[Python-checkins] python/dist/src/Lib/test test_datetime.py,1.22,1.23

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Wed, 08 Jan 2003 12:40:27 -0800


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

Modified Files:
	test_datetime.py 
Log Message:
Utterly minimal changes to collapse datetimetz into datetime, and timetz
into time.  This is little more than *exporting* the datetimetz object
under the name "datetime", and similarly for timetz.  A good implementation
of this change requires more work, but this is fully functional if you
don't stare too hard at the internals (e.g., right now a type named
"datetime" shows up as a base class of the type named "datetime").  The
docs also need extensive revision, not part of this checkin.


Index: test_datetime.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_datetime.py,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** test_datetime.py	4 Jan 2003 06:03:15 -0000	1.22
--- test_datetime.py	8 Jan 2003 20:39:52 -0000	1.23
***************
*** 1,3 ****
! """Test date/time type."""
  
  import sys
--- 1,6 ----
! """Test date/time type.
! 
! See http://www.zope.org/Members/fdrake/DateTimeWiki/TestCases
! """
  
  import sys
***************
*** 9,14 ****
  from datetime import timedelta
  from datetime import tzinfo
! from datetime import time, timetz
! from datetime import date, datetime, datetimetz
  
  #############################################################################
--- 12,33 ----
  from datetime import timedelta
  from datetime import tzinfo
! from datetime import time
! from datetime import date, datetime
! 
! 
! # XXX The test suite uncovered a bug in Python 2.2.2:  if x and y are
! # XXX instances of new-style classes (like date and time) that both
! # XXX define __cmp__, and x is compared to y, and one of the __cmp__
! # XXX implementations raises an exception, the exception can get dropped
! # XXX on the floor when it occurs, and pop up again at some "random" time
! # XXX later (it depends on when the next opcode gets executed that
! # XXX bothers to check).  There isn't a workaround for this, so instead
! # XXX we disable the parts of the tests that trigger it unless
! # XXX CMP_BUG_FIXED is true.  The bug is still there, we simply avoid
! # XXX provoking it here.
! # XXX Guido checked into a fix that will go into 2.2.3.  The bug was
! # XXX already fixed in 2.3 CVS via a different means.
! CMP_BUG_FIXED = sys.version_info >= (2, 2, 3)
! 
  
  #############################################################################
***************
*** 479,503 ****
                  self.assertEqual(fromord.microsecond, 0)
  
!         # Check first and last days of year across the whole range of years
!         # supported.
!         ordinal = 1
!         for year in xrange(MINYEAR, MAXYEAR+1):
              # Verify (year, 1, 1) -> ordinal -> y, m, d is identity.
              d = self.theclass(year, 1, 1)
              n = d.toordinal()
-             self.assertEqual(ordinal, n)
              d2 = self.theclass.fromordinal(n)
              self.assertEqual(d, d2)
!             self.assertEqual(d.timetuple().tm_yday, 1)
!             # Same for (year, 12, 31).
!             isleap = year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
!             days_in_year = 365 + isleap
!             d = self.theclass(year, 12, 31)
!             n = d.toordinal()
!             self.assertEqual(n, ordinal + days_in_year - 1)
!             self.assertEqual(d.timetuple().tm_yday, days_in_year)
!             d2 = self.theclass.fromordinal(n)
!             self.assertEqual(d, d2)
!             ordinal += days_in_year
  
          # Test every day in a leap-year and a non-leap year.
--- 498,515 ----
                  self.assertEqual(fromord.microsecond, 0)
  
!         # Check first and last days of year spottily across the whole
!         # range of years supported.
!         for year in xrange(MINYEAR, MAXYEAR+1, 7):
              # Verify (year, 1, 1) -> ordinal -> y, m, d is identity.
              d = self.theclass(year, 1, 1)
              n = d.toordinal()
              d2 = self.theclass.fromordinal(n)
              self.assertEqual(d, d2)
!             # Verify that moving back a day gets to the end of year-1.
!             if year > 1:
!                 d = self.theclass.fromordinal(n-1)
!                 d2 = self.theclass(year-1, 12, 31)
!                 self.assertEqual(d, d2)
!                 self.assertEqual(d2.toordinal(), n-1)
  
          # Test every day in a leap-year and a non-leap year.
***************
*** 1137,1141 ****
          orig = self.theclass(*args)
          state = orig.__getstate__()
!         self.assertEqual(state, '\x00\x06\x07\x17\x14\x3b\x01\x00\x10\x00')
          derived = self.theclass(1, 1, 1)
          derived.__setstate__(state)
--- 1149,1153 ----
          orig = self.theclass(*args)
          state = orig.__getstate__()
!         self.assertEqual(state, ('\x00\x06\x07\x17\x14\x3b\x01\x00\x10\x00',))
          derived = self.theclass(1, 1, 1)
          derived.__setstate__(state)
***************
*** 1302,1310 ****
  
      def test_astimezone(self):
!         # Pretty boring for a datetime!  datetimetz is more interesting here.
          dt = self.theclass.now()
          f = FixedOffset(44, "")
          for dtz in dt.astimezone(f), dt.astimezone(tz=f):
!             self.failUnless(isinstance(dtz, datetimetz))
              self.assertEqual(dt.date(), dtz.date())
              self.assertEqual(dt.time(), dtz.time())
--- 1314,1322 ----
  
      def test_astimezone(self):
!         # Pretty boring!  The TZ test is more interesting here.
          dt = self.theclass.now()
          f = FixedOffset(44, "")
          for dtz in dt.astimezone(f), dt.astimezone(tz=f):
!             self.failUnless(isinstance(dtz, datetime))
              self.assertEqual(dt.date(), dtz.date())
              self.assertEqual(dt.time(), dtz.time())
***************
*** 1384,1389 ****
              self.assertEqual(cmp(t2, t1), 1)
  
!         for badarg in (10, 10L, 34.5, "abc", {}, [], (), date(1, 1, 1),
!                        datetime(1, 1, 1, 1, 1), timedelta(9)):
              self.assertRaises(TypeError, lambda: t1 == badarg)
              self.assertRaises(TypeError, lambda: t1 != badarg)
--- 1396,1403 ----
              self.assertEqual(cmp(t2, t1), 1)
  
!         badargs = (10, 10L, 34.5, "abc", {}, [], ())
!         if CMP_BUG_FIXED:
!             badargs += (date(1, 1, 1), datetime(1, 1, 1, 1, 1), timedelta(9))
!         for badarg in badargs:
              self.assertRaises(TypeError, lambda: t1 == badarg)
              self.assertRaises(TypeError, lambda: t1 != badarg)
***************
*** 1514,1518 ****
          orig = self.theclass(*args)
          state = orig.__getstate__()
!         self.assertEqual(state, '\x14\x3b\x10\x00\x10\x00')
          derived = self.theclass()
          derived.__setstate__(state)
--- 1528,1532 ----
          orig = self.theclass(*args)
          state = orig.__getstate__()
!         self.assertEqual(state, ('\x14\x3b\x10\x00\x10\x00',))
          derived = self.theclass()
          derived.__setstate__(state)
***************
*** 1560,1569 ****
  # A mixin for classes with a tzinfo= argument.  Subclasses must define
  # theclass as a class atribute, and theclass(1, 1, 1, tzinfo=whatever)
! # must be legit (which is true for timetz and datetimetz).
  class TZInfoBase(unittest.TestCase):
  
      def test_argument_passing(self):
          cls = self.theclass
!         # A datetimetz passes itself on, a timetz passes None.
          class introspective(tzinfo):
              def tzname(self, dt):    return dt and "real" or "none"
--- 1574,1583 ----
  # A mixin for classes with a tzinfo= argument.  Subclasses must define
  # theclass as a class atribute, and theclass(1, 1, 1, tzinfo=whatever)
! # must be legit (which is true for time and datetime).
  class TZInfoBase(unittest.TestCase):
  
      def test_argument_passing(self):
          cls = self.theclass
!         # A datetime passes itself on, a time passes None.
          class introspective(tzinfo):
              def tzname(self, dt):    return dt and "real" or "none"
***************
*** 1574,1581 ****
          obj = cls(1, 2, 3, tzinfo=introspective())
  
!         expected = cls is timetz and "none" or "real"
          self.assertEqual(obj.tzname(), expected)
  
!         expected = timedelta(minutes=(cls is timetz and -42 or 42))
          self.assertEqual(obj.utcoffset(), expected)
          self.assertEqual(obj.dst(), expected)
--- 1588,1595 ----
          obj = cls(1, 2, 3, tzinfo=introspective())
  
!         expected = cls is time and "none" or "real"
          self.assertEqual(obj.tzname(), expected)
  
!         expected = timedelta(minutes=(cls is time and -42 or 42))
          self.assertEqual(obj.utcoffset(), expected)
          self.assertEqual(obj.dst(), expected)
***************
*** 1609,1621 ****
                                (1439, True),
                                (1440, False)):
!             if cls is timetz:
                  t = cls(1, 2, 3, tzinfo=Edgy(offset))
!             elif cls is datetimetz:
                  t = cls(6, 6, 6, 1, 2, 3, tzinfo=Edgy(offset))
              if legit:
                  aofs = abs(offset)
                  h, m = divmod(aofs, 60)
                  tag = "%c%02d:%02d" % (offset < 0 and '-' or '+', h, m)
!                 if isinstance(t, datetimetz):
                      t = t.timetz()
                  self.assertEqual(str(t), "01:02:03" + tag)
--- 1623,1637 ----
                                (1439, True),
                                (1440, False)):
!             if cls is time:
                  t = cls(1, 2, 3, tzinfo=Edgy(offset))
!             elif cls is datetime:
                  t = cls(6, 6, 6, 1, 2, 3, tzinfo=Edgy(offset))
+             else:
+                 assert 0, "impossible"
              if legit:
                  aofs = abs(offset)
                  h, m = divmod(aofs, 60)
                  tag = "%c%02d:%02d" % (offset < 0 and '-' or '+', h, m)
!                 if isinstance(t, datetime):
                      t = t.timetz()
                  self.assertEqual(str(t), "01:02:03" + tag)
***************
*** 1696,1703 ****
  
          # However, if they're different members, uctoffset is not ignored.
!         # Note that a timetz can't actually have an operand-depedent offset,
!         # though (and timetz.utcoffset() passes None to tzinfo.utcoffset()),
!         # so skip this test for timetz.
!         if cls is not timetz:
              d0 = base.replace(minute=3, tzinfo=OperandDependentOffset())
              d1 = base.replace(minute=9, tzinfo=OperandDependentOffset())
--- 1712,1719 ----
  
          # However, if they're different members, uctoffset is not ignored.
!         # Note that a time can't actually have an operand-depedent offset,
!         # though (and time.utcoffset() passes None to tzinfo.utcoffset()),
!         # so skip this test for time.
!         if cls is not time:
              d0 = base.replace(minute=3, tzinfo=OperandDependentOffset())
              d1 = base.replace(minute=9, tzinfo=OperandDependentOffset())
***************
*** 1718,1723 ****
  
  
  class TestTimeTZ(TestTime, TZInfoBase):
!     theclass = timetz
  
      def test_empty(self):
--- 1734,1740 ----
  
  
+ # Testing time objects with a non-None tzinfo.
  class TestTimeTZ(TestTime, TZInfoBase):
!     theclass = time
  
      def test_empty(self):
***************
*** 1733,1741 ****
          utc = FixedOffset(0, "UTC", -2)
          met = FixedOffset(60, "MET", 3)
!         t1 = timetz( 7, 47, tzinfo=est)
!         t2 = timetz(12, 47, tzinfo=utc)
!         t3 = timetz(13, 47, tzinfo=met)
!         t4 = timetz(microsecond=40)
!         t5 = timetz(microsecond=40, tzinfo=utc)
  
          self.assertEqual(t1.tzinfo, est)
--- 1750,1758 ----
          utc = FixedOffset(0, "UTC", -2)
          met = FixedOffset(60, "MET", 3)
!         t1 = time( 7, 47, tzinfo=est)
!         t2 = time(12, 47, tzinfo=utc)
!         t3 = time(13, 47, tzinfo=met)
!         t4 = time(microsecond=40)
!         t5 = time(microsecond=40, tzinfo=utc)
  
          self.assertEqual(t1.tzinfo, est)
***************
*** 1786,1790 ****
          self.assertEqual(t5.isoformat(), "00:00:00.000040+00:00")
  
!         d = 'datetime.timetz'
          self.assertEqual(repr(t1), d + "(7, 47, tzinfo=est)")
          self.assertEqual(repr(t2), d + "(12, 47, tzinfo=utc)")
--- 1803,1807 ----
          self.assertEqual(t5.isoformat(), "00:00:00.000040+00:00")
  
!         d = 'datetime.time'
          self.assertEqual(repr(t1), d + "(7, 47, tzinfo=est)")
          self.assertEqual(repr(t2), d + "(12, 47, tzinfo=utc)")
***************
*** 1799,1803 ****
  
          yuck = FixedOffset(-1439, "%z %Z %%z%%Z")
!         t1 = timetz(23, 59, tzinfo=yuck)
          self.assertEqual(t1.strftime("%H:%M %%Z='%Z' %%z='%z'"),
                                       "23:59 %Z='%z %Z %%z%%Z' %z='-2359'")
--- 1816,1820 ----
  
          yuck = FixedOffset(-1439, "%z %Z %%z%%Z")
!         t1 = time(23, 59, tzinfo=yuck)
          self.assertEqual(t1.strftime("%H:%M %%Z='%Z' %%z='%z'"),
                                       "23:59 %Z='%z %Z %%z%%Z' %z='-2359'")
***************
*** 1806,1810 ****
          class Badtzname(tzinfo):
              def tzname(self, dt): return 42
!         t = timetz(2, 3, 4, tzinfo=Badtzname())
          self.assertEqual(t.strftime("%H:%M:%S"), "02:03:04")
          self.assertRaises(TypeError, t.strftime, "%Z")
--- 1823,1827 ----
          class Badtzname(tzinfo):
              def tzname(self, dt): return 42
!         t = time(2, 3, 4, tzinfo=Badtzname())
          self.assertEqual(t.strftime("%H:%M:%S"), "02:03:04")
          self.assertRaises(TypeError, t.strftime, "%Z")
***************
*** 1927,1931 ****
      def test_mixed_compare(self):
          t1 = time(1, 2, 3)
!         t2 = timetz(1, 2, 3)
          self.assertEqual(t1, t2)
          t2 = t2.replace(tzinfo=None)
--- 1944,1948 ----
      def test_mixed_compare(self):
          t1 = time(1, 2, 3)
!         t2 = time(1, 2, 3)
          self.assertEqual(t1, t2)
          t2 = t2.replace(tzinfo=None)
***************
*** 1933,1940 ****
          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):
--- 1950,1958 ----
          t2 = t2.replace(tzinfo=FixedOffset(None, ""))
          self.assertEqual(t1, t2)
!         if CMP_BUG_FIXED:
!             t2 = t2.replace(tzinfo=FixedOffset(0, ""))
!             self.assertRaises(TypeError, lambda: t1 == t2)
  
!         # In time w/ identical tzinfo objects, utcoffset is ignored.
          class Varies(tzinfo):
              def __init__(self):
***************
*** 1956,1961 ****
  
  
  class TestDateTimeTZ(TestDateTime, TZInfoBase):
!     theclass = datetimetz
  
      def test_trivial(self):
--- 1974,1981 ----
  
  
+ # Testing datetime objects with a non-None tzinfo.
+ 
  class TestDateTimeTZ(TestDateTime, TZInfoBase):
!     theclass = datetime
  
      def test_trivial(self):
***************
*** 2092,2098 ****
          utc = FixedOffset(0, "UTC")
          met = FixedOffset(60, "MET")
!         t1 = datetimetz(2002, 3, 19,  7, 47, tzinfo=est)
!         t2 = datetimetz(2002, 3, 19, 12, 47, tzinfo=utc)
!         t3 = datetimetz(2002, 3, 19, 13, 47, tzinfo=met)
          self.assertEqual(t1.tzinfo, est)
          self.assertEqual(t2.tzinfo, utc)
--- 2112,2118 ----
          utc = FixedOffset(0, "UTC")
          met = FixedOffset(60, "MET")
!         t1 = datetime(2002, 3, 19,  7, 47, tzinfo=est)
!         t2 = datetime(2002, 3, 19, 12, 47, tzinfo=utc)
!         t3 = datetime(2002, 3, 19, 13, 47, tzinfo=met)
          self.assertEqual(t1.tzinfo, est)
          self.assertEqual(t2.tzinfo, utc)
***************
*** 2113,2117 ****
          self.assertEqual(str(t2), "2002-03-19 12:47:00+00:00")
          self.assertEqual(str(t3), "2002-03-19 13:47:00+01:00")
!         d = 'datetime.datetimetz(2002, 3, 19, '
          self.assertEqual(repr(t1), d + "7, 47, tzinfo=est)")
          self.assertEqual(repr(t2), d + "12, 47, tzinfo=utc)")
--- 2133,2137 ----
          self.assertEqual(str(t2), "2002-03-19 12:47:00+00:00")
          self.assertEqual(str(t3), "2002-03-19 13:47:00+01:00")
!         d = 'datetime.datetime(2002, 3, 19, '
          self.assertEqual(repr(t1), d + "7, 47, tzinfo=est)")
          self.assertEqual(repr(t2), d + "12, 47, tzinfo=utc)")
***************
*** 2121,2127 ****
          met = FixedOffset(60, "MET")
          d = date(2002, 3, 4)
!         tz = timetz(18, 45, 3, 1234, tzinfo=met)
!         dt = datetimetz.combine(d, tz)
!         self.assertEqual(dt, datetimetz(2002, 3, 4, 18, 45, 3, 1234,
                                          tzinfo=met))
  
--- 2141,2147 ----
          met = FixedOffset(60, "MET")
          d = date(2002, 3, 4)
!         tz = time(18, 45, 3, 1234, tzinfo=met)
!         dt = datetime.combine(d, tz)
!         self.assertEqual(dt, datetime(2002, 3, 4, 18, 45, 3, 1234,
                                          tzinfo=met))
  
***************
*** 2131,2135 ****
          self.assertEqual(dt.date(), date(2002, 3, 4))
          self.assertEqual(dt.time(), time(18, 45, 3, 1234))
!         self.assertEqual(dt.timetz(), timetz(18, 45, 3, 1234, tzinfo=met))
  
      def test_tz_aware_arithmetic(self):
--- 2151,2155 ----
          self.assertEqual(dt.date(), date(2002, 3, 4))
          self.assertEqual(dt.time(), time(18, 45, 3, 1234))
!         self.assertEqual(dt.timetz(), time(18, 45, 3, 1234, tzinfo=met))
  
      def test_tz_aware_arithmetic(self):
***************
*** 2138,2142 ****
          now = self.theclass.now()
          tz55 = FixedOffset(-330, "west 5:30")
!         timeaware = now.timetz().replace(tzinfo=tz55)
          nowaware = self.theclass.combine(now.date(), timeaware)
          self.failUnless(nowaware.tzinfo is tz55)
--- 2158,2162 ----
          now = self.theclass.now()
          tz55 = FixedOffset(-330, "west 5:30")
!         timeaware = now.time().replace(tzinfo=tz55)
          nowaware = self.theclass.combine(now.date(), timeaware)
          self.failUnless(nowaware.tzinfo is tz55)
***************
*** 2147,2151 ****
          self.assertRaises(TypeError, lambda: nowaware - now)
  
!         # And adding datetimetz's doesn't make sense, aware or not.
          self.assertRaises(TypeError, lambda: now + nowaware)
          self.assertRaises(TypeError, lambda: nowaware + now)
--- 2167,2171 ----
          self.assertRaises(TypeError, lambda: nowaware - now)
  
!         # And adding datetime's doesn't make sense, aware or not.
          self.assertRaises(TypeError, lambda: now + nowaware)
          self.assertRaises(TypeError, lambda: nowaware + now)
***************
*** 2258,2262 ****
  
      def test_tzinfo_timetuple(self):
!         # TestDateTime tested most of this.  datetimetz adds a twist to the
          # DST flag.
          class DST(tzinfo):
--- 2278,2282 ----
  
      def test_tzinfo_timetuple(self):
!         # TestDateTime tested most of this.  datetime adds a twist to the
          # DST flag.
          class DST(tzinfo):
***************
*** 2499,2503 ****
      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)
--- 2519,2523 ----
      def test_mixed_compare(self):
          t1 = datetime(1, 2, 3, 4, 5, 6, 7)
!         t2 = datetime(1, 2, 3, 4, 5, 6, 7)
          self.assertEqual(t1, t2)
          t2 = t2.replace(tzinfo=None)
***************
*** 2505,2512 ****
          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):
--- 2525,2533 ----
          t2 = t2.replace(tzinfo=FixedOffset(None, ""))
          self.assertEqual(t1, t2)
!         if CMP_BUG_FIXED:
!             t2 = t2.replace(tzinfo=FixedOffset(0, ""))
!             self.assertRaises(TypeError, lambda: t1 == t2)
  
!         # In datetime w/ identical tzinfo objects, utcoffset is ignored.
          class Varies(tzinfo):
              def __init__(self):
***************
*** 2597,2604 ****
  class TestTimezoneConversions(unittest.TestCase):
      # The DST switch times for 2002, in local time.
!     dston = datetimetz(2002, 4, 7, 2)
!     dstoff = datetimetz(2002, 10, 27, 2)
  
!     theclass = datetimetz
  
      # Check a time that's inside DST.
--- 2618,2625 ----
  class TestTimezoneConversions(unittest.TestCase):
      # The DST switch times for 2002, in local time.
!     dston = datetime(2002, 4, 7, 2)
!     dstoff = datetime(2002, 10, 27, 2)
  
!     theclass = datetime
  
      # Check a time that's inside DST.