```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

```