The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;

use Test::More tests => 119;

BEGIN {
    use_ok( 'App::HWD::Task' );
}


SIMPLE: {
    my $str = '-Create TW::DB::QuoteHead';

    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Create TW::DB::QuoteHead' );
    is( $task->level, 1 );
    is( $task->estimate, 0 );
    is( $task->id, '' );
    is( $task->date_added, '' );
    is( $task->summary, 'Create TW::DB::QuoteHead (0/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok( !$task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ID: {
    my $str = '--API Pod Docs (#198)';

    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'API Pod Docs' );
    is( $task->level, 2 );
    is( $task->estimate, 0 );
    is( $task->id, 198 );
    is( $task->date_added, '' );
    is( $task->summary, '198 - API Pod Docs (0/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok( !$task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ESTIMATE: {
    my $str = '---API Pod Docs (4h)';

    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'API Pod Docs' );
    is( $task->level, 3 );
    is( $task->estimate, 4 );
    is( $task->id, '' );
    is( $task->date_added, '' );
    is( $task->summary, 'API Pod Docs (4/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok(  $task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ID_AND_ESTIMATE: {
    my $str = '****   Retrofitting widgets     (#142,3h)';

    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Retrofitting widgets' );
    is( $task->level, 4 );
    is( $task->estimate, 3 );
    is( $task->id, 142 );
    is( $task->date_added, '' );
    is( $task->summary, '142 - Retrofitting widgets (3/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok(  $task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ESTIMATE_AND_ID: {
    my $str = '-Flargling dangows (540m ,#2112)';

    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Flargling dangows' );
    is( $task->level, 1 );
    is( $task->estimate, 9 );
    is( $task->id, 2112 );
    is( $task->date_added, '' );
    is( $task->summary, '2112 - Flargling dangows (9/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok(  $task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_PARENS: {
    my $str = '-Voodoo Chile (Slight Return) (#43)';
    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Voodoo Chile (Slight Return)' );
    is( $task->level, 1 );
    is( $task->estimate, 0 );
    is( $task->id, 43 );
    is( $task->date_added, '' );
    is( $task->summary, '43 - Voodoo Chile (Slight Return) (0/0)', 'Summary');
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok( !$task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ID_AND_ESTIMATE_AND_DATE: {
    my $str = '----***IMPORTANT*** (#142, 3h, added 2005-12-07)';
    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, '***IMPORTANT***' );
    is( $task->level, 4 );
    is( $task->estimate, 3 );
    is( $task->id, 142 );
    isa_ok( $task->date_added_obj, 'DateTime', 'Task date object' );
    is( $task->date_added, '2005-12-07', 'Task date string' );
    is( $task->summary, '142 - ***IMPORTANT*** (3/0)', 'Summary' );
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok(  $task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_FRACTIONAL_ESTIMATE: {
    my $str = '----Retrofitting widgets (.25h)';
    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Retrofitting widgets' );
    is( $task->level, 4 );
    cmp_ok( $task->estimate, '==', 0.25 );
    is( $task->id, '' );
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok(  $task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_DELETION: {
    my $str = '**Unnecessary task (14.5h, added 2005-11-07, deleted 2005-08-28, #2112)';
    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, 'Unnecessary task' );
    is( $task->level, 2 );
    cmp_ok( $task->estimate, '==', 14.5 );
    is( $task->id, 2112 );
    is( $task->date_added, '2005-11-07', "Add date" );
    is( $task->date_deleted, '2005-08-28', "Delete date" );
    ok( !$task->completed, 'Not completed' );
    ok( !$task->started, 'Not started' );
    ok( !$task->is_todo );
    ok( !$task->parent );
    is( scalar $task->assignees, 0 );
}

WITH_ASSIGNEES: {
    my $str = "--It's The End Of The World As We Know It (And I Feel Fine) (Slight Return)   (12.3h, Andy, #43, Dave)";
    my $task = App::HWD::Task->parse( $str );
    isa_ok( $task, 'App::HWD::Task' );
    is( $task->name, "It's The End Of The World As We Know It (And I Feel Fine) (Slight Return)" );
    is( $task->level, 2 );
    is( $task->estimate, 12.3 );
    is( $task->id, 43 );
    is( $task->date_added, '' );
    ok( $task->is_todo );
    ok( !$task->parent );

    my @who = $task->assignees;
    is( scalar @who, 2 );
    is_deeply( \@who, [qw( Andy Dave )] );
}

INVALID: {
    my $str = 'Invalid';
    my $task = App::HWD::Task->parse( $str );
    ok( !defined( $task ), "Shouldn't parse" );
}