[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,