9
9
timedelta ,
10
10
)
11
11
import operator
12
+ from platform import architecture
12
13
import re
13
14
14
15
import numpy as np
15
16
import pytest
16
17
17
- from pandas ._libs .tslibs import OutOfBoundsTimedelta
18
+ from pandas ._libs .tslibs import (
19
+ NaTType ,
20
+ OutOfBoundsTimedelta ,
21
+ )
18
22
19
23
import pandas as pd
20
24
from pandas import (
@@ -33,6 +37,7 @@ def fixture_tdlike_cls(request) -> type:
33
37
return request .param
34
38
35
39
40
+ # Tick, too?
36
41
@pytest .fixture (
37
42
name = "tdlike_or_offset_cls" ,
38
43
params = (Timedelta , timedelta , np .timedelta64 , offsets .Nano ),
@@ -148,8 +153,10 @@ def test_binary_ops_not_implemented_for_arbitrary_types(
148
153
149
154
class TestAdditionSubtractionScalar :
150
155
"""
151
- Tests for Timedelta.{__add__,__radd__,__sub__,__rsub__} where second operand is a
152
- scalar.
156
+ Tests against the following Timedelta methods, where second operand is a scalar:
157
+
158
+ __add__,__radd__,
159
+ __sub__,__rsub__
153
160
"""
154
161
155
162
@pytest .mark .parametrize (
@@ -230,7 +237,7 @@ def test_add_timedeltalike(self, ten_days: Timedelta, add_op, one_day):
230
237
assert isinstance (result , Timedelta )
231
238
assert result == expected
232
239
233
- def test_sub_timedeltalike (self , ten_days : Timedelta , one_day , sub_op ):
240
+ def test_sub_timedeltalike (self , ten_days : Timedelta , sub_op , one_day ):
234
241
result = sub_op (ten_days , one_day )
235
242
expected = Timedelta (days = 9 ) if sub_op is operator .sub else Timedelta (days = - 9 )
236
243
assert isinstance (result , Timedelta )
@@ -252,7 +259,7 @@ def test_sub_offset(self, ten_days: Timedelta, sub_op):
252
259
assert isinstance (result , Timedelta )
253
260
assert result == expected
254
261
255
- def test_with_timedeltadlike_raises_for_any_result_above_td_max (
262
+ def test_add_sub_tdlike_raises_for_any_result_above_td_max (
256
263
self ,
257
264
tdlike_or_offset_cls ,
258
265
td_overflow_msg : str ,
@@ -263,12 +270,12 @@ def test_with_timedeltadlike_raises_for_any_result_above_td_max(
263
270
with pytest .raises (OutOfBoundsTimedelta , match = td_overflow_msg ):
264
271
Timedelta .max - (tdlike_or_offset_cls (- 1 ))
265
272
266
- def test_no_error_for_result_1ns_below_td_min (self ):
273
+ def test_add_sub_tdlike_raises_no_error_for_result_1ns_below_td_min (self ):
267
274
assert Timedelta .min + Timedelta (- 1 , "ns" ) is NaT
268
275
assert offsets .Nano (- 1 ) + Timedelta .min is NaT
269
276
assert Timedelta .min - np .timedelta64 (1 , "ns" ) is NaT
270
277
271
- def test_raises_for_any_result_2ns_below_td_min (
278
+ def test_add_sub_tdlike_raises_for_any_result_2ns_below_td_min (
272
279
self ,
273
280
tdlike_or_offset_cls : type ,
274
281
td_overflow_msg : str ,
@@ -288,8 +295,11 @@ def test_add_or_sub_na(self, request, ten_days: Timedelta, add_or_sub, na_value)
288
295
289
296
class TestAdditionSubtractionBox :
290
297
"""
291
- Tests for Timedelta.{__add__,__radd__,__sub__,__rsub__} where second operand is a
292
- Array/Index/Series/DataFrame.
298
+ Tests against the following Timedelta methods, where second operand is a
299
+ Array/Index/Series/DataFrame:
300
+
301
+ __add__,__radd__,
302
+ __sub__,__rsub__
293
303
"""
294
304
295
305
@pytest .mark .parametrize ("value" , (2 , 2.0 ), ids = ("int" , "float" ))
@@ -379,7 +389,9 @@ def test_na(self):
379
389
380
390
class TestMultiplicationScalar :
381
391
"""
382
- Tests for Timedelta.{__mul__,__rmul__} where second operand is a scalar.
392
+ Tests against the following Timedelta methods, where second operand is a scalar:
393
+
394
+ __mul__,__rmul__
383
395
"""
384
396
385
397
@pytest .mark .parametrize (
@@ -419,8 +431,10 @@ def test_na(self, request, ten_days: Timedelta, mul_op, na_value):
419
431
420
432
class TestMultiplicationBox :
421
433
"""
422
- Tests for Timedelta.{__mul__,__rmul__} where second operand is a
423
- Array/Index/Series/DataFrame.
434
+ Tests against the following Timedelta methods, where second operand is a
435
+ Array/Index/Series/DataFrame:
436
+
437
+ __mul__,__rmul__
424
438
"""
425
439
426
440
@pytest .mark .parametrize ("factor,expected" , ((2 , 20 ), (1.5 , 15 )))
@@ -433,13 +447,17 @@ def test_numeric(self, ten_days, mul_op, factor, expected, box_with_array):
433
447
)
434
448
tm .assert_equal (result , expected )
435
449
436
- @pytest .mark .xfail (reason = "no overflow check" , raises = AssertionError )
450
+ @pytest .mark .xfail (
451
+ condition = architecture ()[0 ] != "32bit" ,
452
+ reason = "no overflow check" ,
453
+ raises = AssertionError ,
454
+ )
437
455
@pytest .mark .parametrize ("factor" , (1.01 , 2 ), ids = ("int" , "float" ))
438
456
def test_returns_nat_if_result_overflows (self , mul_op , factor , box_with_array ):
439
457
numeric_box = tm .box_expected ((1 , factor ), box_with_array , transpose = False )
440
- result = mul_op (pd . Timedelta .max , numeric_box )
458
+ result = mul_op (Timedelta .max , numeric_box )
441
459
expected = tm .box_expected (
442
- (pd . Timedelta .max , NaT ),
460
+ (Timedelta .max , NaT ),
443
461
box_with_array ,
444
462
transpose = False ,
445
463
)
@@ -574,22 +592,25 @@ def test_offset(self, ten_days: Timedelta, div_op, expected):
574
592
assert result == expected
575
593
576
594
def test_na (self , request , ten_days : Timedelta , truediv_op , na_value ):
577
- expected = NaT
578
- if na_value is NA or (
595
+ expected : NaTType | float = NaT
596
+
597
+ if na_value is None or na_value is NaT :
598
+ expected = np .nan
599
+ elif na_value is NA or (
579
600
truediv_op is ops .rtruediv and isinstance (na_value , float )
580
601
):
581
602
request .applymarker (xfail_type_error )
582
- elif na_value is None or na_value is NaT :
583
- expected = np .nan
603
+
584
604
result = truediv_op (ten_days , na_value )
585
605
assert result is expected
586
606
587
607
def test_floordiv_na (self , request , ten_days : Timedelta , na_value ):
588
- expected = NaT
589
- if na_value is NA :
590
- request .applymarker (xfail_type_error )
591
- elif na_value is None or na_value is NaT :
608
+ expected : NaTType | float = NaT
609
+
610
+ if na_value is None or na_value is NaT :
592
611
expected = np .nan
612
+ elif na_value is NA :
613
+ request .applymarker (xfail_type_error )
593
614
594
615
result = ten_days // na_value
595
616
assert result is expected
@@ -618,7 +639,8 @@ def test_rmod_na(self, request, ten_days: Timedelta, na_value):
618
639
assert result is NaT
619
640
620
641
def test_divmod_na (self , request , ten_days : Timedelta , na_value ):
621
- expected = (NaT , NaT )
642
+ expected : tuple [NaTType | float , NaTType ] = (NaT , NaT )
643
+
622
644
if na_value is None or na_value is NA :
623
645
request .applymarker (xfail_type_error )
624
646
elif na_value is NaT :
0 commit comments