The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/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" );
}