diff options
author | Nicholas Clark <nick@ccl4.org> | 2021-05-23 09:18:54 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2021-05-23 12:01:04 +0000 |
commit | 5b0b90a6b8d81d30e9ac3231b16c6051ca5cf392 (patch) | |
tree | c48a4a97300db86741838bd2eb28bf67d7ca124f /dist/Data-Dumper/t | |
parent | a38f73999a5889f26c27b391e375797cf3b373ab (diff) | |
download | perl-5b0b90a6b8d81d30e9ac3231b16c6051ca5cf392.tar.gz |
Add TEST_BOTH and SKIP_BOTH to dumper.t to remove a *lot* of DRY violations.
And this spots at least one bug where we weren't testing Dumpxs even though
we thought that we were.
Diffstat (limited to 'dist/Data-Dumper/t')
-rw-r--r-- | dist/Data-Dumper/t/dumper.t | 655 |
1 files changed, 286 insertions, 369 deletions
diff --git a/dist/Data-Dumper/t/dumper.t b/dist/Data-Dumper/t/dumper.t index 1f9f852d58..9c0c51ddec 100644 --- a/dist/Data-Dumper/t/dumper.t +++ b/dist/Data-Dumper/t/dumper.t @@ -161,6 +161,37 @@ sub SKIP_TEST { } } +sub SKIP_BOTH { + my $reason = shift; + SKIP: { + skip($reason, $XS ? 6 : 3); + } +} + +# It's more reliable to match (and substitute) on 'Dumpxs' than 'Dump' +# (the latter is a substring of many things), but as historically we've tested +# "pure perl" then "XS" it seems better to have $want_xs as the optional last +# parameter. +sub TEST_BOTH { + my ($testcase, $desc, $want, $want_xs) = @_; + $want_xs = $want + unless defined $want_xs; + my $desc_pp = $desc; + my $testcase_pp = $testcase; + Carp::confess("Testcase must contain ->Dumpxs") + unless $testcase_pp =~ s/->Dumpxs\b/->Dump/g; + unless ($desc_pp =~ s/Dumpxs/Dump/) { + $desc .= ', XS'; + } + + local $Test::Builder::Level = $Test::Builder::Level + 1; + $WANT = $want; + TEST($testcase_pp, $desc_pp); + $WANT = $want_xs; + TEST($testcase, $desc) + if $XS; +} + #XXXif (0) { ############# ############# @@ -175,7 +206,7 @@ $b->{c} = $a->[2]; ############# ## -$WANT = <<'EOT'; +my $want = <<'EOT'; #$a = [ # 1, # { @@ -191,25 +222,21 @@ $WANT = <<'EOT'; #$6 = $a->[1]{'c'}; EOT -TEST (q(Data::Dumper->Dump([$a,$b,$c], [qw(a b), 6])), - 'basic test with names: Dump()'); -TEST (q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b), 6])), - 'basic test with names: Dumpxs()') - if $XS; +TEST_BOTH(q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b), 6])), + 'basic test with names: Dumpxs()', + $want); SCOPE: { local $Data::Dumper::Sparseseen = 1; - TEST (q(Data::Dumper->Dump([$a,$b,$c], [qw(a b), 6])), - 'Sparseseen with names: Dump()'); - TEST (q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b), 6])), - 'Sparseseen with names: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([$a,$b,$c], [qw(a b), 6])), + 'Sparseseen with names: Dumpxs()', + $want); } ############# ## -$WANT = <<'EOT'; +$want = <<'EOT'; #@a = ( # 1, # { @@ -228,24 +255,20 @@ $WANT = <<'EOT'; EOT $Data::Dumper::Purity = 1; # fill in the holes for eval -TEST (q(Data::Dumper->Dump([$a, $b], [qw(*a b)])), - 'Purity: basic test with dereferenced array: Dump()'); # print as @a -TEST (q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])), - 'Purity: basic test with dereferenced array: Dumpxs()') - if $XS; +TEST_BOTH(q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])), + 'Purity: basic test with dereferenced array: Dumpxs()', + $want); SCOPE: { local $Data::Dumper::Sparseseen = 1; - TEST (q(Data::Dumper->Dump([$a, $b], [qw(*a b)])), - 'Purity: Sparseseen with dereferenced array: Dump()'); # print as @a - TEST (q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])), - 'Purity: Sparseseen with dereferenced array: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([$a, $b], [qw(*a b)])), + 'Purity: Sparseseen with dereferenced array: Dumpxs()', + $want); } ############# ## -$WANT = <<'EOT'; +$want = <<'EOT'; #%b = ( # 'a' => [ # 1, @@ -263,15 +286,13 @@ $WANT = <<'EOT'; #$a = $b{'a'}; EOT -TEST (q(Data::Dumper->Dump([$b, $a], [qw(*b a)])), - 'basic test with dereferenced hash: Dump()'); # print as %b -TEST (q(Data::Dumper->Dumpxs([$b, $a], [qw(*b a)])), - 'basic test with dereferenced hash: Dumpxs()') - if $XS; +TEST_BOTH(q(Data::Dumper->Dumpxs([$b, $a], [qw(*b a)])), + 'basic test with dereferenced hash: Dumpxs()', + $want); ############# ## -$WANT = <<'EOT'; +$want = <<'EOT'; #$a = [ # 1, # { @@ -289,24 +310,16 @@ $WANT = <<'EOT'; EOT $Data::Dumper::Indent = 1; -TEST (q( - $d = Data::Dumper->new([$a,$b], [qw(a b)]); - $d->Seen({'*c' => $c}); - $d->Dump; - ), - 'Indent: Seen: Dump()'); -if ($XS) { - TEST (q( - $d = Data::Dumper->new([$a,$b], [qw(a b)]); - $d->Seen({'*c' => $c}); - $d->Dumpxs; - ), - 'Indent: Seen: Dumpxs()'); -} +TEST_BOTH(q{ + $d = Data::Dumper->new([$a,$b], [qw(a b)]); + $d->Seen({'*c' => $c}); + $d->Dumpxs; + }, 'Indent: Seen: Dumpxs()', + $want); ############# ## -$WANT = <<'EOT'; +$want = <<'EOT'; #$a = [ # #0 # 1, @@ -327,12 +340,9 @@ EOT $d->Indent(3); $d->Purity(0)->Quotekeys(0); -TEST (q( $d->Reset; $d->Dump ), - 'Indent(3): Purity(0)->Quotekeys(0): Dump()'); - -TEST (q( $d->Reset; $d->Dumpxs ), - 'Indent(3): Purity(0)->Quotekeys(0): Dumpxs()') - if $XS; +TEST_BOTH(q( $d->Reset; $d->Dumpxs ), + 'Indent(3): Purity(0)->Quotekeys(0): Dumpxs()', + $want); ############# ## @@ -416,7 +426,7 @@ $foo = { "abc\000\'\efg" => "mno\000", ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$foo = \*::foo; #*::foo = \5; #*::foo = [ @@ -443,15 +453,13 @@ EOT $Data::Dumper::Purity = 1; $Data::Dumper::Indent = 3; - TEST (q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), - 'Purity 1: Indent 3: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), - 'Purity 1: Indent 3: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), + 'Purity 1: Indent 3: Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$foo = \*::foo; #*::foo = \5; #*::foo = [ @@ -474,15 +482,13 @@ EOT EOT $Data::Dumper::Indent = 1; - TEST (q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), - 'Purity 1: Indent 1: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), - 'Purity 1: Indent 1: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), + 'Purity 1: Indent 1: Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #@bar = ( # -10, # \*::foo, @@ -504,15 +510,13 @@ EOT #$foo = $bar[1]; EOT - TEST (q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])), - 'array|hash|glob dereferenced: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])), - 'array|hash|glob dereferenced: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['*bar', '*baz', '*foo'])), + 'array|hash|glob dereferenced: Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$bar = [ # -10, # \*::foo, @@ -534,15 +538,13 @@ EOT #$foo = $bar->[1]; EOT - TEST (q(Data::Dumper->Dump([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])), - 'array|hash|glob: not dereferenced: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])), - 'array|hash|glob: not dereferenced: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\@foo, \\%foo, \\*foo], ['bar', 'baz', 'foo'])), + 'array|hash|glob: not dereferenced: Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$foo = \*::foo; #@bar = ( # -10, @@ -559,15 +561,13 @@ EOT $Data::Dumper::Purity = 0; $Data::Dumper::Quotekeys = 0; - TEST (q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), - 'Purity 0: Quotekeys 0: dereferenced: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), - 'Purity 0: Quotekeys 0: dereferenced: Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['*foo', '*bar', '*baz'])), + 'Purity 0: Quotekeys 0: dereferenced: Dumpxs', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$foo = \*::foo; #$bar = [ # -10, @@ -582,12 +582,9 @@ EOT #$baz = $bar->[2]; EOT - TEST (q(Data::Dumper->Dump([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), - 'Purity 0: Quotekeys 0: not dereferenced: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), - 'Purity 0: Quotekeys 0: not dereferenced: Dumpxs()') - if $XS; - + TEST_BOTH(q(Data::Dumper->Dumpxs([\\*foo, \\@foo, \\%foo], ['foo', 'bar', 'baz'])), + 'Purity 0: Quotekeys 0: not dereferenced: Dumpxs()', + $want); } ############# @@ -605,7 +602,7 @@ EOT ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #%kennels = ( # First => \'Fido', # Second => \'Wags' @@ -618,35 +615,28 @@ EOT #%mutts = %kennels; EOT - TEST (q( - $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts], - [qw(*kennels *dogs *mutts)] ); - $d->Dump; - ), - 'constructor: hash|array|scalar: Dump()'); - if ($XS) { - TEST (q( - $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts], - [qw(*kennels *dogs *mutts)] ); - $d->Dumpxs; - ), - 'constructor: hash|array|scalar: Dumpxs()'); - } + TEST_BOTH(q{ + $d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts], + [qw(*kennels *dogs *mutts)] ); + $d->Dumpxs; + }, 'constructor: hash|array|scalar: Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #%kennels = %kennels; #@dogs = @dogs; #%mutts = %kennels; EOT - TEST q($d->Dump), 'object call: Dump'; - TEST q($d->Dumpxs), 'object call: Dumpxs' if $XS; + TEST_BOTH(q($d->Dumpxs), + 'object call: Dumpxs', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #%kennels = ( # First => \'Fido', # Second => \'Wags' @@ -659,14 +649,13 @@ EOT #%mutts = %kennels; EOT - TEST q($d->Reset; $d->Dump), 'Reset and Dump separate calls'; - if ($XS) { - TEST (q($d->Reset; $d->Dumpxs), 'Reset and Dumpxs separate calls'); - } + TEST_BOTH(q($d->Reset; $d->Dumpxs), + 'Reset and Dumpxs separate calls', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #@dogs = ( # 'Fido', # 'Wags', @@ -679,31 +668,22 @@ EOT #%mutts = %{$dogs[2]}; EOT - TEST (q( - $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts], - [qw(*dogs *kennels *mutts)] ); - $d->Dump; - ), - 'constructor: array|hash|scalar: Dump()'); - if ($XS) { - TEST (q( - $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts], - [qw(*dogs *kennels *mutts)] ); - $d->Dumpxs; - ), - 'constructor: array|hash|scalar: Dumpxs()'); - } + TEST_BOTH(q{ + $d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts], + [qw(*dogs *kennels *mutts)] ); + $d->Dumpxs; + }, 'constructor: array|hash|scalar: Dumpxs()', + $want); ############# ## - TEST q($d->Reset->Dump), 'Reset Dump chained'; - if ($XS) { - TEST q($d->Reset->Dumpxs), 'Reset Dumpxs chained'; - } + TEST_BOTH(q($d->Reset->Dumpxs), + 'Reset Dumpxs chained', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #@dogs = ( # 'Fido', # 'Wags', @@ -718,20 +698,11 @@ EOT #); EOT - TEST (q( - $d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] ); - $d->Deepcopy(1)->Dump; - ), - 'Deepcopy(1): Dump'); - if ($XS) { -# TEST 'q($d->Reset->Dumpxs); - TEST (q( - $d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] ); - $d->Deepcopy(1)->Dumpxs; - ), - 'Deepcopy(1): Dumpxs'); - } - + TEST_BOTH(q{ + $d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] ); + $d->Deepcopy(1)->Dumpxs; + }, 'Deepcopy(1): Dumpxs', + $want); } { @@ -741,50 +712,42 @@ $c = [ \&z ]; ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = $b; #$c = [ # $b #]; EOT -TEST (q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dump;), - 'Seen: scalar: Dump'); -TEST (q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dumpxs;), - 'Seen: scalar: Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'b' => \&z})->Dumpxs;), + 'Seen: scalar: Dumpxs', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$a = \&b; #$c = [ # \&b #]; EOT -TEST (q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dump;), - 'Seen: glob: Dump'); -TEST (q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dumpxs;), - 'Seen: glob: Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->new([\&z,$c],['a','c'])->Seen({'*b' => \&z})->Dumpxs;), + 'Seen: glob: Dumpxs', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #*a = \&b; #@c = ( # \&b #); EOT -TEST (q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dump;), - 'Seen: glob: dereference: Dump'); -TEST (q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => -\&z})->Dumpxs;), - 'Seen: glob: derference: Dumpxs') - if $XS; - + TEST_BOTH(q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dumpxs;), + 'Seen: glob: derference: Dumpxs', + $want); } { @@ -793,7 +756,7 @@ TEST (q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #@a = ( # undef, # do{my $o} @@ -801,11 +764,9 @@ TEST (q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => #$a[1] = \$a[0]; EOT -TEST (q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dump;), - 'Purity(1): dereference: Dump'); -TEST (q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dumpxs;), - 'Purity(1): dereference: Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dumpxs;), + 'Purity(1): dereference: Dumpxs', + $want); } { @@ -814,16 +775,14 @@ TEST (q(Data::Dumper->new([$a],['*a'])->Purity(1)->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = \\\\\'foo'; #$b = ${${$a}}; EOT -TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;), - 'Purity(1): not dereferenced: Dump'); -TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), - 'Purity(1): not dereferenced: Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), + 'Purity(1): not dereferenced: Dumpxs', + $want); } { @@ -832,7 +791,7 @@ TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = [ # { # a => \[ @@ -853,11 +812,9 @@ TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), #$b = ${$a->[0]{a}}; EOT -TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dump;), - 'Purity(1): Dump again'); -TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), - 'Purity(1); Dumpxs again') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), + 'Purity(1); Dumpxs again', + $want); } { @@ -867,7 +824,7 @@ TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = [ # [ # [ @@ -881,11 +838,9 @@ TEST (q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;), #$c = ${${$a->[0][0][0][0]}}; EOT -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dump;), - 'Purity(1): Dump: 3 elements'); -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;), - 'Purity(1): Dumpxs: 3 elements') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;), + 'Purity(1): Dumpxs: 3 elements', + $want); } { @@ -898,7 +853,7 @@ TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = { # b => { # c => [ @@ -912,15 +867,13 @@ TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;), #$c = $a->{b}{c}; EOT -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dump;), - 'Maxdepth(4): Dump()'); -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;), - 'Maxdepth(4): Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;), + 'Maxdepth(4): Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$a = { # b => 'HASH(0xdeadbeef)' #}; @@ -930,11 +883,9 @@ TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;), #]; EOT -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dump;), - 'Maxdepth(1): Dump()'); -TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;), - 'Maxdepth(1): Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;), + 'Maxdepth(1): Dumpxs()', + $want); } { @@ -943,46 +894,41 @@ TEST (q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$b = [ # \$b->[0] #]; EOT -TEST (q(Data::Dumper->new([$b],['b'])->Purity(0)->Dump;), - 'Purity(0): Dump()'); -TEST (q(Data::Dumper->new([$b],['b'])->Purity(0)->Dumpxs;), - 'Purity(0): Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$b],['b'])->Purity(0)->Dumpxs;), + 'Purity(0): Dumpxs()', + $want); ############# ## - $WANT = <<'EOT'; + $want = <<'EOT'; #$b = [ # \do{my $o} #]; #${$b->[0]} = $b->[0]; EOT - -TEST (q(Data::Dumper->new([$b],['b'])->Purity(1)->Dump;), - 'Purity(1): Dump()'); -TEST (q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;), - 'Purity(1): Dumpxs') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;), + 'Purity(1): Dumpxs', + $want); } { $a = "\x{09c10}"; ############# ## XS code was adding an extra \0 - $WANT = <<'EOT'; + my $want = <<'EOT'; #$a = "\x{9c10}"; EOT - TEST q(Data::Dumper->Dump([$a], ['a'])), "\\x{9c10}"; - TEST q(Data::Dumper->Dumpxs([$a], ['a'])), "XS \\x{9c10}" - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([$a], ['a'])), + "\\x{9c10}", + $want); } { @@ -991,7 +937,7 @@ EOT ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = { # III => 1, # JJJ => 2, @@ -1005,11 +951,9 @@ EOT #}; EOT -TEST (q(Data::Dumper->new([$a])->Dump;), - 'basic test without names: Dump()'); -TEST (q(Data::Dumper->new([$a])->Dumpxs;), - 'basic test without names: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->new([$a])->Dumpxs;), + 'basic test without names: Dumpxs()', + $want); } { @@ -1023,7 +967,7 @@ TEST (q(Data::Dumper->new([$a])->Dumpxs;), ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = { # 14 => 'QQQ', # 13 => 'PPP', @@ -1037,9 +981,9 @@ TEST (q(Data::Dumper->new([$a])->Dumpxs;), #}; EOT -TEST q(Data::Dumper->new([$c])->Dump;), "sortkeys sub"; -TEST q(Data::Dumper->new([$c])->Dumpxs;), "sortkeys sub (XS)" - if $XS; + TEST_BOTH(q(Data::Dumper->new([$c])->Dumpxs;), + "sortkeys sub", + $want); } { @@ -1057,7 +1001,7 @@ TEST q(Data::Dumper->new([$c])->Dumpxs;), "sortkeys sub (XS)" ############# ## - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = [ # { # 6 => 'III', @@ -1084,11 +1028,12 @@ TEST q(Data::Dumper->new([$c])->Dumpxs;), "sortkeys sub (XS)" #]; EOT -TEST q(Data::Dumper->new([[$c, $d]])->Dump;), "more sortkeys sub"; -# the XS code does number values as strings -$WANT =~ s/ (\d+)(,?)$/ '$1'$2/gm; -TEST q(Data::Dumper->new([[$c, $d]])->Dumpxs;), "more sortkeys sub (XS)" - if $XS; + # the XS code does number values as strings + my $want_xs = $want; + $want_xs =~ s/ (\d+)(,?)$/ '$1'$2/gm; + TEST_BOTH(q(Data::Dumper->new([[$c, $d]])->Dumpxs;), + "more sortkeys sub", + $want, $want_xs); } { @@ -1358,16 +1303,16 @@ if ($XS) { $a = "1\n"; ############# ## Perl code was using /...$/ and hence missing the \n. - $WANT = <<'EOT'; + my $want = <<'EOT'; my $VAR1 = '42 '; EOT # Can't pad with # as the output has an embedded newline. local $Data::Dumper::Pad = "my "; - TEST q(Data::Dumper->Dump(["42\n"])), "number with trailing newline"; - TEST q(Data::Dumper->Dumpxs(["42\n"])), "XS number with trailing newline" - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs(["42\n"])), + "number with trailing newline", + $want); } { @@ -1387,7 +1332,7 @@ EOT ); ############# ## Perl code flips over at 10 digits. - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = 999999999; #$VAR2 = '1000000000'; #$VAR3 = '9999999999'; @@ -1402,13 +1347,8 @@ EOT #$VAR12 = '-2147483649'; EOT - TEST q(Data::Dumper->Dump(\@a)), "long integers"; - - if ($XS) { ## XS code flips over at 11 characters ("-" is a char) or larger than int. - if (~0 == 0xFFFFFFFF) { - # 32 bit system - $WANT = <<'EOT'; + my $want_xs = ~0 == 0xFFFFFFFF ? << 'EOT32' : << 'EOT64'; #$VAR1 = 999999999; #$VAR2 = 1000000000; #$VAR3 = '9999999999'; @@ -1421,9 +1361,7 @@ EOT #$VAR10 = '4294967296'; #$VAR11 = '-2147483648'; #$VAR12 = '-2147483649'; -EOT - } else { - $WANT = <<'EOT'; +EOT32 #$VAR1 = 999999999; #$VAR2 = 1000000000; #$VAR3 = 9999999999; @@ -1436,58 +1374,57 @@ EOT #$VAR10 = 4294967296; #$VAR11 = '-2147483648'; #$VAR12 = '-2147483649'; -EOT - } - TEST q(Data::Dumper->Dumpxs(\@a)), "XS long integers"; - } +EOT64 + + TEST_BOTH(q(Data::Dumper->Dumpxs(\@a)), + "long integers", + $want, $want_xs); } { - $b = "Bad. XS didn't escape dollar sign"; + $b = "Bad. XS didn't escape dollar sign"; ############# # B6 is chosen because it is UTF-8 variant on ASCII and all 3 EBCDIC # platforms that Perl currently purports to work on. It also is the only # such code point that has the same meaning on all 4, the paragraph sign. - $WANT = <<"EOT"; # Careful. This is '' string written inside "" here doc + my $want = <<"EOT"; # Careful. This is '' string written inside "" here doc #\$VAR1 = '\$b\"\@\\\\\xB6'; EOT $a = "\$b\"\@\\\xB6\x{100}"; chop $a; - TEST q(Data::Dumper->Dump([$a])), "utf8 flag with \" and \$"; - if ($XS) { - $WANT = <<'EOT'; # While this is "" string written inside "" here doc + my $want_xs = <<'EOT'; # While this is "" string written inside "" here doc #$VAR1 = "\$b\"\@\\\x{b6}"; EOT - TEST q(Data::Dumper->Dumpxs([$a])), "XS utf8 flag with \" and \$"; - } + TEST_BOTH(q(Data::Dumper->Dumpxs([$a])), + "XS utf8 flag with \" and \$", + $want, $want_xs); + # XS used to produce "$b\"' which is 4 chars, not 3. [ie wrongly qq(\$b\\\")] ############# - $WANT = <<'EOT'; + $want = <<'EOT'; #$VAR1 = '$b"'; EOT $a = "\$b\"\x{100}"; chop $a; - TEST q(Data::Dumper->Dump([$a])), "utf8 flag with \" and \$"; - if ($XS) { - TEST q(Data::Dumper->Dumpxs([$a])), "XS utf8 flag with \" and \$"; - } + TEST_BOTH(q(Data::Dumper->Dumpxs([$a])), + "XS utf8 flag with \" and \$", + $want); # XS used to produce 'D'oh!' which is well, D'oh! # Andreas found this one, which in turn discovered the previous two. ############# - $WANT = <<'EOT'; + $want = <<'EOT'; #$VAR1 = 'D\'oh!'; EOT $a = "D'oh!\x{100}"; chop $a; - TEST q(Data::Dumper->Dump([$a])), "utf8 flag with '"; - if ($XS) { - TEST q(Data::Dumper->Dumpxs([$a])), "XS utf8 flag with '"; - } + TEST_BOTH(q(Data::Dumper->Dumpxs([$a])), + "XS utf8 flag with '", + $want); } # Jarkko found that -Mutf8 caused some tests to fail. Turns out that there @@ -1495,7 +1432,7 @@ EOT # 1 { - $WANT = <<'EOT'; + my $want = <<'EOT'; #$ping = \*::ping; #*::ping = \5; #*::ping = { @@ -1509,11 +1446,9 @@ EOT $ping = 5; %ping = (chr (0xDECAF) x 4 =>\$ping); for $Data::Dumper::Sortkeys (0, 1) { - TEST (q(Data::Dumper->Dump([\\*ping, \\%ping], ['*ping', '*pong'])), - "utf8: Purity 1: Sortkeys: Dump()"); - TEST (q(Data::Dumper->Dumpxs([\\*ping, \\%ping], ['*ping', '*pong'])), - "utf8: Purity 1: Sortkeys: Dumpxs()") - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\*ping, \\%ping], ['*ping', '*pong'])), + "utf8: Purity 1: Sortkeys: Dumpxs()", + $want); } } @@ -1521,7 +1456,7 @@ EOT # scalars { - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = { # perl => 'rocks' #}; @@ -1531,13 +1466,13 @@ EOT chop $k; %foo = ($k => 'rocks'); - TEST q(Data::Dumper->Dump([\\%foo])), "quotekeys == 0 for utf8 flagged ASCII"; - TEST q(Data::Dumper->Dumpxs([\\%foo])), - "XS quotekeys == 0 for utf8 flagged ASCII" if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\\%foo])), + "quotekeys == 0 for utf8 flagged ASCII", + $want); } ############# { - $WANT = <<'EOT'; + my $want = <<'EOT'; #$VAR1 = [ # undef, # undef, @@ -1546,8 +1481,9 @@ EOT EOT @foo = (); $foo[2] = 1; - TEST q(Data::Dumper->Dump([\@foo])), 'Richard Clamp, Message-Id: <20030104005247.GA27685@mirth.demon.co.uk>: Dump()'; - TEST q(Data::Dumper->Dumpxs([\@foo])), 'Richard Clamp, Message-Id: <20030104005247.GA27685@mirth.demon.co.uk>: Dumpxs()'if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\@foo])), + 'Richard Clamp, Message-Id: <20030104005247.GA27685@mirth.demon.co.uk>: Dumpxs()', + $want); } ############# @@ -1637,7 +1573,7 @@ EOT # at least not consistent, as it had \v65.66.67, but the code at the time # generated \65.66.77 (no v). Now fixed. my $ABC_native = chr(65) . chr(66) . chr(67); - $WANT = $XS ? <<"VSTRINGS_CORRECT" : <<"NO_vstring_HELPER"; + my $want = $XS ? <<"VSTRINGS_CORRECT" : <<"NO_vstring_HELPER"; #\$a = \\v65.66.67; #\$b = \\v65.66.067; #\$c = \\v65.66.6_7; @@ -1656,14 +1592,12 @@ NO_vstring_HELPER \~v190.189.188 ); if ($] >= 5.010) { - TEST q(Data::Dumper->Dump(\@::_v, [qw(a b c d)])), 'vstrings'; - TEST q(Data::Dumper->Dumpxs(\@::_v, [qw(a b c d)])), 'xs vstrings' - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs(\@::_v, [qw(a b c d)])), + 'vstrings', + $want); } else { # Skip tests before 5.10. vstrings considered funny before - SKIP_TEST "vstrings considered funny before 5.10.0"; - SKIP_TEST "vstrings considered funny before 5.10.0 (XS)" - if $XS; + SKIP_BOTH("vstrings considered funny before 5.10.0"); } } @@ -1685,35 +1619,31 @@ EOW ############# { # [perl #74798] uncovered behaviour - $WANT = <<'EOW'; + my $want = <<'EOW'; #$VAR1 = "\0000"; EOW local $Data::Dumper::Useqq = 1; - TEST q(Data::Dumper->Dump(["\x000"])), - "\\ octal followed by digit"; - TEST q(Data::Dumper->Dumpxs(["\x000"])), '\\ octal followed by digit (xs)' - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs(["\x000"])), + "\\ octal followed by digit", + $want); - $WANT = <<'EOW'; + $want = <<'EOW'; #$VAR1 = "\x{100}\0000"; EOW local $Data::Dumper::Useqq = 1; - TEST q(Data::Dumper->Dump(["\x{100}\x000"])), - "\\ octal followed by digit unicode"; - TEST q(Data::Dumper->Dumpxs(["\x{100}\x000"])), '\\ octal followed by digit unicode (xs)' - if $XS; - + TEST_BOTH(q(Data::Dumper->Dumpxs(["\x{100}\x000"])), + "\\ octal followed by digit unicode", + $want); - $WANT = <<'EOW'; + $want = <<'EOW'; #$VAR1 = "\0\x{660}"; EOW - TEST q(Data::Dumper->Dump(["\\x00\\x{0660}"])), - "\\ octal followed by unicode digit"; - TEST q(Data::Dumper->Dumpxs(["\\x00\\x{0660}"])), '\\ octal followed by unicode digit (xs)' - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs(["\\x00\\x{0660}"])), + "\\ octal followed by unicode digit", + $want); # [perl #118933 - handling of digits -$WANT = <<'EOW'; + $want = <<'EOW'; #$VAR1 = 0; #$VAR2 = 1; #$VAR3 = 90; @@ -1722,23 +1652,19 @@ $WANT = <<'EOW'; #$VAR6 = 112345678; #$VAR7 = "1234567890"; EOW - TEST q(Data::Dumper->Dump([0, 1, 90, -10, "010", "112345678", "1234567890" ])), - "numbers and number-like scalars"; - - TEST q(Data::Dumper->Dumpxs([0, 1, 90, -10, "010", "112345678", "1234567890" ])), - "numbers and number-like scalars" - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([0, 1, 90, -10, "010", "112345678", "1234567890" ])), + "numbers and number-like scalars", + $want); } ############# { # [github #18614 - handling of Unicode characters in regexes] # [github #18764 - ... without breaking subsequent Latin-1] if ($] lt '5.010') { - SKIP_TEST "Incomplete support for UTF-8 in old perls"; - SKIP_TEST "Incomplete support for UTF-8 in old perls"; + SKIP_BOTH("Incomplete support for UTF-8 in old perls"); last; } -$WANT = <<"EOW"; + my $want = <<"EOW"; #\$VAR1 = [ # "\\x{41f}", # qr/\x{8b80}/, @@ -1748,26 +1674,24 @@ $WANT = <<"EOW"; #]; EOW if ($] lt '5.010001') { - $WANT =~ s!qr/!qr/(?-xism:!g; - $WANT =~ s!/,!)/,!g; + $want =~ s!qr/!qr/(?-xism:!g; + $want =~ s!/,!)/,!g; } elsif ($] gt '5.014') { - $WANT =~ s{/(,?)$}{/u$1}mg; + $want =~ s{/(,?)$}{/u$1}mg; } - TEST qq(Data::Dumper->Dump([ [qq/\x{41f}/, qr/\x{8b80}/, qr/\x{41f}/, qr/\x{e4}/, "\xE4"] ])), - "string with Unicode + regexp with Unicode"; - - $WANT =~ s/'\xE4'/"\\x{e4}"/; - $WANT =~ s<([^\0-\177])> <sprintf '\\x{%x}', ord $1>ge; - TEST qq(Data::Dumper->Dumpxs([ [qq/\x{41f}/, qr/\x{8b80}/, qr/\x{41f}/, qr/\x{e4}/, "\xE4"] ])), - "string with Unicode + regexp with Unicode, XS" - if $XS; + my $want_xs = $want; + $want_xs =~ s/'\xE4'/"\\x{e4}"/; + $want_xs =~ s<([^\0-\177])> <sprintf '\\x{%x}', ord $1>ge; + TEST_BOTH(qq(Data::Dumper->Dumpxs([ [qq/\x{41f}/, qr/\x{8b80}/, qr/\x{41f}/, qr/\x{e4}/, "\xE4"] ])), + "string with Unicode + regexp with Unicode", + $want, $want_xs); } ############# { # [more perl #58608 tests] my $bs = "\\\\"; - $WANT = <<"EOW"; + my $want = <<"EOW"; #\$VAR1 = [ # qr/ \\/ /, # qr/ \\?\\/ /, @@ -1780,25 +1704,22 @@ EOW #]; EOW if ($] lt '5.010001') { - $WANT =~ s!qr/!qr/(?-xism:!g; - $WANT =~ s! /! )/!g; + $want =~ s!qr/!qr/(?-xism:!g; + $want =~ s! /! )/!g; } - TEST qq(Data::Dumper->Dump([ [qr! / !, qr! \\?/ !, qr! $bs/ !, qr! $bs:/ !, qr! \\?$bs:/ !, qr! $bs$bs/ !, qr! $bs$bs:/ !, qr! $bs$bs$bs/ !, ] ])), - "more perl #58608"; - TEST qq(Data::Dumper->Dump([ [qr! / !, qr! \\?/ !, qr! $bs/ !, qr! $bs:/ !, qr! \\?$bs:/ !, qr! $bs$bs/ !, qr! $bs$bs:/ !, qr! $bs$bs$bs/ !, ] ])), - "more perl #58608 XS" - if $XS; + TEST_BOTH(qq(Data::Dumper->Dumpxs([ [qr! / !, qr! \\?/ !, qr! $bs/ !, qr! $bs:/ !, qr! \\?$bs:/ !, qr! $bs$bs/ !, qr! $bs$bs:/ !, qr! $bs$bs$bs/ !, ] ])), + "more perl #58608", + $want); } ############# { # [github #18614, github #18764, perl #58608 corner cases] if ($] lt '5.010') { - SKIP_TEST "Incomplete support for UTF-8 in old perls"; - SKIP_TEST "Incomplete support for UTF-8 in old perls"; + SKIP_BOTH("Incomplete support for UTF-8 in old perls"); last; } my $bs = "\\\\"; - $WANT = <<"EOW"; + my $want = <<"EOW"; #\$VAR1 = [ # "\\x{2e18}", # qr/ \x{203d}\\/ /, @@ -1808,49 +1729,45 @@ EOW #]; EOW if ($] lt '5.010001') { - $WANT =~ s!qr/!qr/(?-xism:!g; - $WANT =~ s!/,!)/,!g; + $want =~ s!qr/!qr/(?-xism:!g; + $want =~ s!/,!)/,!g; } elsif ($] gt '5.014') { - $WANT =~ s{/(,?)$}{/u$1}mg; + $want =~ s{/(,?)$}{/u$1}mg; } - TEST qq(Data::Dumper->Dump([ [ '\x{2e18}', qr! \x{203d}/ !, qr! \\\x{203d}/ !, qr! \\\x{203d}$bs:/ !, "\xa3"] ])), - "github #18614, github #18764, perl #58608 corner cases"; - - $WANT =~ s/'\x{A3}'/"\\x{a3}"/; - $WANT =~ s/\x{203D}/\\x{203d}/g; - TEST qq(Data::Dumper->Dumpxs([ [ '\x{2e18}', qr! \x{203d}/ !, qr! \\\x{203d}/ !, qr! \\\x{203d}$bs:/ !, "\xa3"] ])), - "github #18614, github #18764, perl #58608 corner cases XS" - if $XS; + my $want_xs = $want; + $want_xs =~ s/'\x{A3}'/"\\x{a3}"/; + $want_xs =~ s/\x{203D}/\\x{203d}/g; + TEST_BOTH(qq(Data::Dumper->Dumpxs([ [ '\x{2e18}', qr! \x{203d}/ !, qr! \\\x{203d}/ !, qr! \\\x{203d}$bs:/ !, "\xa3"] ])), + "github #18614, github #18764, perl #58608 corner cases", + $want, $want_xs); } ############# { # [perl #82948] # re::regexp_pattern was moved to universal.c in v5.10.0-252-g192c1e2 # and apparently backported to maint-5.10 - $WANT = $] > 5.010 ? <<'NEW' : <<'OLD'; + my $want = $] > 5.010 ? <<'NEW' : <<'OLD'; #$VAR1 = qr/abc/; #$VAR2 = qr/abc/i; NEW #$VAR1 = qr/(?-xism:abc)/; #$VAR2 = qr/(?i-xsm:abc)/; OLD - TEST q(Data::Dumper->Dump([ qr/abc/, qr/abc/i ])), "qr//"; - TEST q(Data::Dumper->Dumpxs([ qr/abc/, qr/abc/i ])), "qr// xs" - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([ qr/abc/, qr/abc/i ])), "qr// xs", $want); } ############# { sub foo {} - $WANT = <<'EOW'; + my $want = <<'EOW'; #*a = sub { "DUMMY" }; #$b = \&a; EOW - TEST q(Data::Dumper->new([ \&foo, \\&foo ], [ "*a", "b" ])->Dump), "name of code in *foo"; - TEST q(Data::Dumper->new([ \&foo, \\&foo ], [ "*a", "b" ])->Dumpxs), "name of code in *foo xs" - if $XS; + TEST_BOTH(q(Data::Dumper->new([ \&foo, \\&foo ], [ "*a", "b" ])->Dumpxs), + "name of code in *foo", + $want); } ############# @@ -1887,7 +1804,8 @@ EOT "foo", "\1bar", "L\x{e9}on", "m\x{100}cron", "snow\x{2603}"; } -$WANT = change_glob_expectation(<<'EOT'); +{ + my $want = change_glob_expectation(<<'EOT'); #$globs = [ # *::foo, # \*::foo, @@ -1911,20 +1829,18 @@ $WANT = change_glob_expectation(<<'EOT'); # \*{"s::snow\x{2603}"} #]; EOT -{ local $Data::Dumper::Useqq = 1; if (ord("A") == 65) { - TEST (q(Data::Dumper->Dump([\@globs], ["globs"])), 'globs: Dump()'); - TEST (q(Data::Dumper->Dumpxs([\@globs], ["globs"])), 'globs: Dumpxs()') - if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([\@globs], ["globs"])), 'globs: Dumpxs()', + $want); } else { - SKIP_TEST "ASCII-dependent test"; - SKIP_TEST "ASCII-dependent test"; + SKIP_BOTH("ASCII-dependent test"); } } ############# -$WANT = change_glob_expectation(<<'EOT'); +{ + my $want = change_glob_expectation(<<'EOT'); #$v = { # a => \*::ppp, # b => \*{'::a/b'}, @@ -1940,7 +1856,6 @@ $WANT = change_glob_expectation(<<'EOT'); # c => 5 #}; EOT -{ *ppp = { a => 1 }; { no strict 'refs'; @@ -1949,10 +1864,12 @@ EOT $v = { a => \*ppp, b => \*{"a/b"}, c => \*{"a\x{2603}b"} }; } local $Data::Dumper::Purity = 1; - TEST (q(Data::Dumper->Dump([$v], ["v"])), 'glob purity: Dump()'); - TEST (q(Data::Dumper->Dumpxs([$v], ["v"])), 'glob purity: Dumpxs()') if $XS; - $WANT =~ tr/'/"/; + TEST_BOTH(q(Data::Dumper->Dumpxs([$v], ["v"])), + 'glob purity: Dumpxs()', + $want); + $want =~ tr/'/"/; local $Data::Dumper::Useqq = 1; - TEST (q(Data::Dumper->Dump([$v], ["v"])), 'glob purity, useqq: Dump()'); - TEST (q(Data::Dumper->Dumpxs([$v], ["v"])), 'glob purity, useqq: Dumpxs()') if $XS; + TEST_BOTH(q(Data::Dumper->Dumpxs([$v], ["v"])), + 'glob purity, useqq: Dumpxs()', + $want); } |