#!/bin/perl -w use strict; use Test::More tests => 11; use DateTime; use DateTime::Event::ICal; # yearly { my $dt1 = new DateTime( year => 2000 ); my ( $set, @dt, $r ); # test contributed by John Bishop $set = DateTime::Event::ICal->recur( freq => 'yearly', dtstart => $dt1, dtend => $dt1->clone->add( years => 3 ), bymonth => 7, byday => '3mo' ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-07-17T00:00:00 2001-07-16T00:00:00 2002-07-15T00:00:00', "yearly, bymonth, byday" ); $set = DateTime::Event::ICal->recur( freq => 'yearly', dtstart => $dt1, dtend => $dt1->clone->add( years => 3 ), bymonth => 7, byday => '3mo', byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-07-17T10:00:00 2001-07-16T10:00:00 2002-07-15T10:00:00', "yearly, bymonth, byday, byhour" ); $set = DateTime::Event::ICal->recur( freq => 'yearly', dtstart => $dt1, dtend => $dt1->clone->add( years => 1 ), bymonth => 7, byday => ['3mo', 'fr' ], byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-07-07T10:00:00 2000-07-14T10:00:00 2000-07-17T10:00:00 2000-07-21T10:00:00 2000-07-28T10:00:00', "yearly, bymonth, byday index+nonindex, byhour" ); $set = DateTime::Event::ICal->recur( freq => 'yearly', dtstart => $dt1, dtend => $dt1->clone->add( years => 3 ), interval => 2, bymonth => 7, byday => ['3mo', 'fr' ], byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-07-07T10:00:00 2000-07-14T10:00:00 2000-07-17T10:00:00 2000-07-21T10:00:00 2000-07-28T10:00:00 '. '2002-07-05T10:00:00 2002-07-12T10:00:00 2002-07-15T10:00:00 2002-07-19T10:00:00 2002-07-26T10:00:00', "yearly, interval, bymonth, byday index+nonindex, byhour" ); # all months $set = DateTime::Event::ICal->recur( freq => 'yearly', dtstart => $dt1, dtend => $dt1->clone->add( years => 3 ), interval => 2, byday => ['3mo', 'fr' ], byhour => 10 ); @dt = $set->as_list( start => $dt1, end => $dt1->clone->add( months => 1 ) ); $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-01-07T10:00:00 2000-01-14T10:00:00 2000-01-17T10:00:00 2000-01-21T10:00:00 2000-01-28T10:00:00', "(2000) yearly, interval, byday index+nonindex, byhour" ); @dt = $set->as_list( start => $dt1->clone->add( months => 12 ), end => $dt1->clone->add( months => 13 ) ); $r = join(' ', map { $_->datetime } @dt); is( $r, '', "(2001 = empty) yearly, interval, byday index+nonindex, byhour" ); @dt = $set->as_list( start => $dt1->clone->add( months => 24 ), end => $dt1->clone->add( months => 25 ) ); $r = join(' ', map { $_->datetime } @dt); is( $r, '2002-01-04T10:00:00 2002-01-11T10:00:00 2002-01-18T10:00:00 2002-01-21T10:00:00 2002-01-25T10:00:00', "(2002) yearly, interval, byday index+nonindex, byhour" ); } # monthly { my $dt1 = new DateTime( year => 2000 ); my ( $set, @dt, $r ); $set = DateTime::Event::ICal->recur( freq => 'monthly', dtstart => $dt1, dtend => $dt1->clone->add( months => 4 ), byday => '3mo' ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-01-17T00:00:00 2000-02-21T00:00:00 2000-03-20T00:00:00 2000-04-17T00:00:00', "monthly, byday" ); $set = DateTime::Event::ICal->recur( freq => 'monthly', dtstart => $dt1, dtend => $dt1->clone->add( months => 4 ), byday => '3mo', byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-01-17T10:00:00 2000-02-21T10:00:00 2000-03-20T10:00:00 2000-04-17T10:00:00', "monthly, byday, byhour" ); $set = DateTime::Event::ICal->recur( freq => 'monthly', dtstart => $dt1, dtend => $dt1->clone->add( months => 2 ), byday => ['3mo', 'fr' ], byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-01-07T10:00:00 2000-01-14T10:00:00 2000-01-17T10:00:00 '. '2000-01-21T10:00:00 2000-01-28T10:00:00 2000-02-04T10:00:00 '. '2000-02-11T10:00:00 2000-02-18T10:00:00 2000-02-21T10:00:00 '. '2000-02-25T10:00:00', "monthly, byday index+nonindex, byhour" ); $set = DateTime::Event::ICal->recur( freq => 'monthly', dtstart => $dt1, dtend => $dt1->clone->add( months => 3 ), interval => 2, byday => ['3mo', 'fr' ], byhour => 10 ); @dt = $set->as_list; $r = join(' ', map { $_->datetime } @dt); is( $r, '2000-01-07T10:00:00 2000-01-14T10:00:00 2000-01-17T10:00:00 '. '2000-01-21T10:00:00 2000-01-28T10:00:00 '. '2000-03-03T10:00:00 '. '2000-03-10T10:00:00 2000-03-17T10:00:00 2000-03-20T10:00:00 '. '2000-03-24T10:00:00 2000-03-31T10:00:00', "monthly, byday index+nonindex, byhour" ); }