@@ -196,6 +196,109 @@ 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
+ assert Interval . new ( from: ~N[ 2017-01-02 15:20:00] , until: ~N[ 2017-01-02 15:30:00] ) == Interval . overlap ( b , a )
227
+ end
228
+
229
+ test "partially overlapping" do
230
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] )
231
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] )
232
+
233
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( a , b )
234
+ assert Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( b , a )
235
+ end
236
+
237
+ test "overlapping across hours" do
238
+ a = Interval . new ( from: ~N[ 2017-01-02 14:50:00] , until: ~N[ 2017-01-02 15:15:00] )
239
+ b = Interval . new ( from: ~N[ 2017-01-02 14:55:00] , until: ~N[ 2017-01-02 15:30:00] )
240
+
241
+ assert Interval . new ( from: ~N[ 2017-01-02 14:55:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( a , b )
242
+ assert Interval . new ( from: ~N[ 2017-01-02 14:55:00] , until: ~N[ 2017-01-02 15:15:00] ) == Interval . overlap ( b , a )
243
+ end
244
+
245
+ test "overlapping across days" do
246
+ a = Interval . new ( from: ~N[ 2017-01-15 23:40:00] , until: ~N[ 2017-01-16 00:10:00] )
247
+ b = Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:20:00] )
248
+
249
+ assert Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:10:00] ) == Interval . overlap ( a , b )
250
+ assert Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:10:00] ) == Interval . overlap ( b , a )
251
+ end
252
+
253
+ test "overlapping across months" do
254
+ a = Interval . new ( from: ~N[ 2017-06-30 23:40:00] , until: ~N[ 2017-07-01 00:10:00] )
255
+ b = Interval . new ( from: ~N[ 2017-06-30 23:50:00] , until: ~N[ 2017-07-01 00:20:00] )
256
+
257
+ assert Interval . new ( from: ~N[ 2017-06-30 23:50:00] , until: ~N[ 2017-07-01 00:10:00] ) == Interval . overlap ( a , b )
258
+ assert Interval . new ( from: ~N[ 2017-06-30 23:50:00] , until: ~N[ 2017-07-01 00:10:00] ) == Interval . overlap ( b , a )
259
+ end
260
+
261
+ test "overlapping across years" do
262
+ a = Interval . new ( from: ~N[ 2016-12-31 23:30:00] , until: ~N[ 2017-01-01 00:30:00] )
263
+ b = Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] )
264
+
265
+ assert Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] ) == Interval . overlap ( a , b )
266
+ assert Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] ) == Interval . overlap ( b , a )
267
+ end
268
+
269
+ test "shared from/until with different openness" do
270
+ 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 )
271
+ 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 )
272
+
273
+ 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 )
274
+ 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 ( b , a )
275
+ end
276
+
277
+ test "left_open: true, right_open: true" do
278
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: true )
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: true , left_open: true ) == Interval . overlap ( a , b )
282
+ 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 ( b , a )
283
+ end
284
+
285
+ test "left_open: true, right_open: false" do
286
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false )
287
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: true )
288
+
289
+ 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 )
290
+ 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 ( b , a )
291
+ end
292
+
293
+ test "left_open: false, right_open: false" do
294
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] , right_open: false )
295
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] , left_open: false )
296
+
297
+ 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 )
298
+ 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 ( b , a )
299
+ end
300
+ end
301
+
199
302
describe "contains?/2" do
200
303
test "non-overlapping" do
201
304
earlier = Interval . new ( from: ~D[ 2018-01-01] , until: ~D[ 2018-01-04] )
0 commit comments