[Python-checkins] python/nondist/sandbox/datetime datetime.py,1.77,1.78 test_both.py,1.36,1.37
tim_one@users.sourceforge.net
tim_one@users.sourceforge.net
Thu, 05 Dec 2002 11:45:09 -0800
Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv32415
Modified Files:
datetime.py test_both.py
Log Message:
Added more tests of addition for dates, datetimes and timedeltas. This
uncovered an endcase glitch in the Python date.__sub__, which got
repaired.
Index: datetime.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/datetime.py,v
retrieving revision 1.77
retrieving revision 1.78
diff -C2 -d -r1.77 -r1.78
*** datetime.py 5 Dec 2002 17:14:52 -0000 1.77
--- datetime.py 5 Dec 2002 19:45:03 -0000 1.78
***************
*** 409,414 ****
self.__seconds + other.__seconds,
self.__microseconds + other.__microseconds)
! raise TypeError
! # XXX Should be 'return NotImplemented', but there's a bug in 2.2...
__radd__ = __add__
--- 409,413 ----
self.__seconds + other.__seconds,
self.__microseconds + other.__microseconds)
! return NotImplemented
__radd__ = __add__
***************
*** 639,643 ****
"""Subtract two dates, or a date and a timedelta."""
if isinstance(other, timedelta):
! return self + -other
if isinstance(other, date):
days1 = self.toordinal()
--- 638,642 ----
"""Subtract two dates, or a date and a timedelta."""
if isinstance(other, timedelta):
! return self + timedelta(-other.days)
if isinstance(other, date):
days1 = self.toordinal()
Index: test_both.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/test_both.py,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -d -r1.36 -r1.37
*** test_both.py 5 Dec 2002 05:04:09 -0000 1.36
--- test_both.py 5 Dec 2002 19:45:04 -0000 1.37
***************
*** 297,301 ****
--- 297,336 ----
# date tests
+ class TestDateOnly(unittest.TestCase):
+ # Tests here won't pass if also run on datetime objects, so don't
+ # subclass this to test datetimes too.
+
+ def test_delta_non_days_ignored(self):
+ dt = date(2000, 1, 2)
+ delta = timedelta(days=1, hours=2, minutes=3, seconds=4,
+ microseconds=5)
+ days = timedelta(delta.days)
+ self.assertEqual(days, timedelta(1))
+
+ dt2 = dt + delta
+ self.assertEqual(dt2, dt + days)
+
+ dt2 = delta + dt
+ self.assertEqual(dt2, dt + days)
+
+ dt2 = dt - delta
+ self.assertEqual(dt2, dt - days)
+
+ delta = -delta
+ days = timedelta(delta.days)
+ self.assertEqual(days, timedelta(-2))
+
+ dt2 = dt + delta
+ self.assertEqual(dt2, dt + days)
+
+ dt2 = delta + dt
+ self.assertEqual(dt2, dt + days)
+
+ dt2 = dt - delta
+ self.assertEqual(dt2, dt - days)
+
class TestDate(unittest.TestCase):
+ # Tests here should pass for both dates and datetimes, except for a
+ # few tests that TestDateTime overrides.
theclass = date
***************
*** 438,446 ****
--- 473,484 ----
self.assertEqual(diff.seconds, 0)
self.assertEqual(diff.microseconds, 0)
+
day = timedelta(1)
week = timedelta(7)
a = self.theclass(2002, 3, 2)
self.assertEqual(a + day, self.theclass(2002, 3, 3))
+ self.assertEqual(day + a, self.theclass(2002, 3, 3))
self.assertEqual(a - day, self.theclass(2002, 3, 1))
+ self.assertEqual(-day + a, self.theclass(2002, 3, 1))
self.assertEqual(a + week, self.theclass(2002, 3, 9))
self.assertEqual(a - week, self.theclass(2002, 2, 23))
***************
*** 455,458 ****
--- 493,497 ----
self.assertEqual(a - (a - week), week)
self.assertEqual(a - (a - day), day)
+
# Add/sub ints, longs, floats should be illegal
for i in 1, 1L, 1.0:
***************
*** 462,465 ****
--- 501,516 ----
self.assertRaises(TypeError, lambda: i-a)
+ # delta - date is senseless.
+ self.assertRaises(TypeError, lambda: day - a)
+ # mixing date and (delta or date) via * or // is senseless
+ self.assertRaises(TypeError, lambda: day * a)
+ self.assertRaises(TypeError, lambda: a * day)
+ self.assertRaises(TypeError, lambda: day // a)
+ self.assertRaises(TypeError, lambda: a // day)
+ self.assertRaises(TypeError, lambda: a * a)
+ self.assertRaises(TypeError, lambda: a // a)
+ # date + date is senseless
+ self.assertRaises(TypeError, lambda: a + a)
+
def test_overflow(self):
tiny = self.theclass.resolution
***************
*** 832,837 ****
--- 883,890 ----
week = timedelta(7)
self.assertEqual(a + hour, self.theclass(2002, 3, 2, 18, 6))
+ self.assertEqual(hour + a, self.theclass(2002, 3, 2, 18, 6))
self.assertEqual(a + 10*hour, self.theclass(2002, 3, 3, 3, 6))
self.assertEqual(a - hour, self.theclass(2002, 3, 2, 16, 6))
+ self.assertEqual(-hour + a, self.theclass(2002, 3, 2, 16, 6))
self.assertEqual(a - hour, a + -hour)
self.assertEqual(a - 20*hour, self.theclass(2002, 3, 1, 21, 6))
***************
*** 873,876 ****
--- 926,941 ----
self.assertRaises(TypeError, lambda: i-a)
+ # delta - datetime is senseless.
+ self.assertRaises(TypeError, lambda: day - a)
+ # mixing datetime and (delta or datetime) via * or // is senseless
+ self.assertRaises(TypeError, lambda: day * a)
+ self.assertRaises(TypeError, lambda: a * day)
+ self.assertRaises(TypeError, lambda: day // a)
+ self.assertRaises(TypeError, lambda: a // day)
+ self.assertRaises(TypeError, lambda: a * a)
+ self.assertRaises(TypeError, lambda: a // a)
+ # datetime + datetime is senseless
+ self.assertRaises(TypeError, lambda: a + a)
+
def test_pickling(self):
import pickle, cPickle
***************
*** 928,931 ****
--- 993,997 ----
for klass in (TestModule,
TestTimeDelta,
+ TestDateOnly,
TestDate,
TestDateTime,