15759b3d2Safresh1BEGIN { 25759b3d2Safresh1 if ($ENV{'PERL_CORE'}) { 35759b3d2Safresh1 chdir 't'; 45759b3d2Safresh1 unshift @INC, '../lib'; 55759b3d2Safresh1 } 6*5486feefSafresh1 require Config; Config->import(); 75759b3d2Safresh1 if ($Config{'extensions'} !~ /\bEncode\b/) { 85759b3d2Safresh1 print "1..0 # Skip: Encode was not built\n"; 95759b3d2Safresh1 exit 0; 105759b3d2Safresh1 } 115759b3d2Safresh1 if (ord("A") == 193) { 125759b3d2Safresh1 print "1..0 # Skip: EBCDIC\n"; 135759b3d2Safresh1 exit 0; 145759b3d2Safresh1 } 155759b3d2Safresh1 $| = 1; 165759b3d2Safresh1} 175759b3d2Safresh1 185759b3d2Safresh1use strict; 195759b3d2Safresh1use warnings; 205759b3d2Safresh1 215759b3d2Safresh1use Encode qw(find_encoding encode decode encode_utf8 decode_utf8 is_utf8 _utf8_on _utf8_off FB_CROAK); 225759b3d2Safresh1 235759b3d2Safresh1use Test::More tests => 3*(2*(4*(4*4)+4)+4+3*3); 245759b3d2Safresh1 255759b3d2Safresh1my $ascii = find_encoding('ASCII'); 265759b3d2Safresh1my $latin1 = find_encoding('Latin1'); 275759b3d2Safresh1my $utf8 = find_encoding('UTF-8'); 285759b3d2Safresh1my $utf16 = find_encoding('UTF-16LE'); 295759b3d2Safresh1 305759b3d2Safresh1my $undef = undef; 315759b3d2Safresh1my $ascii_str = 'ascii_str'; 325759b3d2Safresh1my $utf8_str = 'utf8_str'; 335759b3d2Safresh1_utf8_on($utf8_str); 345759b3d2Safresh1 355759b3d2Safresh1{ 365759b3d2Safresh1 foreach my $str ($undef, $ascii_str, $utf8_str) { 375759b3d2Safresh1 foreach my $croak (0, 1) { 385759b3d2Safresh1 foreach my $enc ('ASCII', 'Latin1', 'UTF-8', 'UTF-16LE') { 395759b3d2Safresh1 my $mod = defined $str && $croak; 405759b3d2Safresh1 my $func = "encode('" . $enc . "', " . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')'; 415759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 425759b3d2Safresh1 my $output = encode($enc, $input, $croak ? FB_CROAK : 0); 435759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 445759b3d2Safresh1 is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic')); 455759b3d2Safresh1 is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string'); 465759b3d2Safresh1 is($output, ((defined $str and $enc eq 'UTF-16LE') ? encode("UTF-16LE", $str) : $str), "$func returns correct \$output string"); 475759b3d2Safresh1 } 485759b3d2Safresh1 foreach my $enc ('ASCII', 'Latin1', 'UTF-8', 'UTF-16LE') { 495759b3d2Safresh1 my $mod = defined $str && $croak; 505759b3d2Safresh1 my $func = "decode('" . $enc . "', " . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')'; 515759b3d2Safresh1 my $input_str = ((defined $str and $enc eq 'UTF-16LE') ? encode("UTF-16LE", $str) : $str); 525759b3d2Safresh1 tie my $input, 'TieScalarCounter', $input_str; 535759b3d2Safresh1 my $output = decode($enc, $input, $croak ? FB_CROAK : 0); 545759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 555759b3d2Safresh1 is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic')); 565759b3d2Safresh1 is($input, $mod ? '' : $input_str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string'); 575759b3d2Safresh1 is($output, $str, "$func returns correct \$output string"); 585759b3d2Safresh1 } 595759b3d2Safresh1 foreach my $obj ($ascii, $latin1, $utf8, $utf16) { 605759b3d2Safresh1 my $mod = defined $str && $croak; 615759b3d2Safresh1 my $func = '$' . $obj->name() . '->encode(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')'; 625759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 635759b3d2Safresh1 my $output = $obj->encode($input, $croak ? FB_CROAK : 0); 645759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 655759b3d2Safresh1 is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic')); 665759b3d2Safresh1 is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string'); 675759b3d2Safresh1 is($output, ((defined $str and $obj == $utf16) ? encode("UTF-16LE", $str) : $str), "$func returns correct \$output string"); 685759b3d2Safresh1 } 695759b3d2Safresh1 foreach my $obj ($ascii, $latin1, $utf8, $utf16) { 705759b3d2Safresh1 my $mod = defined $str && $croak; 715759b3d2Safresh1 my $func = '$' . $obj->name() . '->decode(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')'; 725759b3d2Safresh1 my $input_str = ((defined $str and $obj == $utf16) ? encode("UTF-16LE", $str) : $str); 735759b3d2Safresh1 tie my $input, 'TieScalarCounter', $input_str; 745759b3d2Safresh1 my $output = $obj->decode($input, $croak ? FB_CROAK : 0); 755759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 765759b3d2Safresh1 is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic')); 775759b3d2Safresh1 is($input, $mod ? '' : $input_str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string'); 785759b3d2Safresh1 is($output, $str, "$func returns correct \$output string"); 795759b3d2Safresh1 } 805759b3d2Safresh1 { 815759b3d2Safresh1 my $mod = defined $str && $croak; 825759b3d2Safresh1 my $func = 'decode_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ($croak ? ', FB_CROAK' : '') . ')'; 835759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 845759b3d2Safresh1 my $output = decode_utf8($input, $croak ? FB_CROAK : 0); 855759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 865759b3d2Safresh1 is(tied($input)->{store}, $mod ? 1 : 0, "$func " . ($mod ? 'processes set magic only once' : 'does not process set magic')); 875759b3d2Safresh1 is($input, $mod ? '' : $str, "$func " . ($mod ? 'modifies' : 'does not modify') . ' $input string'); 885759b3d2Safresh1 is($output, $str, "$func returns correct \$output string"); 895759b3d2Safresh1 } 905759b3d2Safresh1 } 915759b3d2Safresh1 { 925759b3d2Safresh1 my $func = 'encode_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')'; 935759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 945759b3d2Safresh1 my $output = encode_utf8($input); 955759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 965759b3d2Safresh1 is(tied($input)->{store}, 0, "$func does not process set magic"); 975759b3d2Safresh1 is($input, $str, "$func does not modify \$input string"); 985759b3d2Safresh1 is($output, $str, "$func returns correct \$output string"); 995759b3d2Safresh1 } 1005759b3d2Safresh1 { 1015759b3d2Safresh1 my $func = '_utf8_on(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')'; 1025759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 1035759b3d2Safresh1 _utf8_on($input); 1045759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 1055759b3d2Safresh1 is(tied($input)->{store}, defined $str ? 1 : 0, "$func " . (defined $str ? 'processes set magic only once' : 'does not process set magic')); 1065759b3d2Safresh1 defined $str ? ok(is_utf8($input), "$func sets UTF8 status flag") : ok(!is_utf8($input), "$func does not set UTF8 status flag"); 1075759b3d2Safresh1 } 1085759b3d2Safresh1 { 1095759b3d2Safresh1 my $func = '_utf8_off(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')'; 1105759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 1115759b3d2Safresh1 _utf8_off($input); 1125759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 1135759b3d2Safresh1 is(tied($input)->{store}, defined $str ? 1 : 0, "$func " . (defined $str ? 'processes set magic only once' : 'does not process set magic')); 1145759b3d2Safresh1 ok(!is_utf8($input), "$func unsets UTF8 status flag"); 1155759b3d2Safresh1 } 1165759b3d2Safresh1 { 1175759b3d2Safresh1 my $func = 'is_utf8(' . (!defined $str ? 'undef' : is_utf8($str) ? '$utf8_str' : '$ascii_str') . ')'; 1185759b3d2Safresh1 tie my $input, 'TieScalarCounter', $str; 1195759b3d2Safresh1 my $utf8 = is_utf8($input); 1205759b3d2Safresh1 is(tied($input)->{fetch}, 1, "$func processes get magic only once"); 1215759b3d2Safresh1 is(tied($input)->{store}, 0, "$func does not process set magic"); 1225759b3d2Safresh1 is($utf8, is_utf8($str), "$func returned correct state"); 1235759b3d2Safresh1 } 1245759b3d2Safresh1 } 1255759b3d2Safresh1} 1265759b3d2Safresh1 1275759b3d2Safresh1package TieScalarCounter; 1285759b3d2Safresh1 1295759b3d2Safresh1sub TIESCALAR { 1305759b3d2Safresh1 my ($class, $value) = @_; 1315759b3d2Safresh1 return bless { fetch => 0, store => 0, value => $value }, $class; 1325759b3d2Safresh1} 1335759b3d2Safresh1 1345759b3d2Safresh1sub FETCH { 1355759b3d2Safresh1 my ($self) = @_; 1365759b3d2Safresh1 $self->{fetch}++; 1375759b3d2Safresh1 return $self->{value}; 1385759b3d2Safresh1} 1395759b3d2Safresh1 1405759b3d2Safresh1sub STORE { 1415759b3d2Safresh1 my ($self, $value) = @_; 1425759b3d2Safresh1 $self->{store}++; 1435759b3d2Safresh1 $self->{value} = $value; 1445759b3d2Safresh1} 145