1b39c5158Smillert
2b39c5158Smillertuse strict;
3b39c5158Smillertuse warnings;
45759b3d2Safresh1use bytes;
5b39c5158Smillert
6b39c5158Smillertuse Test::More ;
7b39c5158Smillertuse CompTestUtils;
8b39c5158Smillert
9b39c5158SmillertBEGIN
10b39c5158Smillert{
11b39c5158Smillert    plan skip_all => "Encode is not available"
12b39c5158Smillert        if $] < 5.006 ;
13b39c5158Smillert
14b39c5158Smillert    eval { require Encode; Encode->import(); };
15b39c5158Smillert
16b39c5158Smillert    plan skip_all => "Encode is not available"
17b39c5158Smillert        if $@ ;
18b39c5158Smillert
19b39c5158Smillert    # use Test::NoWarnings, if available
20b39c5158Smillert    my $extra = 0 ;
21b39c5158Smillert
22b39c5158Smillert    my $st = eval { require Test::NoWarnings ;  import Test::NoWarnings; 1; };
23b39c5158Smillert    $extra = 1
24b39c5158Smillert        if $st ;
25b39c5158Smillert
2691f110e0Safresh1    plan(tests => 29 + $extra) ;
27b39c5158Smillert}
28b39c5158Smillert
29b39c5158Smillertsub run
30b39c5158Smillert{
31b39c5158Smillert    my $CompressClass   = identify();
32b39c5158Smillert    my $UncompressClass = getInverse($CompressClass);
33b39c5158Smillert    my $Error           = getErrorRef($CompressClass);
34b39c5158Smillert    my $UnError         = getErrorRef($UncompressClass);
35b39c5158Smillert
36b39c5158Smillert
3791f110e0Safresh1    my $string = "\x{df}\x{100}\x80";
38b39c5158Smillert    my $encString = Encode::encode_utf8($string);
39b39c5158Smillert    my $buffer = $encString;
40b39c5158Smillert
41b39c5158Smillert    #for my $from ( qw(filename filehandle buffer) )
42b39c5158Smillert    {
43b39c5158Smillert#        my $input ;
44*256a93a4Safresh1#        my $lex = LexFile->new( my $name );
45b39c5158Smillert#
46b39c5158Smillert#
47b39c5158Smillert#        if ($from eq 'buffer')
48b39c5158Smillert#          { $input = \$buffer }
49b39c5158Smillert#        elsif ($from eq 'filename')
50b39c5158Smillert#        {
51b39c5158Smillert#            $input = $name ;
52b39c5158Smillert#            writeFile($name, $buffer);
53b39c5158Smillert#        }
54b39c5158Smillert#        elsif ($from eq 'filehandle')
55b39c5158Smillert#        {
56*256a93a4Safresh1#            $input = IO::File->new( "<$name" );
57b39c5158Smillert#        }
58b39c5158Smillert
59b39c5158Smillert        for my $to ( qw(filehandle buffer))
60b39c5158Smillert        {
61b39c5158Smillert            title "OO Mode: To $to, Encode by hand";
62b39c5158Smillert
63*256a93a4Safresh1            my $lex2 = LexFile->new( my $name2 );
64b39c5158Smillert            my $output;
65b39c5158Smillert            my $buffer;
66b39c5158Smillert
67b39c5158Smillert            if ($to eq 'buffer')
68b39c5158Smillert              { $output = \$buffer }
69b39c5158Smillert            elsif ($to eq 'filename')
70b39c5158Smillert            {
71b39c5158Smillert                $output = $name2 ;
72b39c5158Smillert            }
73b39c5158Smillert            elsif ($to eq 'filehandle')
74b39c5158Smillert            {
75*256a93a4Safresh1                $output = IO::File->new( ">$name2" );
76b39c5158Smillert            }
77b39c5158Smillert
78b39c5158Smillert
79b39c5158Smillert            my $out ;
80*256a93a4Safresh1            my $cs = $CompressClass->can('new')->( $CompressClass, $output, AutoClose =>1);
81b39c5158Smillert            $cs->print($encString);
82b39c5158Smillert            $cs->close();
83b39c5158Smillert
84b39c5158Smillert            my $input;
85b39c5158Smillert            if ($to eq 'buffer')
86b39c5158Smillert              { $input = \$buffer }
87b39c5158Smillert            else
88b39c5158Smillert            {
89b39c5158Smillert                $input = $name2 ;
90b39c5158Smillert            }
91b39c5158Smillert
92*256a93a4Safresh1            my $ucs = $UncompressClass->can('new')->( $UncompressClass, $input, Append => 1);
93b39c5158Smillert            my $got;
94b39c5158Smillert            1 while $ucs->read($got) > 0 ;
9591f110e0Safresh1
9691f110e0Safresh1            is  $got, $encString, "  Expected output";
9791f110e0Safresh1
98b39c5158Smillert            my $decode = Encode::decode_utf8($got);
99b39c5158Smillert
100b39c5158Smillert
10191f110e0Safresh1            is $decode, $string, "  Expected output";
102b39c5158Smillert
103b39c5158Smillert
104b39c5158Smillert        }
105b39c5158Smillert    }
106b39c5158Smillert
107b39c5158Smillert    {
108b39c5158Smillert        title "Catch wide characters";
109b39c5158Smillert
110b39c5158Smillert        my $out;
111*256a93a4Safresh1        my $cs = $CompressClass->can('new')->( $CompressClass, \$out);
112b39c5158Smillert        my $a = "a\xFF\x{100}";
113b39c5158Smillert        eval { $cs->syswrite($a) };
114b39c5158Smillert        like($@, qr/Wide character in ${CompressClass}::write/,
115b39c5158Smillert                 "  wide characters in ${CompressClass}::write");
11691f110e0Safresh1
11791f110e0Safresh1    }
11891f110e0Safresh1
11991f110e0Safresh1    {
12091f110e0Safresh1        title "Unknown encoding";
12191f110e0Safresh1        my $output;
122*256a93a4Safresh1        eval { my $cs = $CompressClass->can('new')->( $CompressClass, \$output, Encode => 'fred'); } ;
12391f110e0Safresh1        like($@, qr/${CompressClass}: Encoding 'fred' is not available/,
12491f110e0Safresh1                 "  Encoding 'fred' is not available");
12591f110e0Safresh1    }
12691f110e0Safresh1
12791f110e0Safresh1    {
12891f110e0Safresh1        title "Encode option";
12991f110e0Safresh1
13091f110e0Safresh1        for my $to ( qw(filehandle filename buffer))
13191f110e0Safresh1        {
13291f110e0Safresh1            title "Encode: To $to, Encode option";
13391f110e0Safresh1
134*256a93a4Safresh1            my $lex2 = LexFile->new( my $name2 );
13591f110e0Safresh1            my $output;
13691f110e0Safresh1            my $buffer;
13791f110e0Safresh1
13891f110e0Safresh1            if ($to eq 'buffer')
13991f110e0Safresh1            {
14091f110e0Safresh1                $output = \$buffer
14191f110e0Safresh1            }
14291f110e0Safresh1            elsif ($to eq 'filename')
14391f110e0Safresh1            {
14491f110e0Safresh1                $output = $name2 ;
14591f110e0Safresh1            }
14691f110e0Safresh1            elsif ($to eq 'filehandle')
14791f110e0Safresh1            {
148*256a93a4Safresh1                $output = IO::File->new( ">$name2" );
14991f110e0Safresh1            }
15091f110e0Safresh1
15191f110e0Safresh1            my $out ;
152*256a93a4Safresh1            my $cs = $CompressClass->can('new')->( $CompressClass, $output, AutoClose =>1, Encode => 'utf8');
15391f110e0Safresh1            ok $cs->print($string);
15491f110e0Safresh1            ok $cs->close();
15591f110e0Safresh1
15691f110e0Safresh1            my $input;
15791f110e0Safresh1            if ($to eq 'buffer')
15891f110e0Safresh1            {
15991f110e0Safresh1                $input = \$buffer
16091f110e0Safresh1            }
16191f110e0Safresh1            elsif ($to eq 'filename')
16291f110e0Safresh1            {
16391f110e0Safresh1                $input = $name2 ;
16491f110e0Safresh1            }
16591f110e0Safresh1            else
16691f110e0Safresh1            {
167*256a93a4Safresh1                $input = IO::File->new( "<$name2" );
16891f110e0Safresh1            }
16991f110e0Safresh1
17091f110e0Safresh1            {
171*256a93a4Safresh1                my $ucs = $UncompressClass->can('new')->( $UncompressClass, $input, AutoClose =>1, Append => 1);
17291f110e0Safresh1                my $got;
17391f110e0Safresh1                1 while $ucs->read($got) > 0 ;
17491f110e0Safresh1                ok length($got) > 0;
17591f110e0Safresh1                is  $got, $encString, "  Expected output";
17691f110e0Safresh1
17791f110e0Safresh1                my $decode = Encode::decode_utf8($got);
17891f110e0Safresh1
17991f110e0Safresh1                is  $decode, $string, "  Expected output";
18091f110e0Safresh1            }
18191f110e0Safresh1
18291f110e0Safresh1
18391f110e0Safresh1#            {
184*256a93a4Safresh1#                my $ucs = $UncompressClass->can('new')->( $UncompressClass, $input, Append => 1, Decode => 'utf8');
18591f110e0Safresh1#                my $got;
18691f110e0Safresh1#                1 while $ucs->read($got) > 0 ;
18791f110e0Safresh1#                ok length($got) > 0;
18891f110e0Safresh1#                is  $got, $string, "  Expected output";
18991f110e0Safresh1#            }
19091f110e0Safresh1        }
191b39c5158Smillert    }
192b39c5158Smillert
193b39c5158Smillert}
194b39c5158Smillert
195b39c5158Smillert
196b39c5158Smillert
197b39c5158Smillert1;
198