@@ -8,6 +8,8 @@ import IntervalSets: Domain, endpoints, closedendpoints, TypedEndpointsInterval
8
8
9
9
struct MyClosedUnitInterval <: TypedEndpointsInterval{:closed,:closed,Int} end
10
10
endpoints (:: MyClosedUnitInterval ) = (0 ,1 )
11
+ Base. promote_rule (:: Type{MyClosedUnitInterval} , :: Type{ClosedInterval{T}} ) where T =
12
+ ClosedInterval{T}
11
13
12
14
struct MyUnitInterval <: AbstractInterval{Int}
13
15
isleftclosed:: Bool
16
18
endpoints (:: MyUnitInterval ) = (0 ,1 )
17
19
closedendpoints (I:: MyUnitInterval ) = (I. isleftclosed,I. isrightclosed)
18
20
21
+ struct IncompleteInterval <: AbstractInterval{Int} end
22
+
19
23
@testset " IntervalSets" begin
20
24
@test isempty (detect_ambiguities (IntervalSets, Base, Core))
21
25
@@ -59,6 +63,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
59
63
60
64
@test typeof (leftendpoint (M)) == typeof (rightendpoint (M)) && typeof (leftendpoint (M)) == Float64
61
65
@test typeof (leftendpoint (N)) == typeof (rightendpoint (N)) && typeof (leftendpoint (N)) == Int
66
+ @test @inferred (endpoints (M)) === (2.0 ,5.0 )
67
+ @test @inferred (endpoints (N)) === (255 ,300 )
62
68
63
69
@test maximum (I) === 3
64
70
@test minimum (I) === 0
@@ -117,6 +123,7 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
117
123
118
124
@test promote (1 .. 2 , 1.0 .. 2.0 ) === (1.0 .. 2.0 , 1.0 .. 2.0 )
119
125
126
+ @test duration (1 .. 2 ) == 2
120
127
# duration deliberately not defined for non-integer intervals
121
128
@test_throws MethodError duration (1.2 .. 2.4 )
122
129
end
@@ -135,13 +142,18 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
135
142
@test @inferred (convert (ClosedInterval{Float64}, I)) ===
136
143
@inferred (convert (AbstractInterval{Float64}, I)) ===
137
144
@inferred (convert (Domain{Float64}, I)) ===
138
- @inferred (ClosedInterval {Float64} (I)) === 0.0 .. 3.0
145
+ @inferred (ClosedInterval {Float64} (I)) ===
146
+ @inferred (convert (TypedEndpointsInterval{:closed ,:closed ,Float64},I)) ===
147
+ 0.0 .. 3.0
139
148
@test @inferred (convert (ClosedInterval, I)) ===
140
149
@inferred (convert (Interval, I)) ===
141
150
@inferred (ClosedInterval (I)) ===
142
151
@inferred (Interval (I)) ===
143
152
@inferred (convert (AbstractInterval, I)) ===
144
- @inferred (convert (Domain, I)) === I
153
+ @inferred (convert (Domain, I)) ===
154
+ @inferred (convert (TypedEndpointsInterval{:closed ,:closed }, I)) ===
155
+ @inferred (convert (TypedEndpointsInterval{:closed ,:closed ,Int}, I)) ===
156
+ @inferred (convert (ClosedInterval{Int}, I)) === I
145
157
@test_throws InexactError convert (OpenInterval, I)
146
158
@test_throws InexactError convert (Interval{:open ,:closed }, I)
147
159
@test_throws InexactError convert (Interval{:closed ,:open }, I)
@@ -159,7 +171,9 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
159
171
@inferred (convert (Interval, J)) ===
160
172
@inferred (convert (AbstractInterval, J)) ===
161
173
@inferred (convert (Domain, J)) ===
162
- @inferred (OpenInterval (J)) === OpenInterval (J)
174
+ @inferred (OpenInterval (J)) ===
175
+ @inferred (OpenInterval {Int} (J)) ===
176
+ @inferred (convert (OpenInterval{Int},J)) === OpenInterval (J)
163
177
J = Interval {:open,:closed} (I)
164
178
@test_throws InexactError convert (Interval{:closed ,:open }, J)
165
179
@test @inferred (convert (Interval{:open ,:closed ,Float64}, J)) ===
@@ -194,6 +208,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
194
208
convert (ClosedInterval{Float64}, 1 ) ==
195
209
1.0 .. 1.0
196
210
211
+ @test promote_type (Interval{:closed ,:open ,Float64}, Interval{:closed ,:open ,Int}) ===
212
+ Interval{:closed ,:open ,Float64}
197
213
end
198
214
199
215
@@ -226,6 +242,10 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
226
242
227
243
@test IntervalSets. isclosed (d)
228
244
@test ! IntervalSets. isopen (d)
245
+ @test IntervalSets. isleftclosed (d)
246
+ @test ! IntervalSets. isleftopen (d)
247
+ @test ! IntervalSets. isrightopen (d)
248
+ @test IntervalSets. isrightclosed (d)
229
249
230
250
@test convert (AbstractInterval, d) ≡ d
231
251
@test convert (AbstractInterval{T}, d) ≡ d
@@ -235,6 +255,12 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
235
255
d = OpenInterval (zero (T) .. one (T))
236
256
@test IntervalSets. isopen (d)
237
257
@test ! IntervalSets. isclosed (d)
258
+ @test IntervalSets. isopen (d)
259
+ @test ! IntervalSets. isclosed (d)
260
+ @test ! IntervalSets. isleftclosed (d)
261
+ @test IntervalSets. isleftopen (d)
262
+ @test IntervalSets. isrightopen (d)
263
+ @test ! IntervalSets. isrightclosed (d)
238
264
@test leftendpoint (d) ∉ d
239
265
@test BigFloat (leftendpoint (d)) ∉ d
240
266
@test nextfloat (leftendpoint (d)) ∈ d
@@ -257,45 +283,50 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
257
283
d = Interval {:open,:closed} (zero (T) .. one (T))
258
284
@test ! IntervalSets. isopen (d)
259
285
@test ! IntervalSets. isclosed (d)
286
+ @test ! IntervalSets. isleftclosed (d)
287
+ @test IntervalSets. isleftopen (d)
288
+ @test ! IntervalSets. isrightopen (d)
289
+ @test IntervalSets. isrightclosed (d)
260
290
@test leftendpoint (d) ∉ d
261
291
@test BigFloat (leftendpoint (d)) ∉ d
262
292
@test nextfloat (leftendpoint (d)) ∈ d
263
293
@test nextfloat (BigFloat (leftendpoint (d))) ∈ d
264
294
@test prevfloat (leftendpoint (d)) ∉ d
265
- @test prevfloat (leftendpoint (d)) ∉ d
295
+ @test prevfloat (BigFloat ( leftendpoint (d) )) ∉ d
266
296
@test rightendpoint (d) ∈ d
267
297
@test BigFloat (rightendpoint (d)) ∈ d
268
298
@test nextfloat (rightendpoint (d)) ∉ d
269
299
@test nextfloat (BigFloat (rightendpoint (d))) ∉ d
270
300
@test prevfloat (rightendpoint (d)) ∈ d
271
- @test prevfloat (rightendpoint (d)) ∈ d
272
- @test infimum (d) == leftendpoint (d)
273
- @test supremum (d) == rightendpoint (d)
301
+ @test prevfloat (BigFloat (rightendpoint (d))) ∈ d
274
302
@test infimum (d) == leftendpoint (d)
275
303
@test maximum (d) == supremum (d) == rightendpoint (d)
276
304
@test_throws ArgumentError minimum (d)
277
305
278
306
d = Interval {:closed,:open} (zero (T) .. one (T))
279
307
@test ! IntervalSets. isopen (d)
280
308
@test ! IntervalSets. isclosed (d)
309
+ @test IntervalSets. isleftclosed (d)
310
+ @test ! IntervalSets. isleftopen (d)
311
+ @test IntervalSets. isrightopen (d)
312
+ @test ! IntervalSets. isrightclosed (d)
281
313
@test leftendpoint (d) ∈ d
282
314
@test BigFloat (leftendpoint (d)) ∈ d
283
315
@test nextfloat (leftendpoint (d)) ∈ d
284
316
@test nextfloat (BigFloat (leftendpoint (d))) ∈ d
285
317
@test prevfloat (leftendpoint (d)) ∉ d
286
- @test prevfloat (leftendpoint (d)) ∉ d
318
+ @test prevfloat (BigFloat ( leftendpoint (d) )) ∉ d
287
319
@test rightendpoint (d) ∉ d
288
320
@test BigFloat (rightendpoint (d)) ∉ d
289
321
@test nextfloat (rightendpoint (d)) ∉ d
290
322
@test nextfloat (BigFloat (rightendpoint (d))) ∉ d
291
323
@test prevfloat (rightendpoint (d)) ∈ d
292
- @test prevfloat (rightendpoint (d)) ∈ d
293
- @test infimum (d) == leftendpoint (d)
294
- @test supremum (d) == rightendpoint (d)
324
+ @test prevfloat (BigFloat (rightendpoint (d))) ∈ d
295
325
@test infimum (d) == minimum (d) == leftendpoint (d)
296
326
@test supremum (d) == rightendpoint (d)
297
327
@test_throws ArgumentError maximum (d)
298
328
329
+
299
330
# - empty interval
300
331
@test isempty (one (T) .. zero (T))
301
332
@test zero (T) ∉ one (T) .. zero (T)
@@ -545,19 +576,22 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
545
576
546
577
@testset " Custom intervals" begin
547
578
I = MyUnitInterval (true ,true )
579
+ @test eltype (I) == eltype (typeof (I)) == Int
548
580
@test leftendpoint (I) == 0
549
581
@test rightendpoint (I) == 1
550
- @test isleftclosed (I) == true
551
- @test isrightclosed (I) == true
582
+ @test isleftclosed (I)
583
+ @test ! isleftopen (I)
584
+ @test isrightclosed (I)
585
+ @test ! isrightopen (I)
552
586
@test ClosedInterval (I) === convert (ClosedInterval, I) ===
553
587
ClosedInterval {Int} (I) === convert (ClosedInterval{Int}, I) ===
554
588
convert (Interval, I) === Interval (I) === 0 .. 1
555
589
@test_throws InexactError convert (OpenInterval, I)
556
590
I = MyUnitInterval (false ,false )
557
591
@test leftendpoint (I) == 0
558
592
@test rightendpoint (I) == 1
559
- @test isleftclosed (I) == false
560
- @test isrightclosed (I) == false
593
+ @test ! isleftclosed (I)
594
+ @test ! isrightclosed (I)
561
595
@test OpenInterval (I) === convert (OpenInterval, I) ===
562
596
OpenInterval {Int} (I) === convert (OpenInterval{Int}, I) ===
563
597
convert (Interval, I) === Interval (I) === OpenInterval (0 .. 1 )
@@ -590,6 +624,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
590
624
ClosedInterval {Int} (I) === convert (ClosedInterval{Int}, I) ===
591
625
convert (Interval, I) === Interval (I) === 0 .. 1
592
626
@test_throws InexactError convert (OpenInterval, I)
627
+ @test I ∩ I === 0 .. 1
628
+ @test I ∩ (0.0 .. 0.5 ) === 0.0 .. 0.5
593
629
end
594
630
595
631
@testset " Missing endpoints" begin
@@ -644,9 +680,17 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
644
680
@test_throws ArgumentError Base. OneTo {Int} (0 .. 5 )
645
681
@test_throws ArgumentError Base. OneTo (0 .. 5 )
646
682
@test Base. OneTo (1 .. 5 ) == Base. OneTo {Int} (1 .. 5 ) == Base. OneTo (5 )
683
+ @test Base. Slice (1 .. 5 ) == Base. Slice {UnitRange{Int}} (1 .. 5 ) == Base. Slice (1 : 5 )
647
684
end
648
685
649
686
@testset " IteratorSize" begin
650
687
@test Base. IteratorSize (ClosedInterval) == Base. SizeUnknown ()
651
688
end
689
+
690
+ @testset " IncompleteInterval" begin
691
+ I = IncompleteInterval ()
692
+ @test eltype (I) === Int
693
+ @test_throws ErrorException endpoints (I)
694
+ @test_throws ErrorException closedendpoints (I)
695
+ end
652
696
end
0 commit comments