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