mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
Issue #1289118: datetime.timedelta objects can now be multiplied by float
and divided by float and int objects.
This commit is contained in:
parent
9103597ee7
commit
1790bc43bf
4 changed files with 191 additions and 13 deletions
|
@ -25,6 +25,16 @@ assert len(pickle_choices) == 3
|
|||
OTHERSTUFF = (10, 34.5, "abc", {}, [], ())
|
||||
|
||||
|
||||
# XXX Copied from test_float.
|
||||
INF = float("inf")
|
||||
NAN = float("nan")
|
||||
|
||||
# decorator for skipping tests on non-IEEE 754 platforms
|
||||
requires_IEEE_754 = unittest.skipUnless(
|
||||
float.__getformat__("double").startswith("IEEE"),
|
||||
"test requires IEEE 754 doubles")
|
||||
|
||||
|
||||
#############################################################################
|
||||
# module tests
|
||||
|
||||
|
@ -225,6 +235,36 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||
eq(c//1000, td(0, 0, 1))
|
||||
eq(a//10, td(0, 7*24*360))
|
||||
eq(a//3600000, td(0, 0, 7*24*1000))
|
||||
eq(a/0.5, td(14))
|
||||
eq(b/0.5, td(0, 120))
|
||||
eq(a/7, td(1))
|
||||
eq(b/10, td(0, 6))
|
||||
eq(c/1000, td(0, 0, 1))
|
||||
eq(a/10, td(0, 7*24*360))
|
||||
eq(a/3600000, td(0, 0, 7*24*1000))
|
||||
|
||||
# Multiplication by float
|
||||
us = td(microseconds=1)
|
||||
eq((3*us) * 0.5, 2*us)
|
||||
eq((5*us) * 0.5, 2*us)
|
||||
eq(0.5 * (3*us), 2*us)
|
||||
eq(0.5 * (5*us), 2*us)
|
||||
eq((-3*us) * 0.5, -2*us)
|
||||
eq((-5*us) * 0.5, -2*us)
|
||||
|
||||
# Division by int and float
|
||||
eq((3*us) / 2, 2*us)
|
||||
eq((5*us) / 2, 2*us)
|
||||
eq((-3*us) / 2.0, -2*us)
|
||||
eq((-5*us) / 2.0, -2*us)
|
||||
eq((3*us) / -2, -2*us)
|
||||
eq((5*us) / -2, -2*us)
|
||||
eq((3*us) / -2.0, -2*us)
|
||||
eq((5*us) / -2.0, -2*us)
|
||||
for i in range(-10, 10):
|
||||
eq((i*us/3)//us, round(i/3))
|
||||
for i in range(-10, 10):
|
||||
eq((i*us/-3)//us, round(i/-3))
|
||||
|
||||
def test_disallowed_computations(self):
|
||||
a = timedelta(42)
|
||||
|
@ -236,20 +276,19 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||
self.assertRaises(TypeError, lambda: i+a)
|
||||
self.assertRaises(TypeError, lambda: i-a)
|
||||
|
||||
# Mul/div by float isn't supported.
|
||||
x = 2.3
|
||||
self.assertRaises(TypeError, lambda: a*x)
|
||||
self.assertRaises(TypeError, lambda: x*a)
|
||||
self.assertRaises(TypeError, lambda: a/x)
|
||||
self.assertRaises(TypeError, lambda: x/a)
|
||||
self.assertRaises(TypeError, lambda: a // x)
|
||||
self.assertRaises(TypeError, lambda: x // a)
|
||||
|
||||
# Division of int by timedelta doesn't make sense.
|
||||
# Division by zero doesn't make sense.
|
||||
zero = 0
|
||||
self.assertRaises(TypeError, lambda: zero // a)
|
||||
self.assertRaises(ZeroDivisionError, lambda: a // zero)
|
||||
self.assertRaises(ZeroDivisionError, lambda: a / zero)
|
||||
self.assertRaises(ZeroDivisionError, lambda: a / 0.0)
|
||||
|
||||
@requires_IEEE_754
|
||||
def test_disallowed_special(self):
|
||||
a = timedelta(42)
|
||||
self.assertRaises(ValueError, a.__mul__, NAN)
|
||||
self.assertRaises(ValueError, a.__truediv__, NAN)
|
||||
|
||||
def test_basic_attributes(self):
|
||||
days, seconds, us = 1, 7, 31
|
||||
|
@ -410,6 +449,19 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||
|
||||
self.assertRaises(OverflowError, lambda: -timedelta.max)
|
||||
|
||||
day = timedelta(1)
|
||||
self.assertRaises(OverflowError, day.__mul__, 10**9)
|
||||
self.assertRaises(OverflowError, day.__mul__, 1e9)
|
||||
self.assertRaises(OverflowError, day.__truediv__, 1e-20)
|
||||
self.assertRaises(OverflowError, day.__truediv__, 1e-10)
|
||||
self.assertRaises(OverflowError, day.__truediv__, 9e-10)
|
||||
|
||||
@requires_IEEE_754
|
||||
def _test_overflow_special(self):
|
||||
day = timedelta(1)
|
||||
self.assertRaises(OverflowError, day.__mul__, INF)
|
||||
self.assertRaises(OverflowError, day.__mul__, -INF)
|
||||
|
||||
def test_microsecond_rounding(self):
|
||||
td = timedelta
|
||||
eq = self.assertEqual
|
||||
|
@ -489,7 +541,7 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase):
|
|||
self.assertRaises(ZeroDivisionError, truediv, t, zerotd)
|
||||
self.assertRaises(ZeroDivisionError, floordiv, t, zerotd)
|
||||
|
||||
self.assertRaises(TypeError, truediv, t, 2)
|
||||
# self.assertRaises(TypeError, truediv, t, 2)
|
||||
# note: floor division of a timedelta by an integer *is*
|
||||
# currently permitted.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue