NAME

Test::InDomain - Testing deep datastructures against data domains

SYNOPSIS

use Test::More;
use Test::InDomain;
plan tests => $number_of_tests;

in_domain $v1, List(-all => Int(-min => 0), -size => [5, 10]),
               "5 to 10 positive integers";

my $expr_domain;
$expr_domain = One_of(Num, Struct(operator => String(qr(^[-+*/]$)),
                                  left     => sub {$expr_domain},
                                  right    => sub {$expr_domain}));
in_domain $v2, $expr_domain, "binary expression tree";

in_domain $v3, Struct(data    => Defined,
                      printer => Obj(-can => 'print')),
               "struct with data hash and printer object";

DESCRIPTION

This module is a complement to Test::Simple or Test::More (or any other testing module based on Test::Builder). It adds the function in_domain to your panoply of testing tools; that function uses the functionalities of Data::Domain to check deep datastructures and produce detailed reports about where the data differs from the expectations.

The synopsis above is just an appetizer : many more kinds of comparisons can be performed; see Data::Domain for details.

EXPORTS

Exports from Test::InDomain

in_domain

in_domain $data, $domain, $test_name;

Calls $domain->inspect($data) to check if the data belongs to the domain. The third argument $test_name is optional; if present, it will be printed together with the test result.

If the test fails, the structured error messages issued from Data::Domain are printed as a diagnostic.

not_in_domain

not_in_domain $data, $domain, $test_name, $want_explanation;

This test succeeds if $domain->inspect($data) fails, i.e. the data is not in the domain. By default the error messages will not be printed (since the error was expected, the messages are not interesting!); however, if the fourth argument $want_explanation is true, then the messages will be printed as a note (so they won't be seen when the test in run in a harness, but will be visible in the verbose TAP stream).

Exports from Data::Domain

By default, all symbols from Data::Domain will be exported into the caller's namespace : Int, String, List, Struct, True, Defined, Obj, etc. However it is also possible to explicitly state what to import, and even to rename the imported symbols through Sub::Exporter options, like for example :

use Test::InDomain -constructors => {-prefix => "dom_"};

To achieve this, the import list passed to Test::InDomain is transmitted directly to Data::Domain; by contrast, functions specific to Test::InDomain, namely in_domain and not_in_domain, are not affected by the import list and will be exported in any case.

SEE ALSO

Other ways to perform deep comparisons : "is_deeply" in Test::More, Test::Deep.

AUTHOR

Laurent Dami, <dami at cpan.org>

BUGS

Please report any bugs or feature requests to bug-test-indomain at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-InDomain. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

LICENSE AND COPYRIGHT

Copyright 2012 Laurent Dami.

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.