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

BEGIN { eval { require bytes; }; }
use strict;
no strict "vars";

BEGIN { $Date::Calc::XS_DISABLE = $Date::Calc::XS_DISABLE = 1; }

use Date::Calc qw(:all);

# ======================================================================
#   ($year,$month,$day, $hour,$min,$sec) = Time_to_Date([time]);
#   $time = Date_to_Time($year,$month,$day, $hour,$min,$sec);
# ======================================================================
#   ($year,$month,$day, $hour,$min,$sec, $doy,$dow,$dst) = Gmtime([time]);
#   ($year,$month,$day, $hour,$min,$sec, $doy,$dow,$dst) = Localtime([time]);
#   $time = Mktime($year,$month,$day, $hour,$min,$sec);
# ======================================================================

#          Unix epoch is Thu  1-Jan-1970 00:00:00 (GMT)
# Classic MacOS epoch is Fri  1-Jan-1904 00:00:00 (local time)
#
#  Unix time overflow is Tue 19-Jan-2038 03:14:07 (time=0x7FFFFFFF)
# MacOS time overflow is Mon  6-Feb-2040 06:28:15 (time=0xFFFFFFFF)

if ($^O eq 'MacOS')
{
    $max_time  = 0xFFFFFFFF;
    $epoch_vec = [1904,1,1,0,0,0,1,5];
    $max_vec   = [2040,2,6,6,28,15,37,1];
    $match_vec = [1935,6,10,15,42,30,161,1];
}
else
{
    $max_time  = 0x7FFFFFFF;
    $epoch_vec = [1970,1,1,0,0,0,1,4];
    $max_vec   = [2038,1,19,3,14,7,19,2];
    $match_vec = [2001,6,10,15,42,30,161,7];
}

if (@ARGV and $ARGV[0])
{
    $all = 1;
    print "1..38\n";
}
else
{
    $all = 0;
    print "1..30\n";
}

$n = 1;

@date = Time_to_Date(0);

for ( $i = 0; $i < 6; $i++ )
{
    if ($date[$i] == $epoch_vec->[$i])
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;
}

if (Date_to_Time(@date) == 0)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

@date = Time_to_Date($max_time);

for ( $i = 0; $i < 6; $i++ )
{
    if ($date[$i] == $max_vec->[$i])
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;
}

if (Date_to_Time(@date) == $max_time)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

$time = 992187750;

@date = Time_to_Date($time);

for ( $i = 0; $i < 6; $i++ )
{
    if ($date[$i] == $match_vec->[$i])
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;
}

if (Date_to_Time(@date) == $time)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

eval { @date = Gmtime(); };

unless ($@)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if (Date_to_Days(@date[0..2]) > Date_to_Days(@{$match_vec}[0..2]))
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

eval { @date = Time_to_Date(); };

unless ($@)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if (Date_to_Days(@date[0..2]) > Date_to_Days(@{$match_vec}[0..2]))
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

eval { @date = Localtime(); };

unless ($@)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if (check_date(@date[0..2]) and check_time(@date[3..5]))
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if (Date_to_Days(@date[0..2]) > Date_to_Days(@{$match_vec}[0..2]))
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

eval { $time = Mktime(@date[0..5]); };

unless ($@)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if ($time > 992187750)
{print "ok $n\n";} else {print "not ok $n\n";}
$n++;

if ($all)
{
    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1],   $max_vec->[2],
                        $max_vec->[3],   $max_vec->[4],   $max_vec->[5]    );
    };
    unless ($@)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    if ( ($secs <= $max_time) and ($secs >= $max_time-86400) )
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1],   $max_vec->[2],
                        $max_vec->[3],   $max_vec->[4],   $max_vec->[5]+1  );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1],   $max_vec->[2],
                        $max_vec->[3],   $max_vec->[4]+1, $max_vec->[5]    );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1],   $max_vec->[2],
                        $max_vec->[3]+1, $max_vec->[4],   $max_vec->[5]    );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1],   $max_vec->[2]+1,
                        $max_vec->[3],   $max_vec->[4],   $max_vec->[5]    );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0],   $max_vec->[1]+1, $max_vec->[2],
                        $max_vec->[3],   $max_vec->[4],   $max_vec->[5]    );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;

    eval
    {
        $secs = Mktime( $max_vec->[0]+1, $max_vec->[1],   $max_vec->[2],
                        $max_vec->[3],   $max_vec->[4],   $max_vec->[5]    );
    };
    if ($@ =~ /\bDate::Calc::Mktime\(\): date out of range\b/)
    {print "ok $n\n";} else {print "not ok $n\n";}
    $n++;
}

__END__