#!/usr/bin/perl -w
use strict;
use Test::More;
plan tests => 8;
use DateTime;
use DateTime::Duration;
use DateTime::SpanSet;
use DateTime::Span;
use DateTime::Set;
# use warnings;
#======================================================================
# add duration to recurrence
#======================================================================
use constant INFINITY => 100 ** 100 ** 100 ;
use constant NEG_INFINITY => -1 * (100 ** 100 ** 100);
my $res;
my $t1 = new DateTime( year => '1810', month => '08', day => '22' );
my $t2 = new DateTime( year => '1810', month => '11', day => '24' );
my $s1 = DateTime::Set->from_datetimes( dates => [ $t1, $t2 ] );
my $dur = new DateTime::Duration( hours => 1 );
my $month_callback = sub {
$_[0]->truncate( to => 'month' )
->add( months => 1 );
};
{
# "START"
my $months = DateTime::Set->from_recurrence(
recurrence => $month_callback,
start => $t1,
);
$res = $months->min;
$res = $res->ymd if ref($res);
ok( $res eq '1810-09-01',
"min() - got $res" );
$res = $months->clone->add_duration( $dur )->min;
$res = $res->datetime if ref($res);
ok( $res eq '1810-09-01T01:00:00',
"min() - got $res" );
# TODO:
{
# local $TODO = "backtracking add()";
# BACKTRACKING
my $span = new DateTime::Span(
start => new DateTime(
year => 1810, month => 9, day => 1, hour => 0, minute => 30 ),
end => new DateTime(
year => 1810, month => 9, day => 1, hour => 1, minute => 30 ),
);
my $set = $months->clone->add_duration( $dur )->intersection( $span );
my $res = $set->min;
$res = $res->datetime if ref($res);
$res = 'undef' unless $res;
ok( $res eq '1810-09-01T01:00:00',
"span intersection, add - got ".$res );
}
# TODO:
{
# local $TODO = "backtracking subtract()";
# BACKTRACKING
my $span = new DateTime::Span(
start => new DateTime(
year => 1810, month => 9, day => 30, hour => 22, minute => 30 ),
end => new DateTime(
year => 1810, month => 9, day => 30, hour => 23, minute => 30 ),
);
my $set = $months->subtract_duration( $dur )->intersection( $span );
my $res = $set->min;
$res = $res->datetime if ref($res);
$res = 'undef' unless $res;
ok( $res eq '1810-09-30T23:00:00',
"span intersection, subtract - got ".$res );
}
}
{
# INTERSECTION
my $months = DateTime::Set->from_recurrence(
recurrence => $month_callback,
);
$res = $months->intersection(
DateTime::Span->from_datetimes( after => $t1 )
)->min;
$res = $res->ymd if ref($res);
ok( $res eq '1810-09-01',
"min() - got $res" );
# diag( " after " . $t1->datetime );
$res = $months->clone->add_duration( $dur )
->intersection(
DateTime::Span->from_datetimes( after => $t1 )
);
$res = $res->min;
$res = $res->datetime if ref($res);
ok( $res eq '1810-09-01T01:00:00',
"min() - got $res" );
}
#======================================================================
# create spanset by adding duration to recurrence
#======================================================================
{
# SPANSET FROM RECURRENCE AND DURATION
my $months = DateTime::Set->from_recurrence(
recurrence => $month_callback,
);
my $spans = DateTime::SpanSet->from_set_and_duration(
set => $months,
duration => $dur
);
$res = $spans->intersection(
DateTime::Span->from_datetimes( after => $t1 )
);
# this was written step-by-step to help debugging
my $first_span = $res->{set}->first;
$res = $first_span->min;
$res = $res->datetime if ref($res);
ok( $res eq '1810-09-01T00:00:00',
"min() - got $res" );
$res = $first_span->max;
$res = $res->datetime if ref($res);
ok( $res eq '1810-09-01T01:00:00',
"max() - got $res" );
}
1;