acts_as_span 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,302 @@
1
+ require 'spec_helper'
2
+
3
+ describe "a basic model using acts_as_span" do
4
+ before(:all) do
5
+ build_model :span_model do
6
+ string :description
7
+ date :start_date
8
+ date :end_date
9
+
10
+ acts_as_span
11
+ end
12
+ end
13
+
14
+ context "named_scopes and current?, expired?, and future?" do
15
+ # -2 -1 T +1 +2 C F E
16
+ # A |---| E
17
+ # B |-------| C
18
+ # C |--------------| C
19
+ # D | C
20
+ # E |------| C
21
+ # F |--| F
22
+ # G |-> C
23
+ # H |-> C
24
+ # I |-> F
25
+ # J <-| E
26
+ # K <-| C
27
+ # L <-| C
28
+ # M <-> C
29
+ context "A) start_date < today & end_date < today" do
30
+ before(:all) do
31
+ @span_model = SpanModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today - 1.day)
32
+ end
33
+
34
+ it "should NOT be included in #current" do
35
+ SpanModel.current.should_not include(@span_model)
36
+ @span_model.current?.should be_false
37
+ end
38
+
39
+ it "should NOT be included in #future" do
40
+ SpanModel.future.should_not include(@span_model)
41
+ @span_model.future?.should be_false
42
+ end
43
+
44
+ it "should be included in #expired" do
45
+ SpanModel.expired.should include(@span_model)
46
+ @span_model.expired?.should be_true
47
+ end
48
+ end
49
+
50
+ context "B) start_date < today & end_date == today" do
51
+ before(:all) do
52
+ @span_model = SpanModel.create!(:start_date => Date.today - 2.day, :end_date => Date.today)
53
+ end
54
+
55
+ it "should be included in #current" do
56
+ SpanModel.current.should include(@span_model)
57
+ @span_model.current?.should be_true
58
+ end
59
+
60
+ it "should NOT be included in #future" do
61
+ SpanModel.future.should_not include(@span_model)
62
+ @span_model.future?.should be_false
63
+ end
64
+
65
+ it "should NOT be included in #expired" do
66
+ SpanModel.expired.should_not include(@span_model)
67
+ @span_model.expired?.should be_false
68
+ end
69
+ end
70
+
71
+ context "C) start_date < today & end_date > today" do
72
+ before(:all) do
73
+ @span_model = SpanModel.create!(:start_date => Date.today - 2.day, :end_date => Date.today + 2.day)
74
+ end
75
+
76
+ it "should be included in #current" do
77
+ SpanModel.current.should include(@span_model)
78
+ @span_model.current?.should be_true
79
+ end
80
+
81
+ it "should NOT be included in #future" do
82
+ SpanModel.future.should_not include(@span_model)
83
+ @span_model.future?.should be_false
84
+ end
85
+
86
+ it "should NOT be included in #expired" do
87
+ SpanModel.expired.should_not include(@span_model)
88
+ @span_model.expired?.should be_false
89
+ end
90
+ end
91
+
92
+ context "D) start_date == today & end_date == today" do
93
+ before(:all) do
94
+ @span_model = SpanModel.create!(:start_date => Date.today, :end_date => Date.today)
95
+ end
96
+
97
+ it "should be included in #current" do
98
+ SpanModel.current.should include(@span_model)
99
+ @span_model.current?.should be_true
100
+ end
101
+
102
+ it "should NOT be included in #future" do
103
+ SpanModel.future.should_not include(@span_model)
104
+ @span_model.future?.should be_false
105
+ end
106
+
107
+ it "should NOT be included in #expired" do
108
+ SpanModel.expired.should_not include(@span_model)
109
+ @span_model.expired?.should be_false
110
+ end
111
+ end
112
+
113
+ context "E) start_date == today & end_date > today" do
114
+ before(:all) do
115
+ @span_model = SpanModel.create!(:start_date => Date.today, :end_date => Date.today + 2.day)
116
+ end
117
+
118
+ it "should be included in #current" do
119
+ SpanModel.current.should include(@span_model)
120
+ @span_model.current?.should be_true
121
+ end
122
+
123
+ it "should NOT be included in #future" do
124
+ SpanModel.future.should_not include(@span_model)
125
+ @span_model.future?.should be_false
126
+ end
127
+
128
+ it "should NOT be included in #expired" do
129
+ SpanModel.expired.should_not include(@span_model)
130
+ @span_model.expired?.should be_false
131
+ end
132
+ end
133
+
134
+ context "F) start_date > today & end_date > today" do
135
+ before(:all) do
136
+ @span_model = SpanModel.create!(:start_date => Date.today + 1.day, :end_date => Date.today + 2.days)
137
+ end
138
+
139
+ it "should NOT be included in #current" do
140
+ SpanModel.current.should_not include(@span_model)
141
+ @span_model.current?.should be_false
142
+ end
143
+
144
+ it "should be included in #future" do
145
+ SpanModel.future.should include(@span_model)
146
+ @span_model.future?.should be_true
147
+ end
148
+
149
+ it "should NOT be included in #expired" do
150
+ SpanModel.expired.should_not include(@span_model)
151
+ @span_model.expired?.should be_false
152
+ end
153
+ end
154
+
155
+ context "G) start_date < today & end_date == nil" do
156
+ before(:all) do
157
+ @span_model = SpanModel.create!(:start_date => Date.today - 2.day, :end_date => nil)
158
+ end
159
+
160
+ it "should be included in #current" do
161
+ SpanModel.current.should include(@span_model)
162
+ @span_model.current?.should be_true
163
+ end
164
+
165
+ it "should NOT be included in #future" do
166
+ SpanModel.future.should_not include(@span_model)
167
+ @span_model.future?.should be_false
168
+ end
169
+
170
+ it "should NOT be included in #expired" do
171
+ SpanModel.expired.should_not include(@span_model)
172
+ @span_model.expired?.should be_false
173
+ end
174
+ end
175
+
176
+ context "H) start_date == today & end_date == nil" do
177
+ before(:all) do
178
+ @span_model = SpanModel.create!(:start_date => Date.today, :end_date => nil)
179
+ end
180
+
181
+ it "should be included in #current" do
182
+ SpanModel.current.should include(@span_model)
183
+ @span_model.current?.should be_true
184
+ end
185
+
186
+ it "should NOT be included in #future" do
187
+ SpanModel.future.should_not include(@span_model)
188
+ @span_model.future?.should be_false
189
+ end
190
+
191
+ it "should NOT be included in #expired" do
192
+ SpanModel.expired.should_not include(@span_model)
193
+ @span_model.expired?.should be_false
194
+ end
195
+ end
196
+
197
+ context "I) start_date > today & end_date == nil" do
198
+ before(:all) do
199
+ @span_model = SpanModel.create!(:start_date => Date.today + 1.day, :end_date => nil)
200
+ end
201
+
202
+ it "should NOT be included in #current" do
203
+ SpanModel.current.should_not include(@span_model)
204
+ @span_model.current?.should be_false
205
+ end
206
+
207
+ it "should be included in #future" do
208
+ SpanModel.future.should include(@span_model)
209
+ @span_model.future?.should be_true
210
+ end
211
+
212
+ it "should NOT be included in #expired" do
213
+ SpanModel.expired.should_not include(@span_model)
214
+ @span_model.expired?.should be_false
215
+ end
216
+ end
217
+
218
+ context "J) start_date == nil & end_date < today" do
219
+ before(:all) do
220
+ @span_model = SpanModel.create!(:start_date => nil, :end_date => Date.today - 1.day)
221
+ end
222
+
223
+ it "should NOT be included in #current" do
224
+ SpanModel.current.should_not include(@span_model)
225
+ @span_model.current?.should be_false
226
+ end
227
+
228
+ it "should NOT be included in #future" do
229
+ SpanModel.future.should_not include(@span_model)
230
+ @span_model.future?.should be_false
231
+ end
232
+
233
+ it "should be included in #expired" do
234
+ SpanModel.expired.should include(@span_model)
235
+ @span_model.expired?.should be_true
236
+ end
237
+ end
238
+
239
+ context "K) start_date == nil & end_date == today" do
240
+ before(:all) do
241
+ @span_model = SpanModel.create!(:start_date => nil, :end_date => Date.today)
242
+ end
243
+
244
+ it "should be included in #current" do
245
+ SpanModel.current.should include(@span_model)
246
+ @span_model.current?.should be_true
247
+ end
248
+
249
+ it "should NOT be included in #future" do
250
+ SpanModel.future.should_not include(@span_model)
251
+ @span_model.future?.should be_false
252
+ end
253
+
254
+ it "should NOT be included in #expired" do
255
+ SpanModel.expired.should_not include(@span_model)
256
+ @span_model.expired?.should be_false
257
+ end
258
+ end
259
+
260
+ context "L) start_date == nil & end_date > today" do
261
+ before(:all) do
262
+ @span_model = SpanModel.create!(:start_date => nil, :end_date => Date.today + 2.day)
263
+ end
264
+
265
+ it "should be included in #current" do
266
+ SpanModel.current.should include(@span_model)
267
+ @span_model.current?.should be_true
268
+ end
269
+
270
+ it "should NOT be included in #future" do
271
+ SpanModel.future.should_not include(@span_model)
272
+ @span_model.future?.should be_false
273
+ end
274
+
275
+ it "should NOT be included in #expired" do
276
+ SpanModel.expired.should_not include(@span_model)
277
+ @span_model.expired?.should be_false
278
+ end
279
+ end
280
+
281
+ context "M) start_date == nil & end_date == nil" do
282
+ before(:all) do
283
+ @span_model = SpanModel.create!(:start_date => nil, :end_date => nil)
284
+ end
285
+
286
+ it "should be included in #current" do
287
+ SpanModel.current.should include(@span_model)
288
+ @span_model.current?.should be_true
289
+ end
290
+
291
+ it "should NOT be included in #future" do
292
+ SpanModel.future.should_not include(@span_model)
293
+ @span_model.future?.should be_false
294
+ end
295
+
296
+ it "should NOT be included in #expired" do
297
+ SpanModel.expired.should_not include(@span_model)
298
+ @span_model.expired?.should be_false
299
+ end
300
+ end
301
+ end
302
+ end
@@ -0,0 +1,597 @@
1
+ require 'spec_helper'
2
+
3
+ describe "a basic model using acts_as_span" do
4
+ before(:each) do
5
+ build_model :multiple_scoped_model do
6
+ integer :parent_1_id
7
+ integer :parent_2_id
8
+ string :description
9
+ date :start_date
10
+ date :end_date
11
+
12
+ acts_as_span :span_overlap_count => 1, :span_overlap_scope => [:parent_1_id, :parent_2_id]
13
+ end
14
+
15
+ build_model :single_scoped_model do
16
+ integer :parent_1_id
17
+ string :description
18
+ date :start_date
19
+ date :end_date
20
+
21
+ acts_as_span :span_overlap_scope => :parent_1_id
22
+ end
23
+
24
+ build_model :scoped_model do
25
+ string :description
26
+ date :start_date
27
+ date :end_date
28
+
29
+ acts_as_span :span_overlap_count => 0
30
+ end
31
+
32
+ build_model :span_model do
33
+ string :description
34
+ date :start_date
35
+ date :end_date
36
+
37
+ acts_as_span :span_overlap_count => nil
38
+ end
39
+
40
+ ScopedModel.all.each(&:destroy)
41
+ end
42
+
43
+ #context "span_overlap_count == nil" do
44
+ # before(:each) do
45
+ # @span_model = SpanModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today + 2.day)
46
+ # end
47
+ #
48
+ # it "should be valid if overlap?" do
49
+ # non_scoped_model = SpanModel.new(:start_date => Date.today, :end_date => Date.today)
50
+ # non_scoped_model.should be_valid
51
+ # non_scoped_model.overlap?(@span_model).should be_true
52
+ # end
53
+ #end
54
+ #
55
+ #context "span_overlap_count == 1, span_overlap_scope == Array" do
56
+ # before(:each) do
57
+ # @span_model = MultipleScopedModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today + 2.day, :parent_1_id => 1, :parent_2_id => 2)
58
+ # @span_model_2 = MultipleScopedModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today + 2.day, :parent_1_id => 1, :parent_2_id => 2)
59
+ # end
60
+ #
61
+ # it "should NOT be valid if in scope && overlap?" do
62
+ # scoped_model = MultipleScopedModel.new(:start_date => Date.today, :end_date => Date.today, :parent_1_id => 1, :parent_2_id => 2)
63
+ # scoped_model.should_not be_valid
64
+ # scoped_model.overlap?(@span_model).should be_true
65
+ # end
66
+ #
67
+ # it "should be valid if NOT in scope && overlap?" do
68
+ # scoped_model = MultipleScopedModel.new(:start_date => Date.today, :end_date => Date.today, :parent_1_id => 1, :parent_2_id => 0)
69
+ # scoped_model.should be_valid
70
+ # scoped_model.overlap?(@span_model).should be_true
71
+ # end
72
+ #end
73
+ #
74
+ #context "span_overlap_count == nil, span_overlap_scope == symbol" do
75
+ # before(:each) do
76
+ # @span_model = SingleScopedModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today + 2.day, :parent_1_id => 1)
77
+ # end
78
+ #
79
+ # it "should NOT be valid if in scope && overlap?" do
80
+ # scoped_model = SingleScopedModel.new(:start_date => Date.today, :end_date => Date.today, :parent_1_id => 1)
81
+ # scoped_model.should_not be_valid
82
+ # scoped_model.overlap?(@span_model).should be_true
83
+ # end
84
+ #
85
+ # it "should be valid if NOT in scope && overlap?" do
86
+ # scoped_model = SingleScopedModel.new(:start_date => Date.today, :end_date => Date.today, :parent_1_id => 0)
87
+ # scoped_model.should be_valid
88
+ # scoped_model.overlap?(@span_model).should be_true
89
+ # end
90
+ #
91
+ # it "should ignore itself" do
92
+ # @span_model.should be_valid
93
+ # end
94
+ #end
95
+
96
+ context "span_overlap_count == 0" do
97
+ # -4 -3 -2 -1 +1 +2 +3 +4
98
+ # |-----------| TEST SPAN
99
+ # A |---| VALID
100
+ # B |---------------|
101
+ # C |---------------------------|
102
+ # D |---|
103
+ # E |---------------|
104
+ # F |---| VALID
105
+ # G |->
106
+ # H |->
107
+ # I |-> VALID
108
+ # J <-|
109
+ # K <-|
110
+ # L <-| VALID
111
+ # M <--->
112
+ context "span_model.start_date && span_model.end_date" do
113
+ before(:each) do
114
+ @span_model = ScopedModel.create!(:start_date => Date.today - 2.days, :end_date => Date.today + 2.day)
115
+ end
116
+
117
+ context "A) start_date < span_model.start_date && end_date < span_model.start_date" do
118
+ it "should be valid" do
119
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today - 3.days)
120
+ scoped_model.should be_valid
121
+ scoped_model.overlap?(@span_model).should be_false
122
+ end
123
+ end
124
+
125
+ context "B) start_date < span_model.start_date && end_date IN span" do
126
+ it "should NOT be valid" do
127
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 1.day)
128
+ scoped_model.should_not be_valid
129
+ scoped_model.overlap?(@span_model).should be_true
130
+ end
131
+ end
132
+
133
+ context "C) start_date < span_model.start_date && end_date > span_model.end_date" do
134
+ it "should NOT be valid" do
135
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 4.days)
136
+ scoped_model.should_not be_valid
137
+ scoped_model.overlap?(@span_model).should be_true
138
+ end
139
+ end
140
+
141
+ context "D) start_date IN span && end_date IN span" do
142
+ it "should NOT be valid" do
143
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 1.day)
144
+ scoped_model.should_not be_valid
145
+ scoped_model.overlap?(@span_model).should be_true
146
+ end
147
+ end
148
+
149
+ context "E) start_date IN span && end_date > span_model.end_date" do
150
+ it "should NOT be valid" do
151
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 4.day)
152
+ scoped_model.should_not be_valid
153
+ scoped_model.overlap?(@span_model).should be_true
154
+ end
155
+ end
156
+
157
+ context "F) start_date > span_model.end_date && end_date > span_model.end_date" do
158
+ it "should be valid" do
159
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => Date.today + 4.days)
160
+ scoped_model.should be_valid
161
+ scoped_model.overlap?(@span_model).should be_false
162
+ end
163
+ end
164
+
165
+ context "G) start_date < span_model.start_date && end_date nil" do
166
+ it "should NOT be valid" do
167
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => nil)
168
+ scoped_model.should_not be_valid
169
+ scoped_model.overlap?(@span_model).should be_true
170
+ end
171
+ end
172
+
173
+ context "H) start_date IN span && end_date nil" do
174
+ it "should NOT be valid" do
175
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => nil)
176
+ scoped_model.should_not be_valid
177
+ scoped_model.overlap?(@span_model).should be_true
178
+ end
179
+ end
180
+
181
+ context "I) start_date > span_model.end_date && end_date nil" do
182
+ it "should be valid" do
183
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => nil)
184
+ scoped_model.should be_valid
185
+ scoped_model.overlap?(@span_model).should be_false
186
+ end
187
+ end
188
+
189
+ context "J) start_date nil && end_date > span_model.end_date" do
190
+ it "should NOT be valid" do
191
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 4.days)
192
+ scoped_model.should_not be_valid
193
+ scoped_model.overlap?(@span_model).should be_true
194
+ end
195
+ end
196
+
197
+ context "K) start_date nil && end_date IN span" do
198
+ it "should NOT be valid" do
199
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 1.day)
200
+ scoped_model.should_not be_valid
201
+ scoped_model.overlap?(@span_model).should be_true
202
+ end
203
+ end
204
+
205
+ context "L) start_date nil && end_date < span_model.start_date" do
206
+ it "should be valid" do
207
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today - 3.days)
208
+ scoped_model.should be_valid
209
+ scoped_model.overlap?(@span_model).should be_false
210
+ end
211
+ end
212
+
213
+ context "M) start_date nil && end_date nil" do
214
+ it "should NOT be valid" do
215
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => nil)
216
+ scoped_model.should_not be_valid
217
+ scoped_model.overlap?(@span_model).should be_true
218
+ end
219
+ end
220
+ end
221
+
222
+ # -4 -3 -2 -1 +1 +2 +3 +4
223
+ # |-------------------> TEST SPAN
224
+ # A |---| VALID
225
+ # B |---------------|
226
+ # C |---------------------------|
227
+ # D |---|
228
+ # E |---------------|
229
+ # F |---|
230
+ # G |->
231
+ # H |->
232
+ # I |->
233
+ # J <-|
234
+ # K <-|
235
+ # L <-| VALID
236
+ # M <--->
237
+ context "span_model.start_date && span_model.end_date.nil" do
238
+ before(:each) do
239
+ @span_model = ScopedModel.create!(:start_date => Date.today - 2.days, :end_date => nil)
240
+ end
241
+
242
+ context "A) start_date < span_model.start_date && end_date < span_model.start_date" do
243
+ it "should be valid" do
244
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today - 3.days)
245
+ scoped_model.should be_valid
246
+ scoped_model.overlap?(@span_model).should be_false
247
+ end
248
+ end
249
+
250
+ context "B) start_date < span_model.start_date && end_date IN span" do
251
+ it "should NOT be valid" do
252
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 1.day)
253
+ scoped_model.should_not be_valid
254
+ scoped_model.overlap?(@span_model).should be_true
255
+ end
256
+ end
257
+
258
+ context "C) start_date < span_model.start_date && end_date > span_model.end_date" do
259
+ it "should NOT be valid" do
260
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 4.days)
261
+ scoped_model.should_not be_valid
262
+ scoped_model.overlap?(@span_model).should be_true
263
+ end
264
+ end
265
+
266
+ context "D) start_date IN span && end_date IN span" do
267
+ it "should NOT be valid" do
268
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 1.day)
269
+ scoped_model.should_not be_valid
270
+ scoped_model.overlap?(@span_model).should be_true
271
+ end
272
+ end
273
+
274
+ context "E) start_date IN span && end_date > span_model.end_date" do
275
+ it "should NOT be valid" do
276
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 4.day)
277
+ scoped_model.should_not be_valid
278
+ scoped_model.overlap?(@span_model).should be_true
279
+ end
280
+ end
281
+
282
+ context "F) start_date > span_model.end_date && end_date > span_model.end_date" do
283
+ it "should NOT be valid" do
284
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => Date.today + 4.days)
285
+ scoped_model.should_not be_valid
286
+ scoped_model.overlap?(@span_model).should be_true
287
+ end
288
+ end
289
+
290
+ context "G) start_date < span_model.start_date && end_date nil" do
291
+ it "should NOT be valid" do
292
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => nil)
293
+ scoped_model.should_not be_valid
294
+ scoped_model.overlap?(@span_model).should be_true
295
+ end
296
+ end
297
+
298
+ context "H) start_date IN span && end_date nil" do
299
+ it "should NOT be valid" do
300
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => nil)
301
+ scoped_model.should_not be_valid
302
+ scoped_model.overlap?(@span_model).should be_true
303
+ end
304
+ end
305
+
306
+ context "I) start_date > span_model.end_date && end_date nil" do
307
+ it "should NOT be valid" do
308
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => nil)
309
+ scoped_model.should_not be_valid
310
+ scoped_model.overlap?(@span_model).should be_true
311
+ end
312
+ end
313
+
314
+ context "J) start_date nil && end_date > span_model.end_date" do
315
+ it "should NOT be valid" do
316
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 4.days)
317
+ scoped_model.should_not be_valid
318
+ scoped_model.overlap?(@span_model).should be_true
319
+ end
320
+ end
321
+
322
+ context "K) start_date nil && end_date IN span" do
323
+ it "should NOT be valid" do
324
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 1.day)
325
+ scoped_model.should_not be_valid
326
+ scoped_model.overlap?(@span_model).should be_true
327
+ end
328
+ end
329
+
330
+ context "L) start_date nil && end_date < span_model.start_date" do
331
+ it "should be valid" do
332
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today - 3.days)
333
+ scoped_model.should be_valid
334
+ scoped_model.overlap?(@span_model).should be_false
335
+ end
336
+ end
337
+
338
+ context "M) start_date nil && end_date nil" do
339
+ it "should NOT be valid" do
340
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => nil)
341
+ scoped_model.should_not be_valid
342
+ scoped_model.overlap?(@span_model).should be_true
343
+ end
344
+ end
345
+ end
346
+
347
+ # -4 -3 -2 -1 +1 +2 +3 +4
348
+ # <-------------------| TEST SPAN
349
+ # A |---|
350
+ # B |---------------|
351
+ # C |---------------------------|
352
+ # D |---|
353
+ # E |---------------|
354
+ # F |---| VALID
355
+ # G |->
356
+ # H |->
357
+ # I |-> VALID
358
+ # J <-|
359
+ # K <-|
360
+ # L <-|
361
+ # M <--->
362
+ context "span_model.start_date.nil && span_model.end_date" do
363
+ before(:each) do
364
+ @span_model = ScopedModel.create!(:start_date => nil, :end_date => Date.today + 2.day)
365
+ end
366
+
367
+ context "A) start_date < span_model.start_date && end_date < span_model.start_date" do
368
+ it "should NOT be valid" do
369
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today - 3.days)
370
+ scoped_model.should_not be_valid
371
+ scoped_model.overlap?(@span_model).should be_true
372
+ end
373
+ end
374
+
375
+ context "B) start_date < span_model.start_date && end_date IN span" do
376
+ it "should NOT be valid" do
377
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 1.day)
378
+ scoped_model.should_not be_valid
379
+ scoped_model.overlap?(@span_model).should be_true
380
+ end
381
+ end
382
+
383
+ context "C) start_date < span_model.start_date && end_date > span_model.end_date" do
384
+ it "should NOT be valid" do
385
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 4.days)
386
+ scoped_model.should_not be_valid
387
+ scoped_model.overlap?(@span_model).should be_true
388
+ end
389
+ end
390
+
391
+ context "D) start_date IN span && end_date IN span" do
392
+ it "should NOT be valid" do
393
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 1.day)
394
+ scoped_model.should_not be_valid
395
+ scoped_model.overlap?(@span_model).should be_true
396
+ end
397
+ end
398
+
399
+ context "E) start_date IN span && end_date > span_model.end_date" do
400
+ it "should NOT be valid" do
401
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 4.day)
402
+ scoped_model.should_not be_valid
403
+ scoped_model.overlap?(@span_model).should be_true
404
+ end
405
+ end
406
+
407
+ context "F) start_date > span_model.end_date && end_date > span_model.end_date" do
408
+ it "should be valid" do
409
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => Date.today + 4.days)
410
+ scoped_model.should be_valid
411
+ scoped_model.overlap?(@span_model).should be_false
412
+ end
413
+ end
414
+
415
+ context "G) start_date < span_model.start_date && end_date nil" do
416
+ it "should NOT be valid" do
417
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => nil)
418
+ scoped_model.should_not be_valid
419
+ scoped_model.overlap?(@span_model).should be_true
420
+ end
421
+ end
422
+
423
+ context "H) start_date IN span && end_date nil" do
424
+ it "should NOT be valid" do
425
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => nil)
426
+ scoped_model.should_not be_valid
427
+ scoped_model.overlap?(@span_model).should be_true
428
+ end
429
+ end
430
+
431
+ context "I) start_date > span_model.end_date && end_date nil" do
432
+ it "should be valid" do
433
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => nil)
434
+ scoped_model.should be_valid
435
+ scoped_model.overlap?(@span_model).should be_false
436
+ end
437
+ end
438
+
439
+ context "J) start_date nil && end_date > span_model.end_date" do
440
+ it "should NOT be valid" do
441
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 4.days)
442
+ scoped_model.should_not be_valid
443
+ scoped_model.overlap?(@span_model).should be_true
444
+ end
445
+ end
446
+
447
+ context "K) start_date nil && end_date IN span" do
448
+ it "should NOT be valid" do
449
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 1.day)
450
+ scoped_model.should_not be_valid
451
+ scoped_model.overlap?(@span_model).should be_true
452
+ end
453
+ end
454
+
455
+ context "L) start_date nil && end_date < span_model.start_date" do
456
+ it "should NOT be valid" do
457
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today - 3.days)
458
+ scoped_model.should_not be_valid
459
+ scoped_model.overlap?(@span_model).should be_true
460
+ end
461
+ end
462
+
463
+ context "M) start_date nil && end_date nil" do
464
+ it "should NOT be valid" do
465
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => nil)
466
+ scoped_model.should_not be_valid
467
+ scoped_model.overlap?(@span_model).should be_true
468
+ end
469
+ end
470
+ end
471
+
472
+ # -4 -3 -2 -1 +1 +2 +3 +4
473
+ # <---------------------------> TEST SPAN
474
+ # A |---|
475
+ # B |---------------|
476
+ # C |---------------------------|
477
+ # D |---|
478
+ # E |---------------|
479
+ # F |---|
480
+ # G |->
481
+ # H |->
482
+ # I |->
483
+ # J <-|
484
+ # K <-|
485
+ # L <-|
486
+ # M <--->
487
+ context "span_model.start_date.nil && span_model.end_date.nil" do
488
+ before(:each) do
489
+ @span_model = ScopedModel.create!(:start_date => nil, :end_date => nil)
490
+ end
491
+
492
+ context "A) start_date < span_model.start_date && end_date < span_model.start_date" do
493
+ it "should NOT be valid" do
494
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today - 3.days)
495
+ scoped_model.should_not be_valid
496
+ scoped_model.overlap?(@span_model).should be_true
497
+ end
498
+ end
499
+
500
+ context "B) start_date < span_model.start_date && end_date IN span" do
501
+ it "should NOT be valid" do
502
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 1.day)
503
+ scoped_model.should_not be_valid
504
+ scoped_model.overlap?(@span_model).should be_true
505
+ end
506
+ end
507
+
508
+ context "C) start_date < span_model.start_date && end_date > span_model.end_date" do
509
+ it "should NOT be valid" do
510
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => Date.today + 4.days)
511
+ scoped_model.should_not be_valid
512
+ scoped_model.overlap?(@span_model).should be_true
513
+ end
514
+ end
515
+
516
+ context "D) start_date IN span && end_date IN span" do
517
+ it "should NOT be valid" do
518
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 1.day)
519
+ scoped_model.should_not be_valid
520
+ scoped_model.overlap?(@span_model).should be_true
521
+ end
522
+ end
523
+
524
+ context "E) start_date IN span && end_date > span_model.end_date" do
525
+ it "should NOT be valid" do
526
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => Date.today + 4.day)
527
+ scoped_model.should_not be_valid
528
+ scoped_model.overlap?(@span_model).should be_true
529
+ end
530
+ end
531
+
532
+ context "F) start_date > span_model.end_date && end_date > span_model.end_date" do
533
+ it "should NOT be valid" do
534
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => Date.today + 4.days)
535
+ scoped_model.should_not be_valid
536
+ scoped_model.overlap?(@span_model).should be_true
537
+ end
538
+ end
539
+
540
+ context "G) start_date < span_model.start_date && end_date nil" do
541
+ it "should NOT be valid" do
542
+ scoped_model = ScopedModel.new(:start_date => Date.today - 4.days, :end_date => nil)
543
+ scoped_model.should_not be_valid
544
+ scoped_model.overlap?(@span_model).should be_true
545
+ end
546
+ end
547
+
548
+ context "H) start_date IN span && end_date nil" do
549
+ it "should NOT be valid" do
550
+ scoped_model = ScopedModel.new(:start_date => Date.today - 1.days, :end_date => nil)
551
+ scoped_model.should_not be_valid
552
+ scoped_model.overlap?(@span_model).should be_true
553
+ end
554
+ end
555
+
556
+ context "I) start_date > span_model.end_date && end_date nil" do
557
+ it "should NOT be valid" do
558
+ scoped_model = ScopedModel.new(:start_date => Date.today + 3.days, :end_date => nil)
559
+ scoped_model.should_not be_valid
560
+ scoped_model.overlap?(@span_model).should be_true
561
+ end
562
+ end
563
+
564
+ context "J) start_date nil && end_date > span_model.end_date" do
565
+ it "should NOT be valid" do
566
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 4.days)
567
+ scoped_model.should_not be_valid
568
+ scoped_model.overlap?(@span_model).should be_true
569
+ end
570
+ end
571
+
572
+ context "K) start_date nil && end_date IN span" do
573
+ it "should NOT be valid" do
574
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today + 1.day)
575
+ scoped_model.should_not be_valid
576
+ scoped_model.overlap?(@span_model).should be_true
577
+ end
578
+ end
579
+
580
+ context "L) start_date nil && end_date < span_model.start_date" do
581
+ it "should NOT be valid" do
582
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => Date.today - 3.days)
583
+ scoped_model.should_not be_valid
584
+ scoped_model.overlap?(@span_model).should be_true
585
+ end
586
+ end
587
+
588
+ context "M) start_date nil && end_date nil" do
589
+ it "should NOT be valid" do
590
+ scoped_model = ScopedModel.new(:start_date => nil, :end_date => nil)
591
+ scoped_model.should_not be_valid
592
+ scoped_model.overlap?(@span_model).should be_true
593
+ end
594
+ end
595
+ end
596
+ end
597
+ end