The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More;
use t::DateTime::Astro::Test qw(datetime);
use_ok "DateTime::Astro", "solar_longitude", "solar_longitude_after", "solar_longitude_before";

my $DELTA_LONGITUDE = $ENV{ALLOW_SOLAR_LONGITUDE_DELTA} || 0.006;

# http://aa.usno.navy.mil/data/docs/EarthSeasons.php
my @data = (
    # XXX these data are now gone from above website
    [   0, 1992,  3, 20,  8, 48 ],
    [  90, 1992,  6, 21,  3, 14 ],
    [ 270, 1992, 12, 21, 14, 43 ],
    [  90, 1993,  6, 21,  9, 00 ],
    [ 270, 1993, 12, 21, 20, 26 ],
    [  90, 1994,  6, 21, 14, 48 ],
    [  90, 1999,  6, 21, 19, 49 ],

    # XXX these are there as of 6/12/2010
    [   0, 2000,  3, 20,  7, 35 ],
    [  90, 2000,  6, 21,  1, 48 ],
    [ 180, 2000,  9, 22, 17, 28 ],
    [ 270, 2000, 12, 21, 13, 37 ],
    [   0, 2001,  3, 20, 13, 31 ],
    [  90, 2001,  6, 21,  7, 38 ],
    [ 180, 2001,  9, 22, 23,  4 ],
    [ 270, 2001, 12, 21, 19, 21 ],
    [   0, 2002,  3, 20, 19, 16 ],
    [  90, 2002,  6, 21, 13, 24 ],
    [ 180, 2002,  9, 23,  4, 55 ],
    [ 270, 2002, 12, 22,  1, 14 ],
    [   0, 2003,  3, 21,  1,  0 ],
    [  90, 2003,  6, 21, 19, 10 ],
    [ 180, 2003,  9, 23, 10, 47 ],
    [   0, 2004,  3, 20,  6, 49 ],
    [  90, 2004,  6, 21,  0, 57 ],
    [ 180, 2004,  9, 22, 16, 30 ],
    [   0, 2005,  3, 20, 12, 33 ],
    [  90, 2005,  6, 21,  6, 46 ],
    [ 180, 2005,  9, 22, 22, 23 ],
    [   0, 2006,  3, 20, 18, 26 ],
    [  90, 2006,  6, 21, 12, 26 ],
    [ 180, 2006,  9, 23,  4,  3 ],
    [   0, 2007,  3, 21,  0,  7 ],
    [  90, 2007,  6, 21, 18,  6 ],
    [ 180, 2007,  9, 23,  9, 51 ],
    [   0, 2008,  3, 20,  5, 48 ],
    [  90, 2008,  6, 20, 23, 59 ],
    [ 180, 2008,  9, 22, 15, 44 ],
    [   0, 2009,  3, 20, 11, 44 ],
    [  90, 2009,  6, 21,  5, 46 ],
    [ 180, 2009,  9, 22, 21, 19 ],
    [ 270, 2003, 12, 22,  7,  4 ],
    [ 270, 2004, 12, 21, 12, 42 ],
    [ 270, 2005, 12, 21, 18, 35 ],
    [ 270, 2006, 12, 22,  0, 22 ],
    [ 270, 2007, 12, 22,  6,  8 ],
    [ 270, 2008, 12, 21, 12,  4 ],
    [ 270, 2009, 12, 21, 17, 47 ],
);

foreach my $data (@data) {
    my ($expected, $y, $m, $d, $H, $M) = @$data;

    my $dt = datetime($y, $m, $d, $H, $M);
    my $longitude = solar_longitude($dt);
    my $delta = abs($longitude - $expected);
    ok $delta < $DELTA_LONGITUDE,
        "[longitude = $longitude][expected = $expected][delta = $delta][dt = $dt ]";

    my $x = $dt->clone;
    $x->add( days => 10 );

    my $before = solar_longitude_before( $x, $expected );
    $delta = abs ($before->epoch - $dt->epoch);
    ok $delta < 540, # XXX TODO FIX
        "[before = $before][expected = $dt][delta = $delta]";

    $x = $dt->clone;
    $x->subtract( days => 10 );
    my $after = solar_longitude_after( $x, $expected );
    $delta = abs ($after->epoch - $dt->epoch);
    ok $delta < 540,
        "[after = $after][expected = $dt][delta = $delta]";
}

done_testing;