use strict;
use warnings;
use Test::Contract;
my $c = contract {
$_[0]->like( $user_input, qr/.../, "Format as expected" );
$_[0]->isa_ok( $some_object, "Some::Class" );
};
if ($c->get_passing) {
# so far, so good - move on!
} else {
croak "Contract failed: ".$c->get_tap;
};
####
sub refute {
my ($condition, $message) = @_;
ok (!$condition, $message)
or diag $condition;
};
##
##
package My::Check;
use Exporter qw(import);
use Test::Contract::Engine::Build;
build_refute my_check => sub {
my ($got, $expected) = @_;
# ... a big and nasty check here
}, args => 2, export => 1;
1;
##
##
use Test::More tests => 1;
use My::Check;
my_check $foo, $bar, "foo is fine";
##
##
# inside a running application
use Test::Contract;
use My::Check(); # don't pollute global namespace
my $c = Test::Contract->new;
$c->my_check( $foo, $bar, "runtime-generated foo is fine, too" );
if (!$c->get_passing) {
# ouch, something went wrong with $foo and $bar
};
##
##
use Test::More;
use Test::Contract::Unit qw(contract_is);
use My::Check;
my $c = contract {
my_check $proper_foo, $bar;
my_check $good_foo, $bar;
my_check $broken_foo, $bar;
my_check $good_foo, $wrong_bar;
};
is_contract $c, "1100", "my_check works as expected";
done_testing;