use base qw(Exporter);
use strict;
require Test::Easy;
our @EXPORT = qw(time_nearly);
my @_formatters = ({
_description => 'output of localtime',
format_epoch_seconds => sub {
return scalar(localtime($_));
},
});
sub add_format { shift; push @_formatters, +{@_} }
sub time_nearly {
my ($got, $expected, $epsilon) = @_;
my ($low, $high) = ($expected - $epsilon, $expected + $epsilon);
my $guess;
local $_;
my @testers = map {
my $formatter = $_;
Test::Easy::equivalence->new(
test => sub {
local $_ = shift;
return $formatter->{format_epoch_seconds}->() eq $got;
},
);
} @_formatters;
SAMPLE: foreach my $try ($low .. $high) {
foreach my $tester (@testers) {
if ($tester->check_value($try)) {
$guess = $try;
last SAMPLE;
}
}
}
return 0 unless defined $guess;
return Test::Easy::nearly($guess, $expected, $epsilon);
}
1;