03_base_datetime.t   [plain text]


use strict;

use Test::More tests => 7010;

use DateTime;
use DateTime::Format::ISO8601;

my @good_bases = qw(
    0000-01-01T00:00:00
    0001-01-01T00:00:00
    2500-03-03T06:15:15
    5000-05-05T12:30:30
    7500-09-09T18:45:45
    9998-12-12T23:59:59
    9999-12-12T23:59:59
);

my @test_bases = (
    [ "1945-09-02T09:04", '1945-W35' ],
    [ "1987-12-18T02:03", '1987-W51' ],
    [ "1988-05-05T04:05", '1988-W18' ],
    [ "1989-10-18T06:07", '1989-W42' ],
    [ "1991-03-21T08:09", '1991-W12' ],
);

foreach ( 0 .. 99 ) {
    #tests...
    #new
    #base_datetime
    #set_base_datetime

    my $base = $_ * 100;

    foreach ( 0 .. 9 ) {
        $_ *= 10;
        $_ += $base;

        my $dt = DateTime->new(
                    year    => $_,
                    month   => $_ % 12 || 1,
                    day     => $_ % 28 || 1,
                    hour    => $_ % 23,
                    minute  => $_ % 59,
                    second  => $_ % 59,
                );

        my $iso_parser = DateTime::Format::ISO8601->new(
            base_datetime => $dt,
        );

        isa_ok( $iso_parser, 'DateTime::Format::ISO8601' );
        is( $iso_parser->base_datetime->iso8601, $dt->iso8601 );

        $iso_parser->set_base_datetime(
            object => $dt,
        );
        is( $iso_parser->base_datetime->iso8601, $dt->iso8601 );
    }
}

foreach ( @test_bases ) {
    my $iso_parser = DateTime::Format::ISO8601->new(
        base_datetime => DateTime::Format::ISO8601->parse_datetime( $_->[0] ),
    );

    {
        #tests...
        #_add_minute
        #_add_hour
        #_add_day
        #_add_month
        #_add_year

        #--ss,s --50,5
        my $dt = $iso_parser->parse_datetime( '--50,5' );
        is( $dt->strftime( "%Y-%m-%dT%H:%M" ), $_->[0] );
    }

    {
        #tests...
        #_add_week
        #_add_year

        #-W-D -W-5
        my $dt = $iso_parser->parse_datetime( '-W-5' );
        is( $dt->strftime( "%Y-W%V" ), $_->[1] );
    }
}

foreach ( -99 .. -1, 100 .. 200 ) {
    my $base = $_ * 100;

    foreach ( 0 .. 9 ) {
        $_ *= 10;
        $_ += $base;

        my $dt = DateTime->new(
                    year    => $_,
                    month   => $_ % 12 || 1,
                    day     => $_ % 28 || 1,
                    hour    => $_ % 23,
                    minute  => $_ % 59,
                    second  => $_ % 59,
                );

        eval {
            DateTime::Format::ISO8601->new(
                base_datetime => $dt,
            );
        };
        like( $@, qr/base_datetime must be (greater|less) then/ );

        eval {
            DateTime::Format::ISO8601->new->set_base_datetime(
                object => $dt,
            );
        };
        like( $@, qr/base_datetime must be (greater|less) then/ );
    }
}