📄 dumper.t
字号:
#!./perl -w## testsuite for Data::Dumper#BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require Config; import Config; if ($Config{'extensions'} !~ /\bData\/Dumper\b/) { print "1..0 # Skip: Data::Dumper was not built\n"; exit 0; }}use Data::Dumper;use Config;my $Is_ebcdic = defined($Config{'ebcdic'}) && $Config{'ebcdic'} eq 'define';$Data::Dumper::Pad = "#";my $TMAX;my $XS;my $TNUM = 0;my $WANT = '';sub TEST { my $string = shift; my $t = eval $string; ++$TNUM; $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g if ($WANT =~ /deadbeef/); if ($Is_ebcdic) { # these data need massaging with non ascii character sets # because of hashing order differences $WANT = join("\n",sort(split(/\n/,$WANT))); $WANT =~ s/\,$//mg; $t = join("\n",sort(split(/\n/,$t))); $t =~ s/\,$//mg; } print( ($t eq $WANT and not $@) ? "ok $TNUM\n" : "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n"); ++$TNUM; eval "$t"; print $@ ? "not ok $TNUM\n# \$@ says: $@\n" : "ok $TNUM\n"; $t = eval $string; ++$TNUM; $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g if ($WANT =~ /deadbeef/); if ($Is_ebcdic) { # here too there are hashing order differences $WANT = join("\n",sort(split(/\n/,$WANT))); $WANT =~ s/\,$//mg; $t = join("\n",sort(split(/\n/,$t))); $t =~ s/\,$//mg; } print( ($t eq $WANT and not $@) ? "ok $TNUM\n" : "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n");}if (defined &Data::Dumper::Dumpxs) { print "### XS extension loaded, will run XS tests\n"; $TMAX = 186; $XS = 1;}else { print "### XS extensions not loaded, will NOT run XS tests\n"; $TMAX = 93; $XS = 0;}print "1..$TMAX\n";##########################@c = ('c');$c = \@c;$b = {};$a = [1, $b, $c];$b->{a} = $a;$b->{b} = $a->[1];$b->{c} = $a->[2];############# 1##$WANT = <<'EOT';#$a = [# 1,# {# 'a' => $a,# 'b' => $a->[1],# 'c' => [# 'c'# ]# },# $a->[1]{'c'}# ];#$b = $a->[1];#$c = $a->[1]{'c'};EOTTEST q(Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]));TEST q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b c)])) if $XS;############# 7##$WANT = <<'EOT';#@a = (# 1,# {# 'a' => [],# 'b' => {},# 'c' => [# 'c'# ]# },# []# );#$a[1]{'a'} = \@a;#$a[1]{'b'} = $a[1];#$a[2] = $a[1]{'c'};#$b = $a[1];EOT$Data::Dumper::Purity = 1; # fill in the holes for evalTEST q(Data::Dumper->Dump([$a, $b], [qw(*a b)])); # print as @aTEST q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])) if $XS;############# 13##$WANT = <<'EOT';#%b = (# 'a' => [# 1,# {},# [# 'c'# ]# ],# 'b' => {},# 'c' => []# );#$b{'a'}[1] = \%b;#$b{'b'} = \%b;#$b{'c'} = $b{'a'}[2];#$a = $b{'a'};EOTTEST q(Data::Dumper->Dump([$b, $a], [qw(*b a)])); # print as %bTEST q(Data::Dumper->Dumpxs([$b, $a], [qw(*b a)])) if $XS;############# 19##$WANT = <<'EOT';#$a = [# 1,# {# 'a' => [],# 'b' => {},# 'c' => []# },# []#];#$a->[1]{'a'} = $a;#$a->[1]{'b'} = $a->[1];#$a->[1]{'c'} = \@c;#$a->[2] = \@c;#$b = $a->[1];EOT$Data::Dumper::Indent = 1;TEST q( $d = Data::Dumper->new([$a,$b], [qw(a b)]); $d->Seen({'*c' => $c}); $d->Dump; );if ($XS) { TEST q( $d = Data::Dumper->new([$a,$b], [qw(a b)]); $d->Seen({'*c' => $c}); $d->Dumpxs; );}############# 25##$WANT = <<'EOT';#$a = [# #0# 1,# #1# {# a => $a,# b => $a->[1],# c => [# #0# 'c'# ]# },# #2# $a->[1]{c}# ];#$b = $a->[1];EOT$d->Indent(3);$d->Purity(0)->Quotekeys(0);TEST q( $d->Reset; $d->Dump );TEST q( $d->Reset; $d->Dumpxs ) if $XS;############# 31##$WANT = <<'EOT';#$VAR1 = [# 1,# {# 'a' => [],# 'b' => {},# 'c' => [# 'c'# ]# },# []#];#$VAR1->[1]{'a'} = $VAR1;#$VAR1->[1]{'b'} = $VAR1->[1];#$VAR1->[2] = $VAR1->[1]{'c'};EOTTEST q(Dumper($a));TEST q(Data::Dumper::DumperX($a)) if $XS;############# 37##$WANT = <<'EOT';#[# 1,# {# a => $VAR1,# b => $VAR1->[1],# c => [# 'c'# ]# },# $VAR1->[1]{c}#]EOT{ local $Data::Dumper::Purity = 0; local $Data::Dumper::Quotekeys = 0; local $Data::Dumper::Terse = 1; TEST q(Dumper($a)); TEST q(Data::Dumper::DumperX($a)) if $XS;}############# 43##$WANT = <<'EOT';#$VAR1 = {# "abc\0'\efg" => "mno\0",# "reftest" => \\1#};EOT$foo = { "abc\000\'\efg" => "mno\000", "reftest" => \\1, };{ local $Data::Dumper::Useqq = 1; TEST q(Dumper($foo));} $WANT = <<"EOT";#\$VAR1 = {# 'abc\0\\'\efg' => 'mno\0',# 'reftest' => \\\\1#};EOT { local $Data::Dumper::Useqq = 1; TEST q(Data::Dumper::DumperX($foo)) if $XS; # cheat }##########################{ package main; use Data::Dumper; $foo = 5; @foo = (-10,\*foo); %foo = (a=>1,b=>\$foo,c=>\@foo); $foo{d} = \%foo; $foo[2] = \%foo;############# 49## $WANT = <<'EOT';#$foo = \*::foo;#*::foo = \5;#*::foo = [# #0# -10,# #1# do{my $o},# #2# {# 'a' => 1,# 'b' => do{my $o},# 'c' => [],# 'd' => {}# }# ];#*::foo{ARRAY}->[1] = $foo;#*::foo{ARRAY}->[2]{'b'} = *::foo{SCALAR};#*::foo{ARRAY}->[2]{'c'} = *::foo{ARRAY};#*::foo{ARRAY}->[2]{'d'} = *::foo{ARRAY}->[2];#*::foo = *::foo{ARRAY}->[2];#@bar = @{*::foo{ARRAY}};#%baz = %{*::foo{ARRAY}->[2]};EOT $Data::Dumper::Purity = 1; $Data::Dumper::Indent = 3; TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])); TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])) if $XS;############# 55## $WANT = <<'EOT';#$foo = \*::foo;#*::foo = \5;#*::foo = [# -10,# do{my $o},# {# 'a' => 1,# 'b' => do{my $o},# 'c' => [],# 'd' => {}# }#];#*::foo{ARRAY}->[1] = $foo;#*::foo{ARRAY}->[2]{'b'} = *::foo{SCALAR};#*::foo{ARRAY}->[2]{'c'} = *::foo{ARRAY};#*::foo{ARRAY}->[2]{'d'} = *::foo{ARRAY}->[2];#*::foo = *::foo{ARRAY}->[2];#$bar = *::foo{ARRAY};#$baz = *::foo{ARRAY}->[2];EOT $Data::Dumper::Indent = 1; TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])); TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])) if $XS;############# 61## $WANT = <<'EOT';#@bar = (# -10,# \*::foo,# {}#);#*::foo = \5;#*::foo = \@bar;#*::foo = {# 'a' => 1,# 'b' => do{my $o},# 'c' => [],# 'd' => {}#};#*::foo{HASH}->{'b'} = *::foo{SCALAR};#*::foo{HASH}->{'c'} = \@bar;#*::foo{HASH}->{'d'} = *::foo{HASH};#$bar[2] = *::foo{HASH};#%baz = %{*::foo{HASH}};#$foo = $bar[1];EOT TEST q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])); TEST q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])) if $XS;############# 67## $WANT = <<'EOT';#$bar = [# -10,# \*::foo,# {}#];#*::foo = \5;#*::foo = $bar;#*::foo = {# 'a' => 1,# 'b' => do{my $o},# 'c' => [],# 'd' => {}#};#*::foo{HASH}->{'b'} = *::foo{SCALAR};#*::foo{HASH}->{'c'} = $bar;#*::foo{HASH}->{'d'} = *::foo{HASH};#$bar->[2] = *::foo{HASH};#$baz = *::foo{HASH};#$foo = $bar->[1];EOT TEST q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])); TEST q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])) if $XS;############# 73## $WANT = <<'EOT';#$foo = \*::foo;#@bar = (# -10,# $foo,# {# a => 1,# b => \5,# c => \@bar,# d => $bar[2]# }#);#%baz = %{$bar[2]};EOT $Data::Dumper::Purity = 0; $Data::Dumper::Quotekeys = 0; TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])); TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])) if $XS;############# 79## $WANT = <<'EOT';#$foo = \*::foo;#$bar = [# -10,# $foo,# {# a => 1,# b => \5,# c => $bar,# d => $bar->[2]# }#];#$baz = $bar->[2];EOT TEST q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])); TEST q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])) if $XS;}##########################{ package main; @dogs = ( 'Fido', 'Wags' ); %kennel = ( First => \$dogs[0], Second => \$dogs[1], ); $dogs[2] = \%kennel; $mutts = \%kennel; $mutts = $mutts; # avoid warning ############# 85## $WANT = <<'EOT';#%kennels = (# First => \'Fido',# Second => \'Wags'#);#@dogs = (# ${$kennels{First}},# ${$kennels{Second}},# \%kennels#);#%mutts = %kennels;EOT TEST q( $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts], [qw(*kennels *dogs *mutts)] ); $d->Dump; ); if ($XS) { TEST q( $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts], [qw(*kennels *dogs *mutts)] ); $d->Dumpxs; ); } ############# 91## $WANT = <<'EOT';#%kennels = %kennels;#@dogs = @dogs;#%mutts = %kennels;EOT TEST q($d->Dump); TEST q($d->Dumpxs) if $XS; ############# 97## $WANT = <<'EOT';#%kennels = (# First => \'Fido',# Second => \'Wags'#);#@dogs = (# ${$kennels{First}},# ${$kennels{Second}},# \%kennels#);#%mutts = %kennels;EOT TEST q($d->Reset; $d->Dump); if ($XS) { TEST q($d->Reset; $d->Dumpxs); }############# 103## $WANT = <<'EOT';#@dogs = (# 'Fido',# 'Wags',# {# First => \$dogs[0],# Second => \$dogs[1]# }#);#%kennels = %{$dogs[2]};#%mutts = %{$dogs[2]};EOT TEST q( $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts], [qw(*dogs *kennels *mutts)] ); $d->Dump; ); if ($XS) { TEST q( $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts], [qw(*dogs *kennels *mutts)] ); $d->Dumpxs; ); } ############# 109## TEST q($d->Reset->Dump); if ($XS) { TEST q($d->Reset->Dumpxs); }############# 115## $WANT = <<'EOT';#@dogs = (# 'Fido',# 'Wags',# {# First => \'Fido',# Second => \'Wags'# }#);#%kennels = (# First => \'Fido',# Second => \'Wags'#);EOT TEST q( $d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] ); $d->Deepcopy(1)->Dump; ); if ($XS) { TEST q($d->Reset->Dumpxs); } }{sub z { print "foo\n" }$c = [ \&z ];############# 121## $WANT = <<'EOT';#$a = $b;#$c = [# $b#];EOTTEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dump;);TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dumpxs;) if $XS;############# 127## $WANT = <<'EOT';#$a = \&b;#$c = [# \&b#];EOTTEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dump;);TEST q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dumpxs;) if $XS;############# 133## $WANT = <<'EOT';#*a = \&b;#@c = (# \&b#);EOTTEST q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dump;);TEST q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dumpxs;) if $XS;}{ $a = []; $a->[1] = \$a->[0];############# 139## $WANT = <<'EOT';#@a = (# undef,# do{my $o}#);#$a[1] = \$a[0];EOTTEST q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dump;);TEST q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dumpxs;) if $XS;}{ $a = \\\\\'foo'; $b = $$$a;############# 145## $WANT = <<'EOT';#$a = \\\\\'foo';#$b = ${${$a}};EOTTEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;);TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;) if $XS;}{ $a = [{ a => \$b }, { b => undef }]; $b = [{ c => \$b }, { d => \$a }];############# 151## $WANT = <<'EOT';#$a = [# {# a => \[# {# c => do{my $o}# },# {# d => \[]# }# ]# },# {# b => undef# }#];#${$a->[0]{a}}->[0]->{c} = $a->[0]{a};#${${$a->[0]{a}}->[1]->{d}} = $a;#$b = ${$a->[0]{a}};EOTTEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;);TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;) if $XS;}{ $a = [[[[\\\\\'foo']]]]; $b = $a->[0][0]; $c = $${$b->[0][0]};############# 157## $WANT = <<'EOT';#$a = [# [# [# [# \\\\\'foo'# ]# ]# ]#];#$b = $a->[0][0];#$c = ${${$a->[0][0][0][0]}};EOTTEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dump;);TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;) if $XS;}{ $f = "pearl"; $e = [ $f ]; $d = { 'e' => $e }; $c = [ $d ]; $b = { 'c' => $c }; $a = { 'b' => $b };############# 163## $WANT = <<'EOT';#$a = {# b => {# c => [# {# e => 'ARRAY(0xdeadbeef)'# }# ]# }#};#$b = $a->{b};#$c = $a->{b}{c};EOTTEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dump;);TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;) if $XS;############# 169## $WANT = <<'EOT';#$a = {# b => 'HASH(0xdeadbeef)'#};#$b = $a->{b};#$c = [# 'HASH(0xdeadbeef)'#];EOTTEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dump;);TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;) if $XS;}{ $a = \$a; $b = [$a];############# 175## $WANT = <<'EOT';#$b = [# \$b->[0]#];EOTTEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dump;);TEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dumpxs;) if $XS;############# 181## $WANT = <<'EOT';#$b = [# \do{my $o}#];#${$b->[0]} = $b->[0];EOTTEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dump;);TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;) if $XS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -