diff --git a/README.markdown b/README.markdown index d20e2ab..130e52a 100644 --- a/README.markdown +++ b/README.markdown @@ -139,6 +139,29 @@ Include? Shift.new(TimeOfDay.new(20), TimeOfDay.new(4)).include?(TimeOfDay.new(2)) # => true Shift.new(TimeOfDay.new(20), TimeOfDay.new(4)).include?(TimeOfDay.new(18)) # => false + +Overlap? +-------------------- + breakfast = Shift.new(TimeOfDay.new(8), TimeOfDay.new(11)) + lunch = Shift.new(TimeOfDay.new(10), TimeOfDay.new(14)) + breakfast.overlaps?(lunch) # => true + lunch.overlaps?(breakfast) # => true + + dinner = Shift.new(TimeOfDay.new(18), TimeOfDay.new(20)) + dinner.overlaps?(lunch) # => false + + +Contains? +-------------------- + workday = Shift.new(TimeOfDay.new(9), TimeOfDay.new(17)) + lunch = Shift.new(TimeOfDay.new(10), TimeOfDay.new(14)) + workday.contains?(lunch) # => true + lunch.contains?(workday) # => false + + dinner = Shift.new(TimeOfDay.new(18), TimeOfDay.new(20)) + dinner.overlaps?(lunch) # => false + + Rails Time Zone Support ======================= diff --git a/lib/tod/shift.rb b/lib/tod/shift.rb index edff70d..0ebfeea 100644 --- a/lib/tod/shift.rb +++ b/lib/tod/shift.rb @@ -22,6 +22,17 @@ def include?(tod) end end + def overlaps?(shift) + self.include?(shift.beginning) || + self.include?(shift.ending) || + shift.include?(self.beginning) || + shift.include?(self.ending) + end + + def contains?(shift) + self.include?(shift.beginning) && self.include?(shift.ending) + end + # Return shift duration in seconds. # if ending is lower than beginning this method will calculate the duration as the ending time is from the following day def duration diff --git a/test/tod/shift_test.rb b/test/tod/shift_test.rb index 3b0ac43..8d01f56 100644 --- a/test/tod/shift_test.rb +++ b/test/tod/shift_test.rb @@ -27,6 +27,46 @@ class ShiftTest < Test::Unit::TestCase end end + context "overlaps?" do + should "be true when shifts overlap" do + shift1 = Shift.new(TimeOfDay.new(12), TimeOfDay.new(18)) + shift2 = Shift.new(TimeOfDay.new(13), TimeOfDay.new(15)) + assert_true shift1.overlaps?(shift2) + end + + should "be false when shifts don't overlap" do + shift1 = Shift.new(TimeOfDay.new(1), TimeOfDay.new(5)) + shift2 = Shift.new(TimeOfDay.new(9), TimeOfDay.new(12)) + assert_false shift1.overlaps?(shift2) + end + + should "be true when shifts touch" do + shift1 = Shift.new(TimeOfDay.new(1), TimeOfDay.new(5)) + shift2 = Shift.new(TimeOfDay.new(5), TimeOfDay.new(12)) + assert_true shift1.overlaps?(shift2) + end + end + + context "contains?" do + should "be true when one shift contains another" do + outside = Shift.new(TimeOfDay.new(12), TimeOfDay.new(18)) + inside = Shift.new(TimeOfDay.new(13), TimeOfDay.new(15)) + assert_true outside.contains?(inside) + end + + should "be false when a shift is contained by another" do + outside = Shift.new(TimeOfDay.new(12), TimeOfDay.new(18)) + inside = Shift.new(TimeOfDay.new(13), TimeOfDay.new(15)) + assert_false inside.contains?(outside) + end + + should "be false when shifts don't even overlap" do + shift1 = Shift.new(TimeOfDay.new(12), TimeOfDay.new(15)) + shift2 = Shift.new(TimeOfDay.new(18), TimeOfDay.new(19)) + assert_false shift1.contains?(shift2) + end + end + context "include?" do # |------------------------|--------T1----V----T2----|------------------------| should "be true when value is between ToDs and boths tods are in the same day" do