package tests::LrTimegroupTest;

use strict;

use base qw/Lire::Test::TestCase/;

use Lire::SQLExt::LrTimegroup;

use POSIX qw/strftime tzset/;
sub test_lr_timegroup_sec {
    my $self = $_[0];

    my @tests =
      (
       [ '2003-10-13 14:00 EDT', 1066068720, 3600, 1066068000 ],
       [ '2003-10-13 14:00 EDT', 1066068720.100, 3600, 1066068000 ],
       [ '2003-10-13 14:12 EDT', 1066069440, 3600, 1066068000 ],
       [ '2003-10-13 14:59:59 EDT', 1066071599, 3600, 1066068000 ],
       [ '2003-10-13 15:59:59 EDT', 1066075199, 3600, 1066071600 ],
       [ '2003-10-13 20:12 EDT', 1066090320, 4*3600,  1066089600 ],
       [ '2003-10-13 23:15 EDT', 1066101300, 4*3600, 1066089600 ],
       [ '2003-10-14 00:15 EDT', 1066104900, 4*3600, 1066104000 ],
       );

    $self->assert_null( Lire::SQLExt::LrTimegroup::lr_timegroup_sec( undef, 3600 ),
                        "lr_timegroup_sec( undef ) should return undef" );
    foreach my $t ( @tests ) {
        my ( $date, $epoch, $period_size, $result ) = @$t;
        my $r =
          Lire::SQLExt::LrTimegroup::lr_timegroup_sec( $epoch, $period_size);
        my $result_fmt = strftime( '%Y-%m-%d %H:%M', localtime $result );
        my $r_fmt = strftime( '%Y-%m-%d %H:%M', localtime $r );
        $self->assert_equals( $result, $r, 
                              "lr_timegroup_sec( '$date', $period_size ) returned $r_fmt, expected $result_fmt" );
    }
}

sub test_lr_timegroup_day {
    my $self = $_[0];

    my @tests = ( [ '2003-10-14 00:15 EST', 'EST', 1066104900, 1066107600 ],
                  [ '2003-10-14 00:15 EST', 'EST', 1066104900.367, 1066107600],
                  [ '2003-07-14 23:15 CET', 'CET', 1058217300, 1058133600 ],
                  [ '2003-12-12 23:15 CET', 'CET', 1071267300, 1071183600 ],
                  [ '2003-10-14 00:15 UTC', 'UTC', 1066090500, 1066089600 ] );
    $self->assert_null( Lire::SQLExt::LrTimegroup::lr_timegroup_day( undef ),
                        "lr_timegroup_day( undef ) should return undef" );
    my $old_tz = $ENV{'TZ'};
    foreach my $t ( @tests ) {
        my ( $date, $tz, $epoch, $result ) = @$t;
        @Timezone::tz_local = ();
        $ENV{'TZ'} = $tz;
        tzset();
        my $r = Lire::SQLExt::LrTimegroup::lr_timegroup_day( $epoch );
        my $result_fmt = strftime( '%Y-%m-%d %H:%M %Z', localtime $result );
        my $r_fmt = strftime( '%Y-%m-%d %H:%M %Z', localtime $r );
        $ENV{'TZ'} =  $old_tz || '';
        tzset();
        $self->assert_equals( $result, $r,
                              "lr_timegroup_day( '$date' ) returned $r_fmt($r), expected $result_fmt($result)" );
    }
}

sub test_lr_timegroup_week {
    my $self = $_[0];

    my @tests =
      ( [ '2003-01-01 00:15 CET', 'CET', 'ISO', 1, 1041376500, 1041202800 ],
        [ '2003-01-01 00:15 CET', 'CET', 'ISO', 1, 1041376500.444, 1041202800],
        [ '2003-01-01 00:15 CET', 'CET', 'ISO', 4, 1041376500, 1041202800 ],
        [ '2002-12-31 23:15 CET', 'CET', 'ISO', 1, 1041372900, 1041202800 ],
        [ '2003-10-14 12:00 UTC', 'UTC', 'ISO', 1, 1066125600, 1066003200 ],
        [ '2003-10-14 12:00 UTC', 'UTC', 'ISO', 4, 1066125600, 1065398400 ],
        [ '2003-01-22 00:00 EST', 'EST', 'ISO', 4, 1043211600, 1041224400 ],
        [ '2003-01-29 00:00 EST', 'EST', 'ISO', 4, 1043816400, 1043643600 ],
        [ '2003-02-19 00:00 EST', 'EST', 'ISO', 4, 1045630800, 1043643600 ],

        # Weeks start on sunday
        [ '2003-01-01 00:15 CET', 'CET', 'U', 1, 1041376500, 1041116400 ],
        # Week 0 is grouped in Week 1
        [ '2003-01-01 00:15 CET', 'CET', 'U', 4, 1041376500, 1041721200 ],
        [ '2002-12-31 23:15 CET', 'CET', 'U', 1, 1041372900, 1041116400 ],
        [ '2003-10-14 12:00 UTC', 'UTC', 'U', 1, 1066125600, 1065916800 ],
        [ '2003-10-14 12:00 UTC', 'UTC', 'U', 4, 1066125600, 1065916800 ],
        [ '2003-01-29 00:00 EST', 'EST', 'U', 4, 1043816400, 1041742800 ],
        [ '2003-02-04 00:00 EST', 'EST', 'U', 4, 1044334800, 1044162000 ],
      );
    $self->assert_null( Lire::SQLExt::LrTimegroup::lr_timegroup_week( undef ),
                        "lr_timegroup_week( undef ) should return undef" );
    my $old_tz = $ENV{'TZ'};
    foreach my $t ( @tests ) {
        my ( $date, $tz, $style, $mult, $epoch, $result ) = @$t;
        $ENV{'TZ'} = $tz;
        tzset();
        $self->{'cfg'}{'lr_week_numbering'} = $style;
        $Lire::SQLExt::LrTimegroup::calc = undef;
        my $r = Lire::SQLExt::LrTimegroup::lr_timegroup_week( $epoch, $mult );
        my $result_fmt = strftime( '%Y-%m-%d (%G-%V) %Z', localtime $result );
        my $r_fmt = strftime( '%Y-%m-%d (%G-%V) %Z', localtime $r );
        $ENV{'TZ'} =  $old_tz || '';
        tzset();
        $self->assert_equals( $result, $r,
                              "lr_timegroup_week( '$date', $mult ) using $style returned $r_fmt($r), expected $result_fmt($result)" );
    }
}

sub test_lr_timegroup_month {
    my $self = $_[0];

    my @tests =
      ( [ '2002-12-31 00:00 CET', 'CET',  1, 1041289200, 1038697200 ],
        [ '2002-12-31 00:00 CET', 'CET',  3, 1041289200, 1033423200 ],
        [ '2003-01-01 00:00 UTC', 'UTC',  1, 1041379200, 1041379200 ],
        [ '2003-01-01 00:00 UTC', 'UTC',  1, 1041379200.346, 1041379200 ],
        [ '2003-01-01 00:00 UTC', 'UTC',  3, 1041379200, 1041379200 ],
        [ '2003-03-01 00:00 UTC', 'UTC',  3, 1046476800, 1041379200 ],
        [ '2003-04-05 00:00 EST', 'EST',  1, 1049518800, 1049173200 ],
        [ '2003-04-05 00:00 EST', 'EST',  3, 1049518800, 1049173200 ],
      );
    $self->assert_null( Lire::SQLExt::LrTimegroup::lr_timegroup_month( undef ),
                        "lr_timegroup_month( undef ) should return undef" );
    my $old_tz = $ENV{'TZ'};
    foreach my $t ( @tests ) {
        my ( $date, $tz, $mult, $epoch, $result ) = @$t;
        $ENV{'TZ'} = $tz;
        tzset();

        my $r = Lire::SQLExt::LrTimegroup::lr_timegroup_month( $epoch, $mult );
        my $result_fmt = strftime( '%Y-%m-%d %Z', localtime $result );
        my $r_fmt = strftime( '%Y-%m-%d %Z', localtime $r );
        $ENV{'TZ'} =  $old_tz || '';
        tzset();
        $self->assert_equals( $result, $r,
                              "lr_timegroup_month( '$date', $mult ) returned $r_fmt($r), expected $result_fmt($result)" );
    }
}

sub test_lr_timegroup_year {
    my $self = $_[0];

    my @tests =
      ( [ '2002-12-31 00:00 CET', 'CET',  1, 1041289200, 1009839600 ],
        [ '2002-12-31 00:00 CET', 'CET',  1, 1041289200.765, 1009839600 ],
        [ '2000-01-01 00:00 UTC', 'UTC',  10, 946684800, 662688000 ],
        [ '2001-01-01 00:00 UTC', 'UTC',  10, 978307200, 978307200 ],
      );
    $self->assert_null( Lire::SQLExt::LrTimegroup::lr_timegroup_year( undef ),
                        "lr_timegroup_year( undef ) should return undef" );
    my $old_tz = $ENV{'TZ'};
    foreach my $t ( @tests ) {
        my ( $date, $tz, $mult, $epoch, $result ) = @$t;
        $ENV{'TZ'} = $tz;
        tzset();

        my $r = Lire::SQLExt::LrTimegroup::lr_timegroup_year( $epoch, $mult );
        my $result_fmt = strftime( '%Y-%m-%d %Z', localtime $result );
        my $r_fmt = strftime( '%Y-%m-%d %Z', localtime $r );
        $ENV{'TZ'} =  $old_tz || '';
        tzset();
        $self->assert_equals( $result, $r,
                              "lr_timegroup_year( '$date', $mult ) returned $r_fmt($r), expected $result_fmt($result)" );
    }
}

1;


syntax highlighted by Code2HTML, v. 0.9.1