1# $Id: parse_interval.t 3687 2007-05-27 15:32:27Z lestrrat $
2use strict;
3use Test::More;
4use DateTime;
5use DateTime::Duration;
6use Data::Dumper;
7
8my @positive_data;
9my @negative_data;
10
11BEGIN
12{
13    @negative_data = (
14        '098:08:00',
15        '1:08:00',
16        '-012:00:00',
17    );
18
19    @positive_data = (
20        [ '00:00:00' => DateTime::Duration->new() ],
21        [ '-08:08:00' => DateTime::Duration->new( hours => -8, minutes => -8) ],
22        [ '-98:08:00' => DateTime::Duration->new( hours => -98, minutes => -8) ],
23        [ '-100:33:00' => DateTime::Duration->new( hours => -100, minutes => -33) ],
24        [ '100:33:00' => DateTime::Duration->new( hours => 100, minutes => 33) ],
25        [ '01:00:00'  => DateTime::Duration->new( hours => 1 )  ],
26        [ '-08:00:00' => DateTime::Duration->new( hours => -8 ) ],
27        [ '-1 days'   => DateTime::Duration->new(days => -1)    ],
28        [ '-23:59'    => DateTime::Duration->new(hours => -23, minutes => -59) ],
29        [ '-1 days -00:01' => DateTime::Duration->new( days => -1, minutes => -1) ],
30        [ '1 mon -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
31        [ '@ 1 mon -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
32        [ '-1 days +02:03:00' => DateTime::Duration->new(days => -1)
33              ->add(
34                  hours  => 2,
35                  minutes => 3,
36              )
37        ],
38        ['9 years 1 mon -12 days +13:14:00' => DateTime::Duration->new(
39            years   => 9,
40            months  => 1,
41            hours   => 13,
42            minutes => 14,
43        )->add(days => -12)],
44        [ '@ 1 day ago' => DateTime::Duration->new( days => -1 )],
45        [ '@ 1 day 10 mins' => DateTime::Duration->new( days => 1, minutes => 10 )],
46        [ '@ 23 hours 59 mins ago' => DateTime::Duration->new(
47            hours => -23,
48            minutes => -59
49        )],
50        [ '@ 1 day 1 min ago' => DateTime::Duration->new( days => -1, minutes => -1 )],
51        [ '10 days' => DateTime::Duration->new(days => 10 ) ],
52        [ '34 years' => DateTime::Duration->new(years => 34 )],
53        [ '3 mons' => DateTime::Duration->new(months => 3 )],
54        [ '-00:00:14' => DateTime::Duration->new(seconds => -14 )],
55        [ '1 day 02:03:04' => DateTime::Duration->new(
56            days => 1,
57            hours => 2,
58            minutes => 3,
59            seconds => 4,
60        )],
61    
62        [ '5 mons 12:00:00' => DateTime::Duration->new( months => 5, hours => 12) ],
63        [ '@ 1 min' => DateTime::Duration->new(minutes => 1 )],
64        [ '@ 5 hours' => DateTime::Duration->new( hours => 5 )],
65        [ '@ 34 years' => DateTime::Duration->new(years => 34 )],
66        [ '@ 3 mons' => DateTime::Duration->new(months => 3 )],
67        [ '@ 14 secs ago' => DateTime::Duration->new( seconds => -14 )],
68        [ '@ 1 day 2 hours 3 mins 4 secs' => DateTime::Duration->new(
69            days => 1,
70            hours => 2,
71            minutes => 3,
72            seconds => 4,
73        )],
74    
75        [ '@ 5 mons 12 hours' => DateTime::Duration->new( hours => 12, months => 5) ],
76        [ '@ 4541 years 4 mons 4 days 17 mins 31 secs' => DateTime::Duration->new(
77            years => 4541,
78            months => 4,
79            days => 4,
80            minutes => 17,
81            seconds => 31,
82        )],
83    
84        [ '@ 6 mons 5 days 4 hours 3 mins 2 secs' => DateTime::Duration->new(
85            months => 6,
86            days => 5,
87            hours => 4,
88            minutes => 3,
89            seconds => 2,
90        )],
91
92        [ '1 days 02:03:00 ago' => DateTime::Duration->new(
93            days => -1,
94            hours => -2,
95            minutes => -3,
96        )],
97    );
98
99    plan tests => @negative_data + @positive_data + 1;
100    use_ok 'DateTime::Format::Pg' or die;
101}
102
103{ # Positive data
104    for my $compare (@positive_data) {
105        ok !DateTime::Duration->compare(
106            DateTime::Format::Pg->parse_duration($compare->[0]),
107            $compare->[1]
108        ), "'$compare->[0]'"
109            or diag 
110                Dumper [
111                    { DateTime::Format::Pg->parse_duration($compare->[0])->deltas },
112                    { $compare->[1]->deltas }
113                ]
114        ;
115    }
116}
117
118{ # Negative data
119    for my $data (@negative_data) {
120        ok(! eval { DateTime::Format::Pg->parse_duration($data) } && $@, "'$data' fails to parse");
121    }
122}
123