1# Copyright (C) 2005  Joshua Hoblitt
2use strict;
3use warnings;
4
5use Test2::V0;
6
7use DateTime::Format::ISO8601;
8
9{
10    is(
11        DateTime::Format::ISO8601->DefaultLegacyYear, 1,
12        'default legacy year is 1'
13    );
14    my $iso_parser = DateTime::Format::ISO8601->new;
15    is( $iso_parser->legacy_year, 1, 'legacy_year is 1' );
16}
17
18for my $n ( 0, 1, undef ) {
19    DateTime::Format::ISO8601->DefaultLegacyYear($n);
20    is(
21        DateTime::Format::ISO8601->DefaultLegacyYear, $n,
22        'default legacy was set'
23    );
24    my $iso_parser = DateTime::Format::ISO8601->new;
25    is( $iso_parser->legacy_year, $n, 'set legacy year' );
26}
27
28for my $n ( -3 .. -1, 2 .. 4 ) {
29    like(
30        dies { DateTime::Format::ISO8601->DefaultLegacyYear($n) },
31        qr/Validation failed for type named Bool/,
32        'set legacy year to invalid value',
33    );
34}
35
36# restore default legacy year behavior
37DateTime::Format::ISO8601->DefaultLegacyYear(1);
38
39for my $n ( 0, 1, undef ) {
40    my $iso_parser = DateTime::Format::ISO8601->new( legacy_year => $n );
41    isa_ok( $iso_parser, 'DateTime::Format::ISO8601' );
42    is( $iso_parser->legacy_year, $n, 'pass legacy year to constructor' );
43
44    $iso_parser = DateTime::Format::ISO8601->new->set_legacy_year($n);
45    is( $iso_parser->legacy_year, $n, 'call set_legacy_year on object' );
46}
47
48for my $n ( -3 .. -1, 2 .. 4 ) {
49    like(
50        dies { DateTime::Format::ISO8601->new( legacy_year => $n ) },
51        qr/Validation failed for type named Bool/,
52        'pass invalid legacy year to constructor',
53    );
54
55    like(
56        dies { DateTime::Format::ISO8601->new->set_legacy_year($n) },
57        qr/Validation failed for type named Bool/,
58        'pass invalid legacy year to set_legacy_year',
59    );
60}
61
62for my $year ( 0 .. 99 ) {
63    $year *= 100;    # [0, 9900], step 100
64    my $iso_parser = DateTime::Format::ISO8601->new(
65        legacy_year   => 0,
66        base_datetime => DateTime->new( year => $year ),
67    );
68
69    for my $tdy ( 0 .. 9 ) {
70        $tdy *= 10;    # [0, 90], step 10
71        $tdy = sprintf( '%02d', $tdy );
72        my $dt = $iso_parser->parse_datetime("-$tdy");
73        is(
74            $dt->year,
75            sprintf(
76                '%d', $iso_parser->base_datetime->strftime('%C') . $tdy
77            ),
78            "parses $tdy based on base_datetime with year $year",
79        );
80    }
81}
82
83done_testing();
84