use strict;
use warnings;

use Test::More;
plan( tests => 785 );

require DateTimeX::Fiscal::Fiscal5253;
my $class = 'DateTimeX::Fiscal::Fiscal5253';

#chdir 't' if -d 't';
#require './r454_testdata';

# This script tests the basic calculations to be sure the proper relations
# between various values are present in both normal and 53 week years.

# Loop through 5 years worth of combinations.
# test only one param at a time, an exhaustive test of every combination
# is over 1000 tests/year. This is 175 tests/year on average.

for my $yr ( 2011 .. 2015 ) {
    for my $endm ( 1 .. 12 ) {
        my $params = { year => $yr, end_month => $endm };
        test_oneyear( $class,$params ); # test end_month values
    }
    for my $dow ( 1 .. 7 ) {
        my $params = { year => $yr, end_dow => $dow };
        test_oneyear( $class,$params ); # test end_dow values
    }
    for my $type ( qw( last closest ) ) {
        my $params = { year => $yr, end_type => $type };
        test_oneyear( $class,$params ); # test end_type values
    }
    for my $leap_p ( qw( first last ) ) {
        my $params = { year => $yr, leap_period => $leap_p };
        test_oneyear( $class,$params ); # test leap_period values
    }
}

done_testing();

exit;

sub test_oneyear
{
    my $class = shift;
    my $params = shift;

    my $fc = $class->new( %{$params} );
    my $real_dow = $fc->{_end}->dow;
    ok($real_dow == $fc->end_dow,'correct end_dow');
    ok($fc->contains( date => $fc->{_start_ymd} ) == 1,
        'contains start date in period 1');
    ok($fc->contains( date => $fc->{_end_ymd} ) == $fc->weeks,
        'contains end date in period 12');
    ok(!$fc->contains( date => $fc->{_start}->clone->subtract( days => 1 ) ),
        'does not contain day before start date');
    ok(!$fc->contains( date => $fc->{_end}->clone->add( days => 1 ) ),
        'does not contain day after end date');
    if ( $fc->has_leap_week ) {
        my $dt = $fc->{_start}->clone->add( days => 6 );
        ok(!$fc->contains( date => $dt, style => 'Restated' ),
            'Restated calendar does not have first week');
        $dt->add( days => 1 );
        ok($dt->ymd eq $fc->{_restated}->{summary}->{start},
            'Restated start date is one week after base start');
        ok($fc->contains( date => $dt, style => 'Restated' ),
            'Restated calendar contains own start');
        ok($fc->{_restated}->{summary}->{style} eq 'restated',
            'Restated has correct name in calendar summary record');
        $dt = $fc->{_end}->clone->subtract( days => 6 );
        ok(!$fc->contains( date => $dt, style => 'Truncated' ),
            'Truncated calendar does not have last week');
        $dt->subtract( days => 1 );
        ok($dt->ymd eq $fc->{_truncated}->{summary}->{end},
            'Truncated start date is one week before base end');
        ok($fc->contains( date => $dt, style => 'Truncated' ),
            'Truncated calendar contains own end');
        ok($fc->{_truncated}->{summary}->{style} eq 'truncated',
            'Truncated has correct name in calendar summary record');
        if ( $fc->leap_period eq 'first' ) {
            ok($fc->period_weeks( period => 1 ) == $fc->period_weeks( period => 4 ) + 1,'period 1 has an extra week');
            ok($fc->period_weeks( period => 12 ) == $fc->period_weeks( period => 9 ),'period 12 does not have an extra week');
        } elsif ( $fc->leap_period eq 'last' ) {
            ok($fc->period_weeks( period => 1 ) == $fc->period_weeks( period => 4 ),'period 1 does not have an extra week');
            ok($fc->period_weeks( period => 12 ) == $fc->period_weeks( period => 9 ) + 1,'period 12 has an extra week');
        } else {
            fail('How the hell did we get here?')
        }
    }
}

__END__