The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
BEGIN { $^W = 1 }

use Test::More tests => 186;
use DateTime::Calendar::Pataphysical;

SKIP:{
    eval {require DateTime};
    skip 'DateTime not installed', 132 if $@;

#########################

for my $test ([ 1,  1,   1 => 1873,  9,  8 ],
              [28,  1,   1 => 1873, 10,  5 ],
              [ 1,  2,   1 => 1873, 10,  6 ],
              [28,  2,   1 => 1873, 11,  2 ],
              [ 1,  4,   1 => 1873, 12,  1 ],
              [28,  6,   1 => 1874,  2, 22 ],
              [ 1,  7,   1 => 1874,  2, 23 ],
              [ 1,  9,   1 => 1874,  4, 20 ],
              [ 1, 11,   1 => 1874,  6, 15 ],
              [28, 11,   1 => 1874,  7, 12 ],
              [29, 11,   1 => 1874,  7, 13 ],
              [ 1, 12,   1 => 1874,  7, 14 ],
              [28, 13,   1 => 1874,  9,  7 ],
              [ 1,  1,   2 => 1874,  9,  8 ],
              [ 1,  7,   2 => 1875,  2, 23 ],
              [ 1,  1,   3 => 1875,  9,  8 ],
              [28,  6,   3 => 1876,  2, 22 ],
              [29,  6,   3 => 1876,  2, 23 ],
              [ 1,  7,   3 => 1876,  2, 24 ],
              [ 6,  7,   3 => 1876,  2, 29 ],
              [ 7,  7,   3 => 1876,  3,  1 ],
              [28, 13,   3 => 1876,  9,  7 ],
              [28,  6,  27 => 1900,  2, 22 ],
              [ 1,  7,  27 => 1900,  2, 23 ],
              [28,  6, 127 => 2000,  2, 22 ],
              [29,  6, 127 => 2000,  2, 23 ],
              [ 1,  7, 127 => 2000,  2, 24 ],
              [ 1,  7,1002 => 2875,  2, 23 ],
              [ 1,  1,1003 => 2875,  9,  8 ],
              [ 1,  7,2002 => 3875,  2, 23 ],
              [ 1,  1,2003 => 3875,  9,  8 ],
              [ 1,  1,-1   => 1872,  9,  8 ],
              [ 1,  7,-998 =>  876,  2, 24 ],
              [ 1,  1,-997 =>  876,  9,  8 ], ) {
    my ($dp, $mp, $yp, $yg, $mg, $dg) = @$test;

    my $date = DateTime::Calendar::Pataphysical->new(
                    year => $yp, month => $mp, day => $dp );
    my $date_g = DateTime->from_object( object => $date );

    isa_ok( $date_g, 'DateTime', 'converted date'. $date->datetime );
    is( $date_g->ymd, sprintf '%04d-%02d-%02d', $yg, $mg, $dg,
            '... correctly' );
    is( $date->utc_rd_as_seconds, $date_g->utc_rd_as_seconds,
        'utc_rd_as_seconds is equal' );

    my $date_p = DateTime::Calendar::Pataphysical->from_object(
                object => $date_g );
    isa_ok( $date_p, "DateTime::Calendar::Pataphysical", 'and back' );
    is( $date_p->ymd, sprintf '%0.3d-%0.2d-%0.2d', $yp, $mp, $dp,
        '... correctly' );
}

my $d = DateTime->new( year => 2000, month => 2, day => 24,
                       time_zone => 'Europe/Amsterdam' );
my $dp = DateTime::Calendar::Pataphysical->from_object( object => $d );

is( $dp->ymd, '127-07-01', 'convert from local time instead of utc' );

#my $d2 = DateTime->from_object( object => $dp );
#is( $d2->offset, +3600, 'conversion keeps timezone intact' );
#is( $d2->datetime, '2000-02-24T00:00:00', '... and the correct time' );
} # end SKIP

#                yyy  mm  dd
for my $test ( [   1,  1, 29 ],
               [   1,  2, 29 ],
               [   1,  6, 29 ],
               [   1, 10, 29 ],
               [   1, 13, 29 ],
               [   2,  6, 29 ],
               [  27,  6, 29 ], ) {
    my ($y, $m, $d) = @$test;
    my $date = DateTime::Calendar::Pataphysical->new(
                    year => $y, month => $m, day => $d );
    my @rd = $date->utc_rd_values;
    is( @rd, 0, "$y-$m-$d (imaginary)" );
    ok( !defined $date->utc_rd_as_seconds, 'utc_rd_as_seconds not defined' );
}

my $date = DateTime->new( year => 2003, month => 1, day => 1,
                          hour => 22, minute => 20,
                          time_zone => 'America/Chicago' );
$date = DateTime::Calendar::Pataphysical->from_object( object => $date );
$date = DateTime->from_object( object => $date );

is( $date->datetime, '2003-01-01T22:20:00', 'Keep time in conversion' );