#!perl
use strict;
use warnings;
use lib '../lib';
use Test::More tests => 11;
use Test::CallFlow qw(:all); # package under test
my $mocked = mock_object( 'Mocked::Pkg', { 'some field' => 'some value' } );
my $remains = qr/^End mock with[\s\d]+calls remaining\b/;
eval {
$mocked->first->anytime;
my $end = $mocked->second(2)->anytime->result(-2)->result(-2.2)->min(3);
$mocked->optional->min(0)->end( $end, $end );
$mocked->final;
};
is( $@, '', "Planning unordered calls" );
eval { mock_run; };
is( $@, '', "Run" );
eval { mock_end; };
like( $@, $remains, "End before first call fails" );
eval {
mock_reset;
mock_run;
$mocked->second(2);
$mocked->first;
$mocked->second(2);
$mocked->optional;
$mocked->final;
mock_end;
};
like( $@, qr/^Expected\b.*\bsecond\b/,
"End without enough second calls fails" );
eval {
mock_reset;
mock_run;
};
is( $mocked->second(2), -2, "Call past an anytime declaration" );
is( $mocked->second(2), -2.2, "Second call produces second result" );
is( $mocked->second(2), -2.2,
"Call after last specified result produces last result" );
is( $mocked->first, undef, "First anytime is still callable" );
eval { mock_end; };
like( $@, $remains, "End with only final call unmade fails" );
eval {
mock_reset;
mock_run;
$mocked->second(2);
$mocked->second(2);
$mocked->optional;
};
like( $@, qr/\bsecond\b/,
"Test run fails when an unordered call is ended unsatisfied" );
eval {
mock_reset;
mock_run;
$mocked->second(2);
$mocked->second(2);
$mocked->second(2);
$mocked->optional;
$mocked->first;
$mocked->final;
mock_end;
};
is( $@, '', "Test run succeeds when enough calls have been made" );