@@ -196,6 +196,109 @@ defmodule IntervalTests do
196196 end
197197 end
198198
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+
199302 describe "contains?/2" do
200303 test "non-overlapping" do
201304 earlier = Interval . new ( from: ~D[ 2018-01-01] , until: ~D[ 2018-01-04] )
0 commit comments