The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# time.t

use strict;
use warnings;
use Test::More;

my $mocked_epoch = 1355676244;    # "Sun, 16-Dec-2012 16:44:04 GMT"

# The order is important!
eval { require Test::MockTime; 1; }
    or plan skip_all => 'Test::MockTime not present';

Test::MockTime::set_fixed_time($mocked_epoch);
require Dancer2::Core::Time;

my @tests = (
    [ "1h"      => 3600  => "Sun, 16-Dec-2012 17:44:04 GMT" ],
    [ "1 hour"  => 3600  => "Sun, 16-Dec-2012 17:44:04 GMT" ],
    [ "+1 hour" => 3600  => "Sun, 16-Dec-2012 17:44:04 GMT" ],
    [ "-1h"     => -3600 => "Sun, 16-Dec-2012 15:44:04 GMT" ],
    [ "1 hours" => 3600  => "Sun, 16-Dec-2012 17:44:04 GMT" ],

    [ "1d"    => ( 3600 * 24 ) => "Mon, 17-Dec-2012 16:44:04 GMT" ],
    [ "1 day" => ( 3600 * 24 ) => "Mon, 17-Dec-2012 16:44:04 GMT" ],


);

foreach my $test (@tests) {
    my ( $expr, $secs, $gmt_string ) = @$test;

    subtest "Expression: \"$expr\"" => sub {
        my $t = Dancer2::Core::Time->new( expression => $expr );
        is $t->seconds, $secs, "\"$expr\" is $secs seconds";
        is $t->epoch, ( $t->seconds + $mocked_epoch ),
          "... its epoch is " . $t->epoch;
        is $t->gmt_string, $gmt_string,
          "... and its GMT string is $gmt_string";
    };
}

subtest "Forcing another epoch in the object should work" => sub {
    my $t = Dancer2::Core::Time->new( epoch => 1, expression => "1h" );
    is $t->seconds, 3600, "...1h is still 3600 seconds";
    is $t->epoch,   1,    "... epoch is 1";
    is $t->gmt_string, 'Thu, 01-Jan-1970 00:00:01 GMT',
      "... and is expressed as Thu, 01-Jan-1970 00:00:01 GMT";
};

subtest "unparsable strings should be kept" => sub {
    for my $t (
        [ "something silly", "something silly", "something silly" ],
        [ "+2 something",    "+2 something",    "+2 something" ],
      )
    {
        my ( $expr, $secs, $gmt ) = @$t;
        my $t = Dancer2::Core::Time->new( expression => $expr );
        is $t->seconds,    $secs, "\"$expr\" is $secs seconds";
        is $t->epoch,      $expr, "... its epoch is $expr";
        is $t->gmt_string, $gmt,  "... and its GMT string is $gmt";
    }
};

done_testing;