require File.dirname(__FILE__) + '/abstract_unit' class DateFinderBaseTest < Test::Unit::TestCase def test_instantiation_with_pattern assert_nothing_raised { assert DateFinderBase.weekly } assert_nothing_raised { assert DateFinderBase.monthly } end def test_options assert_raises(ArgumentError) { DateFinderBase.weekly(:bad_option => true) } end def test_method_missing_with_invalid_pattern assert_raises(NoMethodError) { DateFinderBase.moooonthly } end def test_find_options assert_raises(ArgumentError) { DateFinderBase.weekly.find(:max => 10, :bad_option => true) } end def test_daily assert_dates DateFinderBase.daily(:interval => 3).find(:start_date => d(9, 3), :end_date => d(9, 30)), 10 do |date| date.day % 3 == 0 end assert_dates DateFinderBase.daily.weekday.find(:start_date => d(9, 10), :max => 10), 10 do |date| date.weekday? end end def test_weekly_with_day dates = DateFinderBase.weekly.day(:tuesday).find(:start_date => d(9, 1), :end_date => d(9, 30)) expected = [5, 12, 19, 26].map{ |i| d(9, i) } assert_equal expected, dates end def test_weekly_with_days dates = DateFinderBase.weekly.days(:tuesday, :wednesday).find(:start_date => d(9, 1), :end_date => d(9, 30)) expected = [5, 6, 12, 13, 19, 20, 26, 27].map{ |i| d(9, i) } assert_equal expected, dates end def test_weekly_with_interval_and_day dates = DateFinderBase.weekly(:interval => 2).day(:wednesday).find(:start_date => d(9, 1), :end_date => d(10, 31)) expected = [d(9, 13), d(9, 27), d(10, 11), d(10, 25)] assert_equal expected, dates dates_with_every_other = DateFinderBase.weekly(:interval => :every_other).day(:wednesday).find(:start_date => d(9, 1), :end_date => d(10, 31)) assert_equal dates, dates_with_every_other dates_with_every_2nd = DateFinderBase.weekly(:interval => :every_2nd).day(:wednesday).find(:start_date => d(9, 1), :end_date => d(10, 31)) assert_equal dates, dates_with_every_2nd end def test_weekly_with_interval_and_two_days dates = DateFinderBase.weekly(:interval => 3).day(:monday).day(:friday).find(:start_date => d(9, 1), :max => 5) expected = [d(9, 1), d(9, 18), d(9, 22), d(10, 9), d(10, 13)] assert_equal expected, dates end def test_monthly_with_day_number dates = DateFinderBase.monthly.day_number(10).find(:start_date => d(9, 11), :max => 5) expected = [d(10, 10), d(11, 10), d(12, 10), d(2007, 1, 10), d(2007, 2, 10)] assert_equal expected, dates end def test_monthly_with_day_numbers dates = DateFinderBase.monthly.day_numbers(10,11).find(:start_date => d(9, 15), :max => 5) expected = [d(10, 10), d(10, 11), d(11, 10), d(11, 11), d(12, 10)] assert_equal expected, dates end def test_monthly_with_day_number_and_interval dates = DateFinderBase.monthly(:interval => 2).day_number(13).find(:start_date => d(9, 11), :max => 5) expected = [d(9, 13), d(11, 13), d(2007, 1, 13), d(2007, 3, 13), d(2007, 5, 13)] assert_equal expected, dates end def test_monthly_with_day_and_occurrence dates = DateFinderBase.monthly.day(:tuesday).day_occurrence(:first).find(:start_date => d(9, 1), :max => 3) expected = [d(9, 5), d(10, 3), d(11, 7)] assert_equal expected, dates end def test_monthly_with_day_and_occurrences dates = DateFinderBase.monthly.day(:tuesday).day_occurrences(:first, :last).find(:start_date => d(9, 1), :max => 2) expected = [d(9, 5), d(9, 26)] assert_equal expected, dates end def test_monthly_with_occurrence_and_day_and_interval dates = DateFinderBase.monthly(:interval => 4).day(:friday).day_occurrence(:last).find(:start_date => d(1, 1), :max => 4) expected = [d(1, 27), d(5, 26), d(9, 29), d(2007, 1, 26)] assert_equal expected, dates end def test_yearly_with_month_and_day dates = DateFinderBase.yearly.month(:march).day_number(5).find(:start_date => d(1, 1), :end_date => d(2009, 1, 1)) expected = [d(3, 5), d(2007, 3, 5), d(2008, 3, 5)] assert_equal expected, dates end def test_yearly_with_months_and_day dates = DateFinderBase.yearly.months(:march, :april).day_number(5).find(:start_date => d(1, 1), :end_date => d(12, 1)) expected = [d(3, 5), d(4,5)] assert_equal expected, dates end def test_year_with_day_and_occurrence_and_month dates = DateFinderBase.yearly.month(:september).day(1).day_occurrence(:second).find(:start_date => d(1, 1), :end_date => d(2010, 1, 1)) expected = [d(9, 11), d(2007, 9, 10), d(2008, 9, 8), d(2009, 9, 14)] assert_equal expected, dates end def test_find_including_leap_year dates = DateFinderBase.monthly.day(:friday).day_occurrence(:last).find(:start_date => Date.new(2007, 12, 1), :end_date => Date.new(2008, 3, 1)) expected = [d(2007, 12, 28), d(2008, 1, 25), d(2008, 2, 29)] assert_equal expected, dates end end