Skip Menu | You are currently an anonymous guest. | Login | Return to Main | About rt.cpan.org
 

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.

X Report information
Id: 3029
Status: open
Left: 0 min
Priority: 0/0
Queue: Test-Differences

Owner: Nobody
Requestors: MARKSTOS <MARKSTOS [...] cpan.org>
Cc:
AdminCc:

Severity: Normal
Broken in: 0.47
Fixed in: (no value)

X Attachments
test-differences-quoted-nums.patch




X History Display mode: Brief headersFull headers
#   Thu Jul 24 10:01:08 2003 guest - Ticket created  
Subject: bug when comparing numerical hash values
[text/plain 519b]
This bug report centers around this test output I received:

# * 5| order_id => 127 | order_id => '127' *

These two values should compare to the be same, not different. In fact, I don't think I stick '127' in a Perl hash and have it come out '127', it will always come out without the quotes, as just 127.

I also testing the same stuctures with Test::More::is_deeply. With that test, the values were found to be equal.

Perhaps you could see what is_deeply() is doing differently here.


#   Mon Dec 20 22:09:46 2004 guest - Correspondence added  
From: MARKSTOS[...]cpan.org
[text/plain 1k]
[guest - Thu Jul 24 10:01:08 2003]:

> This bug report centers around this test output I received:
>
> # * 5| order_id => 127 | order_id => '127'
> *
>
> These two values should compare to the be same, not different. In
> fact, I don't think I stick '127' in a Perl hash and have it come out
> '127', it will always come out without the quotes, as just 127.
>
> I also testing the same stuctures with Test::More::is_deeply. With
> that test, the values were found to be equal.
>
> Perhaps you could see what is_deeply() is doing differently here.
>


I have a patch and test case which fixes this for simple hashref
comparisons. These are now done inside of Test::Differences.

I think, but did not verify, that more complex cases will still have
this problem, because they are handled by Data::Dumper.

There is probably an easy workaround there to look for strings that look
like numbers and strip off quotes around them if there are any.

If you give me some feedback on this patch, maybe I'll be motivated to
work on that as well. :)

Mark
[text/x-patch 4.1k]
diff -rbNu Test-Differences-0.47/Differences.pm Test-Differences-0.47-modified/Differences.pm
--- Test-Differences-0.47/Differences.pm Mon Jun 16 12:26:37 2003
+++ Test-Differences-0.47-modified/Differences.pm Mon Dec 20 21:57:03 2004
@@ -200,7 +200,7 @@

=cut

-$VERSION = 0.47;
+$VERSION = 0.48;

use Exporter;

@@ -226,6 +226,7 @@
use constant ARRAY_of_scalars => "ARRAY of scalars";
use constant ARRAY_of_ARRAYs_of_scalars => "ARRAY of ARRAYs of scalars";
use constant ARRAY_of_HASHes_of_scalars => "ARRAY of HASHes of scalars";
+use constant HASH_of_scalars => "HASH of scalars";


sub _grok_type {
@@ -241,6 +242,11 @@
unless grep _isnt_HASH_of_scalars, @$_;
return 0;
}
+ elsif (ref eq 'HASH') {
+ return HASH_of_scalars
+ unless _isnt_HASH_of_scalars($_);
+ return 0;
+ }
}


@@ -254,15 +260,22 @@
croak "Can't flatten $_" unless $type ;

## Copy the top level array so we don't trash the originals
- my @recs = @$_;
+ my (@recs, %hash_copy);
+ if (ref $_ eq 'ARRAY') {
+ @recs = @$_;
+ }
+ elsif (ref $_ eq 'HASH') {
+ %hash_copy = %$_;
+ }
+ else {
+ die "unsupported ref type";
+ }

if ( $type eq ARRAY_of_ARRAYs_of_scalars ) {
## Also copy the inner arrays if need be
$_ = [ @$_ ] for @recs;
}
-
-
- if ( $type eq ARRAY_of_HASHes_of_scalars ) {
+ elsif ( $type eq ARRAY_of_HASHes_of_scalars ) {
my %headings;
for my $rec ( @recs ) {
$headings{$_} = 1 for keys %$rec;
@@ -278,6 +291,11 @@

$type = ARRAY_of_ARRAYs_of_scalars;
}
+ elsif ($type eq HASH_of_scalars) {
+ my @headings = sort keys %hash_copy;
+ @recs = (\@headings, [map $hash_copy{$_}, @headings ]);
+ $type = ARRAY_of_ARRAYs_of_scalars;
+ }

if ( $type eq ARRAY_of_ARRAYs_of_scalars ) {
## Convert undefs
@@ -290,6 +308,7 @@
}

return \@recs;
+
}


@@ -339,6 +358,7 @@

my $dump_it = !$types[0] || !$types[1];

+ my ($got,$expected);
if ( $dump_it ) {
require Data::Dumper;
local $Data::Dumper::Indent = 1;
@@ -347,12 +367,12 @@
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Deepcopy = 1;
local $Data::Dumper::Quotekeys = 0;
- @vals = map
+ ($got,$expected) = map
[ split /^/, Data::Dumper::Dumper( $_ ) ],
@vals;
}
else {
- @vals = (
+ ($got,$expected)= (
_flatten( $types[0], $vals[0] ),
_flatten( $types[1], $vals[1] )
);
@@ -360,8 +380,8 @@

my $caller = caller;

- my $passed = join( $joint, @{$vals[0]} ) eq
- join( $joint, @{$vals[1]} );
+ my $passed = join( $joint, @{$got} ) eq
+ join( $joint, @{$expected} );

my $diff;
unless ( $passed ) {
@@ -370,13 +390,13 @@
$context = $options->{context}
if exists $options->{context};

- $context = $dump_it ? 2**31 : grep( @$_ > 25, @vals ) ? 3 : 25
+ $context = $dump_it ? 2**31 : grep( @$_ > 25, $got,$expected ) ? 3 : 25
unless defined $context;

confess "context must be an integer: '$context'\n"
unless $context =~ /\A\d+\z/;

- $diff = diff @vals, {
+ $diff = diff $got,$expected, {
CONTEXT => $context,
STYLE => "Table",
FILENAME_A => "Got",
diff -rbNu Test-Differences-0.47/MANIFEST Test-Differences-0.47-modified/MANIFEST
--- Test-Differences-0.47/MANIFEST Mon May 13 08:49:12 2002
+++ Test-Differences-0.47-modified/MANIFEST Mon Dec 20 20:57:30 2004
@@ -11,3 +11,4 @@
t/10test.t
t/20test_more.t
t/99example.t
+t/quoted_numbers_bug.t
diff -rbNu Test-Differences-0.47/t/quoted_numbers_bug.t Test-Differences-0.47-modified/t/quoted_numbers_bug.t
--- Test-Differences-0.47/t/quoted_numbers_bug.t Wed Dec 31 19:00:00 1969
+++ Test-Differences-0.47-modified/t/quoted_numbers_bug.t Mon Dec 20 20:59:21 2004
@@ -0,0 +1,8 @@
+
+use Test::More tests => 2;
+
+BEGIN {
+ use_ok('Test::Differences');
+}
+
+eq_or_diff({a => 1},{a => '1'}, "quoted and non-quoted numbers should be treated the same");

#   Fri Aug 01 04:49:31 2008 OVID - Correspondence added  
[text/plain 76b]
The "numeric hash value" patch has been applied as of 0.49_01.

Cheers,
Ovid
#   Fri Aug 01 04:49:36 2008 RT_System - Status changed from 'new' to 'open'  
#   Fri Aug 01 04:49:36 2008 OVID - Status changed from 'open' to 'resolved'  
#   Mon Aug 04 04:12:49 2008 OVID - Correspondence added  
[text/plain 1.5k]
On Mon Dec 20 22:09:46 2004, guest wrote:
> [guest - Thu Jul 24 10:01:08 2003]:
>
> > This bug report centers around this test output I received:
> >
> > # * 5| order_id => 127 | order_id => '127'
> > *
> >
> > These two values should compare to the be same, not different. In
> > fact, I don't think I stick '127' in a Perl hash and have it come out
> > '127', it will always come out without the quotes, as just 127.

I'm reopening this. This patch causes a nasty regression, rendering
Test::Differences almost useless:

use Test::More 'no_plan';
use Test::Differences;
diag $Test::Differences::VERSION;

eq_or_diff { foo => 1 }, { foo => 1 }, 'oops!';
eq_or_diff [ { foo => 1 } ], { foo => 1 }, 'oops!';

Before the patch:

eq_or_diff......# 0.4801

ok 1 - oops!
not ok 2 - oops!

# Failed test 'oops!'
# at eq_or_diff.t line 13.
# +----+--------------+----+------------+
# | Elt|Got | Elt|Expected |
# +----+--------------+----+------------+
# * 0|[ * 0|{ *
# * 1| { * 1| foo => 1 *
# * 2| foo => 1 * 2|} *
# * 3| } * | |
# * 4|] * | |
# +----+--------------+----+------------+
1..2
# Looks like you failed 1 test of 2.

After the patch:

eq_or_diff......# 0.49_01

ok 1 - oops!
ok 2 - oops!
1..2
ok
All tests successful.
Files=1, Tests=2, 0 wallclock secs ( 0.01 usr 0.01 sys + 0.04 cusr
0.01 csys = 0.07 CPU)
Result: PASS

Cheers,
Ovid

#   Mon Aug 04 04:12:52 2008 RT_System - Status changed from 'resolved' to 'open'