diff --git a/src/pendulum/interval.py b/src/pendulum/interval.py index c5e0713a7..bb9cf7f36 100644 --- a/src/pendulum/interval.py +++ b/src/pendulum/interval.py @@ -314,6 +314,8 @@ def __iter__(self) -> Iterator[_T]: return self.range("days") def __contains__(self, item: _T) -> bool: + if self.start > self.end: + return self.end <= item <= self.start return self.start <= item <= self.end def __add__(self, other: timedelta) -> Duration: # type: ignore[override] diff --git a/tests/interval/test_reversed_membership.py b/tests/interval/test_reversed_membership.py new file mode 100644 index 000000000..0f76e262c --- /dev/null +++ b/tests/interval/test_reversed_membership.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import pytest + +import pendulum + + +@pytest.mark.parametrize("use_datetime", [False, True]) +@pytest.mark.parametrize("reverse", [False, True]) +@pytest.mark.parametrize("day", [1, 2, 3, 4, 5]) +def test_membership_matches_interval_bounds( + use_datetime: bool, reverse: bool, day: int +) -> None: + start: pendulum.Date + end: pendulum.Date + item: pendulum.Date + if use_datetime: + start = pendulum.datetime(2026, 1, 2) + end = pendulum.datetime(2026, 1, 4) + item = pendulum.datetime(2026, 1, day) + else: + start = pendulum.date(2026, 1, 2) + end = pendulum.date(2026, 1, 4) + item = pendulum.date(2026, 1, day) + interval = ( + pendulum.Interval(end, start) if reverse else pendulum.Interval(start, end) + ) + assert (item in interval) == (2 <= day <= 4)