#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use DateTime;
use DateTime::SpanSet;
# Check that SpanSets return Spans with the correct endpoints given
# the same week recurrence as its starting and ending sets.
BEGIN {
if (eval 'use DateTime::Event::Recurrence; 1') {
plan tests => 60;
}
else {
plan skip_all => 'DateTime::Event::Recurrence required for this test.';
}
}
my $recurrence =
DateTime::Event::Recurrence->weekly(
days => 1, hours => 8, minutes => 30,
);
my $base_span_set =
DateTime::SpanSet
->from_sets(start_set => $recurrence, end_set => $recurrence);
my $test_time_zone = 'Australia/Adelaide';
test_end_points(
$base_span_set,
'no time zone changes',
undef,
);
test_end_points(
$base_span_set
->clone()
->set_time_zone($test_time_zone),
'time zone specified',
$test_time_zone,
);
test_end_points(
$base_span_set
->clone()
->set_time_zone('floating')
->set_time_zone($test_time_zone),
'intermediary floating time zone',
$test_time_zone,
);
sub test_end_points {
my ($span_set, $name, $time_zone) = @_;
foreach my $hour (6..7) {
test_end_points_for_hour($span_set, $name, $time_zone, $hour, 8);
}
foreach my $hour (8..10) {
test_end_points_for_hour($span_set, $name, $time_zone, $hour, 15);
}
return;
}
sub test_end_points_for_hour {
my ($span_set, $name, $time_zone, $hour, $expected_start_day_of_month) = @_;
my $current_time = new_test_time(15, $hour, $time_zone);
my $expected_start =
new_test_time($expected_start_day_of_month, 8, $time_zone);
my $expected_end =
new_test_time($expected_start_day_of_month + 7, 8, $time_zone);
my $span = $span_set->current($current_time)->span();
test_span_end_point(
'start', $name, $span->start(), $expected_start, $current_time,
);
test_span_end_point(
'end', $name, $span->end(), $expected_end, $current_time,
);
return;
}
sub new_test_time {
my ($day_of_month, $hour, $time_zone) = @_;
my %constructor_arguments = (
year => 2008,
month => 12,
day => $day_of_month,
hour => $hour,
minute => 30,
);
if ($time_zone) {
$constructor_arguments{time_zone} = $time_zone;
}
return DateTime->new(%constructor_arguments);
}
sub test_span_end_point {
my ($end_point_name, $spanset_name, $end_point, $expected_time, $test_input_time) = @_;
my $expected_ymd = $expected_time->ymd();
my $expected_hms = $expected_time->hms();
my $test_input_string =
$test_input_time->ymd() . q< > . $test_input_time->hms();
is(
$end_point->ymd(),
$expected_ymd,
"Date for $end_point_name of SpanSet with $spanset_name at $test_input_string.",
);
is(
$end_point->hms(),
$expected_hms,
"Time of day for $end_point_name of SpanSet with $spanset_name at $test_input_string.",
);
return;
}