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 => 10;
use DateTime;
use DateTime::Format::Epoch;

my $dt = DateTime->new( year  => 1970, month => 1, day   => 1 );

my $f_with_leap = DateTime::Format::Epoch->new( epoch => $dt,
                                                skip_leap_seconds => 0 );
my $f_skip_leap = DateTime::Format::Epoch->new( epoch => $dt,
                                                skip_leap_seconds => 1 );

isa_ok($f_with_leap, 'DateTime::Format::Epoch' );

is($f_with_leap->format_datetime($dt), 0, 'Epoch = 0');

$dt->set( hour => 1 );
is($f_with_leap->format_datetime($dt), 3600, 'Epoch + 1hour');

$dt->set( day => 2, hour => 0 );
is($f_with_leap->format_datetime($dt), 24*3600, 'Epoch + 1day');

$dt = DateTime->new( year => 2003, month => 4, day => 27,
                     hour => 21, minute => 9, second => 57,
                     time_zone => 'Europe/Amsterdam' );

is($f_with_leap->format_datetime($dt) - $f_skip_leap->format_datetime($dt),
    22, '22 leap seconds until 2003');

$dt = DateTime->new( year => 1994, month => 6, day => 30,
                     hour => 23, minute => 59 );
my $dt2 = DateTime->new( year => 1994, month => 7, day => 1,
                         hour => 0, minute => 1 );
is($f_with_leap->format_datetime($dt2) - $f_with_leap->format_datetime($dt),
    121, '121 secs in 2 minutes');
is($f_skip_leap->format_datetime($dt2) - $f_skip_leap->format_datetime($dt),
    120, '120 secs counted in 2 minutes');

$dt2 = DateTime->new( year => 1994, month => 6, day => 30,
                      hour => 23, minute => 59, second => 60,
                      time_zone => 'UTC' );

is($f_with_leap->format_datetime($dt2) - $f_with_leap->format_datetime($dt),
    60, 'correct value at leap second');

# (epoch count at leap second is not specified if skip_leap_seconds is
# true, so not tested)

# epoch is leap second
my $f = DateTime::Format::Epoch->new( epoch => $dt2,
                                      skip_leap_seconds => 0 );
is($f->format_datetime($dt), -60, 'epoch -60 before leap second');

$dt = DateTime->new( year => 1994, month => 7, day => 1,
                     hour => 0, minute => 1 );
is($f->format_datetime($dt), 61, 'epoch 61 after leap second');