spec/schedulability/schedule_spec.rb in schedulability-0.1.0 vs spec/schedulability/schedule_spec.rb in schedulability-0.2.0

- old
+ new

@@ -23,10 +23,17 @@ let( :testing_time ) { Time.iso8601('2015-12-15T12:00:00-00:00') } + RSpec::Matchers.define( :overlap ) do |other| + match do |schedule| + schedule.overlaps?( other ) + end + end + + context "with no periods" do let( :schedule ) { described_class.new } @@ -159,10 +166,17 @@ parse( "wd {Mon Wed Fri} hr {8am-4pm}, wd {Tue Thu} hr {9am-5pm}, not hour { 3pm }" ) expect( schedule ).to include( 'Tue Dec 15 12:00:00 2015' ) expect( schedule ).to include( 'Wed Dec 16 12:00:00 2015' ) expect( schedule ).to_not include( 'Wed Dec 16 15:05:00 2015' ) end + + + it "can be stringified" do + schedule = described_class. + parse( "wd {Mon Wed Fri} hr {8am-4pm}, wd {Tue Thu} hr {9am-5pm}, not hour { 3pm }" ) + expect( schedule.to_s ).to eq( "hr { 8-16 } wd { 1 3 5 }, hr { 9-17 } wd { 2 4 }, not hr { 15 }" ) + end end describe "period parsing" do @@ -707,20 +721,72 @@ described_class.parse( 'sec {55-60}' ) }.to raise_error( Schedulability::ParseError, /invalid second value: 60/i ) end + it "doesn't raise a parse error for second values equal to 59" do + expect { + described_class.parse( 'sec {1 5 10 59}' ) + }.not_to raise_error + expect { + described_class.parse( 'sec {59}' ) + }.not_to raise_error + expect { + described_class.parse( 'sec {0-59}' ) + }.not_to raise_error + end + + + it "allows second values equal to 0" do + expect { + described_class.parse( 'sec {0 5 10 59}' ) + }.not_to raise_error + expect { + described_class.parse( 'sec {0}' ) + }.not_to raise_error + expect { + described_class.parse( 'sec {0-59}' ) + }.not_to raise_error + end + + it "raises a parse error for minute values greater than 59" do expect { described_class.parse( 'min {09 28 68}' ) }.to raise_error( Schedulability::ParseError, /invalid minute value: 68/i ) expect { described_class.parse( 'min {60}' ) }.to raise_error( Schedulability::ParseError, /invalid minute value: 60/i ) end + it "doesn't raise a parse error for minute values equal to 59" do + expect { + described_class.parse( 'min {1 5 10 59}' ) + }.not_to raise_error + expect { + described_class.parse( 'min {59}' ) + }.not_to raise_error + expect { + described_class.parse( 'min {0-59}' ) + }.not_to raise_error + end + + + it "allows minute values equal to 0" do + expect { + described_class.parse( 'min {0 5 10 59}' ) + }.not_to raise_error + expect { + described_class.parse( 'min {0}' ) + }.not_to raise_error + expect { + described_class.parse( 'min {0-59}' ) + }.not_to raise_error + end + + it "raises a parse error for minute ranges with invalid values" do expect { described_class.parse( 'min {120-15}' ) }.to raise_error( Schedulability::ParseError, /invalid minute value: 120/i ) end @@ -782,10 +848,19 @@ expect( schedule3 ).to be_empty end + it "treats scales present in one schedule as infinite in the other when intersecting" do + schedule1 = described_class.parse( 'hr {6am-8am}' ) + schedule2 = described_class.parse( 'wday {Thu Sat}' ) + schedule3 = schedule1 & schedule2 + + expect( schedule3 ).to be == described_class.parse( 'hr {6am-8am} wday {Thu Sat}' ) + end + + it "can calculate unions of schedules with negated periods" do schedule1 = described_class.parse( '! wday { Mon-Fri }' ) schedule2 = described_class.parse( '! wday { Thu }' ) schedule3 = schedule1 | schedule2 @@ -818,9 +893,35 @@ expect( schedule2 ).to include( '2015-01-09T08:00:00-00:00' ) expect( schedule2 ).to include( '2015-01-10T07:59:59-00:00' ) expect( schedule2 ).to_not include( '2015-01-10T08:00:00-00:00' ) expect( schedule2 ).to_not include( '2015-01-15T15:59:59-00:00' ) expect( schedule2 ).to include( '2015-01-15T16:00:00-00:00' ) + end + + end + + + describe "predicates" do + + it "can test if one schedule overlaps another" do + schedule1 = described_class.parse( "hr {8am - 5pm}" ) + schedule2 = described_class.parse( "hr {5pm - 8am}" ) + schedule3 = described_class.parse( "wd {Mon - Fri}" ) + + expect( schedule1 ).to_not overlap( schedule2 ) + expect( schedule1 ).to overlap( schedule3 ) + expect( schedule2 ).to overlap( schedule3 ) + end + + + it "can test if one schedule is exclusive of another" do + schedule1 = described_class.parse( "hr {8am - 5pm}" ) + schedule2 = described_class.parse( "hr {5pm - 8am}" ) + schedule3 = described_class.parse( "wd {Mon - Fri}" ) + + expect( schedule1 ).to be_exclusive_of( schedule2 ) + expect( schedule1 ).to_not be_exclusive_of( schedule3 ) + expect( schedule2 ).to_not be_exclusive_of( schedule3 ) end end end