# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
use strict;
use Test;
my @them;
BEGIN { plan('tests' => 135) };
BEGIN { print "# Perl version $] under $^O\n" }
use Time::Duration;
ok 1;
print "# Time::Duration version $Time::Duration::VERSION\n";
use constant MINUTE => 60;
use constant HOUR => 3600;
use constant DAY => 24 * HOUR;
use constant YEAR => 365 * DAY;
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
print "# Basic tests...\n";
ok( sub{duration( 0)}, '0 seconds');
ok( sub{duration( 1)}, '1 second');
ok( sub{duration( -1)}, '1 second');
ok( sub{duration( 2)}, '2 seconds');
ok( sub{duration( -2)}, '2 seconds');
ok( sub{later( 0)}, 'right then');
ok( sub{later( 2)}, '2 seconds later');
ok( sub{later( -2)}, '2 seconds earlier');
ok( sub{earlier( 0)}, 'right then');
ok( sub{earlier( 2)}, '2 seconds earlier');
ok( sub{earlier(-2)}, '2 seconds later');
ok( sub{ago( 0)}, 'right now');
ok( sub{ago( 2)}, '2 seconds ago');
ok( sub{ago( -2)}, '2 seconds from now');
ok( sub{from_now( 0)}, 'right now');
ok( sub{from_now( 2)}, '2 seconds from now');
ok( sub{from_now(-2)}, '2 seconds ago');
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
print "# Advanced tests...\n";
my $v; #scratch var
$v = 0;
ok(sub {later( $v )}, 'right then');
ok(sub {later( $v, 3)}, 'right then');
ok(sub {later_exact( $v )}, 'right then');
$v = 1;
ok(sub {later( $v )}, '1 second later');
ok(sub {later( $v, 3)}, '1 second later');
ok(sub {later_exact( $v )}, '1 second later');
$v = 30;
ok(sub {later( $v )}, '30 seconds later');
ok(sub {later( $v, 3)}, '30 seconds later');
ok(sub {later_exact( $v )}, '30 seconds later');
$v = 46;
ok(sub {later( $v )}, '46 seconds later');
ok(sub {later( $v, 3)}, '46 seconds later');
ok(sub {later_exact( $v )}, '46 seconds later');
$v = 59;
ok(sub {later( $v )}, '59 seconds later');
ok(sub {later( $v, 3)}, '59 seconds later');
ok(sub {later_exact( $v )}, '59 seconds later');
$v = 61;
ok(sub {later( $v )}, '1 minute and 1 second later');
ok(sub {later( $v, 3)}, '1 minute and 1 second later');
ok(sub {later_exact( $v )}, '1 minute and 1 second later');
$v = 3599;
ok(sub {later( $v )}, '59 minutes and 59 seconds later');
ok(sub {later( $v, 3)}, '59 minutes and 59 seconds later');
ok(sub {later_exact( $v )}, '59 minutes and 59 seconds later');
$v = 3600;
ok(sub {later( $v )}, '1 hour later');
ok(sub {later( $v, 3)}, '1 hour later');
ok(sub {later_exact( $v )}, '1 hour later');
$v = 3601;
ok(sub {later( $v )}, '1 hour and 1 second later');
ok(sub {later( $v, 3)}, '1 hour and 1 second later');
ok(sub {later_exact( $v )}, '1 hour and 1 second later');
$v = 3630;
ok(sub {later( $v )}, '1 hour and 30 seconds later');
ok(sub {later( $v, 3)}, '1 hour and 30 seconds later');
ok(sub {later_exact( $v )}, '1 hour and 30 seconds later');
$v = 3800;
ok(sub {later( $v )}, '1 hour and 3 minutes later');
ok(sub {later( $v, 3)}, '1 hour, 3 minutes, and 20 seconds later');
ok(sub {later_exact( $v )}, '1 hour, 3 minutes, and 20 seconds later');
$v = 3820;
ok(sub {later( $v )}, '1 hour and 4 minutes later');
ok(sub {later( $v, 3)}, '1 hour, 3 minutes, and 40 seconds later');
ok(sub {later_exact( $v )}, '1 hour, 3 minutes, and 40 seconds later');
$v = DAY + - HOUR + -28;
ok(sub {later( $v )}, '23 hours later');
ok(sub {later( $v, 3)}, '22 hours, 59 minutes, and 32 seconds later');
ok(sub {later_exact( $v )}, '22 hours, 59 minutes, and 32 seconds later');
$v = DAY + - HOUR + MINUTE;
ok(sub {later( $v )}, '23 hours and 1 minute later');
ok(sub {later( $v, 3)}, '23 hours and 1 minute later');
ok(sub {later_exact( $v )}, '23 hours and 1 minute later');
$v = DAY + - HOUR + 29 * MINUTE + 1;
ok(sub {later( $v )}, '23 hours and 29 minutes later');
ok(sub {later( $v, 3)}, '23 hours, 29 minutes, and 1 second later');
ok(sub {later_exact( $v )}, '23 hours, 29 minutes, and 1 second later');
$v = DAY + - HOUR + 29 * MINUTE + 31;
ok(sub {later( $v )}, '23 hours and 30 minutes later');
ok(sub {later( $v, 3)}, '23 hours, 29 minutes, and 31 seconds later');
ok(sub {later_exact( $v )}, '23 hours, 29 minutes, and 31 seconds later');
$v = DAY + - HOUR + 30 * MINUTE + 31;
ok(sub {later( $v )}, '23 hours and 31 minutes later');
ok(sub {later( $v, 3)}, '23 hours, 30 minutes, and 31 seconds later');
ok(sub {later_exact( $v )}, '23 hours, 30 minutes, and 31 seconds later');
$v = DAY + - HOUR + -28 + YEAR;
ok(sub {later( $v )}, '1 year and 23 hours later');
ok(sub {later( $v, 3)}, '1 year and 23 hours later');
ok(sub {later_exact( $v )}, '1 year, 22 hours, 59 minutes, and 32 seconds later');
$v = DAY + - HOUR + MINUTE + YEAR;
ok(sub {later( $v )}, '1 year and 23 hours later');
ok(sub {later( $v, 3)}, '1 year, 23 hours, and 1 minute later');
ok(sub {later_exact( $v )}, '1 year, 23 hours, and 1 minute later');
$v = DAY + - HOUR + 29 * MINUTE + 1 + YEAR;
ok(sub {later( $v )}, '1 year and 23 hours later');
ok(sub {later( $v, 3)}, '1 year, 23 hours, and 29 minutes later');
ok(sub {later_exact( $v )}, '1 year, 23 hours, 29 minutes, and 1 second later');
$v = DAY + - HOUR + 29 * MINUTE + 31 + YEAR;
ok(sub {later( $v )}, '1 year and 23 hours later');
ok(sub {later( $v, 3)}, '1 year, 23 hours, and 30 minutes later');
ok(sub {later_exact( $v )}, '1 year, 23 hours, 29 minutes, and 31 seconds later');
$v = YEAR + 2 * HOUR + -1;
ok(sub {later( $v )}, '1 year and 2 hours later');
ok(sub {later( $v, 3)}, '1 year and 2 hours later');
ok(sub {later_exact( $v )}, '1 year, 1 hour, 59 minutes, and 59 seconds later');
$v = YEAR + 2 * HOUR + 59;
ok(sub {later( $v )}, '1 year and 2 hours later');
ok(sub {later( $v, 3)}, '1 year, 2 hours, and 59 seconds later');
ok(sub {later_exact( $v )}, '1 year, 2 hours, and 59 seconds later');
$v = YEAR + DAY + 2 * HOUR + -1;
ok(sub {later( $v )}, '1 year and 1 day later');
ok(sub {later( $v, 3)}, '1 year, 1 day, and 2 hours later');
ok(sub {later_exact( $v )}, '1 year, 1 day, 1 hour, 59 minutes, and 59 seconds later');
$v = YEAR + DAY + 2 * HOUR + 59;
ok(sub {later( $v )}, '1 year and 1 day later');
ok(sub {later( $v, 3)}, '1 year, 1 day, and 2 hours later');
ok(sub {later_exact( $v )}, '1 year, 1 day, 2 hours, and 59 seconds later');
$v = YEAR + - DAY + - 1;
ok(sub {later( $v )}, '364 days later');
ok(sub {later( $v, 3)}, '364 days later');
ok(sub {later_exact( $v )}, '363 days, 23 hours, 59 minutes, and 59 seconds later');
$v = YEAR + - 1;
ok(sub {later( $v )}, '1 year later');
ok(sub {later( $v, 3)}, '1 year later');
ok(sub {later_exact( $v )}, '364 days, 23 hours, 59 minutes, and 59 seconds later');
print "# And an advanced one to put duration thru its paces...\n";
$v = YEAR + DAY + 2 * HOUR + 59;
ok(sub {duration( $v )}, '1 year and 1 day');
ok(sub {duration( $v, 3)}, '1 year, 1 day, and 2 hours');
ok(sub {duration_exact( $v )}, '1 year, 1 day, 2 hours, and 59 seconds');
ok(sub {duration( -$v )}, '1 year and 1 day');
ok(sub {duration( -$v, 3)}, '1 year, 1 day, and 2 hours');
ok(sub {duration_exact(-$v )}, '1 year, 1 day, 2 hours, and 59 seconds');
#~~~~~~~~
print "# Some tests of concise() ...\n";
ok( sub{concise duration( 0)}, '0s');
ok( sub{concise duration( 1)}, '1s');
ok( sub{concise duration( -1)}, '1s');
ok( sub{concise duration( 2)}, '2s');
ok( sub{concise duration( -2)}, '2s');
ok( sub{concise later( 0)}, 'right then');
ok( sub{concise later( 2)}, '2s later');
ok( sub{concise later( -2)}, '2s earlier');
ok( sub{concise earlier( 0)}, 'right then');
ok( sub{concise earlier( 2)}, '2s earlier');
ok( sub{concise earlier(-2)}, '2s later');
ok( sub{concise ago( 0)}, 'right now');
ok( sub{concise ago( 2)}, '2s ago');
ok( sub{concise ago( -2)}, '2s from now');
ok( sub{concise from_now( 0)}, 'right now');
ok( sub{concise from_now( 2)}, '2s from now');
ok( sub{concise from_now(-2)}, '2s ago');
$v = YEAR + DAY + 2 * HOUR + -1;
ok(sub {concise later( $v )}, '1y1d later');
ok(sub {concise later( $v, 3)}, '1y1d2h later');
ok(sub {concise later_exact( $v )}, '1y1d1h59m59s later');
$v = YEAR + DAY + 2 * HOUR + 59;
ok(sub {concise later( $v )}, '1y1d later');
ok(sub {concise later( $v, 3)}, '1y1d2h later');
ok(sub {concise later_exact( $v )}, '1y1d2h59s later');
$v = YEAR + - DAY + - 1;
ok(sub {concise later( $v )}, '364d later');
ok(sub {concise later( $v, 3)}, '364d later');
ok(sub {concise later_exact( $v )}, '363d23h59m59s later');
$v = YEAR + - 1;
ok(sub {concise later( $v )}, '1y later');
ok(sub {concise later( $v, 3)}, '1y later');
ok(sub {concise later_exact( $v )}, '364d23h59m59s later');
# That's it.
print "# And one for the road.\n";
ok 1;
print "# Done with of ", __FILE__, "\n";