cmp_ok
skip todo todo_skip
pass fail
- eq_array eq_hash eq_set
+ eq_array eq_hash eq_set eq_deeply
$TODO
plan
can_ok isa_ok
my($this, $that, $name) = @_;
my $ok;
- if( !ref $this || !ref $that ) {
+ if( !ref $this && !ref $that ) {
$ok = $Test->is_eq($this, $that, $name);
}
else {
foreach my $idx (0..$#vals) {
my $val = $vals[$idx];
$vals[$idx] = !defined $val ? 'undef' :
- $val eq $DNE ? "Does not exist"
- : "'$val'";
+ ref $val ? $val eq $DNE ? "Does not exist"
+ : $val
+ : "'$val'"
}
$out .= "$vars[0] = $vals[0]\n";
return $out;
}
+sub eq_deeply {
+ my ($a1, $a2) = @_;
+
+ local @Data_Stack = ();
+ return _deep_check($a1, $a2);
+}
=item B<eq_array>
=cut
#'#
-sub eq_array {
+
+sub eq_array {
+ my ($a1, $a2) = @_;
+
+ return UNIVERSAL::isa($a2, "ARRAY") ? eq_deeply($a1, $a2) : 0;
+}
+
+sub _eq_array {
my($a1, $a2) = @_;
return 1 if $a1 eq $a2;
# Quiet uninitialized value warnings when comparing undefs.
local $^W = 0;
- if( $e1 eq $e2 ) {
+ if( ! (ref $e1 xor ref $e2) and $e1 eq $e2 ) {
$ok = 1;
}
else {
- if( UNIVERSAL::isa($e1, 'ARRAY') and
+ if ( (ref $e1 and $e1 eq $DNE) or
+ (ref $e2 and $e2 eq $DNE) )
+ {
+ $ok = 0;
+ }
+ elsif( UNIVERSAL::isa($e1, 'ARRAY') and
UNIVERSAL::isa($e2, 'ARRAY') )
{
- $ok = eq_array($e1, $e2);
+ $ok = _eq_array($e1, $e2);
}
elsif( UNIVERSAL::isa($e1, 'HASH') and
UNIVERSAL::isa($e2, 'HASH') )
{
- $ok = eq_hash($e1, $e2);
+ $ok = _eq_hash($e1, $e2);
}
elsif( UNIVERSAL::isa($e1, 'REF') and
UNIVERSAL::isa($e2, 'REF') )
{
push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
$ok = _deep_check($$e1, $$e2);
+ pop @Data_Stack if $ok;
}
else {
push @Data_Stack, { vals => [$e1, $e2] };
=cut
sub eq_hash {
+ my ($a1, $a2) = @_;
+
+ return UNIVERSAL::isa($a2, "HASH") ? eq_deeply($a1, $a2) : 0;
+}
+
+sub _eq_hash {
my($a1, $a2) = @_;
return 1 if $a1 eq $a2;
}
}
-use Test::More tests => 41;
+use Test::More tests => 42;
# Make sure we don't mess with $@ or $!. Test at bottom.
my $Err = "this should not be touched";
ok( eq_set([qw(this that whatever)], [qw(that whatever this)]),
'eq_set with simple sets' );
+eq_array([[]], [{}]);
+is(scalar @Test::More::Data_Stack, 0, "data stack empty");
+
my @complex_array1 = (
[qw(this that whatever)],
{foo => 23, bar => 42},
like( $err, <<ERR, ' right diagnostic' );
# Failed test \\($Filename at line 78\\)
# Structures begin differing at:
-# \\\$got = 'HASH\\(0x[0-9a-f]+\\)'
-# \\\$expected = 'ARRAY\\(0x[0-9a-f]+\\)'
+# \\\$got = HASH\\(0x[0-9a-f]+\\)
+# \\\$expected = ARRAY\\(0x[0-9a-f]+\\)
ERR
#line 88
like( $err, <<ERR, ' right diagnostic' );
# Failed test \\($Filename at line 151\\)
# Structures begin differing at:
-# \\\$got = 'ARRAY\\(0x[0-9a-f]+\\)'
-# \\\$expected = 'SCALAR\\(0x[0-9a-f]+\\)'
+# \\\$got = ARRAY\\(0x[0-9a-f]+\\)
+# \\\$expected = SCALAR\\(0x[0-9a-f]+\\)
ERR
# \$got->{that}{foo} = Does not exist
# \$expected->{that}{foo} = '42'
ERR
+
+#line 217
+is_deeply([(\"a"), "b"], [(\"a"), "c"], "scalar refs diag");
+is( $out, "not ok 12 - scalar refs diag\n", 'scalar refs diag' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test ($0 at line 217)
+# Structures begin differing at:
+# \$got->[1] = 'b'
+# \$expected->[1] = 'c'
+ERR
+
+#line 228
+my $a = [];
+is_deeply($a, $a."", "mixed ref and stringified ref");
+is( $out, "not ok 13 - mixed ref and stringified ref\n", 'mixed ref and stringified ref' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test ($0 at line 229)
+# Structures begin differing at:
+# \$got = $a
+# \$expected = '$a'
+ERR
+
+#line 238
+my $b = [];
+is_deeply({}, {key => $b}, "Does Not Exist");
+is( $out, "not ok 14 - Does Not Exist\n", 'Does Not Exist' );
+is( $err, <<ERR, ' right diagnostic' );
+# Failed test ($0 at line 239)
+# Structures begin differing at:
+# \$got->{key} = Does not exist
+# \$expected->{key} = $b
+ERR