NAME
Assert::Refute::Build - tool for extending Assert::Refute suite
DESCRIPTION
Although arbitrary checks may be created using just the refute
function, they may be cumbersome to use and especially share.
This module takes care of some boilerplate as well as maintains parity between functional and object-oriented interfaces of Assert::Refute.
SYNOPSIS
Extending the test suite goes as follows:
package My::Package;
use Assert::Refute::Build;
use parent qw(Exporter);
build_refute is_everything => sub {
return if $_[0] == 42;
return "$_[0] is not answer to life, universe, and everything";
}, export => 1, args => 1;
1;
This can be later used inside production code to check a condition:
use Assert::Refute qw(:all);
use My::Package;
my $fun_check = contract {
is_everything( shift );
};
my $oo_check = contract {
$_[0]->is_everything( $_[1] );
}, need_object => 1;
# ditto
# apply $fun_check or $oo_check to a variable, get result
my $log = $oo_check->apply(137);
$log->is_passing; # nope
$log->get_tap; # get details
This call will create a prototyped function is_everything(...) in the calling package, with args
positional parameters and an optional human-readable message. (Think ok 1
, ok 1 'test passed'
).
FUNCTIONS
All functions are exportable.
build_refute name => \&CODE, %options
This function
accepts a subroutine reference that returns a false value on success and a brief description of the discrepancy on failure (e.g.
"$got != $expected"
);Note that this function does not need to know anything about the testing environment it is in, it just cares about its arguments (think pure function).
builds an exportable wrapper around it that would talk to the most recent Assert::Refute::Report instance;
adds a method with the same name to Assert::Refute::Report so that object-oriented and functional interfaces are as close to each other as possible.
As a side effect, Assert::Refute's internals are added to the caller's @CARP_NOT
array so that carp/croak points to where the built function is actually used.
NOTE One needs to use Exporter explicitly if either export
or export_ok
option is in use. This MAY change in the future.
Options may include:
export
=> 1 - add function to @EXPORT (Exporter still has to be used by target module explicitly).export_ok
=> 1 - add function to @EXPORT_OK (don't export by default).no_create
=> 1 - don't generate a function at all, just add to Assert::Refute's methods.manual
=> 1 - don't generate any code. Instead, assume that user has already done that and just add a method to Assert::Refute::Report and a prototyped exportable wrapper.This may be useful to create refutations based on subcontract or such.
[EXPERIMENTAL].
args
=>nnn
- number of arguments. This will generate a prototyped function acceptingnnn
scalars + optional description.list
=> 1 - create a list prototype instead. Mutually exclusive withargs
.block
=> 1 - create a block function.no_proto
=> 1 - skip prototype, function will have to be called with parentheses.
The name must not start with set_
, get_
, or do_
. Also colliding with a previously defined name would case an exception.
current_contract
Returns a Assert::Refute::Report object. Dies if no contract is being executed at the time.
to_scalar
Convert an arbitrary value into a human-readable string.
to_scalar( $value )
to_scalar( $value, $depth )
If $value is undefined and $depth is not given, returns '(undef)'
(so that it's harder to confuse with a literal 'undef'
).
If $value is a scalar and $depth is not given, returns $value as is, without quotes or anything.
Otherwise returns Data::Dumper to depth $depth (or unlimited by default).
One SHOULD NOT rely on exact format of returned data.
LICENSE AND COPYRIGHT
This module is part of Assert::Refute suite.
Copyright 2017-2018 Konstantin S. Uvarin. <khedin at cpan.org>
This program is free software; you can redistribute it and/or modify it under the terms of the the Artistic License (2.0). You may obtain a copy of the full license at: