Skip to content

Commit 2daaf3e

Browse files
author
Philip de Nier
committed
Fix TimeRange.__contains__ when checking in eternity
Call `contains_subrange` to ensure correctness and consistency sem-ver: bugfix
1 parent 6eedcb3 commit 2daaf3e

2 files changed

Lines changed: 23 additions & 9 deletions

File tree

mediatimestamp/immutable/timerange.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,8 @@ def finite(self) -> bool:
372372

373373
def __contains__(self, ts: object) -> bool:
374374
"""Returns true if the timestamp is within this range."""
375-
return ((isinstance(ts, SupportsMediaTimestamp)) and
376-
(self.start is None or mediatimestamp(ts) >= self.start) and
377-
(self.end is None or mediatimestamp(ts) <= self.end) and
378-
(not ((self.start is not None) and
379-
(mediatimestamp(ts) == self.start) and
380-
(self.inclusivity & TimeRange.INCLUDE_START == 0))) and
381-
(not ((self.end is not None) and
382-
(mediatimestamp(ts) == self.end) and
383-
(self.inclusivity & TimeRange.INCLUDE_END == 0))))
375+
return (isinstance(ts, (Timestamp, SupportsMediaTimestamp, int, float)) and
376+
self.contains_subrange(mediatimestamp(ts)))
384377

385378
def __eq__(self, other: object) -> bool:
386379
if not isinstance(other, SupportsMediaTimeRange):

tests/test_timerange.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,27 @@ def test_subrange__negative(self):
353353

354354
self._check_subrange(a, b, c, d)
355355

356+
def test_subrange__eternity_never(self):
357+
self.assertTrue(TimeRange.eternity().contains_subrange(TimeRange.eternity()))
358+
self.assertTrue(TimeRange.eternity().contains_subrange(TimeRange.from_str("[0:0]")))
359+
self.assertTrue(TimeRange.eternity().contains_subrange(TimeRange.from_str("[0:0_1:0)")))
360+
361+
self.assertTrue(TimeRange.eternity().contains_subrange(TimeRange.never()))
362+
363+
self.assertFalse(TimeRange.never().contains_subrange(TimeRange.eternity()))
364+
self.assertFalse(TimeRange.never().contains_subrange(TimeRange.never()))
365+
self.assertFalse(TimeRange.never().contains_subrange(TimeRange.from_str("[0:0]")))
366+
self.assertFalse(TimeRange.never().contains_subrange(TimeRange.from_str("[0:0_1:0)")))
367+
368+
def test_contains(self):
369+
self.assertNotIn(None, TimeRange.from_str("[0:0]"))
370+
self.assertNotIn(None, TimeRange.never())
371+
self.assertNotIn(None, TimeRange.eternity())
372+
self.assertNotIn(1.0, TimeRange.from_str("[0:0]"))
373+
self.assertIn(1.0, TimeRange.from_str("[1:0]"))
374+
self.assertIn(1.0, TimeRange.from_str("[0:0_10:0)"))
375+
# The subrange tests will cover the rest
376+
356377
def _check_intersection(self, a, b, c, d):
357378
self.assertEqual(TimeRange(a, c, TimeRange.INCLUDE_START).intersect_with(b), mediatimerange(b))
358379

0 commit comments

Comments
 (0)