The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

# t/008_epoch.t - Epoch (%s) tests

use Test::More 0.88;
use DateTime;
use DateTime::Format::Strptime;

my $time = time;

# Epoch in, epoch out, now.
test(
    pattern   => "%s",
    time_zone => 'Asia/Manila',
    locale    => 'en_PH',
    input     => $time,
    epoch     => $time,
);

# is UTC recognized?
test(
    pattern   => "%a %d %b %Y %H:%M:%S %p %Z",
    time_zone => 'UTC',
    locale    => 'en_US',
    input     => "Thu 08 Jul 2010 09:49:02 AM UTC",
    epoch     => 1278582542,
);

# diag("Epoch with a no given time_zone assumes 'floating'. (Though when given an epoch, really should assume UTC ..)");
{
    my $parser = DateTime::Format::Strptime->new(
        pattern  => '%s',
        locale   => 'en',
        on_error => 'undef',
    );
    isa_ok( $parser, 'DateTime::Format::Strptime' );
    my $parsed = $parser->parse_datetime('1235282552');
    isa_ok( $parsed, 'DateTime' );
    is( $parsed->year,            2009 );
    is( $parsed->month,           2 );
    is( $parsed->day,             22 );
    is( $parsed->hour,            6 );
    is( $parsed->minute,          2 );
    is( $parsed->second,          32 );
    is( $parsed->nanosecond * 1,  0 );
    is( $parsed->time_zone->name, 'floating' );
}

# diag("Epoch with a time_zone should return the correct time for that TZ when the epoch occurs in UTC");
{
    my $parser = DateTime::Format::Strptime->new(
        pattern   => '%s',
        locale    => 'en',
        on_error  => 'undef',
        time_zone => 'Asia/Manila',
    );
    isa_ok( $parser, 'DateTime::Format::Strptime' );
    my $parsed = $parser->parse_datetime('1235282552');
    isa_ok( $parsed, 'DateTime' );
    is( $parsed->year,            2009 );
    is( $parsed->month,           2 );
    is( $parsed->day,             22 );
    is( $parsed->hour,            14 );
    is( $parsed->minute,          2 );
    is( $parsed->second,          32 );
    is( $parsed->nanosecond * 1,  0 );
    is( $parsed->time_zone->name, 'Asia/Manila' );
}

sub test {
    my %arg = @_;

    my $strptime = DateTime::Format::Strptime->new(
        pattern    => $arg{pattern}    || '%F %T',
        locale     => $arg{locale}     || 'en',
        time_zone  => $arg{time_zone}  || 'UTC',
        diagnostic => $arg{diagnostic} || 0,
        on_error   => 'undef',
    );
    isa_ok( $strptime, 'DateTime::Format::Strptime' );

    my $parsed = $strptime->parse_datetime( $arg{input} );
    isa_ok( $parsed, 'DateTime' );

    is( $parsed->epoch, $arg{epoch} );
}

done_testing();