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

use Test::More;

eval "use Time::Piece;";
plan skip_all => 'Time::Piece required for this test!' if $@;

plan 'no_plan';

use Validator::Custom;

my $vc;
my $rule;
my $data;
my $result;

# date_to_timepiece
$vc = Validator::Custom->new;
$data = {date1 => '2010/11/12', date2 => '2010111106'};
$rule = [
    date1 => [
        'date_to_timepiece'
    ],
    date2 => [
        'date_to_timepiece'
    ],
];
$result = $vc->validate($data, $rule);
is_deeply($result->invalid_params, ['date2']);
is($result->data->{date1}->year, 2010);
is($result->data->{date1}->mon, 11);
is($result->data->{date1}->mday, 12);

$data = {date1 => '2010/33/12'};
$rule = [
    date1 => [
        'date_to_timepiece'
    ],
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 2011, month => 3, mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);
is($result->data->{date}->year, 2011);
is($result->data->{date}->mon, 3);
is($result->data->{date}->mday, 9);

$data = {year => 20115, month => 3, mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 20115, month => 333, mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 20115, month => 3, mday => 999};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 2011, month => 33, mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 'a', month => 9, mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 2010, month => 'a', mday => 9};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

$data = {year => 2010, month => 11, mday => 'a'};
$rule = [
    {date => ['year', 'month', 'mday']} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->has_invalid);

# datetime_to_timepiece

$data = {datetime => '2010/11/12 12:14:45'};
$rule = [
    datetime => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);
is($result->data->{datetime}->year, 2010);
is($result->data->{datetime}->mon, 11);
is($result->data->{datetime}->mday, 12);
is($result->data->{datetime}->hour, 12);
is($result->data->{datetime}->min, 14);
is($result->data->{datetime}->sec, 45);

$data = {datetime => '2010/11/12 12:14:4'};
$rule = [
    datetime => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {datetime => '2010/11/12 12:14:69'};
$rule = [
    datetime => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2011, month => 3, mday => 9,
         hour => 23, min => 45, sec => 19};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);
is($result->data->{datetime}->year, 2011);
is($result->data->{datetime}->mon, 3);
is($result->data->{datetime}->mday, 9);
is($result->data->{datetime}->hour, 23);
is($result->data->{datetime}->min, 45);
is($result->data->{datetime}->sec, 19);

$data = {year => 2011, month => 3, mday => 9,
         hour => 23, min => 45, sec => 69};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 'a', month => 3, mday => 9,
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 'a', month => 3, mday => 9,
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 'a', month => 3, mday => 9,
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 'a', month => 3, mday => 9,
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2000, month => 'a', mday => 9,
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2000, month => 3, mday => 'a',
         hour => 23, min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2000, month => 3, mday => 9,
         hour => 'a', min => 45, sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2000, month => 3, mday => 9,
         hour => 23, min => 'a', sec => 40};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

$data = {year => 2000, month => 3, mday => 9,
         hour => 23, min => 45, sec => 'a'};
$rule = [
    {datetime => ['year', 'month', 'mday', 'hour', 'min', 'sec']} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok(!$result->is_ok);

# undefined value validation
$data = {key1 => '2011', key2 => '10', key3 => '14', key4 => undef};
$rule = [
    {date1 => [qw/key1 key2 key3/]} => [
        'date_to_timepiece'
    ],
    {date2 => [qw/key1 key2 key4/]} => [
        'date_to_timepiece'
    ],
    {date3 => [qw/key1 key4 key3/]} => [
        'date_to_timepiece'
    ],
    {date4 => [qw/key4 key2 key3/]} => [
        'date_to_timepiece'
    ],
    'key4' => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_valid('date1'));
ok(!$result->is_valid('date2'));
ok(!$result->is_valid('date3'));
ok(!$result->is_valid('date4'));
ok(!$result->is_valid('key4'));

$data = {key1 => '2011', key2 => '10', key3 => '14', key4 => '10',
  key5 => '10', key6 => '10', key7 => undef};
$rule = [
    {date1 => [qw/key1 key2 key3 key4 key5 key6/]} => [
        'datetime_to_timepiece'
    ],
    {date2 => [qw/key1 key2 key3 key4 key5 key7/]} => [
        'datetime_to_timepiece'
    ],
    {date3 => [qw/key1 key2 key3 key4 key7 key6/]} => [
        'datetime_to_timepiece'
    ],
    {date4 => [qw/key1 key2 key3 key7 key5 key6/]} => [
        'datetime_to_timepiece'
    ],
    {date5 => [qw/key1 key2 key7 key4 key5 key6/]} => [
        'datetime_to_timepiece'
    ],
    {date6 => [qw/key1 key7 key3 key4 key5 key6/]} => [
        'datetime_to_timepiece'
    ],
    {date7 => [qw/key7 key2 key3 key4 key5 key6/]} => [
        'datetime_to_timepiece'
    ],
    'key7' => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_valid('date1'));
ok(!$result->is_valid('date2'));
ok(!$result->is_valid('date3'));
ok(!$result->is_valid('date4'));
ok(!$result->is_valid('date5'));
ok(!$result->is_valid('date6'));
ok(!$result->is_valid('date7'));
ok(!$result->is_valid('key7'));

# date_to_timepiece 0-9
$data = {key1 => '201911212', key2_y => 2010, key2_m => 10, key2_d => 10};
$rule = [
    key1 => [
        'date_to_timepiece'
    ],
    {key2 => [qw/key2_y key2_m key2_d/]} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);

# date_to_timepiece 0-9
$data = {key1 => '201911212', key2_y => 2009, key2_m => 9, key2_d => 9};
$rule = [
    key1 => [
        'date_to_timepiece'
    ],
    {key2 => [qw/key2_y key2_m key2_d/]} => [
        'date_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);

# datetime_to_timepiece 0-9
$data = {key1 => '201011212101019', key2_Y => 2010, key2_m => 10, key2_d => 10,
  key2_H => 10, key2_M => 10, key2_S => 10};
$rule = [
    key1 => [
        'datetime_to_timepiece'
    ],
    {key2 => [qw/key2_Y key2_m key2_d key2_H key2_M key2_S/]} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);

# datetime_to_timepiece 0-9
$data = {key1 => '201011212101019', key2_Y => 2010, key2_m => 9, key2_d => 9,
  key2_H => 9, key2_M => 9, key2_S => 9};
$rule = [
    key1 => [
        'datetime_to_timepiece'
    ],
    {key2 => [qw/key2_Y key2_m key2_d key2_H key2_M key2_S/]} => [
        'datetime_to_timepiece'
    ]
];
$result = $vc->validate($data, $rule);
ok($result->is_ok);