@@ -8,6 +8,8 @@ import IntervalSets: Domain, endpoints, closedendpoints, TypedEndpointsInterval
88
99struct MyClosedUnitInterval <: TypedEndpointsInterval{:closed,:closed,Int} end
1010endpoints (:: MyClosedUnitInterval ) = (0 ,1 )
11+ Base. promote_rule (:: Type{MyClosedUnitInterval} , :: Type{ClosedInterval{T}} ) where T =
12+ ClosedInterval{T}
1113
1214struct MyUnitInterval <: AbstractInterval{Int}
1315 isleftclosed:: Bool
1618endpoints (:: MyUnitInterval ) = (0 ,1 )
1719closedendpoints (I:: MyUnitInterval ) = (I. isleftclosed,I. isrightclosed)
1820
21+ struct IncompleteInterval <: AbstractInterval{Int} end
22+
1923@testset " IntervalSets" begin
2024 @test isempty (detect_ambiguities (IntervalSets, Base, Core))
2125
@@ -59,6 +63,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
5963
6064 @test typeof (leftendpoint (M)) == typeof (rightendpoint (M)) && typeof (leftendpoint (M)) == Float64
6165 @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 )
6268
6369 @test maximum (I) === 3
6470 @test minimum (I) === 0
@@ -117,6 +123,7 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
117123
118124 @test promote (1 .. 2 , 1.0 .. 2.0 ) === (1.0 .. 2.0 , 1.0 .. 2.0 )
119125
126+ @test duration (1 .. 2 ) == 2
120127 # duration deliberately not defined for non-integer intervals
121128 @test_throws MethodError duration (1.2 .. 2.4 )
122129 end
@@ -135,13 +142,18 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
135142 @test @inferred (convert (ClosedInterval{Float64}, I)) ===
136143 @inferred (convert (AbstractInterval{Float64}, I)) ===
137144 @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
139148 @test @inferred (convert (ClosedInterval, I)) ===
140149 @inferred (convert (Interval, I)) ===
141150 @inferred (ClosedInterval (I)) ===
142151 @inferred (Interval (I)) ===
143152 @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
145157 @test_throws InexactError convert (OpenInterval, I)
146158 @test_throws InexactError convert (Interval{:open ,:closed }, I)
147159 @test_throws InexactError convert (Interval{:closed ,:open }, I)
@@ -159,7 +171,9 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
159171 @inferred (convert (Interval, J)) ===
160172 @inferred (convert (AbstractInterval, J)) ===
161173 @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)
163177 J = Interval {:open,:closed} (I)
164178 @test_throws InexactError convert (Interval{:closed ,:open }, J)
165179 @test @inferred (convert (Interval{:open ,:closed ,Float64}, J)) ===
@@ -194,6 +208,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
194208 convert (ClosedInterval{Float64}, 1 ) ==
195209 1.0 .. 1.0
196210
211+ @test promote_type (Interval{:closed ,:open ,Float64}, Interval{:closed ,:open ,Int}) ===
212+ Interval{:closed ,:open ,Float64}
197213 end
198214
199215
@@ -226,6 +242,10 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
226242
227243 @test IntervalSets. isclosed (d)
228244 @test ! IntervalSets. isopen (d)
245+ @test IntervalSets. isleftclosed (d)
246+ @test ! IntervalSets. isleftopen (d)
247+ @test ! IntervalSets. isrightopen (d)
248+ @test IntervalSets. isrightclosed (d)
229249
230250 @test convert (AbstractInterval, d) ≡ d
231251 @test convert (AbstractInterval{T}, d) ≡ d
@@ -235,6 +255,12 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
235255 d = OpenInterval (zero (T) .. one (T))
236256 @test IntervalSets. isopen (d)
237257 @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)
238264 @test leftendpoint (d) ∉ d
239265 @test BigFloat (leftendpoint (d)) ∉ d
240266 @test nextfloat (leftendpoint (d)) ∈ d
@@ -257,45 +283,50 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
257283 d = Interval {:open,:closed} (zero (T) .. one (T))
258284 @test ! IntervalSets. isopen (d)
259285 @test ! IntervalSets. isclosed (d)
286+ @test ! IntervalSets. isleftclosed (d)
287+ @test IntervalSets. isleftopen (d)
288+ @test ! IntervalSets. isrightopen (d)
289+ @test IntervalSets. isrightclosed (d)
260290 @test leftendpoint (d) ∉ d
261291 @test BigFloat (leftendpoint (d)) ∉ d
262292 @test nextfloat (leftendpoint (d)) ∈ d
263293 @test nextfloat (BigFloat (leftendpoint (d))) ∈ d
264294 @test prevfloat (leftendpoint (d)) ∉ d
265- @test prevfloat (leftendpoint (d)) ∉ d
295+ @test prevfloat (BigFloat ( leftendpoint (d) )) ∉ d
266296 @test rightendpoint (d) ∈ d
267297 @test BigFloat (rightendpoint (d)) ∈ d
268298 @test nextfloat (rightendpoint (d)) ∉ d
269299 @test nextfloat (BigFloat (rightendpoint (d))) ∉ d
270300 @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
274302 @test infimum (d) == leftendpoint (d)
275303 @test maximum (d) == supremum (d) == rightendpoint (d)
276304 @test_throws ArgumentError minimum (d)
277305
278306 d = Interval {:closed,:open} (zero (T) .. one (T))
279307 @test ! IntervalSets. isopen (d)
280308 @test ! IntervalSets. isclosed (d)
309+ @test IntervalSets. isleftclosed (d)
310+ @test ! IntervalSets. isleftopen (d)
311+ @test IntervalSets. isrightopen (d)
312+ @test ! IntervalSets. isrightclosed (d)
281313 @test leftendpoint (d) ∈ d
282314 @test BigFloat (leftendpoint (d)) ∈ d
283315 @test nextfloat (leftendpoint (d)) ∈ d
284316 @test nextfloat (BigFloat (leftendpoint (d))) ∈ d
285317 @test prevfloat (leftendpoint (d)) ∉ d
286- @test prevfloat (leftendpoint (d)) ∉ d
318+ @test prevfloat (BigFloat ( leftendpoint (d) )) ∉ d
287319 @test rightendpoint (d) ∉ d
288320 @test BigFloat (rightendpoint (d)) ∉ d
289321 @test nextfloat (rightendpoint (d)) ∉ d
290322 @test nextfloat (BigFloat (rightendpoint (d))) ∉ d
291323 @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
295325 @test infimum (d) == minimum (d) == leftendpoint (d)
296326 @test supremum (d) == rightendpoint (d)
297327 @test_throws ArgumentError maximum (d)
298328
329+
299330 # - empty interval
300331 @test isempty (one (T) .. zero (T))
301332 @test zero (T) ∉ one (T) .. zero (T)
@@ -545,19 +576,22 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
545576
546577 @testset " Custom intervals" begin
547578 I = MyUnitInterval (true ,true )
579+ @test eltype (I) == eltype (typeof (I)) == Int
548580 @test leftendpoint (I) == 0
549581 @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)
552586 @test ClosedInterval (I) === convert (ClosedInterval, I) ===
553587 ClosedInterval {Int} (I) === convert (ClosedInterval{Int}, I) ===
554588 convert (Interval, I) === Interval (I) === 0 .. 1
555589 @test_throws InexactError convert (OpenInterval, I)
556590 I = MyUnitInterval (false ,false )
557591 @test leftendpoint (I) == 0
558592 @test rightendpoint (I) == 1
559- @test isleftclosed (I) == false
560- @test isrightclosed (I) == false
593+ @test ! isleftclosed (I)
594+ @test ! isrightclosed (I)
561595 @test OpenInterval (I) === convert (OpenInterval, I) ===
562596 OpenInterval {Int} (I) === convert (OpenInterval{Int}, I) ===
563597 convert (Interval, I) === Interval (I) === OpenInterval (0 .. 1 )
@@ -590,6 +624,8 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
590624 ClosedInterval {Int} (I) === convert (ClosedInterval{Int}, I) ===
591625 convert (Interval, I) === Interval (I) === 0 .. 1
592626 @test_throws InexactError convert (OpenInterval, I)
627+ @test I ∩ I === 0 .. 1
628+ @test I ∩ (0.0 .. 0.5 ) === 0.0 .. 0.5
593629 end
594630
595631 @testset " Missing endpoints" begin
@@ -644,9 +680,17 @@ closedendpoints(I::MyUnitInterval) = (I.isleftclosed,I.isrightclosed)
644680 @test_throws ArgumentError Base. OneTo {Int} (0 .. 5 )
645681 @test_throws ArgumentError Base. OneTo (0 .. 5 )
646682 @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 )
647684 end
648685
649686 @testset " IteratorSize" begin
650687 @test Base. IteratorSize (ClosedInterval) == Base. SizeUnknown ()
651688 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
652696end
0 commit comments