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