use strict; use warnings; use Test::More; use Test::Warn; use Test::Fatal; use Test::Time; use Selenium::Waiter; SIMPLE_WAIT: { my $ret; waits_ok( sub { $ret = wait_until { 1 } }, '<', 2, 'immediately true returns quickly' ); ok($ret == 1, 'return value for a true wait_until is passed up'); waits_ok( sub { $ret = wait_until { 0 } }, '==', 30, 'never true expires the timeout' ); ok($ret eq '', 'return value for a false wait is an empty string'); } EVENTUALLY: { my $ret = 0; waits_ok( sub { wait_until { $ret++ > 2 } }, '>', 2, 'eventually true takes time'); $ret = 0; my %opts = ( interval => 2, timeout => 5 ); waits_ok( sub { wait_until { $ret++; 0 } %opts }, '>', 4, 'timeout is respected' ); ok(1 <= $ret && $ret <= 3, 'interval option changes iteration speed'); } EXCEPTIONS: { my %opts = ( timeout => 2 ); warning_is { wait_until { die 'caught!' } %opts } 'caught!', 'exceptions usually only warn once'; } NO_FINALLY_WAIT: { waits_ok( sub { wait_until { 1 }, interval => 10 }, '<', 1, 'does not do interval wait on success') } sub waits_ok { my ($sub, $cmp, $expected_duration, $test_desc) = @_; my $start = time; $sub->(); my $elapsed = time - $start; cmp_ok($elapsed, $cmp, $expected_duration, $test_desc); } done_testing;