Re: [Perlunit-users] Comparing deeply nested data structures.
Status: Beta
                
                Brought to you by:
                
                    mca1001
                    
                
            | 
      
      
      From: Desilets, A. <Ala...@nr...> - 2007-05-16 23:35:07
      
     | 
| Great, thanks Adrian. That sounds exactly like what we're looking for.
Alain
=20
> -----Original Message-----
> From: Adrian Howard [mailto:ad...@qu...]=20
> Sent: May 16, 2007 7:26 PM
> To: per...@li...; Desilets, Alain
> Cc: Farley, Benoit
> Subject: Re: [Perlunit-users] Comparing deeply nested data structures.
>=20
>=20
> On 16 May 2007, at 18:17, Desilets, Alain wrote:
> [snip]
> > I want to easily compare the output of that method to=20
> expected output,=20
> > and if the two differ, get a good diagnostic message that describes=20
> > exactly how the two differ.
> [snip]
> > Is there something in Perl that would allow me to do this?
>=20
> In Test::Unit there's assert_deep_equals() - for example:
>=20
>      sub test_using_assert_deep_equals {
>          my $self =3D shift;
>          $self->assert_deep_equals(
>              [ { hello =3D>1}, { world =3D> 1 } ],
>              [ { hello =3D>1}, { earth =3D> 1 } ]
>          );
>      }
>=20
> that gives you a diagnostic like
>=20
> 1) /Users/adrianh/Desktop/test.pl:53 - test_using_assert_deep_equals
> (Comparison::Test)
> Structures begin differing at:
>    $a->[1]{earth} =3D Does not exist
>    $b->[1]{earth} =3D '1'
>=20
> > I stumbled across cmp_deeply(), but I can't figure out how=20
> to use it.=20
> > It's part of a testing framework different from PerlUnit,=20
> and I can't=20
> > seem to be able to use it without running it inside that=20
> other testing=20
> > framework (which I don't have time to learn).
>=20
> It's not that hard to shim the more popular Test::Builder=20
> based "assertion" modules into Test::Unit. The=20
> off-the-top-of-my-head greasy hack of:
>=20
> {   package Test::Unit::MyTestCase;
>      use base qw( Test::Unit::TestCase );
>      use Test::Builder '0.7';
>      use Carp qw( confess );
>=20
>      sub assert_using {
>          my ( $self, $test_coderef ) =3D @_;
>          my $builder =3D Test::Builder->new;
>          $builder->reset;
>          $builder->plan( 'no_plan' );
>          my $output =3D '';
>          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 );
>      }
> }
>=20
> would allow you to do things like:
>=20
> {   package Comparison::Test;
>      use base qw( Test::Unit::MyTestCase );
>=20
>      use Test::More; # provides is_deeply
>=20
>      sub test_using_is_deeply {
>          my $self =3D shift;
>          $self->assert_using( sub {
>              is_deeply   [ { hello =3D>1}, { world =3D> 1 } ],
>                          [ { hello =3D>1}, { earth =3D> 1 } ];
>          } );
>      }
>=20
>      use Test::Deep; # provides cmp_deeply
>=20
>      sub test_using_cmp_deeply {
>          my $self =3D shift;
>          $self->assert_using( sub {
>              cmp_deeply(   [ { hello =3D>1}, { world =3D> 1 } ],
>                          [ { hello =3D>1}, { earth =3D> 1 } ]
>              );
>          } );
>      }
> }
>=20
> giving you diagnostics like
>=20
> 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/=20
> test-201050484.793.pl line 43.
> # Comparing hash keys of $data->[1]
> # Missing: 'earth'
> # Extra: 'world'
>=20
> 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/=20
> test-201050484.793.pl line 33.
> #     Structures begin differing at:
> #          $got->[1]{earth} =3D Does not exist
> #     $expected->[1]{earth} =3D '1'
>=20
> However if you're going to be using a bunch of Test::Builder=20
> based assertions it might be easier to use Test::Group or=20
> <bias class=3D"author"> Test::Class </bias> instead.
>=20
> Cheers,
>=20
> Adrian
>=20
>=20
 |