use strict;
use warnings;
use Test::More;
use Test::Exception;
BEGIN {
if(!eval 'require Coro'){
plan skip_all => 'this test requires Coro';
}
}
use AnyEvent;
use Coro;
use Coro::AnyEvent;
use ok 'AnyEvent::Retry::Coro';
my $start = AnyEvent->now;
my $cv = AnyEvent->condvar;
my $times = 0;
my $r = AnyEvent::Retry::Coro->new(
max_tries => 50,
interval => { Fibonacci => { scale => 1/1000 } },
try => sub {
$times++;
Coro::AnyEvent::sleep 0.01;
return AnyEvent->now - $start > 1 ? AnyEvent->now : 0;
},
);
my $end;
lives_ok {
$end = $r->run;
} 'lives ok';
ok $times > 1, 'called more than once';
ok $end - $start > 1, 'got the value returned by try';
$start = AnyEvent->now;
my $middle;
lives_ok {
$r->start;
$middle = AnyEvent->now;
$end = $r->wait;
} 'start/wait also works';
ok $end - $start > 1, 'got the value returned by try (again)';
ok((($middle - $start) < ($end - $start)), 'middle runs before "wait"');
my $r2 = AnyEvent::Retry::Coro->new(
interval => { Fibonacci => { scale => 1000 } },
try => sub { Coro::AnyEvent::sleep 1; return 0 },
);
my $kill = async {
while(1){
Coro::AnyEvent::sleep 1;
undef $r2;
}
};
throws_ok {
$r2->run;
} qr/DEMOLISH/, 'demolition still works';
$kill->cancel;
done_testing;