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