#!/usr/bin/perl -w use strict; use Test::More tests => 53; use Time::Piece::Range; use Time::Piece; use Time::Seconds; my $date1 = Time::Piece->strptime("31 Dec, 2000", "%d %b, %Y"); my $date2 = $date1 + ONE_DAY; my $date3 = $date2 + ONE_DAY; eval { my $range = Time::Piece::Range->new() }; ok($@, "Can't create a range with no dates"); eval { my $range = Time::Piece::Range->new($date1) }; ok($@, "Can't create a range with one date"); eval { my $range = Time::Piece::Range->new($date1, $date2, $date3) }; ok($@, "Can't create a range with three dates"); eval { my $range = Time::Piece::Range->new("2001-01-01", "2001-02-02") }; ok($@, "Can't create a range with strings"); { ok(my $range = Time::Piece::Range->new($date1, $date1), "Create an single day range"); is($range->start, $range->end, "Start and end on same date"); is($range->length, 1, "1 day long"); is($range->dates, 1, "So 1 date in 'dates'"); } ok(my $range1 = Time::Piece::Range->new($date1, $date2), "Create a range"); is($range1->start, $date1, "Starts OK"); is($range1->end, $date2, "Starts OK"); is($range1->length, 2, "2 days long"); my @dates = $range1->dates; is(@dates, 2, "So 2 date in 'dates'"); is($dates[0], $range1->start, "Starts at start"); is($dates[1], $range1->end, "And ends at end"); ok(my $range2 = Time::Piece::Range->new($date2, $date1), "Create a range in wrong order"); is($range2->start, $date1, "Starts OK"); is($range2->end, $date2, "Starts OK"); is($range2->length, 2, "1 days long"); ok($range1->equals($range2), "Range 1 and 2 are equal"); ok(my $range3 = Time::Piece::Range->new($date1, $date3), "Longer Range"); is($range3->length, 3, "3 days long"); ok(!$range3->includes($date1 - 1), "Range doesn't include early day"); ok($range3->includes($date1), "Range includes first day"); ok($range3->includes($date2), "Range includes middle day"); ok($range3->includes($date3), "Range includes last day"); ok(!$range3->includes($date3 + 1), "Range doesn't includes later day"); ok($range3->includes($range1), "Range includes first range"); ok($range3->includes($range2), "Range includes second range"); ok($range3->includes($range3), "Range includes itself"); #------------------------------------------------------------------------- # Test overlaps #------------------------------------------------------------------------- { my $range = Time::Piece::Range->new($date2, $date3); ok($range->overlaps($range1), "The ranges overlap"); ok(my $overlap = $range->overlap($range1), "Get that overlap"); is($overlap->start, $date2, "Starts on day2"); is($overlap->end, $date2, "Ends on day2"); } { my $range = Time::Piece::Range->new($date2, $date3); ok($range->overlaps($range3), "The ranges overlap"); ok(my $overlap = $range->overlap($range3), "Get that overlap"); is($overlap->start, $date2, "Starts on day2"); is($overlap->end, $date3, "Ends on day3"); } #------------------------------------------------------------------------- # Test Gap / abuts #------------------------------------------------------------------------- { my $jan = Time::Piece::Range->new( map Time::Piece->strptime($_, "%Y-%m-%d"), '2004-01-01', '2004-01-31' ); my $mar = Time::Piece::Range->new( map Time::Piece->strptime($_, "%Y-%m-%d"), '2004-03-01', '2004-03-31' ); my $feb = $jan->gap($mar) or die "Can't get gap"; isa_ok $feb => 'Time::Piece::Range'; is $feb->start->ymd, "2004-02-01", "Starts start Feb"; is $feb->end->ymd, "2004-02-29", "Ends end Feb"; my $feb2 = $mar->gap($jan); ok $feb2->equals($feb), "Gap works either way around"; my $fj = $jan->gap($feb); ok !$jan->gap($feb), "Jan has no gap to Feb"; ok !$feb->gap($mar), "Feb has no gap to Mar"; ok !$jan->abuts($jan), "Abuts J/J - no"; ok $jan->abuts($feb), "Abuts J/F - yes"; ok !$jan->abuts($mar), "Abuts J/M - no"; ok $feb->abuts($jan), "Abuts F/J - yes"; ok !$feb->abuts($feb), "Abuts F/F - no"; ok $feb->abuts($mar), "Abuts F/M - yes"; ok !$mar->abuts($jan), "Abuts M/J - no"; ok $mar->abuts($feb), "Abuts M/F - yes"; ok !$mar->abuts($mar), "Abuts M/M - no"; }