[Python-checkins] python/dist/src/Lib/test test_datetime.py,1.11,1.12

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Thu, 26 Dec 2002 16:41:13 -0800


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1:/tmp/cvs-serv11885/python/Lib/test

Modified Files:
	test_datetime.py 
Log Message:
Make comparison and subtraction of aware objects ignore tzinfo if the
operands have identical tzinfo members (meaning object identity -- "is").
I misunderstood the intent here, reading wrong conclusion into
conflicting clues.


Index: test_datetime.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_datetime.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** test_datetime.py	26 Dec 2002 05:01:19 -0000	1.11
--- test_datetime.py	27 Dec 2002 00:41:11 -0000	1.12
***************
*** 1658,1664 ****
          cls = self.theclass
  
!         # Primarily trying to ensure that utcoffset() gets called even if
!         # the comparands have the same tzinfo member.  timetz comparison
!         # didn't used to do so, although datetimetz comparison did.
          class OperandDependentOffset(tzinfo):
              def utcoffset(self, t):
--- 1658,1663 ----
          cls = self.theclass
  
!         # Ensure that utcoffset() gets ignored if the comparands have
!         # the same tzinfo member.
          class OperandDependentOffset(tzinfo):
              def utcoffset(self, t):
***************
*** 1675,1678 ****
--- 1674,1687 ----
              for y in d0, d1, d2:
                  got = cmp(x, y)
+                 expected = cmp(x.minute, y.minute)
+                 self.assertEqual(got, expected)
+ 
+         # However, if they're different members, uctoffset is not ignored.
+         d0 = base.replace(minute=3, tzinfo=OperandDependentOffset())
+         d1 = base.replace(minute=9, tzinfo=OperandDependentOffset())
+         d2 = base.replace(minute=11, tzinfo=OperandDependentOffset())
+         for x in d0, d1, d2:
+             for y in d0, d1, d2:
+                 got = cmp(x, y)
                  if (x is d0 or x is d1) and (y is d0 or y is d1):
                      expected = 0
***************
*** 1894,1897 ****
--- 1903,1936 ----
          self.assertRaises(ValueError, base.replace, microsecond=1000000)
  
+     def test_mixed_compare(self):
+         t1 = time(1, 2, 3)
+         t2 = timetz(1, 2, 3)
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=None)
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=FixedOffset(None, ""))
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=FixedOffset(0, ""))
+         self.assertRaises(TypeError, lambda: t1 == t2)
+ 
+         # In timetz w/ identical tzinfo objects, utcoffset is ignored.
+         class Varies(tzinfo):
+             def __init__(self):
+                 self.offset = 22
+             def utcoffset(self, t):
+                 self.offset += 1
+                 return self.offset
+ 
+         v = Varies()
+         t1 = t2.replace(tzinfo=v)
+         t2 = t2.replace(tzinfo=v)
+         self.assertEqual(t1.utcoffset(), timedelta(minutes=23))
+         self.assertEqual(t2.utcoffset(), timedelta(minutes=24))
+         self.assertEqual(t1, t2)
+ 
+         # But if they're not identical, it isn't ignored.
+         t2 = t2.replace(tzinfo=Varies())
+         self.failUnless(t1 < t2)  # t1's offset counter still going up
+ 
  
  class TestDateTimeTZ(TestDateTime, TZInfoBase):
***************
*** 1972,1976 ****
          t1 = self.theclass(2, 2, 2, tzinfo=Bogus())
          t2 = self.theclass(2, 2, 2, tzinfo=FixedOffset(0, ""))
!         self.assertRaises(ValueError, lambda: t1 == t1)
  
      def test_pickling(self):
--- 2011,2015 ----
          t1 = self.theclass(2, 2, 2, tzinfo=Bogus())
          t2 = self.theclass(2, 2, 2, tzinfo=FixedOffset(0, ""))
!         self.assertRaises(ValueError, lambda: t1 == t2)
  
      def test_pickling(self):
***************
*** 2390,2397 ****
          cls = self.theclass
  
!         # Primarily trying to ensure that utcoffset() gets called even if
!         # the operands have the same tzinfo member.  Subtraction didn't
!         # used to do this, and it makes a difference for DST-aware tzinfo
!         # instances.
          class OperandDependentOffset(tzinfo):
              def utcoffset(self, t):
--- 2429,2434 ----
          cls = self.theclass
  
!         # Ensure that utcoffset() is ignored when the operands have the
!         # same tzinfo member.
          class OperandDependentOffset(tzinfo):
              def utcoffset(self, t):
***************
*** 2408,2411 ****
--- 2445,2460 ----
              for y in d0, d1, d2:
                  got = x - y
+                 expected = timedelta(minutes=x.minute - y.minute)
+                 self.assertEqual(got, expected)
+ 
+         # OTOH, if the tzinfo members are distinct, utcoffsets aren't
+         # ignored.
+         base = cls(8, 9, 10, 11, 12, 13, 14)
+         d0 = base.replace(minute=3, tzinfo=OperandDependentOffset())
+         d1 = base.replace(minute=9, tzinfo=OperandDependentOffset())
+         d2 = base.replace(minute=11, tzinfo=OperandDependentOffset())
+         for x in d0, d1, d2:
+             for y in d0, d1, d2:
+                 got = x - y
                  if (x is d0 or x is d1) and (y is d0 or y is d1):
                      expected = timedelta(0)
***************
*** 2419,2422 ****
--- 2468,2500 ----
                  self.assertEqual(got, expected)
  
+     def test_mixed_compare(self):
+         t1 = datetime(1, 2, 3, 4, 5, 6, 7)
+         t2 = datetimetz(1, 2, 3, 4, 5, 6, 7)
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=None)
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=FixedOffset(None, ""))
+         self.assertEqual(t1, t2)
+         t2 = t2.replace(tzinfo=FixedOffset(0, ""))
+         self.assertRaises(TypeError, lambda: t1 == t2)
+ 
+         # In datetimetz w/ identical tzinfo objects, utcoffset is ignored.
+         class Varies(tzinfo):
+             def __init__(self):
+                 self.offset = 22
+             def utcoffset(self, t):
+                 self.offset += 1
+                 return self.offset
+ 
+         v = Varies()
+         t1 = t2.replace(tzinfo=v)
+         t2 = t2.replace(tzinfo=v)
+         self.assertEqual(t1.utcoffset(), timedelta(minutes=23))
+         self.assertEqual(t2.utcoffset(), timedelta(minutes=24))
+         self.assertEqual(t1, t2)
+ 
+         # But if they're not identical, it isn't ignored.
+         t2 = t2.replace(tzinfo=Varies())
+         self.failUnless(t1 < t2)  # t1's offset counter still going up
  
  def test_suite():