xref: /openbsd-src/gnu/usr.bin/perl/cpan/Encode/t/magic.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
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