Assert-Refute-T-Numeric
view release on metacpan or search on metacpan
lib/Assert/Refute/T/Numeric.pm view on Meta::CPAN
};
my $total = calculate_price();
try_refute {
is_between $total, 1, 100, "Price within reasonable limits";
};
=cut
use Carp;
use Scalar::Util qw(looks_like_number);
use parent qw(Exporter);
use Assert::Refute::Build;
=head2 is_between $x, $lower, $upper, [$message]
Note that $x comes first and I<not> between boundaries.
=cut
build_refute is_between => sub {
my ($x, $min, $max) = @_;
croak "Non-numeric boundaries: ".to_scalar($min, 0).",".to_scalar($max, 0)
unless looks_like_number $min and looks_like_number $max;
return "Not a number: ".to_scalar($x, 0)
unless looks_like_number $x;
return $min <= $x && $x <= $max ? '' : "$x is not in [$min, $max]";
}, args => 3, export => 1;
=head2 within_delta $x, $expected, $delta, [$message]
Test that $x differs from $expected value by no more than $delta.
=cut
build_refute within_delta => sub {
my ($x, $exp, $delta) = @_;
croak "Non-numeric boundaries: ".to_scalar($exp, 0)."+-".to_scalar($delta, 0)
unless looks_like_number $exp and looks_like_number $delta;
return "Not a number: ".to_scalar($x, 0)
unless looks_like_number $x;
return abs($x - $exp) <= $delta ? '' : "$x is not in [$exp +- $delta]";
}, args => 3, export => 1;
=head2 within_relative $x, $expected, $delta, [$message]
Test that $x differs from $expected value by no more than $expected * $delta.
=cut
build_refute within_relative => sub {
my ($x, $exp, $delta) = @_;
croak "Non-numeric boundaries: ".to_scalar($exp, 0)."+-".to_scalar($delta, 0)
unless looks_like_number $exp and looks_like_number $delta;
return "Not a number: ".to_scalar($x, 0)
unless looks_like_number $x;
return abs($x - $exp) <= abs($exp * $delta)
? ''
: "$x differs from $exp by more than ".$exp*$delta;
}, args => 3, export => 1;
=head1 SEE ALSO
L<Test::Number::Delta>.
( run in 0.330 second using v1.01-cache-2.11-cpan-64827b87656 )