The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;

use Time::List;
use Time::List::Constant;

$ENV{TZ} = "JST";

plan( skip_all => "I don't have windows perl so skip and patch welcome" ) if $^O eq 'MSWin32';

subtest 'get_list_array'=> sub {
    my $timelist = Time::List->new(
        input_strftime_form => '%Y-%m-%d',
        output_strftime_form => '%Y-%m-%d',
        time_unit => MONTH,
        output_type => ROWS ,
    );

    my ($start_time , $end_time);

    $start_time = "2013-01-01";
    $end_time = "2013-03-01";
    
    my $time_list_rows = $timelist->get_list($start_time , $end_time);
   
    $time_list_rows->set_rows_from_datetime({
        "2013-01-01 00:00:00" => {id => 1 , value => "a"},
        "2013-02-01 00:00:00" => {id => 2 , value => "b"},
        "2013-03-01 00:00:00" => {id => 3 , value => "c"},
    });

    my $hash = $time_list_rows->get_hash;
    is_deeply {
        "2013-01-01" => {id => 1 , value => "a"},
        "2013-02-01" => {id => 2 , value => "b"},
        "2013-03-01" => {id => 3 , value => "c"},
    } , $hash;

    my $array = $time_list_rows->get_array;
    delete $_->{unixtime} for @$array;
    is_deeply [
        {output_time => "2013-01-01" , datetime => "2013-01-01 00:00:00" , id => 1 , value => "a"},
        {output_time => "2013-02-01" , datetime => "2013-02-01 00:00:00" , id => 2 , value => "b"},
        {output_time => "2013-03-01" , datetime => "2013-03-01 00:00:00" , id => 3 , value => "c"},
    ] , $array;
    
    $timelist->output_strftime_form( '%Y-%m-%d %H:%M:%S' );
    $time_list_rows = $timelist->get_list($start_time , $end_time);
    $time_list_rows->set_rows_from_datetime({
        "2013-01-01 00:00:00" => {id => 1 , value => "a"},
        "2013-02-01 00:00:00" => {id => 2 , value => "b"},
        "2013-03-01 00:00:00" => {id => 3 , value => "c"},
    });

    $array = $time_list_rows->get_array;
    delete $_->{unixtime} for @$array;
    is_deeply [
        {output_time => "2013-01-01 00:00:00" , datetime => "2013-01-01 00:00:00" , id => 1 , value => "a"},
        {output_time => "2013-02-01 00:00:00" , datetime => "2013-02-01 00:00:00" , id => 2 , value => "b"},
        {output_time => "2013-03-01 00:00:00" , datetime => "2013-03-01 00:00:00" , id => 3 , value => "c"},
    ] , $array;

    $timelist->show_end_time(1);
    $time_list_rows = $timelist->get_list($start_time , $end_time);
    $time_list_rows->set_rows_from_datetime({
        "2013-01-01 00:00:00" => {id => 1 , value => "a"},
        "2013-02-01 00:00:00" => {id => 2 , value => "b"},
        "2013-03-01 00:00:00" => {id => 3 , value => "c"},
    });

    $array = $time_list_rows->get_array;
    delete $_->{unixtime} for @$array;
    is_deeply [
        {output_time => "2013-01-01 00:00:00~2013-01-31 23:59:59" , datetime => "2013-01-01 00:00:00" , id => 1 , value => "a"},
        {output_time => "2013-02-01 00:00:00~2013-02-28 23:59:59" , datetime => "2013-02-01 00:00:00" , id => 2 , value => "b"},
        {output_time => "2013-03-01 00:00:00~2013-03-31 23:59:59" , datetime => "2013-03-01 00:00:00" , id => 3 , value => "c"},
    ] , $array;

    done_testing;
};

subtest 'get_list_rows_per_hours'=> sub {
    my $timelist = Time::List->new(
        input_strftime_form => '%Y-%m-%d',
        output_strftime_form => '%Y-%m-%d %H:%M:%S' ,
        time_unit => HOUR,
        output_type => ROWS ,
        boundary_included => 0 , 
    );

    my ($start_time , $end_time);

    $start_time = "2013-01-01";
    $end_time = "2013-01-02";

    my $time_list_rows = $timelist->get_list($start_time , $end_time);
    my $array = $time_list_rows->get_array;
    delete $_->{unixtime} for @$array;
    is_deeply [
        {output_time => "2013-01-01 00:00:00" , datetime => "2013-01-01 00:00:00"},
        {output_time => "2013-01-01 01:00:00" , datetime => "2013-01-01 01:00:00"},
        {output_time => "2013-01-01 02:00:00" , datetime => "2013-01-01 02:00:00"},
        {output_time => "2013-01-01 03:00:00" , datetime => "2013-01-01 03:00:00"},
        {output_time => "2013-01-01 04:00:00" , datetime => "2013-01-01 04:00:00"},
        {output_time => "2013-01-01 05:00:00" , datetime => "2013-01-01 05:00:00"},
        {output_time => "2013-01-01 06:00:00" , datetime => "2013-01-01 06:00:00"},
        {output_time => "2013-01-01 07:00:00" , datetime => "2013-01-01 07:00:00"},
        {output_time => "2013-01-01 08:00:00" , datetime => "2013-01-01 08:00:00"},
        {output_time => "2013-01-01 09:00:00" , datetime => "2013-01-01 09:00:00"},
        {output_time => "2013-01-01 10:00:00" , datetime => "2013-01-01 10:00:00"},
        {output_time => "2013-01-01 11:00:00" , datetime => "2013-01-01 11:00:00"},
        {output_time => "2013-01-01 12:00:00" , datetime => "2013-01-01 12:00:00"},
        {output_time => "2013-01-01 13:00:00" , datetime => "2013-01-01 13:00:00"},
        {output_time => "2013-01-01 14:00:00" , datetime => "2013-01-01 14:00:00"},
        {output_time => "2013-01-01 15:00:00" , datetime => "2013-01-01 15:00:00"},
        {output_time => "2013-01-01 16:00:00" , datetime => "2013-01-01 16:00:00"},
        {output_time => "2013-01-01 17:00:00" , datetime => "2013-01-01 17:00:00"},
        {output_time => "2013-01-01 18:00:00" , datetime => "2013-01-01 18:00:00"},
        {output_time => "2013-01-01 19:00:00" , datetime => "2013-01-01 19:00:00"},
        {output_time => "2013-01-01 20:00:00" , datetime => "2013-01-01 20:00:00"},
        {output_time => "2013-01-01 21:00:00" , datetime => "2013-01-01 21:00:00"},
        {output_time => "2013-01-01 22:00:00" , datetime => "2013-01-01 22:00:00"},
        {output_time => "2013-01-01 23:00:00" , datetime => "2013-01-01 23:00:00"},
    ] , $array;

    my $values = {map{$_ => {id => 1 , name => 2}}
        "2013-01-01 00:00:00",
        "2013-01-01 01:00:00",
        "2013-01-01 02:00:00",
        "2013-01-01 03:00:00",
        "2013-01-01 04:00:00",
        "2013-01-01 05:00:00",
        "2013-01-01 06:00:00",
        "2013-01-01 07:00:00",
        "2013-01-01 08:00:00",
        "2013-01-01 09:00:00",
        "2013-01-01 10:00:00",
        "2013-01-01 11:00:00",
        "2013-01-01 12:00:00",
        "2013-01-01 13:00:00",
        "2013-01-01 14:00:00",
    };
    
    $time_list_rows->set_rows_from_datetime($values);
    $array = $time_list_rows->get_array;
    delete $_->{unixtime} for @$array;
    is_deeply [
        {id => 1 , name => 2 , output_time => "2013-01-01 00:00:00" , datetime => "2013-01-01 00:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 01:00:00" , datetime => "2013-01-01 01:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 02:00:00" , datetime => "2013-01-01 02:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 03:00:00" , datetime => "2013-01-01 03:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 04:00:00" , datetime => "2013-01-01 04:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 05:00:00" , datetime => "2013-01-01 05:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 06:00:00" , datetime => "2013-01-01 06:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 07:00:00" , datetime => "2013-01-01 07:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 08:00:00" , datetime => "2013-01-01 08:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 09:00:00" , datetime => "2013-01-01 09:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 10:00:00" , datetime => "2013-01-01 10:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 11:00:00" , datetime => "2013-01-01 11:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 12:00:00" , datetime => "2013-01-01 12:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 13:00:00" , datetime => "2013-01-01 13:00:00"},
        {id => 1 , name => 2 , output_time => "2013-01-01 14:00:00" , datetime => "2013-01-01 14:00:00"},
        {output_time => "2013-01-01 15:00:00" , datetime => "2013-01-01 15:00:00"},
        {output_time => "2013-01-01 16:00:00" , datetime => "2013-01-01 16:00:00"},
        {output_time => "2013-01-01 17:00:00" , datetime => "2013-01-01 17:00:00"},
        {output_time => "2013-01-01 18:00:00" , datetime => "2013-01-01 18:00:00"},
        {output_time => "2013-01-01 19:00:00" , datetime => "2013-01-01 19:00:00"},
        {output_time => "2013-01-01 20:00:00" , datetime => "2013-01-01 20:00:00"},
        {output_time => "2013-01-01 21:00:00" , datetime => "2013-01-01 21:00:00"},
        {output_time => "2013-01-01 22:00:00" , datetime => "2013-01-01 22:00:00"},
        {output_time => "2013-01-01 23:00:00" , datetime => "2013-01-01 23:00:00"},
    ] , $array;
     
 
    done_testing;
};

done_testing;