#!/usr/bin/perl -w
use strict;
use Test::More tests => 9;
use DateTime;
use DateTime::SpanSet;
use DateTime::Event::Recurrence;
sub str { ref($_[0]) ? $_[0]->datetime : $_[0] }
sub span_str { str($_[0]->min) . '..' . str($_[0]->max) }
{
# INTERSECTION
my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
hour => 12, minute => 10, second => 45,
nanosecond => 123456,
time_zone => 'UTC' );
my $r1 = yearly DateTime::Event::Recurrence (
months => [ 10, 14 ],
days => [ 15 ],
hours => [ 14 ],
minutes => [ 15 ] );
my $r2 = daily DateTime::Event::Recurrence (
hours => [ 10, 14 ],
minutes => [ 15 ] );
my $dt;
my $r = $r1->intersection( $r2 );
$dt = $r->next( $dt1 );
is ( $dt->datetime, '2003-10-15T14:15:00', 'next intersection' );
$dt = $r->next( $dt );
is ( $dt->datetime, '2004-10-15T14:15:00', 'next intersection' );
$dt = $r->next( $dt );
is ( $dt->datetime, '2005-10-15T14:15:00', 'next intersection' );
}
{
# NO-INTERSECTION
my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
hour => 12, minute => 10, second => 45,
nanosecond => 123456,
time_zone => 'UTC' );
my $r1 = yearly DateTime::Event::Recurrence (
months => [ 10, 14 ],
days => [ 15 ],
hours => [ 14 ],
minutes => [ 15 ] );
my $r2 = daily DateTime::Event::Recurrence (
hours => [ 11, 15 ],
minutes => [ 15 ] );
my $dt;
my $r = $r1->intersection( $r2 );
$dt = $r->next( $dt1 );
is ( $dt, undef, 'next no-intersection' );
}
{
# BUILD SPAN-SET
my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
hour => 12, minute => 10, second => 45,
nanosecond => 123456,
time_zone => 'UTC' );
my $r1 = yearly DateTime::Event::Recurrence (
months => [ 9, 11 ],
days => [ 15 ],
hours => [ 14 ] );
my $r = DateTime::SpanSet->from_set_and_duration(
set => $r1,
hours => 1,
);
my $span;
my $s;
# test Set
my $iterator =
$r1->intersection( DateTime::Span->new( after => $dt1 ) )
->iterator;
$span = $iterator->next;
$s = str( $span );
is ( $s, '2003-09-15T14:00:00', 'next set' );
$span = $iterator->next;
$s = str( $span );
is ( $s, '2003-11-15T14:00:00', 'next set' );
# test SpanSet
$iterator =
$r->intersection( DateTime::Span->new( after => $dt1 ) )
->iterator;
$span = $iterator->next;
$s = span_str( $span );
is ( $s, '2003-09-15T14:00:00..2003-09-15T15:00:00', 'next span-set' );
$span = $iterator->next;
$s = span_str( $span );
is ( $s, '2003-11-15T14:00:00..2003-11-15T15:00:00', 'next span-set' );
}
{
# INTERSECTION TO SPAN-SET
my $dt1 = new DateTime( year => 2003, month => 4, day => 28,
hour => 12, minute => 10, second => 45,
nanosecond => 123456,
time_zone => 'UTC' );
my $r1 = yearly DateTime::Event::Recurrence (
months => [ 10, 14 ],
days => [ 15 ],
hours => [ 14 ] );
my $rs1 = DateTime::SpanSet->from_set_and_duration(
set => $r1,
hours => 1,
);
my $r2 = daily DateTime::Event::Recurrence (
minutes => [ 15 ] );
my $dt;
my $r = $r2->intersection( $rs1 );
$dt = $r->next( $dt1 );
is ( $dt, undef, 'next intersection to span-set' );
}