#!/usr/bin/perl -w
use strict;
use Test::More tests=>227;

use Date::Simple;

#------------------------------------------------------------------------------
# Check validate method
#------------------------------------------------------------------------------
use strict;
use warnings;

my $d;

#1
ok($d=Date::Simple->new(2000, 12, 25));
ok(not Date::Simple->new(2000, 13, 25));
ok(not Date::Simple->new(2000, 0, 25));
ok(not Date::Simple->new(2000, 12, 32));
ok(not Date::Simple->new(2000, 12, 0));
ok($d=Date::Simple->new(1996, 02, 29));
ok(not Date::Simple->new(1900, 02, 29));

#8
ok($d=Date::Simple->new('2000-12-25'));
ok(not Date::Simple->new('2000-13-25'));
ok(not Date::Simple->new('2000-00-25'));
ok(not Date::Simple->new('2000-12-32'));
ok(not Date::Simple->new('2000-12-00'));
ok($d=Date::Simple->new('1996-02-29'));
ok(not Date::Simple->new('1900-02-29'));

#------------------------------------------------------------------------------
# Check new method with parameters
#------------------------------------------------------------------------------

#15
ok(not Date::Simple->new(2000, 2, 30));
ok($d = Date::Simple->new(2000, 2, 28));
ok(my $d2 = Date::Simple->new('2000-02-28'));

#18
is($d, $d2);
is(2000, $d->year);
is(2, $d->month);
is(28, $d->day);

ok("$d" eq "2000-02-28");

#------------------------------------------------------------------------------
# Date arithmetic
#------------------------------------------------------------------------------
#23
ok($d += 7);
is("$d", "2000-03-06");

ok($d -= 14);
is("$d", "2000-02-21");

is($d cmp "2001-07-01", -1,'cmp check');
is($d <=> [2001, 7, 1], -1,'<=> check');

ok($d2 = $d + 7);
is("$d2", "2000-02-28");

#31
is($d2->prev, "2000-02-27");
is($d2->next, "2000-02-29");

is($d2-$d, 7);

is( ($d + 0), $d);
is( ($d + -3), ($d - 3));
is( ($d - -3), ($d + 3));

#------------------------------------------------------------------------------
# try again with another date
#------------------------------------------------------------------------------

ok($d = Date::Simple->new('1998-02-28'));

ok(1998 == $d->year);
ok(2 == $d->month);
ok(28 == $d->day);

ok($d += 7);
is("$d", "1998-03-07");

ok($d -= 14);
is("$d", "1998-02-21");

ok($d2 = $d + 7);
is("$d2", "1998-02-28");

is($d2->prev, "1998-02-27");
is($d2->next, "1998-03-01");

ok($d = Date::Simple->new('1972-01-17'));
is($d->year, 1972);
is($d->month, 1);
is($d->day, 17);

is($d->format, '1972-01-17');
# Don't assume much about how this locale spells 'Jan'.
ok($d->format('%d %b %Y') =~ m/17 \D+ 1972/);
is($d->format('Foo'), 'Foo');

use Date::Simple ('date', 'd8');

$d = Date::Simple->new(1996, 10, 13);
ok ($d == Date::Simple->new ([1996, 10, 13]));
ok ($d > date(1996, 10, 12));
ok (date('1996-10-12') <= $d);
is (Date::Simple->new(2000, 3, 12) - d8(19690219), 11344);

ok ($d = Date::Simple->new (2000, 2, 12));
ok ($d = $d + 17);
is ($d->strftime("%Y %m %d"), "2000 02 29");
$d += 1;
is ($d->as_d8, "20000301");
is ($d - Date::Simple::ymd (2000, 2, 12), 18);
is (($d - 18)->format("%Y %m %d"), "2000 02 12");

is (Date::Simple::ymd(1966,10,15)->day_of_week, 6);
is (Date::Simple::ymd(2401,3,1)->day_of_week, 4);
is (Date::Simple::ymd(2401,2,28)->day_of_week, 3);
is (Date::Simple::ymd(2400,3,1)->day_of_week, 3);
is (Date::Simple::ymd(2400,2,29)->day_of_week, 2);
is (Date::Simple::ymd(2400,2,28)->day_of_week, 1);
is (Date::Simple::ymd(2101,3,1)->day_of_week, 2);
is (Date::Simple::ymd(2101,2,28)->day_of_week, 1);
is (Date::Simple::ymd(2100,3,1)->day_of_week, 1);
is (Date::Simple::ymd(2100,2,28)->day_of_week, 0);
is (Date::Simple::ymd(2001,3,1)->day_of_week, 4);
is (Date::Simple::ymd(2001,2,28)->day_of_week, 3);
is (Date::Simple::ymd(2000,3,1)->day_of_week, 3);
is (Date::Simple::ymd(2000,2,29)->day_of_week, 2);
is (Date::Simple::ymd(2000,2,28)->day_of_week, 1);
is (Date::Simple::ymd(1901,3,1)->day_of_week, 5);
is (Date::Simple::ymd(1901,2,28)->day_of_week, 4);
is (Date::Simple::ymd(1900,3,1)->day_of_week, 4);
is (Date::Simple::ymd(1900,2,28)->day_of_week, 3);
is (Date::Simple::ymd(1801,3,1)->day_of_week, 0);
is (Date::Simple::ymd(1801,2,28)->day_of_week, 6);
is (Date::Simple::ymd(1800,3,1)->day_of_week, 6);
is (Date::Simple::ymd(1800,2,28)->day_of_week, 5);
is (Date::Simple::ymd(1701,3,1)->day_of_week, 2);
is (Date::Simple::ymd(1701,2,28)->day_of_week, 1);
is (Date::Simple::ymd(1700,3,1)->day_of_week, 1);
is (Date::Simple::ymd(1700,2,28)->day_of_week, 0);
is (Date::Simple::ymd(1601,3,1)->day_of_week, 4);
is (Date::Simple::ymd(1601,2,28)->day_of_week, 3);
is (Date::Simple::ymd(1600,3,1)->day_of_week, 3);
is (Date::Simple::ymd(1600,2,29)->day_of_week, 2);
is (Date::Simple::ymd(1600,2,28)->day_of_week, 1);

foreach (
	 [1969, 2,19,  1],
	 [1975, 6,14,  1],
	 [1999, 0, 1,  0],
	 [1999, 1, 1,  1],
	 [1999, 2,28,  1],
	 [1999, 2,29,  0],
	 [1999, 4,31,  0],
	 [1999, 4,30,  1],
	 [1999, 8, 1,  1],
	 [1999, 8,31,  1],  # produced '1999 09 00' due to buggy POSIX.xs
                            # in perl 5.005_63 and 5.5.560.
	 [1999, 8,32,  0],
	 [1999,12,31,  1],
	 [1999,13, 1,  0],
	 [2000, 1, 1,  1],
	 [2000, 2,12,  1],
	 [2000, 2,28,  1],
	 [2000, 2,29,  1],
	 [2000, 3, 1,  1],
	 [2001, 2,29,  0],
	 [2004, 2,29,  1],
	 [2100, 2,29,  0],
	)
{
    $d = Date::Simple->new(@$_[0,1,2]);
    is (($d ? 1 : 0), $$_[3]);
    if ($$_[3]) {
	is ($d->year, $$_[0]);
	is ($d->month, $$_[1]);
	is ($d->day, $$_[2]);
	is ($d->strftime("%Y %m %d"), sprintf("%04d %02d %02d", @$_[0,1,2]));
	is (join (' ', $d->as_ymd),
	    join (' ', Date::Simple::days_to_ymd (Date::Simple::ymd_to_days
						  (@$_[0,1,2]))));
    }
}

ok (Date::Simple::today());
is (Date::Simple::days_in_month(2001,10), 31);

ok (d8 ('20021206') == 20021206);
ok (d8 ('20021206') eq '20021206');
ok (d8 ('20021206') eq '2002-12-06');
ok (d8 ('20021206') ne 'bla');
ok (d8 ('20021206') != 123);

   $d   = Date::Simple->new ('1972-04-28');
my $d8  = Date::Simple::D8->new  ('1972-04-28');
my $iso = Date::Simple::ISO->new ('1972-04-28');
my $fmt = Date::Simple::Fmt->new ('%d-%m-%Y','1972-04-28');

isa_ok($d,'Date::Simple');
isa_ok($d8,'Date::Simple::D8');
isa_ok($iso,'Date::Simple::ISO');
isa_ok($fmt,'Date::Simple::Fmt');

is ("$d",   '1972-04-28','Normal overloaded stringify');
is ("$d8",  '19720428'  ,'D8 overloaded stringify');
is ("$iso", '1972-04-28','ISO overloaded stringify');
is ("$fmt", '28-04-1972','Fmt overloaded stringify');

is ($d->as_str,   '1972-04-28','Normal as_str');
is ($d8->as_str,  '19720428'  ,'D8 as_str');
is ($iso->as_str, '1972-04-28','ISO as_str');
is ($fmt->as_str, '28-04-1972','Fmt as_str');

is ($d->as_d8,   '19720428','Normal as_d8');
is ($d8->as_d8,  '19720428','D8 as_d8');
is ($iso->as_d8, '19720428','ISO as_d8');
is ($fmt->as_d8, '19720428','Fmt as_d8');

is ($d->as_iso,   '1972-04-28','Normal as_iso');
is ($d8->as_iso,  '1972-04-28','D8 as_iso');
is ($iso->as_iso, '1972-04-28','ISO as_iso');
is ($fmt->as_iso, '1972-04-28','Fmt as_iso');

is ($d->as_str('<%Y><%m><%d>'),   '<1972><04><28>','Normal as_str(FMT)');
is ($d8->as_str('<%Y><%m><%d>'),  '<1972><04><28>','D8 as_str(FMT)');
is ($iso->as_str('<%Y><%m><%d>'), '<1972><04><28>','ISO as_str(FMT)');
is ($fmt->as_str('<%Y><%m><%d>'), '<1972><04><28>','Fmt as_str(FMT)');

$d   = Date::Simple->new();
$d8  = Date::Simple::D8->new();
$iso = Date::Simple::ISO->new();
$fmt = Date::Simple::Fmt->new('%d-%m-%Y');

isa_ok($d,'Date::Simple');
isa_ok($d8,'Date::Simple::D8');
isa_ok($fmt,'Date::Simple::Fmt');
isa_ok($iso,'Date::Simple::ISO');

my ($Y, $M, $D) = (localtime) [5, 4, 3];
$Y += 1900;
$M += 1;
$_=sprintf "%02d",$_ for $M,$D;

is ("$d",   "$Y-$M-$D",'Normal overloaded stringify');
is ("$d8",  "$Y$M$D"  ,'D8 overloaded stringify');
is ("$iso", "$Y-$M-$D",'ISO overloaded stringify');
is ("$fmt", "$D-$M-$Y",'Fmt overloaded stringify');



syntax highlighted by Code2HTML, v. 0.9.1