Blob Blame History Raw
#!/bin/perl -w
# Copyright (c) 2003 Flavio Soibelmann Glock. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# modified from Date::Set tests
#

use strict;
# use warnings;
use Test::More tests => 42;

use DateTime::Span;
BEGIN { use_ok('DateTime::Event::ICal') };

sub str {
    my $iter = $_[0]->iterator;
    my @result;
    while ( my $dt = $iter->next ) {
        push @result, $dt->datetime
            if ref( $dt ); 
    };
    return join( ',', @result );
}

my ($title, $a, $a2, $b, $period, $RFC);

# DATES

my $dt19950101 = DateTime->new( 
    year => 1995 );

my $dt19961105T090000 = DateTime->new(
    year => 1996, month => 11, day => 05, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19990101 = DateTime->new( 
    year => 1999 );

my $dt19970101T090000 = DateTime->new(
    year => 1997, month => 1, day => 1, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970310T090000 = DateTime->new(
    year => 1997, month => 3, day => 10, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970610T090000 = DateTime->new(
    year => 1997, month => 6, day => 10, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970805T090000 = DateTime->new(
    year => 1997, month => 8, day => 5, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970902T090000 = DateTime->new( 
    year => 1997, month => 9, day => 2, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970904T090000 = $dt19970902T090000->clone->add( days => 2 );

my $dt19970905T090000 = DateTime->new( 
    year => 1997, month => 9, day => 5, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19970902T170000 = DateTime->new(
    year => 1997, month => 9, day => 2, hour => 17,
    # time_zone => 'US-Eastern',
 );

my $dt19971007T000000= DateTime->new(
    year => 1997, month => 10, day => 7,
    # time_zone => 'US-Eastern',
 );

my $dt19971224T000000 = DateTime->new(
    year => 1997, month => 12, day => 24, 
    # time_zone => 'US-Eastern',
 );

my $dt19980101T090000 = DateTime->new(
    year => 1998, month => 1, day => 1, hour => 9,
    # time_zone => 'US-Eastern',
 );

my $dt19980201T000000 = DateTime->new(
    year => 1998, month => 2, day => 1, 
    # time_zone => 'US-Eastern',
 );

my $dt20000131T090000 = DateTime->new(
    year => 2000, month => 1, day => 31, hour => 9,
    # time_zone => 'US-Eastern',
 );


# PERIODS

my $period_1995_19970904T090000 = DateTime::Span->new(
            start => $dt19950101, end => $dt19970904T090000 );

my $period_1995_1999 = DateTime::Span->new(
            start => $dt19950101, end => $dt19990101 );

my $period_1995_1998 = DateTime::Span->new(
            start => $dt19950101, 
            end => $dt19990101->clone->subtract( years => 1 ) );

my $period_1995_19980201 = DateTime::Span->new(
            start => $dt19950101,
            end =>   $dt19980201T000000 );

my $period_1995_19980301 = DateTime::Span->new(
            start => $dt19950101,
            end =>   $dt19980201T000000->clone->add( months => 1 ) );

my $period_1995_19980401 = DateTime::Span->new(
            start => $dt19950101,
            end =>   $dt19980201T000000->clone->add( months => 2 ) );

my $period_1995_2000 = DateTime::Span->new(
            start => $dt19950101,
            end => $dt19990101->clone->add( years => 1 ) );

my $period_1995_2001 = DateTime::Span->new(
            start => $dt19950101,
            end => $dt19990101->clone->add( years => 2 ) );

my $period_1995_2004 = DateTime::Span->new(
            start => $dt19950101,
            end => $dt19990101->clone->add( years => 5 ) );

my $period_1995_2005 = DateTime::Span->new(
            start => $dt19950101,
            end => $dt19990101->clone->add( years => 6 ) );

my $period_1995_2007 = DateTime::Span->new(
            start => $dt19950101,
            end => $dt19990101->clone->add( years => 8 ) );


# TESTS

$title="***  Daily for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=DAILY;COUNT=10
#
#     ==> (1997 9:00 AM EDT)September 2-11
#
    $a = DateTime::Event::ICal->recur( 
            dtstart => $dt19970902T090000 ,
            freq => 'daily', 
            count => 10 )
            ->intersection( $period_1995_1999 );
    is("". str($a), 
        '1997-09-02T09:00:00,1997-09-03T09:00:00,' .
        '1997-09-04T09:00:00,1997-09-05T09:00:00,' .
        '1997-09-06T09:00:00,1997-09-07T09:00:00,' .
        '1997-09-08T09:00:00,1997-09-09T09:00:00,' .
        '1997-09-10T09:00:00,1997-09-11T09:00:00', $title);


$title="***  Daily until December 24, 1997  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=DAILY;UNTIL=1997-12-24T00:00:00
#
#     ==> (1997 9:00 AM EDT)September 2-30;October 1-25
#         (1997 9:00 AM EST)October 26-31;November 1-30;December 1-23
#
    $a = DateTime::Event::ICal->recur(
            dtstart => $dt19970902T090000 ,
            freq => 'daily',
            until => $dt19971224T000000 )
            ->intersection( $period_1995_1999 );
    is("". str($a),
        '1997-09-02T09:00:00,1997-09-03T09:00:00,' .
        '1997-09-04T09:00:00,1997-09-05T09:00:00,' .
        '1997-09-06T09:00:00,1997-09-07T09:00:00,' .
        '1997-09-08T09:00:00,1997-09-09T09:00:00,' .
        '1997-09-10T09:00:00,1997-09-11T09:00:00,' .
        '1997-09-12T09:00:00,1997-09-13T09:00:00,' .
        '1997-09-14T09:00:00,1997-09-15T09:00:00,' .
        '1997-09-16T09:00:00,1997-09-17T09:00:00,' .
        '1997-09-18T09:00:00,1997-09-19T09:00:00,' .
        '1997-09-20T09:00:00,1997-09-21T09:00:00,' .
        '1997-09-22T09:00:00,1997-09-23T09:00:00,' .
        '1997-09-24T09:00:00,1997-09-25T09:00:00,' .
        '1997-09-26T09:00:00,1997-09-27T09:00:00,' .
        '1997-09-28T09:00:00,1997-09-29T09:00:00,' .
        '1997-09-30T09:00:00,1997-10-01T09:00:00,' .
        '1997-10-02T09:00:00,1997-10-03T09:00:00,' .
        '1997-10-04T09:00:00,1997-10-05T09:00:00,' .
        '1997-10-06T09:00:00,1997-10-07T09:00:00,' .
        '1997-10-08T09:00:00,1997-10-09T09:00:00,' .
        '1997-10-10T09:00:00,1997-10-11T09:00:00,' .
        '1997-10-12T09:00:00,1997-10-13T09:00:00,' .
        '1997-10-14T09:00:00,1997-10-15T09:00:00,' .
        '1997-10-16T09:00:00,1997-10-17T09:00:00,' .
        '1997-10-18T09:00:00,1997-10-19T09:00:00,' .
        '1997-10-20T09:00:00,1997-10-21T09:00:00,' .
        '1997-10-22T09:00:00,1997-10-23T09:00:00,' .
        '1997-10-24T09:00:00,1997-10-25T09:00:00,' .
        '1997-10-26T09:00:00,1997-10-27T09:00:00,' .
        '1997-10-28T09:00:00,1997-10-29T09:00:00,' .
        '1997-10-30T09:00:00,1997-10-31T09:00:00,' .
        '1997-11-01T09:00:00,1997-11-02T09:00:00,' .
        '1997-11-03T09:00:00,1997-11-04T09:00:00,' .
        '1997-11-05T09:00:00,1997-11-06T09:00:00,' .
        '1997-11-07T09:00:00,1997-11-08T09:00:00,' .
        '1997-11-09T09:00:00,1997-11-10T09:00:00,' .
        '1997-11-11T09:00:00,1997-11-12T09:00:00,' .
        '1997-11-13T09:00:00,1997-11-14T09:00:00,' .
        '1997-11-15T09:00:00,1997-11-16T09:00:00,' .
        '1997-11-17T09:00:00,1997-11-18T09:00:00,' .
        '1997-11-19T09:00:00,1997-11-20T09:00:00,' .
        '1997-11-21T09:00:00,1997-11-22T09:00:00,' .
        '1997-11-23T09:00:00,1997-11-24T09:00:00,' .
        '1997-11-25T09:00:00,1997-11-26T09:00:00,' .
        '1997-11-27T09:00:00,1997-11-28T09:00:00,' .
        '1997-11-29T09:00:00,1997-11-30T09:00:00,' .
        '1997-12-01T09:00:00,1997-12-02T09:00:00,' .
        '1997-12-03T09:00:00,1997-12-04T09:00:00,' .
        '1997-12-05T09:00:00,1997-12-06T09:00:00,' .
        '1997-12-07T09:00:00,1997-12-08T09:00:00,' .
        '1997-12-09T09:00:00,1997-12-10T09:00:00,' .
        '1997-12-11T09:00:00,1997-12-12T09:00:00,' .
        '1997-12-13T09:00:00,1997-12-14T09:00:00,' .
        '1997-12-15T09:00:00,1997-12-16T09:00:00,' .
        '1997-12-17T09:00:00,1997-12-18T09:00:00,' .
        '1997-12-19T09:00:00,1997-12-20T09:00:00,' .
        '1997-12-21T09:00:00,1997-12-22T09:00:00,' .
        '1997-12-23T09:00:00' ,

        $title);



$title="***  Every other day - forever  ***"; 
# 
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=DAILY;INTERVAL=2
#     ==> (1997 9:00 AM EDT)September2,4,6,8...24,26,28,30;
#          October 2,4,6...20,22,24
#         (1997 9:00 AM EST)October 26,28,30;November 1,3,5,7...25,27,29;
#          Dec 1,3,...
#
    $a = DateTime::Event::ICal->recur(
            dtstart => $dt19970902T090000 ,
            freq => 'daily',
            interval => 2 )
            ->intersection( $period_1995_1998 );
    is("". str($a),

        '1997-09-02T09:00:00,1997-09-04T09:00:00,' .
        '1997-09-06T09:00:00,1997-09-08T09:00:00,1997-09-10T09:00:00,' .
        '1997-09-12T09:00:00,1997-09-14T09:00:00,1997-09-16T09:00:00,' .
        '1997-09-18T09:00:00,1997-09-20T09:00:00,1997-09-22T09:00:00,' .
        '1997-09-24T09:00:00,1997-09-26T09:00:00,1997-09-28T09:00:00,' .
        '1997-09-30T09:00:00,1997-10-02T09:00:00,1997-10-04T09:00:00,' .
        '1997-10-06T09:00:00,1997-10-08T09:00:00,1997-10-10T09:00:00,' .
        '1997-10-12T09:00:00,1997-10-14T09:00:00,1997-10-16T09:00:00,' .
        '1997-10-18T09:00:00,1997-10-20T09:00:00,1997-10-22T09:00:00,' .
        '1997-10-24T09:00:00,1997-10-26T09:00:00,1997-10-28T09:00:00,' .
        '1997-10-30T09:00:00,1997-11-01T09:00:00,1997-11-03T09:00:00,' .
        '1997-11-05T09:00:00,1997-11-07T09:00:00,1997-11-09T09:00:00,' .
        '1997-11-11T09:00:00,1997-11-13T09:00:00,1997-11-15T09:00:00,' .
        '1997-11-17T09:00:00,1997-11-19T09:00:00,1997-11-21T09:00:00,' .
        '1997-11-23T09:00:00,1997-11-25T09:00:00,1997-11-27T09:00:00,' .
        '1997-11-29T09:00:00,1997-12-01T09:00:00,1997-12-03T09:00:00,' .
        '1997-12-05T09:00:00,1997-12-07T09:00:00,1997-12-09T09:00:00,' .
        '1997-12-11T09:00:00,1997-12-13T09:00:00,1997-12-15T09:00:00,' .
        '1997-12-17T09:00:00,1997-12-19T09:00:00,1997-12-21T09:00:00,' .
        '1997-12-23T09:00:00,1997-12-25T09:00:00,1997-12-27T09:00:00,' .
        '1997-12-29T09:00:00,1997-12-31T09:00:00',

        $title);



$title="***  Every 10 days, 5 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=DAILY;INTERVAL=10;COUNT=5
#
#     ==> (1997 9:00 AM EDT)September 2,12,22;October 2,12
#
#

    $a = DateTime::Event::ICal->recur(
            dtstart => $dt19970902T090000 ,
            freq => 'daily',
            interval => 10,
            count => 5 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-12T09:00:00,1997-09-22T09:00:00,' .
        '1997-10-02T09:00:00,1997-10-12T09:00:00', 
        $title);


$title="***  Everyday in January, for 3 years  ***";
#
#     DTSTART;TZID=US-Eastern:19980101T090000
#     recur_by_rule:FREQ=YEARLY;UNTIL=2000-01-31T09:00:00;
#      BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
#     or
#     recur_by_rule:FREQ=DAILY;UNTIL=2000-01-31T09:00:00;BYMONTH=1
#
#     ==> (1998 9:00 AM EDT)January 1-31
#         (1999 9:00 AM EDT)January 1-31
#         (2000 9:00 AM EDT)January 1-31
#
    # FIRST FORM

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'yearly',
            until =>    $dt20000131T090000,
            bymonth =>  [ 1 ],
            byday =>    [ qw( su mo tu we th fr sa ) ] )
            ->intersection( $period_1995_2001 );

    is("".str($a), 
        '1998-01-01T09:00:00,1998-01-02T09:00:00,' .
        '1998-01-03T09:00:00,1998-01-04T09:00:00,1998-01-05T09:00:00,' .
        '1998-01-06T09:00:00,1998-01-07T09:00:00,1998-01-08T09:00:00,' .
        '1998-01-09T09:00:00,1998-01-10T09:00:00,1998-01-11T09:00:00,' .
        '1998-01-12T09:00:00,1998-01-13T09:00:00,1998-01-14T09:00:00,' .
        '1998-01-15T09:00:00,1998-01-16T09:00:00,1998-01-17T09:00:00,' .
        '1998-01-18T09:00:00,1998-01-19T09:00:00,1998-01-20T09:00:00,' .
        '1998-01-21T09:00:00,1998-01-22T09:00:00,1998-01-23T09:00:00,' .
        '1998-01-24T09:00:00,1998-01-25T09:00:00,1998-01-26T09:00:00,' .
        '1998-01-27T09:00:00,1998-01-28T09:00:00,1998-01-29T09:00:00,' .
        '1998-01-30T09:00:00,1998-01-31T09:00:00,' . 
        '1999-01-01T09:00:00,1999-01-02T09:00:00,' .
        '1999-01-03T09:00:00,1999-01-04T09:00:00,1999-01-05T09:00:00,' .
        '1999-01-06T09:00:00,1999-01-07T09:00:00,1999-01-08T09:00:00,' .
        '1999-01-09T09:00:00,1999-01-10T09:00:00,1999-01-11T09:00:00,' .
        '1999-01-12T09:00:00,1999-01-13T09:00:00,1999-01-14T09:00:00,' .
        '1999-01-15T09:00:00,1999-01-16T09:00:00,1999-01-17T09:00:00,' .
        '1999-01-18T09:00:00,1999-01-19T09:00:00,1999-01-20T09:00:00,' .
        '1999-01-21T09:00:00,1999-01-22T09:00:00,1999-01-23T09:00:00,' .
        '1999-01-24T09:00:00,1999-01-25T09:00:00,1999-01-26T09:00:00,' .
        '1999-01-27T09:00:00,1999-01-28T09:00:00,1999-01-29T09:00:00,' .
        '1999-01-30T09:00:00,1999-01-31T09:00:00,' .
        '2000-01-01T09:00:00,2000-01-02T09:00:00,' .
        '2000-01-03T09:00:00,2000-01-04T09:00:00,2000-01-05T09:00:00,' .
        '2000-01-06T09:00:00,2000-01-07T09:00:00,2000-01-08T09:00:00,' .
        '2000-01-09T09:00:00,2000-01-10T09:00:00,2000-01-11T09:00:00,' .
        '2000-01-12T09:00:00,2000-01-13T09:00:00,2000-01-14T09:00:00,' .
        '2000-01-15T09:00:00,2000-01-16T09:00:00,2000-01-17T09:00:00,' .
        '2000-01-18T09:00:00,2000-01-19T09:00:00,2000-01-20T09:00:00,' .
        '2000-01-21T09:00:00,2000-01-22T09:00:00,2000-01-23T09:00:00,' .
        '2000-01-24T09:00:00,2000-01-25T09:00:00,2000-01-26T09:00:00,' .
        '2000-01-27T09:00:00,2000-01-28T09:00:00,2000-01-29T09:00:00,' .
        '2000-01-30T09:00:00,2000-01-31T09:00:00',
        $title);



    # SECOND FORM

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19980101T090000 ,
            freq =>     'daily',
            until =>    $dt20000131T090000,
            bymonth =>  [ 1 ],
            )
            ->intersection( $period_1995_2001 );

    is("".str($a), 
        '1998-01-01T09:00:00,1998-01-02T09:00:00,' .
        '1998-01-03T09:00:00,1998-01-04T09:00:00,1998-01-05T09:00:00,' .
        '1998-01-06T09:00:00,1998-01-07T09:00:00,1998-01-08T09:00:00,' .
        '1998-01-09T09:00:00,1998-01-10T09:00:00,1998-01-11T09:00:00,' .
        '1998-01-12T09:00:00,1998-01-13T09:00:00,1998-01-14T09:00:00,' .
        '1998-01-15T09:00:00,1998-01-16T09:00:00,1998-01-17T09:00:00,' .
        '1998-01-18T09:00:00,1998-01-19T09:00:00,1998-01-20T09:00:00,' .
        '1998-01-21T09:00:00,1998-01-22T09:00:00,1998-01-23T09:00:00,' .
        '1998-01-24T09:00:00,1998-01-25T09:00:00,1998-01-26T09:00:00,' .
        '1998-01-27T09:00:00,1998-01-28T09:00:00,1998-01-29T09:00:00,' .
        '1998-01-30T09:00:00,1998-01-31T09:00:00,' . 
        '1999-01-01T09:00:00,1999-01-02T09:00:00,' .
        '1999-01-03T09:00:00,1999-01-04T09:00:00,1999-01-05T09:00:00,' .
        '1999-01-06T09:00:00,1999-01-07T09:00:00,1999-01-08T09:00:00,' .
        '1999-01-09T09:00:00,1999-01-10T09:00:00,1999-01-11T09:00:00,' .
        '1999-01-12T09:00:00,1999-01-13T09:00:00,1999-01-14T09:00:00,' .
        '1999-01-15T09:00:00,1999-01-16T09:00:00,1999-01-17T09:00:00,' .
        '1999-01-18T09:00:00,1999-01-19T09:00:00,1999-01-20T09:00:00,' .
        '1999-01-21T09:00:00,1999-01-22T09:00:00,1999-01-23T09:00:00,' .
        '1999-01-24T09:00:00,1999-01-25T09:00:00,1999-01-26T09:00:00,' .
        '1999-01-27T09:00:00,1999-01-28T09:00:00,1999-01-29T09:00:00,' .
        '1999-01-30T09:00:00,1999-01-31T09:00:00,' .
        '2000-01-01T09:00:00,2000-01-02T09:00:00,' .
        '2000-01-03T09:00:00,2000-01-04T09:00:00,2000-01-05T09:00:00,' .
        '2000-01-06T09:00:00,2000-01-07T09:00:00,2000-01-08T09:00:00,' .
        '2000-01-09T09:00:00,2000-01-10T09:00:00,2000-01-11T09:00:00,' .
        '2000-01-12T09:00:00,2000-01-13T09:00:00,2000-01-14T09:00:00,' .
        '2000-01-15T09:00:00,2000-01-16T09:00:00,2000-01-17T09:00:00,' .
        '2000-01-18T09:00:00,2000-01-19T09:00:00,2000-01-20T09:00:00,' .
        '2000-01-21T09:00:00,2000-01-22T09:00:00,2000-01-23T09:00:00,' .
        '2000-01-24T09:00:00,2000-01-25T09:00:00,2000-01-26T09:00:00,' .
        '2000-01-27T09:00:00,2000-01-28T09:00:00,2000-01-29T09:00:00,' .
        '2000-01-30T09:00:00,2000-01-31T09:00:00',
        $title);


$title="***  Weekly for 10 occurrence  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=WEEKLY;COUNT=10
#
#     ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
#         (1997 9:00 AM EST)October 28;November 4
#

    # 'FREQ=WEEKLY' MEANS THAT 'DTSTART' SPECIFIES DAY-OF-WEEK (=tuesday)

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'weekly',
            count =>    10,
            )
            ->intersection( $period_1995_1999 );

    is("".str($a),
        '1997-09-02T09:00:00,1997-09-09T09:00:00,' .
        '1997-09-16T09:00:00,1997-09-23T09:00:00,1997-09-30T09:00:00,' .
        '1997-10-07T09:00:00,1997-10-14T09:00:00,1997-10-21T09:00:00,' .
        '1997-10-28T09:00:00,1997-11-04T09:00:00',
        $title);


$title="***  Weekly until December 24, 1997  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=WEEKLY;UNTIL=1997-12-24T00:00:00
#
#     ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
#         (1997 9:00 AM EST)October 28;November 4,11,18,25;
#                           December 2,9,16,23
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'weekly',
            until =>    $dt19971224T000000,
            )
            ->intersection( $period_1995_1999 );

    is("". str($a), 
        '1997-09-02T09:00:00,1997-09-09T09:00:00,' .
        '1997-09-16T09:00:00,1997-09-23T09:00:00,1997-09-30T09:00:00,' .
        '1997-10-07T09:00:00,1997-10-14T09:00:00,1997-10-21T09:00:00,' .
        '1997-10-28T09:00:00,' .
        '1997-11-04T09:00:00,1997-11-11T09:00:00,' .
        '1997-11-18T09:00:00,1997-11-25T09:00:00,' .
        '1997-12-02T09:00:00,1997-12-09T09:00:00,' .
        '1997-12-16T09:00:00,1997-12-23T09:00:00',
        $title);


$title="***  Every other week - forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=WEEKLY;INTERVAL=2;WKST=SU
#
#     ==> (1997 9:00 AM EDT)September 2,16,30;October 14
#         (1997 9:00 AM EST)October 28;November 11,25;December 9,23
#         (1998 9:00 AM EST)January 6,20;February
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'weekly',
            interval => 2,
            wkst =>     'su',  
            )
            ->intersection( $period_1995_19980201 );

    is("". str($a), 
        '1997-09-02T09:00:00,1997-09-16T09:00:00,1997-09-30T09:00:00,' .
        '1997-10-14T09:00:00,' .
        '1997-10-28T09:00:00,' .
        '1997-11-11T09:00:00,1997-11-25T09:00:00,' .
        '1997-12-09T09:00:00,1997-12-23T09:00:00,' .
        '1998-01-06T09:00:00,1998-01-20T09:00:00',
        $title);


#### TEST 11 ##########

$title="***  Weekly on Tuesday and Thursday for 5 weeks  ***";
#
#    DTSTART;TZID=US-Eastern:19970902T090000
#    recur_by_rule:FREQ=WEEKLY;UNTIL=1997-10-07T00:00:00;WKST=SU;BYDAY=TU,TH
#    or
#
#    recur_by_rule:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH
#
#    ==> (1997 9:00 AM EDT)September 2,4,9,11,16,18,23,25,30;October 2
#
    # FIRST

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000,
            freq =>     'weekly',
            until =>    $dt19971007T000000,
            wkst =>     'su',   
            byday =>    [ 'tu', 'th' ],
            )
            ->intersection( $period_1995_1999 );

    is("". str($a),
        '1997-09-02T09:00:00,1997-09-04T09:00:00,' .
        '1997-09-09T09:00:00,1997-09-11T09:00:00,1997-09-16T09:00:00,' .
        '1997-09-18T09:00:00,1997-09-23T09:00:00,1997-09-25T09:00:00,' .
        '1997-09-30T09:00:00,1997-10-02T09:00:00',
        $title);

    # SECOND

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000,
            freq =>     'weekly',
            count =>    10,
            wkst =>     'su',
            byday =>    [ 'tu', 'th' ],
            )
            ->intersection( $period_1995_1999 );

    is("". str($a), 
        '1997-09-02T09:00:00,1997-09-04T09:00:00,' .
        '1997-09-09T09:00:00,1997-09-11T09:00:00,1997-09-16T09:00:00,' .
        '1997-09-18T09:00:00,1997-09-23T09:00:00,1997-09-25T09:00:00,' .
        '1997-09-30T09:00:00,1997-10-02T09:00:00', 
        $title);


$title="***  Every other week on Monday, Wednesday and Friday until December 24  ***";
#   1997, but starting on Tuesday, September 2, 1997:
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=WEEKLY;INTERVAL=2;UNTIL=1997-12-24T00:00:00;WKST=SU;
#      BYDAY=MO,WE,FR
#     ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
#     1,3,13,15,17
#         (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
#                           December 8,10,12,22
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000,
            freq =>     'weekly',
            interval => 2,
            until =>    $dt19971224T000000,
            wkst =>     'su',
            byday =>    [ 'mo', 'we', 'fr' ],
            )
            ->union( $dt19970902T090000 )
            ->intersection( $period_1995_1999 );

    is("". str($a),
    '1997-09-02T09:00:00,1997-09-03T09:00:00,' .
    '1997-09-05T09:00:00,1997-09-15T09:00:00,1997-09-17T09:00:00,' .
    '1997-09-19T09:00:00,1997-09-29T09:00:00,' .
    '1997-10-01T09:00:00,1997-10-03T09:00:00,' .
    '1997-10-13T09:00:00,1997-10-15T09:00:00,1997-10-17T09:00:00,' .
    '1997-10-27T09:00:00,1997-10-29T09:00:00,1997-10-31T09:00:00,' .
    '1997-11-10T09:00:00,1997-11-12T09:00:00,' .
    '1997-11-14T09:00:00,1997-11-24T09:00:00,1997-11-26T09:00:00,' .
    '1997-11-28T09:00:00,1997-12-08T09:00:00,1997-12-10T09:00:00,' .
    '1997-12-12T09:00:00,1997-12-22T09:00:00',
    $title);


######## TEST 14

$title="***  Every other week on Tuesday and Thursday, for 8 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH
#
#     ==> (1997 9:00 AM EDT)September 2,4,16,18,30;October 2,14,16
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000,
            freq =>     'weekly',
            interval => 2,
            count =>    8,
            wkst =>     'su',
            byday =>    [ 'tu', 'th' ],
            )
            ->union( $dt19970902T090000 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
    '1997-09-02T09:00:00,1997-09-04T09:00:00,' .
    '1997-09-16T09:00:00,1997-09-18T09:00:00,1997-09-30T09:00:00,' .
    '1997-10-02T09:00:00,1997-10-14T09:00:00,1997-10-16T09:00:00', 
    $title);


#### TEST 15

$title="***  Monthly on the 1st Friday for ten occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970905T090000
#     recur_by_rule:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
#
#     ==> (1997 9:00 AM EDT)September 5;October 3
#         (1997 9:00 AM EST)November 7;Dec 5
#         (1998 9:00 AM EST)January 2;February 6;March 6;April 3
#         (1998 9:00 AM EDT)May 1;June 5
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            count =>    10,
            byday =>    [ '1fr' ],
            )
            ->union( $dt19970905T090000 )
            ->intersection( $period_1995_1999 );

    is("".str($a),
    '1997-09-05T09:00:00,' .
    '1997-10-03T09:00:00,' .
    '1997-11-07T09:00:00,' .
    '1997-12-05T09:00:00,' .
    '1998-01-02T09:00:00,' .
    '1998-02-06T09:00:00,' .
    '1998-03-06T09:00:00,' .
    '1998-04-03T09:00:00,' .
    '1998-05-01T09:00:00,' .
    '1998-06-05T09:00:00',
    $title);


$title="***  Monthly on the 1st Friday until December 24, 1997  ***";
#
#     DTSTART;TZID=US-Eastern:19970905T090000
#     recur_by_rule:FREQ=MONTHLY;UNTIL=1997-12-24T00:00:00;BYDAY=1FR
#
#     ==> (1997 9:00 AM EDT)September 5;October 3
#         (1997 9:00 AM EST)November 7;December 5
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            until =>    $dt19971224T000000,
            byday =>    [ '1fr' ],
            )
            ->union( $dt19970905T090000 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
    '1997-09-05T09:00:00,' .
    '1997-10-03T09:00:00,' .
    '1997-11-07T09:00:00,' .
    '1997-12-05T09:00:00',
    $title);


$title="***  Every other month on the 1st and last Sunday of the month for 1  ***";
#   occurrences:
#
#     DTSTART;TZID=US-Eastern:19970907T090000
#     recur_by_rule:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
#
#     ==> (1997 9:00 AM EDT)September 7,28
#         (1997 9:00 AM EST)November 2,30
#
#         (1998 9:00 AM EST)January 4,25;March 1,29
#         (1998 9:00 AM EDT)May 3,31
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            interval => 2,
            count =>    10,
            byday =>    [ '1su', '-1su' ],
            )
            # ->union( $dt19970905T090000 )
            ->intersection( $period_1995_1999 );


    is("".str($a), 
    '1997-09-07T09:00:00,1997-09-28T09:00:00,' .
    '1997-11-02T09:00:00,1997-11-30T09:00:00,' .
    '1998-01-04T09:00:00,1998-01-25T09:00:00,' .
    '1998-03-01T09:00:00,1998-03-29T09:00:00,' .
    '1998-05-03T09:00:00,1998-05-31T09:00:00' ,
    $title);


$title="***  Monthly on the second to last Monday of the month for 6 months  ***";
#
#     DTSTART;TZID=US-Eastern:19970922T090000
#     recur_by_rule:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
#
#     ==> (1997 9:00 AM EDT)September 22;October 20
#         (1997 9:00 AM EST)November 17;December 22
#         (1998 9:00 AM EST)January 19;February 16
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            count =>    6,
            byday =>    [ '-2mo' ],
            )
            # ->union( $dt19970905T090000 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
    '1997-09-22T09:00:00,1997-10-20T09:00:00,' .
    '1997-11-17T09:00:00,1997-12-22T09:00:00,' .
    '1998-01-19T09:00:00,1998-02-16T09:00:00',
    $title);




$title="***  Monthly on the third to the last day of the month, forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970928T090000
#     recur_by_rule:FREQ=MONTHLY;BYMONTHDAY=-3
#
#     ==> (1997 9:00 AM EDT)September 28
#         (1997 9:00 AM EST)October 29;November 28;December 29
#         (1998 9:00 AM EST)January 29;February 26
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            bymonthday =>  [ -3 ],
            )
            ->intersection( $period_1995_19980301 );

    is("".str($a), 
    '1997-09-28T09:00:00,' .
    '1997-10-29T09:00:00,1997-11-28T09:00:00,1997-12-29T09:00:00,' .
    '1998-01-29T09:00:00,1998-02-26T09:00:00',
    $title);





$title="***  Monthly on the 2nd and 15th of the month for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
#
#     ==> (1997 9:00 AM EDT)September 2,15;October 2,15
#         (1997 9:00 AM EST)November 2,15;December 2,15
#         (1998 9:00 AM EST)January 2,15
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000,
            freq =>     'monthly',
            count =>    10,
            bymonthday =>  [ 2, 15 ],
            )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-15T09:00:00,' .
    '1997-10-02T09:00:00,1997-10-15T09:00:00,' .
    '1997-11-02T09:00:00,1997-11-15T09:00:00,' .
    '1997-12-02T09:00:00,1997-12-15T09:00:00,' .
    '1998-01-02T09:00:00,1998-01-15T09:00:00',
    $title);



$title="***  Monthly on the first and last day of the month for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970930T090000
#     recur_by_rule:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
#
#     ==> (1997 9:00 AM EDT)September 30;October 1
#         (1997 9:00 AM EST)October 31;November 1,30;December 1,31
#         (1998 9:00 AM EST)January 1,31;February 1
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            count =>    10,
            bymonthday =>  [ 1, -1 ],
            )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-30T09:00:00,1997-10-01T09:00:00,' .
    '1997-10-31T09:00:00,1997-11-01T09:00:00,1997-11-30T09:00:00,' .
    '1997-12-01T09:00:00,1997-12-31T09:00:00,' .
    '1998-01-01T09:00:00,1998-01-31T09:00:00,' .
    '1998-02-01T09:00:00',
    $title);



$title="***  Every 18 months on the 10th thru 15th of the month for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970910T090000
#     recur_by_rule:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15
#
#     ==> (1997 9:00 AM EDT)September 10,11,12,13,14,15
#         (1999 9:00 AM EST)March 10,11,12,13
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970905T090000,
            freq =>     'monthly',
            interval => 18,
            count =>    10,
            bymonthday =>  [ 10 .. 15 ],
            )
            ->intersection( $period_1995_2000 );

    is("".str($a), 
        '1997-09-10T09:00:00,1997-09-11T09:00:00,' .
        '1997-09-12T09:00:00,1997-09-13T09:00:00,' .
        '1997-09-14T09:00:00,1997-09-15T09:00:00,' .
        '1999-03-10T09:00:00,1999-03-11T09:00:00,' .
        '1999-03-12T09:00:00,1999-03-13T09:00:00'
        , $title);


$title="***  Every Tuesday, every other month  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
#
#     ==> (1997 9:00 AM EDT)September 2,9,16,23,30
#         (1997 9:00 AM EST)November 4,11,18,25
#         (1998 9:00 AM EST)January 6,13,20,27;March 3,10,17,24,31
#           ...
    $a = DateTime::Event::ICal->recur(
            dtstart =>     $dt19970902T090000,
            freq =>        'monthly',
            interval =>    2,
            byday =>       [ 'tu' ],
            )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-09T09:00:00,' .
        '1997-09-16T09:00:00,1997-09-23T09:00:00,1997-09-30T09:00:00,' .
        '1997-11-04T09:00:00,1997-11-11T09:00:00,' .
        '1997-11-18T09:00:00,1997-11-25T09:00:00,' .
        '1998-01-06T09:00:00,1998-01-13T09:00:00,' .
        '1998-01-20T09:00:00,1998-01-27T09:00:00,' .
        '1998-03-03T09:00:00,1998-03-10T09:00:00,' .
        '1998-03-17T09:00:00,1998-03-24T09:00:00,1998-03-31T09:00:00,' .
        '1998-05-05T09:00:00,1998-05-12T09:00:00,' .
        '1998-05-19T09:00:00,1998-05-26T09:00:00,1998-07-07T09:00:00,' .
        '1998-07-14T09:00:00,1998-07-21T09:00:00,1998-07-28T09:00:00,' .
        '1998-09-01T09:00:00,1998-09-08T09:00:00,1998-09-15T09:00:00,' .
        '1998-09-22T09:00:00,1998-09-29T09:00:00,1998-11-03T09:00:00,' .
        '1998-11-10T09:00:00,1998-11-17T09:00:00,1998-11-24T09:00:00'
        , $title);



$title="***  Yearly in June and July for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970610T090000
#     recur_by_rule:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
#     ==> (1997 9:00 AM EDT)June 10;July 10
#         (1998 9:00 AM EDT)June 10;July 10
#         (1999 9:00 AM EDT)June 10;July 10
#         (2000 9:00 AM EDT)June 10;July 10
#         (2001 9:00 AM EDT)June 10;July 10
#     Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components
#     are specified, the day is gotten from DTSTART
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>     $dt19970610T090000,
            freq =>        'yearly',
            count    =>    10,
            bymonth =>     [ 6, 7 ],
            )
            ->intersection( $period_1995_2005 );

    is("".str($a), 
        '1997-06-10T09:00:00,1997-07-10T09:00:00,' .
        '1998-06-10T09:00:00,1998-07-10T09:00:00,' .
        '1999-06-10T09:00:00,1999-07-10T09:00:00,' .
        '2000-06-10T09:00:00,2000-07-10T09:00:00,' .
        '2001-06-10T09:00:00,2001-07-10T09:00:00', $title);



###### TEST 25

$title="***  Every other year on January, February, and March for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970310T090000
#     recur_by_rule:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
#
#     ==> (1997 9:00 AM EST)March 10
#         (1999 9:00 AM EST)January 10;February 10;March 10
#         (2001 9:00 AM EST)January 10;February 10;March 10
#         (2003 9:00 AM EST)January 10;February 10;March 10
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>     $dt19970310T090000,
            freq =>        'yearly',
            interval =>    2,
            count    =>    10,
            bymonth =>     [ 1, 2, 3 ],
            )
            ->intersection( $period_1995_2004 );

    is("".str($a), 
        '1997-03-10T09:00:00,' .
        '1999-01-10T09:00:00,1999-02-10T09:00:00,1999-03-10T09:00:00,' .
        '2001-01-10T09:00:00,2001-02-10T09:00:00,2001-03-10T09:00:00,' .
        '2003-01-10T09:00:00,2003-02-10T09:00:00,2003-03-10T09:00:00', $title);


$title="***  Every 3rd year on the 1st, 100th and 200th day for 10 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970101T090000
#     recur_by_rule:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
#
#     ==> (1997 9:00 AM EST)January 1
#         (1997 9:00 AM EDT)April 10;July 19
#         (2000 9:00 AM EST)January 1
#         (2000 9:00 AM EDT)April 9;July 18
#         (2003 9:00 AM EST)January 1
#         (2003 9:00 AM EDT)April 10;July 19
#         (2006 9:00 AM EST)January 1
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970101T090000 ,
            freq =>     'yearly',
            interval => 3,
            count   =>  10,
            byyearday => [ 1, 100, 200 ] )
            ->intersection( $period_1995_2007 );

    is("".str($a), 
    '1997-01-01T09:00:00,' .
    '1997-04-10T09:00:00,1997-07-19T09:00:00,' .
    '2000-01-01T09:00:00,' .
    '2000-04-09T09:00:00,2000-07-18T09:00:00,' .
    '2003-01-01T09:00:00,2003-04-10T09:00:00,2003-07-19T09:00:00,' .
    '2006-01-01T09:00:00',
    $title);

########### TEST 27

$title="***  Every 20th Monday of the year, forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970519T090000
#     recur_by_rule:FREQ=YEARLY;BYDAY=20MO
#
#     ==> (1997 9:00 AM EDT)May 19
#         (1998 9:00 AM EDT)May 18
#         (1999 9:00 AM EDT)May 17
#     ...
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970101T090000 ,
            freq =>     'yearly',
            byday =>    [ '20mo' ] )
            ->intersection( $period_1995_2000 );

    is("".str($a), 
        '1997-05-19T09:00:00,1998-05-18T09:00:00,1999-05-17T09:00:00', $title);

$title="***  Monday of week number 20 (where the default start of the week i  ***";
#   Monday), forever:
#
#     DTSTART;TZID=US-Eastern:19970512T090000
#     recur_by_rule:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO
#
#     ==> (1997 9:00 AM EDT)May 12
#         (1998 9:00 AM EDT)May 11
#         (1999 9:00 AM EDT)May 17
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970101T090000 ,
            freq =>     'yearly',
            byweekno => [ 20 ],
            byday =>    [ 'mo' ] )
            ->intersection( $period_1995_2000 );

    is("".str($a), 
        '1997-05-12T09:00:00,1998-05-11T09:00:00,1999-05-17T09:00:00', $title);

$title="***  Every Thursday in March, forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970313T090000
#     recur_by_rule:FREQ=YEARLY;BYMONTH=3;BYDAY=TH
#
#     ==> (1997 9:00 AM EST)March 13,20,27
#         (1998 9:00 AM EST)March 5,12,19,26
#         (1999 9:00 AM EST)March 4,11,18,25
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970310T090000 ,
            freq =>     'yearly',
            bymonth  => [ 3 ],
            byday =>    [ 'th' ] )
            ->intersection( $period_1995_2000 );

    is("".str($a), 
    '1997-03-13T09:00:00,1997-03-20T09:00:00,1997-03-27T09:00:00,' .
    '1998-03-05T09:00:00,1998-03-12T09:00:00,' .
    '1998-03-19T09:00:00,1998-03-26T09:00:00,' .
    '1999-03-04T09:00:00,1999-03-11T09:00:00,' .
    '1999-03-18T09:00:00,1999-03-25T09:00:00',
    $title);

$title="***  Every Thursday, but only during June, July, and August, forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970605T090000
#     recur_by_rule:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
#
#     ==> (1997 9:00 AM EDT)June 5,12,19,26;July 3,10,17,24,31;
#                       August 7,14,21,28
#         (1998 9:00 AM EDT)June 4,11,18,25;July 2,9,16,23,30;
#                       August 6,13,20,27
#         (1999 9:00 AM EDT)June 3,10,17,24;July 1,8,15,22,29;
#                       August 5,12,19,26
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970310T090000 ,
            freq =>     'yearly',
            bymonth  => [ 6, 7, 8 ],
            byday =>    [ 'th' ] )
            ->intersection( $period_1995_2000 );

    is("".str($a),
    '1997-06-05T09:00:00,1997-06-12T09:00:00,' .
    '1997-06-19T09:00:00,1997-06-26T09:00:00,' .
    '1997-07-03T09:00:00,1997-07-10T09:00:00,' .
    '1997-07-17T09:00:00,1997-07-24T09:00:00,1997-07-31T09:00:00,' .
    '1997-08-07T09:00:00,1997-08-14T09:00:00,' .
    '1997-08-21T09:00:00,1997-08-28T09:00:00,' .

    '1998-06-04T09:00:00,1998-06-11T09:00:00,' .
    '1998-06-18T09:00:00,1998-06-25T09:00:00,' .
    '1998-07-02T09:00:00,1998-07-09T09:00:00,' .
    '1998-07-16T09:00:00,1998-07-23T09:00:00,1998-07-30T09:00:00,' .
    '1998-08-06T09:00:00,1998-08-13T09:00:00,' .
    '1998-08-20T09:00:00,1998-08-27T09:00:00,' .

    '1999-06-03T09:00:00,1999-06-10T09:00:00,' .
    '1999-06-17T09:00:00,1999-06-24T09:00:00,' .
    '1999-07-01T09:00:00,1999-07-08T09:00:00,' .
    '1999-07-15T09:00:00,1999-07-22T09:00:00,1999-07-29T09:00:00,' .
    '1999-08-05T09:00:00,1999-08-12T09:00:00,' .
    '1999-08-19T09:00:00,1999-08-26T09:00:00',
    $title);

$title="***  Every Friday the 13th, forever  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     EXDATE;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
#
#     ==> (1998 9:00 AM EST)February 13;March 13;November 13
#         (1999 9:00 AM EDT)August 13
#         (2000 9:00 AM EDT)October 13
#     ...
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'monthly',
            bymonthday => [ 13 ],
            byday =>      [ 'fr' ] )
            ->intersection( $period_1995_2001 );
    # EXDATE doesn't make sense here, because the date is not in the set

    is("".str($a), 
    '1998-02-13T09:00:00,1998-03-13T09:00:00,1998-11-13T09:00:00,' .
    '1999-08-13T09:00:00,2000-10-13T09:00:00', $title);


$title="***  The first Saturday that follows the first Sunday of the month  ***";
#    forever:
#
#     DTSTART;TZID=US-Eastern:19970913T090000
#     recur_by_rule:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
#
#     ==> (1997 9:00 AM EDT)September 13;October 11
#         (1997 9:00 AM EST)November 8;December 13
#         (1998 9:00 AM EST)January 10;February 7;March 7
#         (1998 9:00 AM EDT)April 11;May 9;June 13...
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>  $dt19970902T090000 ,
            freq =>     'monthly',
            bymonthday => [ 7,8,9,10,11,12,13 ],
            byday =>      [ 'sa' ] )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
    '1997-09-13T09:00:00,1997-10-11T09:00:00,' .
    '1997-11-08T09:00:00,1997-12-13T09:00:00,' .
    '1998-01-10T09:00:00,1998-02-07T09:00:00,1998-03-07T09:00:00,' .
    '1998-04-11T09:00:00,1998-05-09T09:00:00,1998-06-13T09:00:00,' .
    '1998-07-11T09:00:00,1998-08-08T09:00:00,1998-09-12T09:00:00,' .
    '1998-10-10T09:00:00,1998-11-07T09:00:00,1998-12-12T09:00:00',
    $title);


# test 33

$title="***  Every four years, the first Tuesday after a Monday in November  ***";
#   forever (U.S. Presidential Election day):
#
#     DTSTART;TZID=US-Eastern:19961105T090000
#     recur_by_rule:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,
#      5,6,7,8
#
#     ==> (1996 9:00 AM EST)November 5
#         (2000 9:00 AM EST)November 7
#         (2004 9:00 AM EST)November 2
#     ...
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19961105T090000 ,
            freq =>       'yearly',
            interval =>   4,
            bymonthday => [ 2,3,4,5,6,7,8 ],
            byday =>      [ 'tu' ],
            bymonth =>    [ 11 ], )
            ->intersection( $period_1995_2005 );

    is("".str($a), 
        '1996-11-05T09:00:00,2000-11-07T09:00:00,2004-11-02T09:00:00',
    $title);

# test 34

$title="***  The 3rd instance into the month of one of Tuesday, Wednesday or Thursday, for the next 3 months:  ***";
#
#     DTSTART;TZID=US-Eastern:19970904T090000
#     recur_by_rule:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
#
#     ==> (1997 9:00 AM EDT)September 4;October 7
#         (1997 9:00 AM EST)November 6
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970904T090000 ,
            freq =>       'monthly',
            count =>      3,
            byday =>      [ 'tu', 'we', 'th' ],
            bysetpos =>   3 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-04T09:00:00,1997-10-07T09:00:00,1997-11-06T09:00:00', $title);


$title="***  The 2nd to last weekday of the month:  ***";
#
#     DTSTART;TZID=US-Eastern:19970929T090000
#     recur_by_rule:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
#
#     ==> (1997 9:00 AM EDT)September 29
#         (1997 9:00 AM EST)October 30;November 27;December 30
#         (1998 9:00 AM EST)January 29;February 26;March 30
#     ...
#


    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970904T090000 ,
            freq =>       'monthly',
            byday =>      [ 'mo', 'tu', 'we', 'th', 'fr' ],
            bysetpos =>   -2 )
            ->intersection( $period_1995_19980401 );

    is("".str($a), 
        '1997-09-29T09:00:00,1997-10-30T09:00:00,' .
        '1997-11-27T09:00:00,1997-12-30T09:00:00,1998-01-29T09:00:00,' .
        '1998-02-26T09:00:00,1998-03-30T09:00:00', $title);


$title="***  Every 3 hours from 9:00 AM to 5:00 PM on a specific day  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=HOURLY;INTERVAL=3;UNTIL=1997-09-02T17:00:00
#
#     ==> (September 2, 1997 EDT)09:00,12:00,15:00
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970902T090000 ,
            freq =>       'hourly',
            interval =>   3,
            until =>      $dt19970902T170000 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-02T12:00:00,1997-09-02T15:00:00', $title);

$title="***  Every 15 minutes for 6 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=MINUTELY;INTERVAL=15;COUNT=6
#
#     ==> (September 2, 1997 EDT)09:00,09:15,' .
#        '09:30,09:45,10:00,10:15
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970902T090000 ,
            freq =>       'minutely',
            interval =>   15,
            count =>      6 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-02T09:15:00,' .
        '1997-09-02T09:30:00,1997-09-02T09:45:00,' .
        '1997-09-02T10:00:00,1997-09-02T10:15:00',
    $title);


$title="***  Every hour and a half for 4 occurrences  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=MINUTELY;INTERVAL=90;COUNT=4
#
#     ==> (September 2, 1997 EDT)09:00,10:30;12:00;13:30
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970902T090000 ,
            freq =>       'minutely',
            interval =>   90,
            count =>      4 )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-02T10:30:00,' .
        '1997-09-02T12:00:00,1997-09-02T13:30:00', $title);


########## TEST 39

$title="***  Every 20 minutes from 9:00 AM to 4:40 PM every day  ***";
#
#     DTSTART;TZID=US-Eastern:19970902T090000
#     recur_by_rule:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40
#     or
#     recur_by_rule:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
#
#     ==> (September 2, 1997 EDT)9:00,9:20,' .
#        '9:40,10:00,10:20,
#                                ... 16:00,16:20,16:40
#         (September 3, 1997 EDT)9:00,9:20,' .
#        '9:40,10:00,10:20,
#                               ...16:00,16:20,16:40
#     ...
#

    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970902T090000 ,
            freq =>       'daily',
            byhour =>     [ 9,10,11,12,13,14,15,16 ],
            byminute =>   [ 0,20,40 ] )
            ->intersection( $period_1995_19970904T090000 );

    is("".str($a), 
        '1997-09-02T09:00:00,1997-09-02T09:20:00,' .
        '1997-09-02T09:40:00,1997-09-02T10:00:00,1997-09-02T10:20:00,' .
        '1997-09-02T10:40:00,1997-09-02T11:00:00,' .
        '1997-09-02T11:20:00,1997-09-02T11:40:00,1997-09-02T12:00:00,' .
        '1997-09-02T12:20:00,1997-09-02T12:40:00,' .
        '1997-09-02T13:00:00,1997-09-02T13:20:00,1997-09-02T13:40:00,' .
        '1997-09-02T14:00:00,1997-09-02T14:20:00,' .
        '1997-09-02T14:40:00,1997-09-02T15:00:00,1997-09-02T15:20:00,' .
        '1997-09-02T15:40:00,1997-09-02T16:00:00,' .
        '1997-09-02T16:20:00,1997-09-02T16:40:00,' .

        '1997-09-03T09:00:00,1997-09-03T09:20:00,' .
        '1997-09-03T09:40:00,1997-09-03T10:00:00,1997-09-03T10:20:00,' .
        '1997-09-03T10:40:00,1997-09-03T11:00:00,' .
        '1997-09-03T11:20:00,1997-09-03T11:40:00,1997-09-03T12:00:00,' .
        '1997-09-03T12:20:00,1997-09-03T12:40:00,' .
        '1997-09-03T13:00:00,1997-09-03T13:20:00,1997-09-03T13:40:00,' .
        '1997-09-03T14:00:00,1997-09-03T14:20:00,' .
        '1997-09-03T14:40:00,1997-09-03T15:00:00,1997-09-03T15:20:00,' .
        '1997-09-03T15:40:00,1997-09-03T16:00:00,' .
        '1997-09-03T16:20:00,1997-09-03T16:40:00,1997-09-04T09:00:00',
    $title);

#     recur_by_rule:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16


    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970902T090000 ,
            freq =>       'minutely',
            interval =>   20,
            byhour =>     [ 9,10,11,12,13,14,15,16 ], )
            ->intersection( $period_1995_19970904T090000 );

    is("".str($a),
        '1997-09-02T09:00:00,1997-09-02T09:20:00,' .
        '1997-09-02T09:40:00,1997-09-02T10:00:00,1997-09-02T10:20:00,' .
        '1997-09-02T10:40:00,1997-09-02T11:00:00,' .
        '1997-09-02T11:20:00,1997-09-02T11:40:00,1997-09-02T12:00:00,' .
        '1997-09-02T12:20:00,1997-09-02T12:40:00,' .
        '1997-09-02T13:00:00,1997-09-02T13:20:00,1997-09-02T13:40:00,' .
        '1997-09-02T14:00:00,1997-09-02T14:20:00,' .
        '1997-09-02T14:40:00,1997-09-02T15:00:00,1997-09-02T15:20:00,' .
        '1997-09-02T15:40:00,1997-09-02T16:00:00,' .
        '1997-09-02T16:20:00,1997-09-02T16:40:00,' .

        '1997-09-03T09:00:00,1997-09-03T09:20:00,' .
        '1997-09-03T09:40:00,1997-09-03T10:00:00,1997-09-03T10:20:00,' .
        '1997-09-03T10:40:00,1997-09-03T11:00:00,' .
        '1997-09-03T11:20:00,1997-09-03T11:40:00,1997-09-03T12:00:00,' .
        '1997-09-03T12:20:00,1997-09-03T12:40:00,' .
        '1997-09-03T13:00:00,1997-09-03T13:20:00,1997-09-03T13:40:00,' .
        '1997-09-03T14:00:00,1997-09-03T14:20:00,' .
        '1997-09-03T14:40:00,1997-09-03T15:00:00,1997-09-03T15:20:00,' .
        '1997-09-03T15:40:00,1997-09-03T16:00:00,' .
        '1997-09-03T16:20:00,1997-09-03T16:40:00,1997-09-04T09:00:00',
    $title);


$title="***  An example where the days generated makes a difference because of WKST  ***";
#
#     DTSTART;TZID=US-Eastern:19970805T090000
#     recur_by_rule:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO
#
#     ==> (1997 EDT)Aug 5,10,19,24
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970805T090000 ,
            freq =>       'weekly',
            interval =>   2,
            count =>      4,
            byday =>      [ 'tu', 'su' ], 
            wkst =>       'mo' )
            ->intersection( $period_1995_1999 );

    is("".str($a), 
        '1997-08-05T09:00:00,1997-08-10T09:00:00,' .
        '1997-08-19T09:00:00,1997-08-24T09:00:00', $title);

$title="***  changing only WKST from MO to SU, yields different results...  ***";
#
#     DTSTART;TZID=US-Eastern:19970805T090000
#     recur_by_rule:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU
#     ==> (1997 EDT)August 5,17,19,31
#
    $a = DateTime::Event::ICal->recur(
            dtstart =>    $dt19970805T090000 ,
            freq =>       'weekly',
            interval =>   2,
            count =>      4,
            byday =>      [ 'tu', 'su' ],
            wkst =>       'su' )
            ->intersection( $period_1995_1999 );


    is("".str($a), 
        '1997-08-05T09:00:00,1997-08-17T09:00:00,' .
        '1997-08-19T09:00:00,1997-08-31T09:00:00', $title);

__END__
    # another test using this result:
    is( "" . $a->exclude_by_date( list => ['1997-08-17T09:00:00', '1997-08-31T09:00:00'] ) ,
        '1997-08-05T09:00:00,1997-08-19T09:00:00', "***  EXDATE removing 2 days  ***" );

    # yet another test using this result:
    is( "" . $a->recur_by_date( list => ['19970817Z', '19970831Z'] ) ,
        '1997-08-05T09:00:00,19970817Z,1997-08-17T09:00:00,' .
        '1997-08-19T09:00:00,19970831Z,1997-08-31T09:00:00', "***  RDATE adding 2 days  ***" );

$a = Date::Set->event(
    dtstart => '1970-03-29T02:00:00',
    rule => 'FREQ=MONTHLY;BYMONTH=3;BYDAY=-3SU',
    start=>'2003-01-01T00:00:00', end=>'2005-01-01T00:00:00' );
is ( "". $a ,
  '2003-03-16T02:00:00,2004-03-14T02:00:00',
  'BYDAY works well with FREQ=MONTH' );

$a = Date::Set->event(
    dtstart => '1970-03-29T02:00:00',
    rule => 'FREQ=YEARLY;BYMONTH=3;BYDAY=-3SU',
    start=> '2003-01-01T00:00:00', end=>'2005-01-01T00:00:00' );
is ( "". $a ,
  '2003-03-16T02:00:00,2004-03-14T02:00:00',
  'BYDAY works well with FREQ=YEARLY;BYMONTH' );


1;