@@ -112,22 +112,43 @@ def test_init_basic_datetime_timezone(self):
112112 assert interval .start == datetime .datetime (2026 , 9 , 10 , 9 , 11 , 11 , tzinfo = datetime .timezone .utc )
113113 assert interval .end == datetime .datetime (2026 , 11 , 12 , 23 , 52 , 22 , tzinfo = datetime .timezone .utc )
114114
115+ @pytest .mark .parametrize (
116+ ["interval" , "expected" ],
117+ [
118+ (DateTimeInterval ("2026-09-10" , "2026-09-20" ), True ),
119+ (DateTimeInterval ("2026-09-10T00:00:00" , "2026-09-20T00:00:00" ), True ),
120+ (DateTimeInterval ("2026-09-10T01:00:00+01:00" , "2026-09-20T00:00:00" ), True ),
121+ (DateTimeInterval ("2026-09-10T01:00:00" , "2026-09-20T00:00:00" ), False ),
122+ ],
123+ )
124+ def test_equality (self , interval , expected ):
125+ ref = DateTimeInterval ("2026-09-10" , "2026-09-20" )
126+ assert (ref == interval ) == expected
127+ assert (interval == ref ) == expected
128+
129+ def test_equality_end_inclusive (self ):
130+ d1 = "2026-09-10"
131+ d2 = "2026-09-20"
132+ assert DateTimeInterval (d1 , d2 ) == DateTimeInterval (d1 , d2 , end_inclusive = True )
133+ assert DateTimeInterval (d1 , d2 ) != DateTimeInterval (d1 , d2 , end_inclusive = False )
134+ assert DateTimeInterval (d1 , d2 , end_inclusive = False ) == DateTimeInterval (d1 , d2 , end_inclusive = False )
135+
115136 @pytest .mark .parametrize (
116137 ["given" , "expected" ],
117138 [
118- (["2026-09-10" , "2026-11-12" ], DateTimeInterval ("2026-09-10" , "2026-11-12" )),
119139 (("2026-09-10" , "2026-11-12" ), DateTimeInterval ("2026-09-10" , "2026-11-12" )),
120- ({"start" : "2026-09-10" , "end" : "2026-11-12" }, DateTimeInterval ("2026-09-10" , "2026-11-12" )),
140+ (("2026-09-10" , None ), DateTimeInterval ("2026-09-10" , None )),
141+ (["2026-09-10" , "2026-11-12" ], DateTimeInterval ("2026-09-10" , "2026-11-12" )),
142+ (None , None ),
121143 ("foobar" , None ),
122144 (["2026-09-10" ], None ),
123145 (["2026-09-10" , "2026-11-12" , "2026-12-01" ], None ),
124- ({ "color " : "green" } , None ),
125- ({"start " : "2026- 09-10" }, None ),
146+ ([{ "2026 " : "09-10" }, { "2026" : "11-12" }] , None ),
147+ ({"2026 " : "09-10" }, None ),
126148 ],
127149 )
128150 def test_try_from (self , given , expected ):
129- assert DateTimeInterval .try_from (given ) == expected
130-
151+ assert DateTimeInterval .try_from_tuple (given ) == expected
131152 def test_as_tuple (self ):
132153 interval = DateTimeInterval ("2026-09-10" , "2026-11-12T11:22:33Z" )
133154 assert interval .as_tuple () == (
@@ -174,3 +195,27 @@ def test_intersection(self, interval1, interval2, expected):
174195 interval2 = DateTimeInterval (* interval2 )
175196 assert interval1 .intersection (interval2 ) == expected
176197 assert interval2 .intersection (interval1 ) == expected
198+
199+ @pytest .mark .parametrize (
200+ ["interval1" , "interval2" , "expected" ],
201+ [
202+ (
203+ DateTimeInterval ("2026-08-20" , "2026-09-01" ),
204+ DateTimeInterval ("2026-09-01" , "2026-09-30" ),
205+ DateTimeInterval ("2026-09-01" , "2026-09-01" ),
206+ ),
207+ (
208+ DateTimeInterval ("2026-08-20" , "2026-09-01" , end_inclusive = False ),
209+ DateTimeInterval ("2026-09-01" , "2026-09-30" ),
210+ None ,
211+ ),
212+ (
213+ DateTimeInterval ("2026-08-20" , "2026-09-01" , end_inclusive = False ),
214+ DateTimeInterval ("2026-08-25" , "2026-09-30" ),
215+ DateTimeInterval ("2026-08-25" , "2026-09-01" , end_inclusive = False ),
216+ ),
217+ ],
218+ )
219+ def test_intersection_end_inclusive (self , interval1 , interval2 , expected ):
220+ assert interval1 .intersection (interval2 ) == expected
221+ assert interval2 .intersection (interval1 ) == expected
0 commit comments