Hi,
        I've just uploaded Test::Deep 0.02 to CPAN. This module is a very souped up 
version of the is_deeply() test from Test::More. If you don't include an 
special comparison instructions, it behaves exactly like is_deeply() except 
it handles circular data structures and it compares the class of bless 
references.

By including special comparisons, it gives you control of the comparison 
process at every level of the structures you are comparing by letting you 
insert special comparisons wherever you want. Special comparisons include 
checking the results of method calls, treating an array like a set or a bag, 
forcing numerical comparisons, forcing shallow comparisons of refs, regexp 
comparisons, applying multiple tests to the same piece of the structure etc.

One interesting new thing that this can be used for is exporting tests for 
reuse by other modules. A very simple example is IO::Handle, it could define 
a test

$open_handle = all( isa("IO::Handle"), methods(opened => 1) );

then

cmp_deeply($fh, $open_handle);

would check $fh->isa("IO::Handle") and $fh->opened == 1. More usefully, you 
can now use this test as part of another test, so that

cmp_deeply(
  $got,
  array_each(
    methods(
      FileHandle => $open_handle,
      FileName => re("^/tmp/"),
      Members => bag(1, 2, 3, 4),
    )
  )
);

This will make sure that each element of @$got is an object who's FileHandle 
method returns an open file handle, who's FileName method returns a string 
starting with "/tmp/" and who's Members method returns an array containing 4 
elemets: 1, 2, 3 and 4 in any order.

This is a quite trivial example but it illustrates the idea of how big tests 
can be built up from smaller ones and could include tests defined outside of 
the module's own test suite,

F

-- 
Do you need someone with lots of Unix sysadmin and/or lots of OO software 
development experience? Go on, giz a job.
My CV - http://www.fergaldaly.com/cv.html

Reply via email to