@@ -196,6 +196,73 @@ 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
+ % Duration { seconds: seconds } = Interval . overlap ( a , b , :duration )
205
+ assert seconds == 0
206
+ assert Interval . overlap ( a , b ) == 0
207
+ end
208
+
209
+ test "overlapping at single instant" do
210
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] )
211
+ b = Interval . new ( from: ~N[ 2017-01-02 15:15:00] , until: ~N[ 2017-01-02 15:30:00] )
212
+
213
+ assert Interval . overlap ( a , b ) == 0
214
+ end
215
+
216
+ test "first subset of second" do
217
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:45:00] )
218
+ b = Interval . new ( from: ~N[ 2017-01-02 15:20:00] , until: ~N[ 2017-01-02 15:30:00] )
219
+
220
+ assert Interval . overlap ( a , b , :minutes ) == 10
221
+ % Duration { seconds: seconds } = Interval . overlap ( a , b , :duration )
222
+ assert seconds == 600
223
+ end
224
+
225
+ test "partially overlapping" do
226
+ a = Interval . new ( from: ~N[ 2017-01-02 15:00:00] , until: ~N[ 2017-01-02 15:15:00] )
227
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] )
228
+
229
+ assert Interval . overlap ( a , b ) == 300
230
+ assert Interval . overlap ( a , b , :minutes ) == 5
231
+ end
232
+
233
+ test "overlapping across hours" do
234
+ a = Interval . new ( from: ~N[ 2017-01-02 14:50:00] , until: ~N[ 2017-01-02 15:15:00] )
235
+ b = Interval . new ( from: ~N[ 2017-01-02 15:10:00] , until: ~N[ 2017-01-02 15:30:00] )
236
+
237
+ assert Interval . overlap ( a , b ) == 300
238
+ assert Interval . overlap ( a , b , :minutes ) == 5
239
+ end
240
+
241
+ test "overlapping across days" do
242
+ a = Interval . new ( from: ~N[ 2017-01-15 23:40:00] , until: ~N[ 2017-01-16 00:10:00] )
243
+ b = Interval . new ( from: ~N[ 2017-01-15 23:50:00] , until: ~N[ 2017-01-16 00:20:00] )
244
+
245
+ assert Interval . overlap ( a , b ) == 1200
246
+ assert Interval . overlap ( a , b , :minutes ) == 20
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 . overlap ( a , b ) == 1200
254
+ assert Interval . overlap ( a , b , :minutes ) == 20
255
+ end
256
+
257
+ test "overlapping across years" do
258
+ a = Interval . new ( from: ~N[ 2016-12-31 23:30:00] , until: ~N[ 2017-01-01 00:30:00] )
259
+ b = Interval . new ( from: ~N[ 2016-12-31 23:45:00] , until: ~N[ 2017-01-01 00:15:00] )
260
+
261
+ assert Interval . overlap ( a , b ) == 1800
262
+ assert Interval . overlap ( a , b , :minutes ) == 30
263
+ end
264
+ end
265
+
199
266
describe "contains?/2" do
200
267
test "non-overlapping" do
201
268
earlier = Interval . new ( from: ~D[ 2018-01-01] , until: ~D[ 2018-01-04] )
0 commit comments