Commit | Line | Data |
c91c4ca1 |
1 | use strict; |
2 | use warnings; |
3 | use Test::More qw(no_plan); |
4 | |
c91c4ca1 |
5 | BEGIN { |
6 | use_ok 'IronMunger::Post'; |
7 | use_ok 'IronMunger::Calculate'; |
8 | } |
9 | |
38827ef4 |
10 | use autobox; |
11 | use autobox::DateTime::Duration; |
12 | use signatures; |
13 | |
c91c4ca1 |
14 | sub named_eq ($test_name, $sub_name, $expected, @posts) { |
15 | my $sub_ref = IronMunger::Calculate->can($sub_name); |
38827ef4 |
16 | die "Couldn't find $sub_name in IronMunger::Calculate" unless $sub_ref; |
c91c4ca1 |
17 | my $sub_description = join(' ', split '_', $sub_name); |
18 | cmp_ok( |
19 | $sub_ref->(@posts), '==', $expected, |
20 | "${test_name}: ${expected} ${sub_description}", |
21 | ); |
22 | } |
23 | |
24 | sub case ($name_spec, $case, $expect) { |
25 | my $name = join(' ', map ucfirst, split '_', $name_spec); |
26 | my @posts = map { IronMunger::Post->new(at => $_) } @$case; |
27 | foreach my $test (sort keys %$expect) { |
28 | named_eq($name, $test, $expect->{$test}, @posts); |
29 | } |
30 | } |
31 | |
32 | sub expect (%expect) { |
33 | +{ |
34 | successful_sequential_posts => $expect{sequential}, |
35 | days_remaining_to_post => $expect{remaining}, |
36 | }; |
37 | } |
38 | |
39 | case two_posts_ok => |
40 | [ 5->days->ago, 13->days->ago ], |
41 | expect |
42 | sequential => 2, |
43 | remaining => 5; |
44 | |
45 | case two_posts_too_far_apart => |
46 | [ 5->days->ago, 20->days->ago ], |
47 | expect |
48 | sequential => 1, |
49 | remaining => 5; |