Blame t/ymd.t

Packit eb839c
use warnings;
Packit eb839c
use strict;
Packit eb839c
Packit eb839c
use Test::More tests => 1 + 3*19 + 6 + 6*11 + 11;
Packit eb839c
Packit eb839c
BEGIN {
Packit eb839c
	use_ok "Date::ISO8601",
Packit eb839c
		qw(month_days cjdn_to_ymd ymd_to_cjdn present_ymd);
Packit eb839c
}
Packit eb839c
Packit eb839c
my $have_bigint = eval("use Math::BigInt 1.16; 1");
Packit eb839c
my $have_bigrat = eval("use Math::BigRat 0.04; 1");
Packit eb839c
Packit eb839c
sub match_val($$) {
Packit eb839c
	my($a, $b) = @_;
Packit eb839c
	ok ref($a) eq ref($b) && $a == $b;
Packit eb839c
}
Packit eb839c
Packit eb839c
sub match_vec($$) {
Packit eb839c
	my($a, $b) = @_;
Packit eb839c
	unless(@$a == @$b) {
Packit eb839c
		ok 0;
Packit eb839c
		return;
Packit eb839c
	}
Packit eb839c
	for(my $i = 0; $i != @$a; $i++) {
Packit eb839c
		my $aval = $a->[$i];
Packit eb839c
		my $bval = $b->[$i];
Packit eb839c
		unless(ref($aval) eq ref($bval) && $aval == $bval) {
Packit eb839c
			ok 0;
Packit eb839c
			return;
Packit eb839c
		}
Packit eb839c
	}
Packit eb839c
	ok 1;
Packit eb839c
}
Packit eb839c
Packit eb839c
my @prep = (
Packit eb839c
	sub { $_[0] },
Packit eb839c
	sub { $have_bigint ? Math::BigInt->new($_[0]) : undef },
Packit eb839c
	sub { $have_bigrat ? Math::BigRat->new($_[0]) : undef },
Packit eb839c
);
Packit eb839c
Packit eb839c
sub check_days($$$) {
Packit eb839c
	my($y, $m, $md) = @_;
Packit eb839c
	foreach my $prep (@prep) { SKIP: {
Packit eb839c
		my $py = $prep->($y);
Packit eb839c
		skip "numeric type unavailable", 1 unless defined $py;
Packit eb839c
		match_val month_days($py, $m), $md;
Packit eb839c
	} }
Packit eb839c
}
Packit eb839c
Packit eb839c
check_days(-2000, 2, 29);
Packit eb839c
check_days(-1999, 2, 28);
Packit eb839c
check_days(-1996, 2, 29);
Packit eb839c
check_days(-1900, 2, 28);
Packit eb839c
check_days(2000, 2, 29);
Packit eb839c
check_days(2001, 2, 28);
Packit eb839c
check_days(2004, 2, 29);
Packit eb839c
check_days(2100, 2, 28);
Packit eb839c
check_days(2100, 1, 31);
Packit eb839c
check_days(2100, 3, 31);
Packit eb839c
check_days(2100, 4, 30);
Packit eb839c
check_days(2100, 5, 31);
Packit eb839c
check_days(2100, 6, 30);
Packit eb839c
check_days(2100, 7, 31);
Packit eb839c
check_days(2100, 8, 31);
Packit eb839c
check_days(2100, 9, 30);
Packit eb839c
check_days(2100, 10, 31);
Packit eb839c
check_days(2100, 11, 30);
Packit eb839c
check_days(2100, 12, 31);
Packit eb839c
Packit eb839c
eval { ymd_to_cjdn(2000, 0, 1); };
Packit eb839c
like $@, qr/\Amonth number /;
Packit eb839c
eval { ymd_to_cjdn(2000, 13, 1); };
Packit eb839c
like $@, qr/\Amonth number /;
Packit eb839c
eval { ymd_to_cjdn(2000, 1, 0); };
Packit eb839c
like $@, qr/\Aday number /;
Packit eb839c
eval { ymd_to_cjdn(2000, 1, 32); };
Packit eb839c
like $@, qr/\Aday number /;
Packit eb839c
eval { ymd_to_cjdn(2000, 2, 30); };
Packit eb839c
like $@, qr/\Aday number /;
Packit eb839c
eval { ymd_to_cjdn(2001, 2, 29); };
Packit eb839c
like $@, qr/\Aday number /;
Packit eb839c
Packit eb839c
sub check_conv($$$$) {
Packit eb839c
	my($cjdn, $y, $m, $d) = @_;
Packit eb839c
	foreach my $prep (@prep) { SKIP: {
Packit eb839c
		skip "numeric type unavailable", 2 unless defined $prep->(0);
Packit eb839c
		match_vec [ cjdn_to_ymd($prep->($cjdn)) ],
Packit eb839c
			[ $prep->($y), $m, $d ];
Packit eb839c
		match_vec [ $prep->($cjdn) ],
Packit eb839c
			[ ymd_to_cjdn($prep->($y), $m, $d) ];
Packit eb839c
	} }
Packit eb839c
}
Packit eb839c
Packit eb839c
check_conv(0, -4713, 11, 24);
Packit eb839c
check_conv(1721060, 0, 1, 1);
Packit eb839c
check_conv(2406029, 1875, 5, 20);
Packit eb839c
check_conv(2441317, 1971, 12, 31);
Packit eb839c
check_conv(2441318, 1972, 1, 1);
Packit eb839c
check_conv(2443144, 1976, 12, 31);
Packit eb839c
check_conv(2443145, 1977, 1, 1);
Packit eb839c
check_conv(2451544, 1999, 12, 31);
Packit eb839c
check_conv(2451545, 2000, 1, 1);
Packit eb839c
check_conv(2451604, 2000, 2, 29);
Packit eb839c
check_conv(2451605, 2000, 3, 1);
Packit eb839c
Packit eb839c
is present_ymd(2406029), "1875-05-20";
Packit eb839c
is present_ymd(1875, 5, 20), "1875-05-20";
Packit eb839c
is present_ymd(2451545), "2000-01-01";
Packit eb839c
is present_ymd(2000, 1, 1), "2000-01-01";
Packit eb839c
Packit eb839c
is present_ymd(1233, 0, 0), "1233-00-00";
Packit eb839c
is present_ymd(1233, 2, 29), "1233-02-29";
Packit eb839c
is present_ymd(1233, 99, 99), "1233-99-99";
Packit eb839c
eval { present_ymd(1233, -1, 1) }; isnt $@, "";
Packit eb839c
eval { present_ymd(1233, 100, 1) }; isnt $@, "";
Packit eb839c
eval { present_ymd(1233, 1, -1) }; isnt $@, "";
Packit eb839c
eval { present_ymd(1233, 1, 100) }; isnt $@, "";
Packit eb839c
Packit eb839c
1;