require File.dirname(__FILE__) + '/abstract_unit' class DateFinderMock attr_reader :conditions def initialize @conditions = [] end def condition(name, &block) @conditions << block end include DateFinderConditions end class DateConditionsTest < Test::Unit::TestCase def setup @mock = DateFinderMock.new end def method_missing(method_id, *args) if @mock.respond_to?(method_id) @mock.send(method_id, *args) else super end end def conditions_match?(date) @mock.conditions.any? { |c| c.call(date) } end def assert_conditions_match(*dates) dates.each { |d| assert conditions_match?(d) } end def assert_conditions_not_match(*dates) dates.each { |d| assert !conditions_match?(d) } end def test_day_number day_number(20) assert_conditions_match d(9, 20) assert_conditions_not_match d(9, 1), d(9, 21) end def test_day_by_number day(3) assert_conditions_match d(12, 6), d(9, 13), d(3, 8) assert_conditions_not_match d(3, 6), d(6, 22), d(11, 11) end def test_day_by_name day('sunday') assert_conditions_match d(10, 29), d(4, 23) assert_conditions_not_match d(4, 18), d(9, 2), d(1, 5) end def test_day_by_method_true tuesday(true) assert_conditions_match d(1, 17), d(2, 21) assert_conditions_not_match d(2, 24), d(2, 26) end def test_day_by_method_false tuesday(false) assert_conditions_not_match *7.times { |i| Date.today + i } end def test_weekday weekday assert_conditions_match d(4, 3), d(10, 3) assert_conditions_not_match d(4, 22), d(6, 10) end def test_month_by_number month(2) assert_conditions_match d(2, 3), d(2, 20), Date.new(2004, 2, 29) assert_conditions_not_match d(4, 5), d(6, 7), d(8, 9) end def test_month_by_name month('December') assert_conditions_match d(12, 1), d(12, 31), Date.new(2001, 12, 18) assert_conditions_not_match d(1, 1), d(10, 20), d(4, 4) end def test_day_occurrence day_occurrence('second') assert_conditions_match d(5, 9), d(8, 14), d(8, 10), d(12, 8) assert_conditions_not_match d(5, 2), d(8, 21), d(8, 6), d(4, 27) end end