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