The three rules of Ruby Quiz:

1.  Please do not post any solutions or spoiler discussion for this quiz until
48 hours have passed from the time on this message.

2.  Support Ruby Quiz by submitting ideas as often as you can:

http://www.rubyquiz.com/

3.  Enjoy!

Suggestion:  A [QUIZ] in the subject of emails about the problem helps everyone
on Ruby Talk follow the discussion.  Please reply to the original quiz message,
if you can.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

by Brian Candler

Write a Ruby class which can tell you whether the current time (or any given
time) is within a particular "time window". Time windows are defined by strings
in the following format:

	#    0700-0900                     # every day between these times
	#    Sat Sun                       # all day Sat and Sun, no other times
	#    Sat Sun 0700-0900             # 0700-0900 on Sat and Sun only
	#    Mon-Fri 0700-0900             # 0700-0900 on Monday to Friday only
	#    Mon-Fri 0700-0900; Sat Sun    # ditto plus all day Sat and Sun
	#    Fri-Mon 0700-0900             # 0700-0900 on Fri Sat Sun Mon
	#    Sat 0700-0800; Sun 0800-0900  # 0700-0800 on Sat, plus 0800-0900 on Sun

Time ranges should exclude the upper bound, i.e. 0700-0900 is 07:00:00 to
08:59:59. An empty time window means "all times everyday". Here are some test
cases to make it clearer:

	class TestTimeWindow < Test::Unit::TestCase
	  def test_window_1
	    w = TimeWindow.new("Sat-Sun; Mon Wed 0700-0900; Thu 0700-0900 1000-1200")
	    
	    assert ! w.include?(Time.mktime(2007,9,25,8,0,0))   # Tue
	    assert   w.include?(Time.mktime(2007,9,26,8,0,0))   # Wed
	    assert ! w.include?(Time.mktime(2007,9,26,11,0,0))
	    assert ! w.include?(Time.mktime(2007,9,27,6,59,59)) # Thu
	    assert   w.include?(Time.mktime(2007,9,27,7,0,0))
	    assert   w.include?(Time.mktime(2007,9,27,8,59,59))
	    assert ! w.include?(Time.mktime(2007,9,27,9,0,0))
	    assert   w.include?(Time.mktime(2007,9,27,11,0,0))
	    assert   w.include?(Time.mktime(2007,9,29,11,0,0))  # Sat
	    assert   w.include?(Time.mktime(2007,9,29,0,0,0))
	    assert   w.include?(Time.mktime(2007,9,29,23,59,59))
	  end
	  
	  def test_window_2
	    w = TimeWindow.new("Fri-Mon")
	    assert ! w.include?(Time.mktime(2007,9,27)) # Thu
	    assert   w.include?(Time.mktime(2007,9,28))
	    assert   w.include?(Time.mktime(2007,9,29))
	    assert   w.include?(Time.mktime(2007,9,30))
	    assert   w.include?(Time.mktime(2007,10,1))
	    assert ! w.include?(Time.mktime(2007,10,2)) # Tue
	  end
	  
	  def test_window_nil
	    w = RDS::TimeWindow.new("")
	    assert w.include?(Time.mktime(2007,9,25,1,2,3))     # all times
	  end
	end