The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vim: set ft=perl :

use strict;
use warnings;

use Test::More tests => 977;

use_ok('Java::JCR');
use_ok('Java::JCR::Jackrabbit');

my $repository = Java::JCR::Jackrabbit->new;
ok($repository);

my $session = $repository->login(
    Java::JCR::SimpleCredentials->new('username', 'password'));
ok($session);

my $root = $session->get_root_node;
ok($root);

my $node = $root->has_node('dates') 
                ? $root->get_node('dates')
                : $root->add_node('dates', 'nt:unstructured');

my $has_datetime;
my $has_class_date;

my @timezones = qw(
    Africa/Cairo
    America/Chicago
    Asia/Bangkok
    Atlantic/Bermuda
    Australia/Sydney
    Europe/Moscow
    Indian/Mayotte
    Pacific/Midway
    UTC
);

my @hours = (0, 5, 10, 15, 20, 23);

SKIP: {
    eval 'use DateTime';
    skip 'DateTime is not installed.', scalar(@timezones)*scalar(@hours) if $@;

    $has_datetime++;

    for my $tz (@timezones) {
        my $tzname = $tz;
        $tzname =~ s/\W/_/;

        for my $h (@hours) {
            my $datetime = DateTime->new(
                year => 1978,
                month => 1,
                day => 10,
                hour => $h,
                minute => 42,
                second => 57,
                time_zone => $tz,
            );

            my $property = $node->set_property(
                "datetime_${tzname}_$h" => $datetime
            );
            ok($property, "DateTime $tz $h set");
        }
    }
}

SKIP: {
    eval 'use Class::Date';
    skip 'Class::Date is not installed.', scalar(@timezones)*scalar(@hours)
        if $@;

    $has_class_date++;

    for my $tz (@timezones) {
        my $tzname = $tz;
        $tzname =~ s/\W/_/;

        for my $h (@hours) {
            my $class_date = Class::Date->new(
                [ 1978, 1, 10, $h, 42, 57 ], $tz
            );

            my $property = $node->set_property(
                "class_date_${tzname}_$h" => $class_date
            );
            ok($property, "Class::Date $tz $h set");
        }
    }
}

$session->save;

$node = $root->get_node('dates');

SKIP: {
    skip 'DateTime is not installed.', 8*scalar(@timezones)*scalar(@hours)
        if !$has_datetime;

    for my $tz (@timezones) {
        my $tzname = $tz;
        $tzname =~ s/\W/_/;

        for my $h (@hours) {
            my $property = $node->get_property("datetime_${tzname}_$h");
            my $datetime = $property->get_date('DateTime');
            ok($datetime, "DateTime $tz $h get");

            is($datetime->year, 1978, "DateTime $tz $h year");
            is($datetime->month, 1, "DateTime $tz $h month");
            is($datetime->day, 10, "DateTime $tz $h day");
            is($datetime->hour, $h, "DateTime $tz $h hour");
            is($datetime->minute, 42, "DateTime $tz $h minute");
            is($datetime->second, 57, "DateTime $tz $h second");
            is($datetime->time_zone->name, $tz, "DateTime $tz $h tz");
        }
    }
}

SKIP: {
    skip 'Class::Date is not installed.', 8*scalar(@timezones)*scalar(@hours) 
        if !$has_class_date;

    for my $tz (@timezones) {
        my $tzname = $tz;
        $tzname =~ s/\W/_/;

        for my $h (@hours) {
            my $property = $node->get_property("class_date_${tzname}_$h");
            my $class_date = $property->get_date('Class::Date');
            ok($class_date, "Class::Date $tz $h get");

            is($class_date->year, 1978, "Class::Date $tz $h year");
            is($class_date->month, 1, "Class::Date $tz $h month");
            is($class_date->day, 10, "Class::Date $tz $h day");
            is($class_date->hour, $h, "Class::Date $tz $h hour");
            is($class_date->minute, 42, "Class::Date $tz $h minute");
            is($class_date->second, 57, "Class::Date $tz $h second");
            is($class_date->tz, $tz, "Class::Date $tz $h tz");
        }
    }
}

$node->remove;
$root->save;

$session->logout;