@@ -196,6 +196,99 @@ 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+ 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+
199292 describe "contains?/2" do
200293 test "non-overlapping" do
201294 earlier = Interval . new ( from: ~D[ 2018-01-01] , until: ~D[ 2018-01-04] )
0 commit comments