@@ -196,6 +196,99 @@ defmodule IntervalTests do
196
196
end
197
197
end
198
198
199
+ describe "overlap" do
200
+ test "non-overlapping intervals" do
201
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] )
202
+ b = Interval . new ( from: ~N[ 2017-01-02 15:30:00] , until: ~N[ 2017-01-02 15:45:00] )
203
+
204
+ assert { :error , _ } = Interval . overlap ( a , b )
205
+ end
206
+
207
+ test "non-overlapping back-to-back intervals" do
208
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: true )
209
+ b = Interval . new ( from: ~N[ 2017-01-02 15:15:00] , until: ~N[ 2017-01-02 15:30:00] )
210
+
211
+ assert { :error , _ } = Interval . overlap ( a , b )
212
+ end
213
+
214
+ test "overlapping at single instant with closed bounds" do
215
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false )
216
+ b = Interval . new ( from: ~N[ 2017-01-02 15:15:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: false )
217
+
218
+ assert { :error , _ } = Interval . overlap ( a , b )
219
+ end
220
+
221
+ test "first subset of second" do
222
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:45:00] )
223
+ b = Interval . new ( from: ~N[ 2017-01-02 15:20:00] , until: ~N[ 2017-01-02 15:30:00] )
224
+
225
+ assert Interval . new ( from: ~N[ 2017-01-02 15:20:00] , until: ~N[ 2017-01-02 15:30:00] ) == Interval . overlap ( a , b )
226
+ end
227
+
228
+ test "partially overlapping" do
229
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] )
230
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] )
231
+
232
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( a , b )
233
+ end
234
+
235
+ test "overlapping across hours" do
236
+ a = Interval . new ( from: ~N[ 2017-01-02 14:50:00] , until: ~N[ 2017-01-02 15:15:00] )
237
+ b = Interval . new ( from: ~N[ 2017-01-02 14:55:00] , until: ~N[ 2017-01-02 15:30:00] )
238
+
239
+ assert Interval . new ( from: ~N[ 2017-01-02 14:55:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( a , b )
240
+ end
241
+
242
+ test "overlapping across days" do
243
+ a = Interval . new ( from: ~N[ 2017-01-15 23:40:00] , until: ~N[ 2017-01-16 00:10:00] )
244
+ b = Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:20:00] )
245
+
246
+ assert Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:10:00] ) == Interval . overlap ( a , b )
247
+ end
248
+
249
+ test "overlapping across months" do
250
+ a = Interval . new ( from: ~N[ 2017-06-30 23:40:00] , until: ~N[ 2017-07-01 00:10:00] )
251
+ b = Interval . new ( from: ~N[ 2017-06-30 23:50:00] , until: ~N[ 2017-07-01 00:20:00] )
252
+
253
+ assert Interval . new ( from: ~N[ 2017-06-30 23:50:00] , until: ~N[ 2017-07-01 00:10:00] ) == Interval . overlap ( a , b )
254
+ end
255
+
256
+ test "overlapping across years" do
257
+ a = Interval . new ( from: ~N[ 2016-12-31 23:30:00] , until: ~N[ 2017-01-01 00:30:00] )
258
+ b = Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] )
259
+
260
+ assert Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] ) == Interval . overlap ( a , b )
261
+ end
262
+
263
+ test "shared from/until with different openness" do
264
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , left_open: true , right_open: false )
265
+ b = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , left_open: false , right_open: true )
266
+
267
+ assert Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: true , left_open: true ) == Interval . overlap ( a , b )
268
+ end
269
+
270
+ test "left_open: true, right_open: true" do
271
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: true )
272
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: true )
273
+
274
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: true , left_open: true ) == Interval . overlap ( a , b )
275
+ end
276
+
277
+ test "left_open: true, right_open: false" do
278
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false )
279
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: true )
280
+
281
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false , left_open: true ) == Interval . overlap ( a , b )
282
+ end
283
+
284
+ test "left_open: false, right_open: false" do
285
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false )
286
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: false )
287
+
288
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false , left_open: false ) == Interval . overlap ( a , b )
289
+ end
290
+ end
291
+
199
292
describe "contains?/2" do
200
293
test "non-overlapping" do
201
294
earlier = Interval . new ( from: ~D[ 2018-01-01] , until: ~D[ 2018-01-04] )
0 commit comments