4 @INC = ("../lib", "lib/compress");
8 use lib qw(t t/compress);
17 # use Test::NoWarnings, if available
20 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
22 plan tests => 163 + $extra ;
24 use_ok('Scalar::Util');
25 use_ok('IO::Compress::Base::Common');
29 ok gotScalarUtilXS(), "Got XS Version of Scalar::Util"
31 You don't have the XS version of Scalar::Util
34 # Compress::Zlib::Common;
36 sub My::testParseParameters()
38 eval { ParseParameters(1, {}, 1) ; };
39 like $@, mkErr(': Expected even number of parameters, got 1'),
40 "Trap odd number of params";
42 eval { ParseParameters(1, {}, undef) ; };
43 like $@, mkErr(': Expected even number of parameters, got 1'),
44 "Trap odd number of params";
46 eval { ParseParameters(1, {}, []) ; };
47 like $@, mkErr(': Expected even number of parameters, got 1'),
48 "Trap odd number of params";
50 eval { ParseParameters(1, {'fred' => [Parse_boolean, 0]}, fred => 'joe') ; };
51 like $@, mkErr("Parameter 'fred' must be an int, got 'joe'"),
52 "wanted unsigned, got undef";
54 eval { ParseParameters(1, {'fred' => [Parse_unsigned, 0]}, fred => undef) ; };
55 like $@, mkErr("Parameter 'fred' must be an unsigned int, got 'undef'"),
56 "wanted unsigned, got undef";
58 eval { ParseParameters(1, {'fred' => [Parse_signed, 0]}, fred => undef) ; };
59 like $@, mkErr("Parameter 'fred' must be a signed int, got 'undef'"),
60 "wanted signed, got undef";
62 eval { ParseParameters(1, {'fred' => [Parse_signed, 0]}, fred => 'abc') ; };
63 like $@, mkErr("Parameter 'fred' must be a signed int, got 'abc'"),
64 "wanted signed, got 'abc'";
66 eval { ParseParameters(1, {'fred' => [Parse_code, undef]}, fred => 'abc') ; };
67 like $@, mkErr("Parameter 'fred' must be a code reference, got 'abc'"),
68 "wanted code, got 'abc'";
75 skip 'readonly + threads', 2
76 if $Config{useithreads};
78 eval { ParseParameters(1, {'fred' => [Parse_writable_scalar, 0]}, fred => 'abc') ; };
79 like $@, mkErr("Parameter 'fred' not writable"),
80 "wanted writable, got readonly";
82 skip '\\ returns mutable value in 5.19.3', 1
85 eval { ParseParameters(1, {'fred' => [Parse_writable_scalar, 0]}, fred => \'abc') ; };
86 like $@, mkErr("Parameter 'fred' not writable"),
87 "wanted writable, got readonly";
91 eval { ParseParameters(1, {'fred' => [Parse_writable_scalar, 0]}, fred => \@xx) ; };
92 like $@, mkErr("Parameter 'fred' not a scalar reference"),
93 "wanted scalar reference";
96 eval { ParseParameters(1, {'fred' => [Parse_writable_scalar, 0]}, fred => *ABC) ; };
97 like $@, mkErr("Parameter 'fred' not a scalar"),
100 eval { ParseParameters(1, {'fred' => [Parse_any, 0]}, fred => 1, fred => 2) ; };
101 like $@, mkErr("Muliple instances of 'fred' found"),
102 "multiple instances";
104 # my $g = ParseParameters(1, {'fred' => [Parse_unsigned|Parse_multiple, 7]}, fred => 1, fred => 2) ;
105 # is_deeply $g->value('fred'), [ 1, 2 ] ;
110 my $got = ParseParameters(1, {'fred' => [0x1000000, 0]}, fred => 'abc') ;
111 is $got->getValue('fred'), "abc", "other" ;
113 $got = ParseParameters(1, {'fred' => [Parse_any, undef]}, fred => undef) ;
114 ok $got->parsed('fred'), "undef" ;
115 ok ! defined $got->getValue('fred'), "undef" ;
117 $got = ParseParameters(1, {'fred' => [Parse_string, undef]}, fred => undef) ;
118 ok $got->parsed('fred'), "undef" ;
119 is $got->getValue('fred'), "", "empty string" ;
122 $got = ParseParameters(1, {'fred' => [Parse_writable_scalar, undef]}, fred => $xx) ;
124 ok $got->parsed('fred'), "parsed" ;
125 my $xx_ref = $got->getValue('fred');
129 $got = ParseParameters(1, {'fred' => [Parse_writable_scalar, undef]}, fred => \$xx) ;
131 ok $got->parsed('fred'), "parsed" ;
132 $xx_ref = $got->getValue('fred');
138 my $got1 = ParseParameters(1, {'fred' => [Parse_writable_scalar, undef]}, $got) ;
139 is $got1, $got, "Same object";
141 ok $got1->parsed('fred'), "parsed" ;
142 $xx_ref = $got1->getValue('fred');
148 for my $type (Parse_unsigned, Parse_signed, Parse_any)
152 eval { $got1 = ParseParameters(1, {'fred' => [$type, 1]}, fred => $value) } ;
155 ok $got1->parsed('fred'), "parsed ok" ;
156 is $got1->getValue('fred'), 0;
163 eval { $got1 = ParseParameters(1, {'fred' => [Parse_any, 1]}, fred => $value) } ;
166 ok $got1->parsed('fred'), "parsed ok" ;
167 is $got1->getValue('fred'), 0;
168 $got1->setValue('fred' => undef);
169 is $got1->getValue('fred'), undef;
176 my $got = IO::Compress::Base::Parameters::new();
179 ok $got->parse({'fred' => [Parse_any, 1]}, fred => $value) ;
181 ok $got->parsed('fred'), "parsed ok" ;
182 is $got->getValue('fred'), 0;
184 ok $got->parse({'fred' => [Parse_any, 1]}, fred => undef) ;
185 ok $got->parsed('fred'), "parsed ok" ;
186 is $got->getValue('fred'), undef;
188 ok $got->parse({'fred' => [Parse_any, 1]}, fred => 7) ;
189 ok $got->parsed('fred'), "parsed ok" ;
190 is $got->getValue('fred'), 7;
195 My::testParseParameters();
199 title "isaFilename" ;
200 ok isaFilename("abc"), "'abc' isaFilename";
202 ok ! isaFilename(undef), "undef ! isaFilename";
203 ok ! isaFilename([]), "[] ! isaFilename";
204 $main::X = 1; $main::X = $main::X ;
205 ok ! isaFilename(*X), "glob ! isaFilename";
209 title "whatIsInput" ;
211 my $lex = new LexFile my $out_file ;
212 open FH, ">$out_file" ;
213 is whatIsInput(*FH), 'handle', "Match filehandle" ;
217 is whatIsInput($stdin), 'handle', "Match '-' as stdin";
218 #is $stdin, \*STDIN, "'-' changed to *STDIN";
219 #isa_ok $stdin, 'IO::File', "'-' changed to IO::File";
220 is whatIsInput("abc"), 'filename', "Match filename";
221 is whatIsInput(\"abc"), 'buffer', "Match buffer";
222 is whatIsInput(sub { 1 }, 1), 'code', "Match code";
223 is whatIsInput(sub { 1 }), '' , "Don't match code";
228 title "whatIsOutput" ;
230 my $lex = new LexFile my $out_file ;
231 open FH, ">$out_file" ;
232 is whatIsOutput(*FH), 'handle', "Match filehandle" ;
236 is whatIsOutput($stdout), 'handle', "Match '-' as stdout";
237 #is $stdout, \*STDOUT, "'-' changed to *STDOUT";
238 #isa_ok $stdout, 'IO::File', "'-' changed to IO::File";
239 is whatIsOutput("abc"), 'filename', "Match filename";
240 is whatIsOutput(\"abc"), 'buffer', "Match buffer";
241 is whatIsOutput(sub { 1 }, 1), 'code', "Match code";
242 is whatIsOutput(sub { 1 }), '' , "Don't match code";
252 is $x->getHigh, 0, " getHigh is 0";
253 is $x->getLow, 0, " getLow is 0";
254 ok ! $x->is64bit(), " ! is64bit";
257 is $x->getHigh, 1, " getHigh is 1";
258 is $x->getLow, 2, " getLow is 2";
259 ok $x->is64bit(), " is64bit";
261 $x = new U64(0xFFFFFFFF,2);
262 is $x->getHigh, 0xFFFFFFFF, " getHigh is 0xFFFFFFFF";
263 is $x->getLow, 2, " getLow is 2";
264 ok $x->is64bit(), " is64bit";
266 $x = new U64(7, 0xFFFFFFFF);
267 is $x->getHigh, 7, " getHigh is 7";
268 is $x->getLow, 0xFFFFFFFF, " getLow is 0xFFFFFFFF";
269 ok $x->is64bit(), " is64bit";
272 is $x->getHigh, 0, " getHigh is 0";
273 is $x->getLow, 666, " getLow is 666";
274 ok ! $x->is64bit(), " ! is64bit";
279 is $x->getHigh, 0, " getHigh is 0";
280 is $x->getLow, 1, " getLow is 1";
281 ok ! $x->is64bit(), " ! is64bit";
284 is $x->getHigh, 0, " getHigh is 0";
285 is $x->getLow, 2, " getLow is 2";
286 ok ! $x->is64bit(), " ! is64bit";
288 $x = new U64(0, 0xFFFFFFFE);
289 is $x->getHigh, 0, " getHigh is 0";
290 is $x->getLow, 0xFFFFFFFE, " getLow is 0xFFFFFFFE";
291 is $x->get32bit(), 0xFFFFFFFE, " get32bit is 0xFFFFFFFE";
292 is $x->get64bit(), 0xFFFFFFFE, " get64bit is 0xFFFFFFFE";
293 ok ! $x->is64bit(), " ! is64bit";
296 is $x->getHigh, 0, " getHigh is 0";
297 is $x->getLow, 0xFFFFFFFF, " getLow is 0xFFFFFFFF";
298 is $x->get32bit(), 0xFFFFFFFF, " get32bit is 0xFFFFFFFF";
299 is $x->get64bit(), 0xFFFFFFFF, " get64bit is 0xFFFFFFFF";
300 ok ! $x->is64bit(), " ! is64bit";
303 is $x->getHigh, 1, " getHigh is 1";
304 is $x->getLow, 0, " getLow is 0";
305 is $x->get32bit(), 0x0, " get32bit is 0x0";
306 is $x->get64bit(), 0xFFFFFFFF+1, " get64bit is 0x100000000";
307 ok $x->is64bit(), " is64bit";
310 is $x->getHigh, 1, " getHigh is 1";
311 is $x->getLow, 1, " getLow is 1";
312 is $x->get32bit(), 0x1, " get32bit is 0x1";
313 is $x->get64bit(), 0xFFFFFFFF+2, " get64bit is 0x100000001";
314 ok $x->is64bit(), " is64bit";
317 is $x->getHigh, 1, " getHigh is 1";
318 is $x->getLow, 2, " getLow is 1";
319 is $x->get32bit(), 0x2, " get32bit is 0x2";
320 is $x->get64bit(), 0xFFFFFFFF+3, " get64bit is 0x100000002";
321 ok $x->is64bit(), " is64bit";
323 $x = new U64(1, 0xFFFFFFFE);
324 my $y = new U64(2, 3);
327 is $x->getHigh, 4, " getHigh is 4";
328 is $x->getLow, 1, " getLow is 1";
329 ok $x->is64bit(), " is64bit";
331 title "U64 - subtract" ;
334 is $x->getHigh, 0, " getHigh is 0";
335 is $x->getLow, 1, " getLow is 1";
336 ok ! $x->is64bit(), " ! is64bit";
339 is $x->getHigh, 0, " getHigh is 0";
340 is $x->getLow, 0, " getLow is 0";
341 ok ! $x->is64bit(), " ! is64bit";
344 is $x->getHigh, 1, " getHigh is 1";
345 is $x->getLow, 0, " getLow is 0";
346 is $x->get32bit(), 0, " get32bit is 0xFFFFFFFE";
347 is $x->get64bit(), 0xFFFFFFFF+1, " get64bit is 0x100000000";
348 ok $x->is64bit(), " is64bit";
351 is $x->getHigh, 0, " getHigh is 0";
352 is $x->getLow, 0xFFFFFFFF, " getLow is 0xFFFFFFFF";
353 is $x->get32bit(), 0xFFFFFFFF, " get32bit is 0xFFFFFFFF";
354 is $x->get64bit(), 0xFFFFFFFF, " get64bit is 0xFFFFFFFF";
355 ok ! $x->is64bit(), " ! is64bit";
361 is $x->getHigh, 0, " getHigh is 0";
362 is $x->getLow, 0xFFFFFFFF, " getLow is 1";
363 ok ! $x->is64bit(), " ! is64bit";
365 $x = new U64(0x01CADCE2, 0x4E815983);
366 $y = new U64(0x19DB1DE, 0xD53E8000); # NTFS to Unix time delta
369 is $x->getHigh, 0x2D2B03, " getHigh is 2D2B03";
370 is $x->getLow, 0x7942D983, " getLow is 7942D983";
371 ok $x->is64bit(), " is64bit";
373 title "U64 - equal" ;
376 is $x->getHigh, 0, " getHigh is 0";
377 is $x->getLow, 1, " getLow is 1";
378 ok ! $x->is64bit(), " ! is64bit";
381 is $y->getHigh, 0, " getHigh is 0";
382 is $y->getLow, 1, " getLow is 1";
383 ok ! $y->is64bit(), " ! is64bit";
385 my $z = new U64(0, 2);
386 is $z->getHigh, 0, " getHigh is 0";
387 is $z->getLow, 2, " getLow is 2";
388 ok ! $z->is64bit(), " ! is64bit";
390 ok $x->equal($y), " equal";
391 ok !$x->equal($z), " ! equal";
393 title "U64 - clone" ;
394 $x = new U64(21, 77);
396 is $z->getHigh, 21, " getHigh is 21";
397 is $z->getLow, 77, " getLow is 77";
399 title "U64 - cmp.gt" ;
402 cmp_ok $x->cmp($y), '>', 0, " cmp > 0";
403 is $x->gt($y), 1, " gt";
404 cmp_ok $y->cmp($x), '<', 0, " cmp < 0";