Skip to content

Commit 5c8b7d8

Browse files
committed
TST: Improve test structure
1 parent 5f38eb0 commit 5c8b7d8

File tree

2 files changed

+134
-67
lines changed

2 files changed

+134
-67
lines changed

pandas-stubs/_libs/interval.pyi

+10-10
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,16 @@ class Interval(IntervalMixin, Generic[_OrderableT]):
106106
) -> Interval[_OrderableScalarT]: ...
107107
@overload
108108
def __sub__(self: Interval[float], y: float) -> Interval[float]: ...
109-
@overload
110-
def __rsub__(
111-
self: Interval[_OrderableTimesT], y: Timedelta
112-
) -> Interval[_OrderableTimesT]: ...
113-
@overload
114-
def __rsub__(
115-
self: Interval[int], y: _OrderableScalarT
116-
) -> Interval[_OrderableScalarT]: ...
117-
@overload
118-
def __rsub__(self: Interval[float], y: float) -> Interval[float]: ...
109+
# @overload
110+
# def __rsub__(
111+
# self: Interval[_OrderableTimesT], y: Timedelta
112+
# ) -> Interval[_OrderableTimesT]: ...
113+
# @overload
114+
# def __rsub__(
115+
# self: Interval[int], y: _OrderableScalarT
116+
# ) -> Interval[_OrderableScalarT]: ...
117+
# @overload
118+
# def __rsub__(self: Interval[float], y: float) -> Interval[float]: ...
119119
@overload
120120
def __mul__(
121121
self: Interval[int], y: _OrderableScalarT

tests/test_scalars.py

+124-57
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import pandas as pd
66
from typing_extensions import assert_type
77

8-
from tests import check
8+
from tests import (
9+
TYPE_CHECKING_INVALID_USAGE,
10+
check,
11+
)
912

1013

11-
def test_interval() -> None:
14+
def test_interval_constructor() -> None:
1215
i0 = pd.Interval(0, 1, closed="left")
1316
i1 = pd.Interval(0.0, 1.0, closed="right")
1417
i2 = pd.Interval(
@@ -20,6 +23,15 @@ def test_interval() -> None:
2023
check(assert_type(i2, "pd.Interval[pd.Timestamp]"), pd.Interval)
2124
check(assert_type(i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
2225

26+
27+
def test_interval_properties() -> None:
28+
i0 = pd.Interval(0, 1, closed="left")
29+
i1 = pd.Interval(0.0, 1.0, closed="right")
30+
i2 = pd.Interval(
31+
pd.Timestamp("2017-01-01"), pd.Timestamp("2017-01-02"), closed="both"
32+
)
33+
i3 = pd.Interval(pd.Timedelta("1 days"), pd.Timedelta("2 days"), closed="neither")
34+
2335
check(assert_type(i0.closed, Literal["left", "right", "both", "neither"]), str)
2436
check(assert_type(i0.closed_left, bool), bool)
2537
check(assert_type(i0.closed_right, bool), bool)
@@ -64,6 +76,15 @@ def test_interval() -> None:
6476
check(assert_type(i3.open_right, bool), bool)
6577
check(assert_type(i3.right, pd.Timedelta), pd.Timedelta)
6678

79+
80+
def test_interval_methods() -> None:
81+
i0 = pd.Interval(0, 1, closed="left")
82+
i1 = pd.Interval(0.0, 1.0, closed="right")
83+
i2 = pd.Interval(
84+
pd.Timestamp("2017-01-01"), pd.Timestamp("2017-01-02"), closed="both"
85+
)
86+
i3 = pd.Interval(pd.Timedelta("1 days"), pd.Timedelta("2 days"), closed="neither")
87+
6788
check(assert_type(i0.overlaps(pd.Interval(0.5, 1.5, closed="left")), bool), bool)
6889
check(assert_type(i0.overlaps(pd.Interval(2, 3, closed="left")), bool), bool)
6990

@@ -76,73 +97,119 @@ def test_interval() -> None:
7697
td2 = pd.Timedelta(days=3)
7798
check(assert_type(i3.overlaps(pd.Interval(td1, td2, closed="left")), bool), bool)
7899

79-
check(assert_type(i0 * 3, "pd.Interval[int]"), pd.Interval)
80-
check(assert_type(i1 * 3, "pd.Interval[float]"), pd.Interval)
81-
check(assert_type(i3 * 3, "pd.Interval[pd.Timedelta]"), pd.Interval)
82100

83-
check(assert_type(i0 * 3.5, "pd.Interval[float]"), pd.Interval)
84-
check(assert_type(i1 * 3.5, "pd.Interval[float]"), pd.Interval)
85-
check(assert_type(i3 * 3.5, "pd.Interval[pd.Timedelta]"), pd.Interval)
101+
def test_interval_math() -> None:
102+
i0 = pd.Interval(0, 1, closed="left")
103+
i1 = pd.Interval(0.0, 1.0, closed="right")
104+
i2 = pd.Interval(
105+
pd.Timestamp("2017-01-01"), pd.Timestamp("2017-01-02"), closed="both"
106+
)
107+
i3 = pd.Interval(pd.Timedelta("1 days"), pd.Timedelta("2 days"), closed="neither")
86108

87-
check(assert_type(3 * i0, "pd.Interval[int]"), pd.Interval)
88-
check(assert_type(3 * i1, "pd.Interval[float]"), pd.Interval)
89-
check(assert_type(3 * i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
109+
md1 = 3
110+
md2 = 3.5
90111

91-
check(assert_type(3.5 * i0, "pd.Interval[float]"), pd.Interval)
92-
check(assert_type(3.5 * i1, "pd.Interval[float]"), pd.Interval)
93-
check(assert_type(3.5 * i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
112+
check(assert_type(i0 * md1, "pd.Interval[int]"), pd.Interval)
113+
check(assert_type(md1 * i0, "pd.Interval[int]"), pd.Interval)
94114

95-
check(assert_type(i0 / 3, "pd.Interval[int]"), pd.Interval)
96-
check(assert_type(i1 / 3, "pd.Interval[float]"), pd.Interval)
97-
check(assert_type(i3 / 3, "pd.Interval[pd.Timedelta]"), pd.Interval)
115+
check(assert_type(i1 * md1, "pd.Interval[float]"), pd.Interval)
116+
check(assert_type(md1 * i1, "pd.Interval[float]"), pd.Interval)
98117

99-
check(assert_type(i0 / 3.5, "pd.Interval[float]"), pd.Interval)
100-
check(assert_type(i1 / 3.5, "pd.Interval[float]"), pd.Interval)
101-
check(assert_type(i3 / 3.5, "pd.Interval[pd.Timedelta]"), pd.Interval)
118+
check(assert_type(i3 * md1, "pd.Interval[pd.Timedelta]"), pd.Interval)
119+
check(assert_type(md1 * i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
102120

103-
check(assert_type(i0 // 3, "pd.Interval[int]"), pd.Interval)
104-
check(assert_type(i1 // 3, "pd.Interval[float]"), pd.Interval)
105-
check(assert_type(i3 // 3, "pd.Interval[pd.Timedelta]"), pd.Interval)
121+
check(assert_type(i0 * md2, "pd.Interval[float]"), pd.Interval)
122+
check(assert_type(md2 * i0, "pd.Interval[float]"), pd.Interval)
106123

107-
check(assert_type(i0 // 3.5, "pd.Interval[float]"), pd.Interval)
108-
check(assert_type(i1 // 3.5, "pd.Interval[float]"), pd.Interval)
109-
check(assert_type(i3 // 3.5, "pd.Interval[pd.Timedelta]"), pd.Interval)
124+
check(assert_type(i1 * md2, "pd.Interval[float]"), pd.Interval)
125+
check(assert_type(md2 * i1, "pd.Interval[float]"), pd.Interval)
110126

111-
check(assert_type(i0 - 1, "pd.Interval[int]"), pd.Interval)
112-
check(assert_type(i1 - 1, "pd.Interval[float]"), pd.Interval)
113-
check(
114-
assert_type(i2 - pd.Timedelta(days=1), "pd.Interval[pd.Timestamp]"), pd.Interval
115-
)
116-
check(
117-
assert_type(i3 - pd.Timedelta(days=1), "pd.Interval[pd.Timedelta]"), pd.Interval
118-
)
127+
check(assert_type(i3 * md2, "pd.Interval[pd.Timedelta]"), pd.Interval)
128+
check(assert_type(md2 * i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
119129

120-
check(assert_type(i0 - 1.5, "pd.Interval[float]"), pd.Interval)
121-
check(assert_type(i1 - 1.5, "pd.Interval[float]"), pd.Interval)
122-
check(
123-
assert_type(i2 - pd.Timedelta(days=1), "pd.Interval[pd.Timestamp]"), pd.Interval
124-
)
125-
check(
126-
assert_type(i3 - pd.Timedelta(days=1), "pd.Interval[pd.Timedelta]"), pd.Interval
127-
)
130+
check(assert_type(i0 / md1, "pd.Interval[int]"), pd.Interval)
131+
check(assert_type(i1 / md1, "pd.Interval[float]"), pd.Interval)
132+
check(assert_type(i3 / md1, "pd.Interval[pd.Timedelta]"), pd.Interval)
128133

129-
check(assert_type(i0 + 1, "pd.Interval[int]"), pd.Interval)
130-
check(assert_type(i1 + 1, "pd.Interval[float]"), pd.Interval)
131-
check(
132-
assert_type(i2 + pd.Timedelta(days=1), "pd.Interval[pd.Timestamp]"), pd.Interval
133-
)
134-
check(
135-
assert_type(i3 + pd.Timedelta(days=1), "pd.Interval[pd.Timedelta]"), pd.Interval
136-
)
134+
check(assert_type(i0 / md2, "pd.Interval[float]"), pd.Interval)
135+
check(assert_type(i1 / md2, "pd.Interval[float]"), pd.Interval)
136+
check(assert_type(i3 / md2, "pd.Interval[pd.Timedelta]"), pd.Interval)
137137

138-
check(assert_type(i0 + 1.5, "pd.Interval[float]"), pd.Interval)
139-
check(assert_type(i1 + 1.5, "pd.Interval[float]"), pd.Interval)
140-
check(
141-
assert_type(i2 + pd.Timedelta(days=1), "pd.Interval[pd.Timestamp]"), pd.Interval
142-
)
143-
check(
144-
assert_type(i3 + pd.Timedelta(days=1), "pd.Interval[pd.Timedelta]"), pd.Interval
138+
check(assert_type(i0 // md1, "pd.Interval[int]"), pd.Interval)
139+
check(assert_type(i1 // md1, "pd.Interval[float]"), pd.Interval)
140+
check(assert_type(i3 // md1, "pd.Interval[pd.Timedelta]"), pd.Interval)
141+
142+
check(assert_type(i0 // md2, "pd.Interval[float]"), pd.Interval)
143+
check(assert_type(i1 // md2, "pd.Interval[float]"), pd.Interval)
144+
check(assert_type(i3 // md2, "pd.Interval[pd.Timedelta]"), pd.Interval)
145+
146+
if TYPE_CHECKING_INVALID_USAGE:
147+
md1 / i0 # type: ignore[operator]
148+
md1 / i1 # type: ignore[operator]
149+
md1 / i3 # type: ignore[operator]
150+
151+
md2 / i0 # type: ignore[operator]
152+
md2 / i1 # type: ignore[operator]
153+
md2 / i3 # type: ignore[operator]
154+
155+
md1 // i0 # type: ignore[operator]
156+
md1 // i1 # type: ignore[operator]
157+
md1 // i3 # type: ignore[operator]
158+
159+
md2 // i0 # type: ignore[operator]
160+
md2 // i1 # type: ignore[operator]
161+
md2 // i3 # type: ignore[operator]
162+
163+
as1 = 1
164+
as2 = pd.Timedelta(days=1)
165+
as3 = 1.5
166+
167+
check(assert_type(i0 - as1, "pd.Interval[int]"), pd.Interval)
168+
169+
check(assert_type(i0 - as3, "pd.Interval[float]"), pd.Interval)
170+
171+
check(assert_type(i0 + as1, "pd.Interval[int]"), pd.Interval)
172+
check(assert_type(as1 + i0, "pd.Interval[int]"), pd.Interval)
173+
174+
check(assert_type(i0 + as3, "pd.Interval[float]"), pd.Interval)
175+
check(assert_type(as3 + i0, "pd.Interval[float]"), pd.Interval)
176+
177+
check(assert_type(i1 - as1, "pd.Interval[float]"), pd.Interval)
178+
179+
check(assert_type(i1 - as3, "pd.Interval[float]"), pd.Interval)
180+
181+
check(assert_type(i1 + as1, "pd.Interval[float]"), pd.Interval)
182+
check(assert_type(as1 + i1, "pd.Interval[float]"), pd.Interval)
183+
184+
check(assert_type(i1 + as3, "pd.Interval[float]"), pd.Interval)
185+
check(assert_type(as3 + i1, "pd.Interval[float]"), pd.Interval)
186+
187+
check(assert_type(i2 - as2, "pd.Interval[pd.Timestamp]"), pd.Interval)
188+
189+
check(assert_type(i2 + as2, "pd.Interval[pd.Timestamp]"), pd.Interval)
190+
check(assert_type(as2 + i2, "pd.Interval[pd.Timestamp]"), pd.Interval)
191+
192+
check(assert_type(i3 - as2, "pd.Interval[pd.Timedelta]"), pd.Interval)
193+
194+
check(assert_type(i3 + as2, "pd.Interval[pd.Timedelta]"), pd.Interval)
195+
check(assert_type(as2 + i3, "pd.Interval[pd.Timedelta]"), pd.Interval)
196+
197+
if TYPE_CHECKING_INVALID_USAGE:
198+
as1 - i0 # type: ignore[operator]
199+
as3 - i0 # type: ignore[operator]
200+
as1 - i1 # type: ignore[operator]
201+
as3 - i1 # type: ignore[operator]
202+
as2 - i2 # type: ignore[operator]
203+
as2 - i3 # type: ignore[operator]
204+
205+
206+
def test_interval_misc() -> None:
207+
i0 = pd.Interval(0, 1, closed="left")
208+
i1 = pd.Interval(0.0, 1.0, closed="right")
209+
i2 = pd.Interval(
210+
pd.Timestamp("2017-01-01"), pd.Timestamp("2017-01-02"), closed="both"
145211
)
212+
i3 = pd.Interval(pd.Timedelta("1 days"), pd.Timedelta("2 days"), closed="neither")
146213

147214
check(assert_type(0.5 in i0, bool), bool)
148215
check(assert_type(1 in i0, bool), bool)

0 commit comments

Comments
 (0)