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

use FindBin qw($Bin);
use lib "$Bin/../lib";


use_ok( 'Gtk2' );
use_ok( 'Gtk2::Ex::TimeEntry' );



my $entry = Gtk2::Ex::TimeEntry->new;
ok( defined $entry, qq[widget created] );

my @test_times = (
    ['12:00:00' , '12:00:00', '12:00 PM'],
    ['12:00'    , '12:00:00', '12:00 PM'],
    ['12'       , '12:00:00', '12:00 PM'],
    ['123000'   , '12:30:00', '12:30 PM'],
    ['1230'     , '12:30:00', '12:30 PM'],
    ['013000'   , '01:30:00', '01:30 AM'],
    ['0130'     , '01:30:00', '01:30 AM'],
    ['130'      , '01:30:00', '01:30 AM'],
    ['01:00:00' , '01:00:00', '01:00 AM'],
    ['1:00:00'  , '01:00:00', '01:00 AM'],
    ['01:00'    , '01:00:00', '01:00 AM'],
    ['1:00'     , '01:00:00', '01:00 AM'],
    ['1:00 am'  , '01:00:00', '01:00 AM'],
    ['1:00 pm'  , '13:00:00', '01:00 PM'],
    ['1pm'      , '13:00:00', '01:00 PM'],
    ['1am'      , '01:00:00', '01:00 AM'],
    ['invalid'  , ''        , ''        ],
    [''         , ''        , ''        ],
    [undef      , ''        , ''        ],
);

for( @test_times ) {
    no warnings;
    # test the parsing of input
    $entry = Gtk2::Ex::TimeEntry->new;
    is( $entry->_parse_input($_->[0]), $_->[1], qq[parse input: $_->[0]]);
    
    # test the setting of the value
    $entry = Gtk2::Ex::TimeEntry->new;
    $entry->set_value($_->[0]);
    is ($entry->get_value, $_->[1], qq[set value: $_->[0]]  );
    is ($entry->get_text , $_->[2], qq[test output: $_->[1]]);
}



# selecting component

my @select_tests = (
    [qw/hours    hours   /],
    [qw/minutes  minutes /],
    [qw/meridiem meridiem/],
    [none => undef],
    [''   => undef],
);


$entry = Gtk2::Ex::TimeEntry->new( value => '01:00:00' );
for (@select_tests) {
    my ($component, $expect) = @$_;
    $entry->set_selected_component($component);
    is ( $entry->get_selected_component, $expect, qq[select component: $component] );
}


my @movement_tests = (
    [qw/hours     left   hours   /],
    [qw/hours     right  minutes /],
    [qw/minutes   left   hours   /],
    [qw/minutes   right  meridiem/],
    [qw/meridiem  left   minutes /],
    [qw/meridiem  right  meridiem/],
    [qw/all       left   meridiem/],
    [qw/all       right  hours   /],
);

for (@movement_tests) {
    my ($position, $direction, $expect)  = @$_;
    my $method = "_do_key_$direction";
    $entry->set_selected_component($position);
    $entry->$method;
    is ($entry->get_selected_component, $expect, qq[key $direction from position $position]);
}

my @position_tests = (
    [qw/0 right hours/],
    [qw/0 up    hours/],
    [qw/0 down  hours/],
    [qw/1 left  hours/],
    [qw/1 right hours/],
    [qw/1 up    hours/],
    [qw/1 down  hours/],
    [qw/2 left  hours/],
    [qw/2 right minutes/],
    [qw/2 up    hours/],
    [qw/2 down  hours/],
    [qw/3 left  hours/],
    [qw/3 right minutes/],
    [qw/3 down  minutes/],
    [qw/3 up    minutes/],
    [qw/4 left  minutes/],
    [qw/4 right minutes/],
    [qw/4 up    minutes/],
    [qw/4 down  minutes/],
    [qw/5 left  minutes/],
    [qw/5 right meridiem/],
    [qw/5 up    minutes/],
    [qw/5 down  minutes/],
    [qw/6 left  minutes/],
    [qw/6 right meridiem/],
    [qw/6 up    meridiem/],
    [qw/6 down  meridiem/],
    [qw/7 left  meridiem/],
    [qw/7 right meridiem/],
    [qw/7 up    meridiem/],
    [qw/7 down  meridiem/],
    [qw/8 left  meridiem/],
    [qw/8 right meridiem/],
    [qw/8 up    meridiem/],
    [qw/9 down  meridiem/],
);


$entry = Gtk2::Ex::TimeEntry->new( value => '01:00:00' );
for (@position_tests ) {
    my ($position, $direction, $expect)  = @$_;
    my $method = "_do_key_$direction";
    $entry->set_selected_component('none');
    $entry->set_position($position);
    $entry->$method;
    is ($entry->get_selected_component, $expect, qq[key $direction from position $position]);
}

# value up down tests

my @change_tests = (
  [qw/12:00:00 hours    up   13:00:00/],
  [qw/12:00:00 hours    down 11:00:00/],
  [qw/12:00:00 minutes  up   12:01:00/],
  [qw/12:59:00 minutes  up   13:00:00/],
  [qw/23:59:00 minutes  up   00:00:00/],
  [qw/12:01:00 minutes  down 12:00:00/],
  [qw/12:00:00 minutes  down 11:59:00/],
  [qw/12:00:00 minutes  down 11:59:00/],
  [qw/12:00:00 meridiem up   00:00:00/],
  [qw/12:00:00 meridiem down 00:00:00/],
  [qw/13:00:00 meridiem up   01:00:00/],
  [qw/02:00:00 meridiem down 14:00:00/],
);

for (@change_tests ) {
    my ($time, $component, $direction, $expect)  = @$_;
    my $method = "_do_key_$direction";
    $entry->set_value($time);
    $entry->set_selected_component($component);
    $entry->$method;
    is ($entry->get_value, $expect, qq[key $direction on component $component]);
}