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

use 5.010;
use strict;
use warnings;

use Test::More 0.98;

use Data::Sah::Util::Type::Date qw(coerce_date);

my @datemods = (qw/Time::Moment DateTime Time::Piece/);
my %mod_available;
for my $mod (@datemods) {
    $mod_available{$mod} = eval "require $mod; 1" ? 1:0;
}

for my $mod (@datemods) {
    plan skip_all => "$mod not available" unless $mod_available{$mod};

    local $Data::Sah::Util::Type::Date::DATE_MODULE = $mod;

    subtest "coerce_date ($mod)" => sub {
        ok(!defined(coerce_date(undef)));
        ok(!defined(coerce_date("x")));
        ok(!defined(coerce_date(100_000)));
        ok(!defined(coerce_date(3_000_000_000)));
        #ok(!defined(coerce_date("2014-04-31"))); # Time::Piece accepts this
        ok(!defined(coerce_date("2014-04-32")));

        is( ref(coerce_date("2014-04-25")), $mod);
        is( ref(coerce_date("2014-04-25T10:20:30Z")), $mod);
        is( ref(coerce_date(100_000_000)), $mod);
        is( ref(coerce_date(DateTime->now)), $mod) if $mod_available{DateTime};
        is( ref(coerce_date(Time::Moment->now)), $mod) if $mod_available{'Time::Moment'};
        is( ref(coerce_date(scalar Time::Piece->gmtime)), $mod) if $mod_available{'Time::Piece'};
    };
}

done_testing;