#!/usr/bin/perl -w
use strict;
use Test::More tests => 35;
use DateTimeX::Lite;
# test _ymd2rd and _rd2ymd for various dates
# 2 tests are performed for each date (on _ymd2rd and _rd2ymd)
# dates are specified as [rd,year,month,day]
for (# min and max supported days (for 32-bit system)
[-2 ** 31, -5879610, 6, 22],
[ 2 ** 31 - 1, 5879611, 7, 11],
# some miscellaneous dates (these are actually epoch dates for
# various calendars from Calendrical Calculations (1st ed) Table
# 1.1)
[-1721425,-4713,11,24],
[-1373427,-3760,9,7],
[-1137142,-3113,8,11],
[-1132959,-3101,1,23],
[-963099,-2636,2,15],
[-1,0,12,30],[1,1,1,1],
[2796,8,8,27],
[103605,284,8,29],
[226896,622,3,22],
[227015,622,7,19],
[654415,1792,9,22],
[673222,1844,3,21]
) {
TODO: {
todo_skip("need to work this out", 1) if ($_->[0] == 2 ** 31 - 1);
is( join('/',DateTimeX::Lite::Util::rd2ymd($_->[0])), join('/',@{$_}[1..3]),
$_->[0] . " \t=> " . join '/', @{$_}[1..3] );
}
is( DateTimeX::Lite::Util::ymd2rd(@{$_}[1..3]), $_->[0],
join('/',@{$_}[1..3]) . " \t=> " . $_->[0]);
}
# normalization tests
for ( [-1753469,-4797,-33,1],
[-1753469,-4803,39,1],
[-1753105,-4796,-34,28],
[-1753105,-4802,38,28]
)
{
is(DateTimeX::Lite::Util::ymd2rd(@{$_}[1..3]), $_->[0],
join('/',@{$_}[1..3])." \t=> ".$_->[0]." (normalization)");
}
# test first and last day of each month from Jan -4800..Dec 4800
# this test bails after the first failure with a not ok.
# if it comlpetes successfully, only one ok is issued.
my @mlen=(0,31,0,31,30,31,30,31,31,30,31,30,31);
my ($dno,$y,$m,$dno2,$y2,$m2,$d2,$mlen) = (-1753530,-4800,1);
diag("this may take a minute...\n");
while ( $y <= 4800 ) {
# test $y,$m,1
++$dno;
$dno2 = DateTimeX::Lite::Util::ymd2rd( $y, $m, 1 );
if ( $dno != $dno2 ) {
is( $dno2, $dno, "greg torture test: _ymd2rd($y,$m,1) should be $dno" );
last;
}
( $y2, $m2, $d2 ) = DateTimeX::Lite::Util::rd2ymd($dno);
if ( $y2 != $y || $m2 != $m || $d2 != 1 ) {
is( "$y2/$m2/$d2", "$y/$m/1",
"greg torture test: _rd2ymd($dno) should be $y/$m/1" );
last;
}
# test $y,$m,$mlen
$mlen = $mlen[$m] || ( $y % 4 ? 28 : $y % 100 ? 29 : $y % 400 ? 28 : 29 );
$dno += $mlen - 1;
$dno2 = DateTimeX::Lite::Util::ymd2rd( $y, $m, $mlen );
if ( $dno != $dno2 ) {
is( $dno2, $dno,
"greg torture test: _ymd2rd($y,$m,$mlen) should be $dno" );
last;
}
( $y2, $m2, $d2 ) = DateTimeX::Lite::Util::rd2ymd($dno);
if ( $y2 != $y || $m2 != $m || $d2 != $mlen ) {
is( "$y2/$m2/$d2", "$y/$m/$mlen",
"greg torture test: _rd2ymd($dno) should be $y/$m/$mlen" );
last;
}
# and on to the next month...
if ( ++$m > 12 ) {
$m = 1;
++$y;
}
}
pass("greg torture test") if $y == 4801;