Great, thanks Adrian. That sounds exactly like what we're looking for. Alain
> -----Original Message----- > From: Adrian Howard [mailto:[EMAIL PROTECTED] > Sent: May 16, 2007 7:26 PM > To: [email protected]; Desilets, Alain > Cc: Farley, Benoit > Subject: Re: [Perlunit-users] Comparing deeply nested data structures. > > > On 16 May 2007, at 18:17, Desilets, Alain wrote: > [snip] > > I want to easily compare the output of that method to > expected output, > > and if the two differ, get a good diagnostic message that describes > > exactly how the two differ. > [snip] > > Is there something in Perl that would allow me to do this? > > In Test::Unit there's assert_deep_equals() - for example: > > sub test_using_assert_deep_equals { > my $self = shift; > $self->assert_deep_equals( > [ { hello =>1}, { world => 1 } ], > [ { hello =>1}, { earth => 1 } ] > ); > } > > that gives you a diagnostic like > > 1) /Users/adrianh/Desktop/test.pl:53 - test_using_assert_deep_equals > (Comparison::Test) > Structures begin differing at: > $a->[1]{earth} = Does not exist > $b->[1]{earth} = '1' > > > I stumbled across cmp_deeply(), but I can't figure out how > to use it. > > It's part of a testing framework different from PerlUnit, > and I can't > > seem to be able to use it without running it inside that > other testing > > framework (which I don't have time to learn). > > It's not that hard to shim the more popular Test::Builder > based "assertion" modules into Test::Unit. The > off-the-top-of-my-head greasy hack of: > > { package Test::Unit::MyTestCase; > use base qw( Test::Unit::TestCase ); > use Test::Builder '0.7'; > use Carp qw( confess ); > > sub assert_using { > my ( $self, $test_coderef ) = @_; > my $builder = Test::Builder->new; > $builder->reset; > $builder->plan( 'no_plan' ); > my $output = ''; > open my $output_fh, '>', \$output or die; > $builder->output( $output_fh ); > $builder->failure_output( $output_fh ); > $builder->todo_output( $output_fh ); > $self->assert( $test_coderef->(), $output ); > } > } > > would allow you to do things like: > > { package Comparison::Test; > use base qw( Test::Unit::MyTestCase ); > > use Test::More; # provides is_deeply > > sub test_using_is_deeply { > my $self = shift; > $self->assert_using( sub { > is_deeply [ { hello =>1}, { world => 1 } ], > [ { hello =>1}, { earth => 1 } ]; > } ); > } > > use Test::Deep; # provides cmp_deeply > > sub test_using_cmp_deeply { > my $self = shift; > $self->assert_using( sub { > cmp_deeply( [ { hello =>1}, { world => 1 } ], > [ { hello =>1}, { earth => 1 } ] > ); > } ); > } > } > > giving you diagnostics like > > 2) /private/var/tmp/folders.502/Cleanup At Startup/ > test-201050484.793.pl:21 - test_using_cmp_deeply(Comparison::Test) > not ok 1 > # Failed test at /private/var/tmp/folders.502/Cleanup At Startup/ > test-201050484.793.pl line 43. > # Comparing hash keys of $data->[1] > # Missing: 'earth' > # Extra: 'world' > > 3) /private/var/tmp/folders.502/Cleanup At Startup/ > test-201050484.793.pl:21 - test_using_is_deeply(Comparison::Test) > not ok 1 > # Failed test at /private/var/tmp/folders.502/Cleanup At Startup/ > test-201050484.793.pl line 33. > # Structures begin differing at: > # $got->[1]{earth} = Does not exist > # $expected->[1]{earth} = '1' > > However if you're going to be using a bunch of Test::Builder > based assertions it might be easier to use Test::Group or > <bias class="author"> Test::Class </bias> instead. > > Cheers, > > Adrian > > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Perlunit-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/perlunit-users
