3 # testsuite for Data::Dumper
8 unshift @INC, '../lib' if -d '../lib';
9 require Config; import Config;
10 if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
11 print "1..0 # Skip: Data::Dumper was not built\n";
18 my $Is_ebcdic = defined($Config{'ebcdic'}) && $Config{'ebcdic'} eq 'define';
20 $Data::Dumper::Pad = "#";
30 $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g
31 if ($WANT =~ /deadbeef/);
33 # these data need massaging with non ascii character sets
34 # because of hashing order differences
35 $WANT = join("\n",sort(split(/\n/,$WANT)));
37 $t = join("\n",sort(split(/\n/,$t)));
40 print( ($t eq $WANT and not $@) ? "ok $TNUM\n"
41 : "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n");
45 print $@ ? "not ok $TNUM\n# \$@ says: $@\n" : "ok $TNUM\n";
49 $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g
50 if ($WANT =~ /deadbeef/);
52 # here too there are hashing order differences
53 $WANT = join("\n",sort(split(/\n/,$WANT)));
55 $t = join("\n",sort(split(/\n/,$t)));
58 print( ($t eq $WANT and not $@) ? "ok $TNUM\n"
59 : "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n");
62 if (defined &Data::Dumper::Dumpxs) {
63 print "### XS extension loaded, will run XS tests\n";
67 print "### XS extensions not loaded, will NOT run XS tests\n";
102 TEST q(Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]));
103 TEST q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b c)])) if $XS;
126 $Data::Dumper::Purity = 1; # fill in the holes for eval
127 TEST q(Data::Dumper->Dump([$a, $b], [qw(*a b)])); # print as @a
128 TEST q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])) if $XS;
146 #$b{'c'} = $b{'a'}[2];
150 TEST q(Data::Dumper->Dump([$b, $a], [qw(*b a)])); # print as %b
151 TEST q(Data::Dumper->Dumpxs([$b, $a], [qw(*b a)])) if $XS;
166 #$a->[1]{'b'} = $a->[1];
172 $Data::Dumper::Indent = 1;
174 $d = Data::Dumper->new([$a,$b], [qw(a b)]);
175 $d->Seen({'*c' => $c});
180 $d = Data::Dumper->new([$a,$b], [qw(a b)]);
181 $d->Seen({'*c' => $c});
209 $d->Purity(0)->Quotekeys(0);
210 TEST q( $d->Reset; $d->Dump );
212 TEST q( $d->Reset; $d->Dumpxs ) if $XS;
228 #$VAR1->[1]{'a'} = $VAR1;
229 #$VAR1->[1]{'b'} = $VAR1->[1];
230 #$VAR1->[2] = $VAR1->[1]{'c'};
234 TEST q(Data::Dumper::DumperX($a)) if $XS;
253 local $Data::Dumper::Purity = 0;
254 local $Data::Dumper::Quotekeys = 0;
255 local $Data::Dumper::Terse = 1;
257 TEST q(Data::Dumper::DumperX($a)) if $XS;
265 # "abc\0'\efg" => "mno\0"
269 $foo = { "abc\000\'\efg" => "mno\000" };
271 local $Data::Dumper::Useqq = 1;
272 TEST q(Dumper($foo));
277 # 'abc\0\\'\efg' => 'mno\0'
282 local $Data::Dumper::Useqq = 1;
283 TEST q(Data::Dumper::DumperX($foo)) if $XS; # cheat
296 %foo = (a=>1,b=>\$foo,c=>\@foo);
318 #*::foo{ARRAY}->[1] = $foo;
319 #*::foo{ARRAY}->[2]{'b'} = *::foo{SCALAR};
320 #*::foo{ARRAY}->[2]{'c'} = *::foo{ARRAY};
321 #*::foo{ARRAY}->[2]{'d'} = *::foo{ARRAY}->[2];
322 #*::foo = *::foo{ARRAY}->[2];
323 #@bar = @{*::foo{ARRAY}};
324 #%baz = %{*::foo{ARRAY}->[2]};
327 $Data::Dumper::Purity = 1;
328 $Data::Dumper::Indent = 3;
329 TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz']));
330 TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])) if $XS;
347 #*::foo{ARRAY}->[1] = $foo;
348 #*::foo{ARRAY}->[2]{'b'} = *::foo{SCALAR};
349 #*::foo{ARRAY}->[2]{'c'} = *::foo{ARRAY};
350 #*::foo{ARRAY}->[2]{'d'} = *::foo{ARRAY}->[2];
351 #*::foo = *::foo{ARRAY}->[2];
352 #$bar = *::foo{ARRAY};
353 #$baz = *::foo{ARRAY}->[2];
356 $Data::Dumper::Indent = 1;
357 TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz']));
358 TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])) if $XS;
376 #*::foo{HASH}->{'b'} = *::foo{SCALAR};
377 #*::foo{HASH}->{'c'} = \@bar;
378 #*::foo{HASH}->{'d'} = *::foo{HASH};
379 #$bar[2] = *::foo{HASH};
380 #%baz = %{*::foo{HASH}};
384 TEST q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo']));
385 TEST q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])) if $XS;
403 #*::foo{HASH}->{'b'} = *::foo{SCALAR};
404 #*::foo{HASH}->{'c'} = $bar;
405 #*::foo{HASH}->{'d'} = *::foo{HASH};
406 #$bar->[2] = *::foo{HASH};
407 #$baz = *::foo{HASH};
411 TEST q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo']));
412 TEST q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])) if $XS;
431 $Data::Dumper::Purity = 0;
432 $Data::Dumper::Quotekeys = 0;
433 TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz']));
434 TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])) if $XS;
453 TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz']));
454 TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])) if $XS;
462 @dogs = ( 'Fido', 'Wags' );
469 $mutts = $mutts; # avoid warning
479 # ${$kennels{First}},
480 # ${$kennels{Second}},
487 $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts],
488 [qw(*kennels *dogs *mutts)] );
493 $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts],
494 [qw(*kennels *dogs *mutts)] );
502 #%kennels = %kennels;
508 TEST q($d->Dumpxs) if $XS;
518 # ${$kennels{First}},
519 # ${$kennels{Second}},
526 TEST q($d->Reset; $d->Dump);
528 TEST q($d->Reset; $d->Dumpxs);
538 # First => \$dogs[0],
539 # Second => \$dogs[1]
542 #%kennels = %{$dogs[2]};
543 #%mutts = %{$dogs[2]};
547 $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts],
548 [qw(*dogs *kennels *mutts)] );
553 $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts],
554 [qw(*dogs *kennels *mutts)] );
561 TEST q($d->Reset->Dump);
563 TEST q($d->Reset->Dumpxs);
584 $d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] );
585 $d->Deepcopy(1)->Dump;
588 TEST q($d->Reset->Dumpxs);
595 sub z { print "foo\n" }
607 TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dump;);
608 TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dumpxs;)
620 TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dump;);
621 TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dumpxs;)
633 TEST q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dump;);
634 TEST q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dumpxs;)
653 TEST q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dump;);
654 TEST q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dumpxs;)
669 TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;);
670 TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;)
675 $a = [{ a => \$b }, { b => undef }];
676 $b = [{ c => \$b }, { d => \$a }];
696 #${$a->[0]{a}}->[0]->{c} = $a->[0]{a};
697 #${${$a->[0]{a}}->[1]->{d}} = $a;
701 TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;);
702 TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;)
707 $a = [[[[\\\\\'foo']]]];
724 #$c = ${${$a->[0][0][0][0]}};
727 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dump;);
728 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;)
747 # e => 'ARRAY(0xdeadbeef)'
756 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dump;);
757 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;)
764 # b => 'HASH(0xdeadbeef)'
772 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dump;);
773 TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;)
789 TEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dump;);
790 TEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dumpxs;)
799 #${$b->[0]} = $b->[0];
803 TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dump;);
804 TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;)