1BEGIN { 2 if ($ENV{'PERL_CORE'}){ 3 chdir 't'; 4 unshift @INC, '../lib'; 5 } 6 require Config; import Config; 7 if ($Config{'extensions'} !~ /\bEncode\b/) { 8 print "1..0 # Skip: Encode was not built\n"; 9 exit 0; 10 } 11 if (ord("A") == 193) { 12 print "1..0 # Skip: EBCDIC\n"; 13 exit 0; 14 } 15 $| = 1; 16} 17 18use strict; 19#use Test::More qw(no_plan); 20use Test::More tests => 58; 21use Encode q(:all); 22 23my $uo = ''; 24my $nf = ''; 25my ($af, $aq, $ap, $ah, $ax, $uf, $uq, $up, $uh, $ux, $ac, $uc); 26for my $i (0x20..0x7e){ 27 $uo .= chr($i); 28} 29$af = $aq = $ap = $ah = $ax = $ac = 30$uf = $uq = $up = $uh = $ux = $uc = 31$nf = $uo; 32 33my $residue = ''; 34for my $i (0x80..0xff){ 35 $uo .= chr($i); 36 $residue .= chr($i); 37 $af .= '?'; 38 $uf .= "\x{FFFD}"; 39 $ap .= sprintf("\\x{%04x}", $i); 40 $up .= sprintf("\\x%02X", $i); 41 $ah .= sprintf("&#%d;", $i); 42 $uh .= sprintf("\\x%02X", $i); 43 $ax .= sprintf("&#x%x;", $i); 44 $ux .= sprintf("\\x%02X", $i); 45 $ac .= sprintf("<U+%04X>", $i); 46 $uc .= sprintf("[%02X]", $i); 47} 48 49my $ao = $uo; 50utf8::upgrade($uo); 51 52my $ascii = find_encoding('ascii'); 53my $latin1 = find_encoding('latin1'); 54my $utf8 = find_encoding('utf8'); 55 56my $src = $uo; 57my $dst = $ascii->encode($src, FB_DEFAULT); 58is($dst, $af, "FB_DEFAULT ascii"); 59is($src, $uo, "FB_DEFAULT residue ascii"); 60 61$src = $ao; 62$dst = $utf8->decode($src, FB_DEFAULT); 63is($dst, $uf, "FB_DEFAULT utf8"); 64is($src, $ao, "FB_DEFAULT residue utf8"); 65 66$src = $uo; 67eval{ $dst = $ascii->encode($src, FB_CROAK) }; 68like($@, qr/does not map to ascii/o, "FB_CROAK ascii"); 69is($src, $uo, "FB_CROAK residue ascii"); 70 71$src = $ao; 72eval{ $dst = $utf8->decode($src, FB_CROAK) }; 73like($@, qr/does not map to Unicode/o, "FB_CROAK utf8"); 74is($src, $ao, "FB_CROAK residue utf8"); 75 76$src = $nf; 77eval{ $dst = $ascii->encode($src, FB_CROAK) }; 78is($@, '', "FB_CROAK on success ascii"); 79is($src, '', "FB_CROAK on success residue ascii"); 80 81$src = $nf; 82eval{ $dst = $utf8->decode($src, FB_CROAK) }; 83is($@, '', "FB_CROAK on success utf8"); 84is($src, '', "FB_CROAK on success residue utf8"); 85 86$src = $uo; 87$dst = $ascii->encode($src, FB_QUIET); 88is($dst, $aq, "FB_QUIET ascii"); 89is($src, $residue, "FB_QUIET residue ascii"); 90 91$src = $ao; 92$dst = $utf8->decode($src, FB_QUIET); 93is($dst, $uq, "FB_QUIET utf8"); 94is($src, $residue, "FB_QUIET residue utf8"); 95 96{ 97 my $message = ''; 98 local $SIG{__WARN__} = sub { $message = $_[0] }; 99 100 $src = $uo; 101 $dst = $ascii->encode($src, FB_WARN); 102 is($dst, $aq, "FB_WARN ascii"); 103 is($src, $residue, "FB_WARN residue ascii"); 104 like($message, qr/does not map to ascii/o, "FB_WARN message ascii"); 105 106 $message = ''; 107 $src = $ao; 108 $dst = $utf8->decode($src, FB_WARN); 109 is($dst, $uq, "FB_WARN utf8"); 110 is($src, $residue, "FB_WARN residue utf8"); 111 like($message, qr/does not map to Unicode/o, "FB_WARN message utf8"); 112 113 $message = ''; 114 $src = $uo; 115 $dst = $ascii->encode($src, WARN_ON_ERR); 116 is($dst, $af, "WARN_ON_ERR ascii"); 117 is($src, '', "WARN_ON_ERR residue ascii"); 118 like($message, qr/does not map to ascii/o, "WARN_ON_ERR message ascii"); 119 120 $message = ''; 121 $src = $ao; 122 $dst = $utf8->decode($src, WARN_ON_ERR); 123 is($dst, $uf, "WARN_ON_ERR utf8"); 124 is($src, '', "WARN_ON_ERR residue utf8"); 125 like($message, qr/does not map to Unicode/o, "WARN_ON_ERR message ascii"); 126} 127 128$src = $uo; 129$dst = $ascii->encode($src, FB_PERLQQ); 130is($dst, $ap, "FB_PERLQQ encode"); 131is($src, $uo, "FB_PERLQQ residue encode"); 132 133$src = $ao; 134$dst = $ascii->decode($src, FB_PERLQQ); 135is($dst, $up, "FB_PERLQQ decode"); 136is($src, $ao, "FB_PERLQQ residue decode"); 137 138$src = $uo; 139$dst = $ascii->encode($src, FB_HTMLCREF); 140is($dst, $ah, "FB_HTMLCREF encode"); 141is($src, $uo, "FB_HTMLCREF residue encode"); 142 143$src = $ao; 144$dst = $ascii->decode($src, FB_HTMLCREF); 145is($dst, $uh, "FB_HTMLCREF decode"); 146is($src, $ao, "FB_HTMLCREF residue decode"); 147 148$src = $uo; 149$dst = $ascii->encode($src, FB_XMLCREF); 150is($dst, $ax, "FB_XMLCREF encode"); 151is($src, $uo, "FB_XMLCREF residue encode"); 152 153$src = $ao; 154$dst = $ascii->decode($src, FB_XMLCREF); 155is($dst, $ux, "FB_XMLCREF decode"); 156is($src, $ao, "FB_XMLCREF residue decode"); 157 158$src = $uo; 159$dst = $ascii->encode($src, sub{ sprintf "<U+%04X>", shift }); 160is($dst, $ac, "coderef encode"); 161is($src, $uo, "coderef residue encode"); 162 163$src = $ao; 164$dst = $ascii->decode($src, sub{ sprintf "[%02X]", shift }); 165is($dst, $uc, "coderef decode"); 166is($src, $ao, "coderef residue decode"); 167 168$src = "\x{3000}"; 169$dst = $ascii->encode($src, sub{ $_[0] }); 170is $dst, 0x3000."", q{$ascii->encode($src, sub{ $_[0] } )}; 171$dst = encode("ascii", "\x{3000}", sub{ $_[0] }); 172is $dst, 0x3000."", q{encode("ascii", "\x{3000}", sub{ $_[0] })}; 173 174$src = pack "C*", 0xFF; 175$dst = $ascii->decode($src, sub{ $_[0] }); 176is $dst, 0xFF."", q{$ascii->encode($src, sub{ $_[0] } )}; 177$dst = decode("ascii", (pack "C*", 0xFF), sub{ $_[0] }); 178is $dst, 0xFF."", q{decode("ascii", (pack "C*", 0xFF), sub{ $_[0] })}; 179 180 181$src = pack "C*", 0x80; 182$dst = $utf8->decode($src, sub{ $_[0] }); 183is $dst, 0x80."", q{$utf8->encode($src, sub{ $_[0] } )}; 184$dst = decode("utf8", $src, sub{ $_[0] }); 185is $dst, 0x80."", q{decode("utf8", (pack "C*", 0x80), sub{ $_[0] })}; 186 187$src = "\x{3000}"; 188$dst = $latin1->encode($src, sub { "\N{U+FF}" }); 189is $dst, "\x{ff}", q{$latin1->encode($src, sub { "\N{U+FF}" })}; 190$dst = encode("latin1", $src, sub { "\N{U+FF}" }); 191is $dst, "\x{ff}", q{encode("latin1", $src, sub { "\N{U+FF}" })}; 192 193$src = "\x{3000}"; 194$dst = $latin1->encode($src, sub { utf8::upgrade(my $r = "\x{ff}"); $r }); 195is $dst, "\x{ff}", q{$latin1->encode($src, sub { utf8::upgrade(my $r = "\x{ff}"); $r })}; 196$dst = encode("latin1", $src, sub { utf8::upgrade(my $r = "\x{ff}"); $r }); 197is $dst, "\x{ff}", q{encode("latin1", $src, sub { utf8::upgrade(my $r = "\x{ff}"); $r })}; 198 199$src = "\x{ff}"; 200$dst = $utf8->decode($src, sub { chr($_[0]) }); 201is $dst, "\x{ff}", q{$utf8->decode($src, sub { chr($_[0]) })}; 202$dst = decode("utf8", $src, sub { chr($_[0]) }); 203is $dst, "\x{ff}", q{decode("utf8", $src, sub { chr($_[0]) })}; 204 205{ 206 use charnames ':full'; 207 $src = "\x{ff}"; 208 $dst = $utf8->decode($src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r }); 209 is $dst, "\N{LATIN SMALL LETTER Y WITH DIAERESIS}", q{$utf8->decode($src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r })}; 210 $dst = decode("utf8", $src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r }); 211 is $dst, "\N{LATIN SMALL LETTER Y WITH DIAERESIS}", q{decode("utf8", $src, sub { utf8::downgrade(my $r = "\N{LATIN SMALL LETTER Y WITH DIAERESIS}"); $r })}; 212} 213