#!/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