The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use 5.010;
use strict;
use warnings;
use lib 't';

use Test::Most;
use testlib::Fixtures;
use DateTime;
use App::TimeTracker;
my $tmp = testlib::Fixtures::setup_tempdir;

my %BASE = ( home=>$tmp, config=>{} );

{ # $self->now
    my $exp = DateTime->now(time_zone=>'local');
    my $got = App::TimeTracker->now;
    is($exp->ymd,$got->ymd,'$self->now: ymd');
    is($exp->strftime('%H:%M'),$got->strftime('%H:%M'),'$self->now: hh:mm');
}

{ # beautify_seconds
    my @tests = (
        [undef, '0'],
        ['0', '0'],
        ['59', '00:00:59'],
        ['60', '00:01:00'],
        ['61', '00:01:01'],
        ['263', '00:04:23'],
        [3*60*60, '03:00:00'],
        [(4*60*60)+(42*60)+21, '04:42:21'],
        [(18*60*60), '18:00:00'],
        [(111*60*60)+11, '111:00:11'],
    );
    foreach (@tests) {
        is(App::TimeTracker->beautify_seconds($_->[0]),$_->[1],join(' -> ',map { $_ // 'UNDEF'} @$_));
    }
}

{ # tags
    my $t = App::TimeTracker->new(\%BASE);
    cmp_bag($t->tags,[],'no tags');
    $t->add_tag('1');
    $t->add_tag('2');
    $t->insert_tag('3');
    cmp_deeply($t->tags,[3,1,2],'some tags');

}

{ # to / from
    my $class = Moose::Meta::Class->create_anon_class(
        superclasses => ['App::TimeTracker'],
        roles        => ['App::TimeTracker::Command::Core'],
    );
    my $class_name = $class->name;
    $class_name->_load_attribs_worked($class);
    
    no warnings 'redefine';
    local *DateTime::now = sub { return DateTime->new( year => 2011, month => 9, day => 7, hour => 12 ) };
    {
        my $t1 = $class_name->new({
            %BASE,
            this    => 'week',
        });
        
        is($t1->from->iso8601,'2011-09-05T00:00:00','From 1 ok');
        is($t1->to->iso8601,'2011-09-11T23:59:59','To 1 ok');
    }

    {
        my $t2 = $class_name->new({
            %BASE,
            last    => 'week',
        });
        
        is($t2->from->iso8601,'2011-08-29T00:00:00','From 2 ok');
        is($t2->to->iso8601,'2011-09-04T23:59:59','To 2 ok');
    }
    
    {
        my $t3 = $class_name->new({
            %BASE,
            last    => 'month',
        });
        
        is($t3->from->iso8601,'2011-08-01T00:00:00','From 3 ok');
        is($t3->to->iso8601,'2011-08-31T23:59:59','To 3 ok');
    }
    
    {
        my $t4 = $class_name->new({
            %BASE,
            last    => 'day',
        });
        
        is($t4->from->iso8601,'2011-09-06T00:00:00','From 4 ok');
        is($t4->to->iso8601,'2011-09-06T23:59:59','To 4 ok');
    }
}

done_testing();