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

# Test the date-parsing facilities provided by the DateTime::Format::ISO8601
# module, if available

## no critic(Bangs::ProhibitVagueNames)

use strict;
use warnings;

use Module::Load;
use Test::More;

use RPC::XML;

my ($obj, @values, $formatter);

my $datetime_format_iso8601_avail = eval { load DateTime::Format::ISO8601; 1; };
# Do not run this suite if the package is not available
if (! $datetime_format_iso8601_avail)
{
    plan skip_all => 'DateTime::Format::ISO8601 not available';
}

# Otherwise, we have to calculate our tests from the content after __DATA__:
while (defined(my $line = <DATA>))
{
    next if ($line =~ /^#/);
    chomp $line;
    next if (! $line);
    push @values, [ split /[|]/, $line ];
}

plan tests => (scalar(@values) * 2);

# Create a formatter from the DateTime::Format::ISO8601 package, we'll use it
# to determine what the constructor *should* return:
$formatter = DateTime::Format::ISO8601->new();

for my $test (0 .. $#values)
{
    my ($input, $is_error) = @{$values[$test]};

    $obj = RPC::XML::datetime_iso8601->new($input);
    if (! $is_error)
    {
        my $match = $formatter->parse_datetime($input);
        $match =~ s/-//g;

        isa_ok($obj, 'RPC::XML::datetime_iso8601', "Input $test \$obj");
        is($obj->value, $match, "Input '$input' yielded correct value");
    }
    else
    {
        ok(! ref($obj), "Input $test yielded no object");
        like($RPC::XML::ERROR, qr/Malformed data [(]$input[)]/,
             "Input '$input' yielded correct error message");
    }
}

exit 0;

__DATA__
# Format is:
# <Input value>|<Error if set>
#
# If the second field is non-blank, then the input should yield an error
#
# I am skipping some of the sillier formats, as I don't care if people use them
# and get unexpected results. Caveat Programmer, and all that...
20110820
2011-08-20
2011-08
2011
110820
11-08-20
-1108
-11-08
--0820
--08-20
--08
---20
2011232
2011-232
11232
11-232
-232
2011W336
2011-W33-6
2011W33
2011-W33
11W336
11-W33-6
11W33
11-W33
-1W336
-1-W33-6
-1W33
-1-W33
-W336
-W33-6
17:55:55
17:55
175555,50
17:55:55,50
175555.50
1755.50
17:55.50
17.50
-55:00
-5500,50
-55.50
--00.0
175555Z
17:55:55Z
1755Z
17:55Z
17Z
175555.0Z
17:55:55.0Z
175555-0700
17:55:55-07:00
175555-07
17:55:55-07
175555.0-0700
17:55:55.0-07:00
17,01|bad
20110820175555|bad