#!/usr/bin/ruby -I./lib/ -I../lib/ require 'custodian/util/timespan' require 'test/unit' # # Unit test for our time-span code. # class TestTimeSpanUtil < Test::Unit::TestCase # # Create the test suite environment: NOP. # def setup end # # Destroy the test suite environment: NOP. # def teardown end # # Test the expansion of "obvious" hour-specifiers. # def test_to_hour for hour in 0..23 assert_equal(hour, Custodian::Util::TimeSpan.to_hour(hour)) end # # Invalid hours will throw exceptions # assert_raise ArgumentError do result = Custodian::Util::TimeSpan.to_hour(0.5) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.to_hour(-1) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.to_hour(100) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.to_hour(24) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.to_hour(25) end # # Ensure AM times work well # for hour in 0..11 assert_equal(hour, Custodian::Util::TimeSpan.to_hour("#{hour}am")) end for hour in 0..11 assert_equal(12 + hour, Custodian::Util::TimeSpan.to_hour("#{hour}pm")) end end # # # Ensure we received errors if the start/end hours are under/over 24 # def test_excessive_hours # # Valid hours are 0-23, inclusive. Test outside that range. # for i in 24..100 assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?(i, 2) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?(1, i) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?(1, 2, i) end end # # Now negative values. # for i in 1..50 assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?(1, (-1 * i)) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?((-1 * i), 1) end assert_raise ArgumentError do result = Custodian::Util::TimeSpan.inside?(1, 1, (-1 * i)) end end end # # Test simple cases where the period is positive. # def test_simple_cases # 8am-5pm assert(Custodian::Util::TimeSpan.inside?('8am', '5am', 12)) assert(Custodian::Util::TimeSpan.inside?(8, 17, 12)) end # # Test cases which involve the wrap-around over midnight. # def test_midnight_cases # 9pm-2am assert(Custodian::Util::TimeSpan.inside?('9pm', '2am', 22)) assert(Custodian::Util::TimeSpan.inside?('9pm', '2am', '10pm')) assert(Custodian::Util::TimeSpan.inside?(21, 2, 22)) assert(Custodian::Util::TimeSpan.inside?(21, 2, '10pm')) # 10pm-3am assert(Custodian::Util::TimeSpan.inside?('10pm', '3am', 22)) assert(Custodian::Util::TimeSpan.inside?(22, 3, 22)) assert(Custodian::Util::TimeSpan.inside?(22, 3, 22)) assert(Custodian::Util::TimeSpan.inside?(22, 3, '10pm')) # 11pm-5am assert(Custodian::Util::TimeSpan.inside?('11pm', '5am', 23)) assert(Custodian::Util::TimeSpan.inside?(23, 5, 23)) assert(Custodian::Util::TimeSpan.inside?('11pm', '5am', '11pm')) # midnight-3am assert(Custodian::Util::TimeSpan.inside?('0', '3am', 1)) assert(Custodian::Util::TimeSpan.inside?('0', '3am', '1am')) end # # The time-spans listed are inclusive. # # Test the boundaries. # def test_inclusive open = '4pm' close = '6pm' # The hours + the middle should be inside assert(Custodian::Util::TimeSpan.inside?(open, close, 16)) assert(Custodian::Util::TimeSpan.inside?(open, close, '4pm')) assert(Custodian::Util::TimeSpan.inside?(open, close, 17)) assert(Custodian::Util::TimeSpan.inside?(open, close, '5pm')) assert(Custodian::Util::TimeSpan.inside?(open, close, 18)) assert(Custodian::Util::TimeSpan.inside?(open, close, '6pm')) # # The preceeding + successive hours shouldn't be. # assert(!Custodian::Util::TimeSpan.inside?(open, close, 15)) assert(!Custodian::Util::TimeSpan.inside?(open, close, 19)) # # That is true for the string-versions too # assert(!Custodian::Util::TimeSpan.inside?(open, close, '3pm')) assert(!Custodian::Util::TimeSpan.inside?(open, close, '7pm')) # # Random hours should be outside too. # assert(!Custodian::Util::TimeSpan.inside?(open, close, 3)) assert(!Custodian::Util::TimeSpan.inside?(open, close, '3am')) assert(!Custodian::Util::TimeSpan.inside?(open, close, 7)) assert(!Custodian::Util::TimeSpan.inside?(open, close, '7am')) assert(!Custodian::Util::TimeSpan.inside?(open, close, 9)) assert(!Custodian::Util::TimeSpan.inside?(open, close, '9am')) end # # Since the implementation of our test involves # iterating over the specified period then any 24-hour # period is the worst case. # # def test_worst for i in 0..23 assert(Custodian::Util::TimeSpan.inside?(0, 23, i)) end end # # Test that we don't wrap-around unexpectedly. # # # i.e. "between 00-00" is one hour, not 24. # def test_wrap_around for h in 00..23 assert_equal(1, Custodian::Util::TimeSpan.to_hours(h, h).size) end # # But the time-period 00-23 is a full day # assert_equal(24, Custodian::Util::TimeSpan.to_hours(0, 23).size) end end