1# Copyright (C) 2005  Joshua Hoblitt
2use strict;
3use warnings;
4
5use Test2::V0;
6
7use DateTime;
8use DateTime::Format::ISO8601;
9
10my @good_bases = (
11    { year => 0 },
12    { year => 1 },
13    { year => 2500 },
14    { year => 5000 },
15    { year => 7500 },
16    { year => 9998 },
17    {
18        year       => 9999,
19        month      => 12,
20        day        => 12,
21        hour       => 23,
22        minute     => 59,
23        second     => 59,
24        nanosecond => 999_999_999,
25    },
26);
27
28my @test_bases = (
29    [ '1945-09-02T09:04', '1945-W35' ],
30    [ '1987-12-18T02:03', '1987-W51' ],
31    [ '1988-05-05T04:05', '1988-W18' ],
32    [ '1989-10-18T06:07', '1989-W42' ],
33    [ '1991-03-21T08:09', '1991-W12' ],
34);
35
36my @bad_bases = (
37    { year => -2 },
38    { year => -1 },
39    {
40        year       => -1,
41        month      => 12,
42        day        => 31,
43        hour       => 23,
44        minute     => 59,
45        second     => 59,
46        nanosecond => 999_999_999
47    },
48    { year => 10_000 },
49    { year => 10_001 },
50    { year => 10_002 },
51);
52
53for my $params (@good_bases) {
54    my $dt = DateTime->new(%$params);
55
56    {
57        my $iso_parser = DateTime::Format::ISO8601->new(
58            base_datetime => $dt,
59        );
60        isa_ok( $iso_parser, 'DateTime::Format::ISO8601' );
61    }
62
63    {
64        my $iso_parser = DateTime::Format::ISO8601->new->set_base_datetime(
65            object => $dt,
66        );
67        isa_ok( $iso_parser, 'DateTime::Format::ISO8601' );
68    }
69}
70
71for (@test_bases) {
72    my $iso_parser = DateTime::Format::ISO8601->new(
73        base_datetime => DateTime::Format::ISO8601->parse_datetime( $_->[0] ),
74    );
75
76    {
77        #tests...
78        #_add_minute
79        #_add_hour
80        #_add_day
81        #_add_month
82        #_add_year
83
84        #--ss,s --50,5
85        my $dt = $iso_parser->parse_datetime('--50,5');
86        is( $dt->strftime('%Y-%m-%dT%H:%M'), $_->[0] );
87    }
88
89    {
90        #tests...
91        #_add_week
92        #_add_year
93
94        #-W-D -W-5
95        my $dt = $iso_parser->parse_datetime('-W-5');
96        is( $dt->strftime('%Y-W%V'), $_->[1] );
97    }
98}
99
100for my $params (@bad_bases) {
101    my $dt = DateTime->new(%$params);
102
103    like(
104        dies {
105            DateTime::Format::ISO8601->new(
106                base_datetime => $dt,
107            );
108        },
109        qr/base_datetime must be (greater|less) then/,
110        'invalid base_datetime',
111    );
112
113    like(
114        dies {
115            DateTime::Format::ISO8601->new->set_base_datetime(
116                object => $dt,
117            );
118        },
119        qr/base_datetime must be (greater|less) then/,
120        'invalid base_datetime',
121    );
122}
123
124done_testing();
125