acts_as_span 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +47 -0
- data/LICENSE +22 -0
- data/README.rdoc +33 -0
- data/Rakefile +4 -0
- data/acts_as_span.gemspec +23 -0
- data/lib/acts_as_span.rb +161 -0
- data/lib/acts_as_span/span_instance.rb +53 -0
- data/lib/acts_as_span/span_instance/overlap.rb +17 -0
- data/lib/acts_as_span/span_instance/status.rb +58 -0
- data/lib/acts_as_span/span_instance/validations.rb +67 -0
- data/lib/acts_as_span/span_klass.rb +31 -0
- data/lib/acts_as_span/span_klass/overlap.rb +21 -0
- data/lib/acts_as_span/span_klass/status.rb +29 -0
- data/lib/acts_as_span/version.rb +12 -0
- data/spec/lib/acts_as_span_spec.rb +64 -0
- data/spec/lib/delegation_spec.rb +128 -0
- data/spec/lib/negative_spec.rb +30 -0
- data/spec/lib/span_instance/named_scopes_on_spec.rb +304 -0
- data/spec/lib/span_instance/named_scopes_spec.rb +302 -0
- data/spec/lib/span_instance/overlap_spec.rb +597 -0
- data/spec/lib/span_instance/status_spec.rb +49 -0
- data/spec/lib/span_instance/validations_spec.rb +54 -0
- data/spec/lib/span_instance_spec.rb +41 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- metadata +112 -0
@@ -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
|