1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
#!/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;
|