[Python-checkins] python/dist/src/Lib/test test_datetime.py,1.5,1.6

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Sat, 21 Dec 2002 19:43:41 -0800


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

Modified Files:
	test_datetime.py 
Log Message:
Implemented a Wiki suggestion:

{timetz,datetimetz}.{utcoffset,dst}() now return a timedelta (or None)
instead of an int (or None).

tzinfo.{utcoffset,dst)() can now return a timedelta (or an int, or None).

Curiously, this was much easier to do in the C implementation than in the
Python implementation (which lives in the Zope3 code tree) -- the C code
already had lots of hair to extract C ints from offset objects, and used
C ints internally.


Index: test_datetime.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_datetime.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** test_datetime.py	21 Dec 2002 17:44:07 -0000	1.5
--- test_datetime.py	22 Dec 2002 03:43:39 -0000	1.6
***************
*** 1459,1483 ****
          self.failUnless(not cls())
  
! 
! class TestTimeTZ(TestTime):
! 
!     theclass = timetz
! 
!     def test_empty(self):
!         t = self.theclass()
!         self.assertEqual(t.hour, 0)
!         self.assertEqual(t.minute, 0)
!         self.assertEqual(t.second, 0)
!         self.assertEqual(t.microsecond, 0)
!         self.failUnless(t.tzinfo is None)
  
      def test_bad_tzinfo_classes(self):
!         tz = self.theclass
!         self.assertRaises(TypeError, tz, tzinfo=12)
  
          class NiceTry(object):
              def __init__(self): pass
              def utcoffset(self, dt): pass
!         self.assertRaises(TypeError, tz, tzinfo=NiceTry)
  
          class BetterTry(tzinfo):
--- 1459,1475 ----
          self.failUnless(not cls())
  
! # 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_bad_tzinfo_classes(self):
!         cls = self.theclass
!         self.assertRaises(TypeError, cls, 1, 1, 1, tzinfo=12)
  
          class NiceTry(object):
              def __init__(self): pass
              def utcoffset(self, dt): pass
!         self.assertRaises(TypeError, cls, 1, 1, 1, tzinfo=NiceTry)
  
          class BetterTry(tzinfo):
***************
*** 1485,1491 ****
              def utcoffset(self, dt): pass
          b = BetterTry()
!         t = tz(tzinfo=b)
          self.failUnless(t.tzinfo is b)
  
      def test_zones(self):
          est = FixedOffset(-300, "EST", 1)
--- 1477,1576 ----
              def utcoffset(self, dt): pass
          b = BetterTry()
!         t = cls(1, 1, 1, tzinfo=b)
          self.failUnless(t.tzinfo is b)
  
+     def test_utc_offset_out_of_bounds(self):
+         class Edgy(tzinfo):
+             def __init__(self, offset):
+                 self.offset = offset
+             def utcoffset(self, dt):
+                 return self.offset
+ 
+         cls = self.theclass
+         for offset, legit in ((-1440, False),
+                               (-1439, True),
+                               (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)
+             else:
+                 self.assertRaises(ValueError, str, t)
+ 
+     def test_tzinfo_classes(self):
+         cls = self.theclass
+         class C1(tzinfo):
+             def utcoffset(self, dt): return None
+             def dst(self, dt): return None
+             def tzname(self, dt): return None
+         for t in (cls(1, 1, 1),
+                   cls(1, 1, 1, tzinfo=None),
+                   cls(1, 1, 1, tzinfo=C1())):
+             self.failUnless(t.utcoffset() is None)
+             self.failUnless(t.dst() is None)
+             self.failUnless(t.tzname() is None)
+ 
+         class C2(tzinfo):
+             def utcoffset(self, dt): return -1439
+             def dst(self, dt): return 1439
+             def tzname(self, dt): return "aname"
+         class C3(tzinfo):
+             def utcoffset(self, dt): return timedelta(minutes=-1439)
+             def dst(self, dt): return timedelta(minutes=1439)
+             def tzname(self, dt): return "aname"
+         for t in cls(1, 1, 1, tzinfo=C2()), cls(1, 1, 1, tzinfo=C3()):
+             self.assertEqual(t.utcoffset(), timedelta(minutes=-1439))
+             self.assertEqual(t.dst(), timedelta(minutes=1439))
+             self.assertEqual(t.tzname(), "aname")
+ 
+         # Wrong types.
+         class C4(tzinfo):
+             def utcoffset(self, dt): return "aname"
+             def dst(self, dt): return ()
+             def tzname(self, dt): return 0
+         t = cls(1, 1, 1, tzinfo=C4())
+         self.assertRaises(TypeError, t.utcoffset)
+         self.assertRaises(TypeError, t.dst)
+         self.assertRaises(TypeError, t.tzname)
+ 
+         # Offset out of range.
+         class C5(tzinfo):
+             def utcoffset(self, dt): return -1440
+             def dst(self, dt): return 1440
+         class C6(tzinfo):
+             def utcoffset(self, dt): return timedelta(hours=-24)
+             def dst(self, dt): return timedelta(hours=24)
+         for t in cls(1, 1, 1, tzinfo=C5()), cls(1, 1, 1, tzinfo=C6()):
+             self.assertRaises(ValueError, t.utcoffset)
+             self.assertRaises(ValueError, t.dst)
+ 
+         # Not a whole number of minutes.
+         class C7(tzinfo):
+             def utcoffset(self, dt): return timedelta(seconds=61)
+             def dst(self, dt): return timedelta(microseconds=-81)
+         t = cls(1, 1, 1, tzinfo=C7())
+         self.assertRaises(ValueError, t.utcoffset)
+         self.assertRaises(ValueError, t.dst)
+ 
+ 
+ class TestTimeTZ(TestTime, TZInfoBase):
+     theclass = timetz
+ 
+     def test_empty(self):
+         t = self.theclass()
+         self.assertEqual(t.hour, 0)
+         self.assertEqual(t.minute, 0)
+         self.assertEqual(t.second, 0)
+         self.assertEqual(t.microsecond, 0)
+         self.failUnless(t.tzinfo is None)
+ 
      def test_zones(self):
          est = FixedOffset(-300, "EST", 1)
***************
*** 1504,1510 ****
          self.assertEqual(t5.tzinfo, utc)
  
!         self.assertEqual(t1.utcoffset(), -300)
!         self.assertEqual(t2.utcoffset(), 0)
!         self.assertEqual(t3.utcoffset(), 60)
          self.failUnless(t4.utcoffset() is None)
          self.assertRaises(TypeError, t1.utcoffset, "no args")
--- 1589,1595 ----
          self.assertEqual(t5.tzinfo, utc)
  
!         self.assertEqual(t1.utcoffset(), timedelta(minutes=-300))
!         self.assertEqual(t2.utcoffset(), timedelta(minutes=0))
!         self.assertEqual(t3.utcoffset(), timedelta(minutes=60))
          self.failUnless(t4.utcoffset() is None)
          self.assertRaises(TypeError, t1.utcoffset, "no args")
***************
*** 1516,1522 ****
          self.assertRaises(TypeError, t1.tzname, "no args")
  
!         self.assertEqual(t1.dst(), 1)
!         self.assertEqual(t2.dst(), -2)
!         self.assertEqual(t3.dst(), 3)
          self.failUnless(t4.dst() is None)
          self.assertRaises(TypeError, t1.dst, "no args")
--- 1601,1607 ----
          self.assertRaises(TypeError, t1.tzname, "no args")
  
!         self.assertEqual(t1.dst(), timedelta(minutes=1))
!         self.assertEqual(t2.dst(), timedelta(minutes=-2))
!         self.assertEqual(t3.dst(), timedelta(minutes=3))
          self.failUnless(t4.dst() is None)
          self.assertRaises(TypeError, t1.dst, "no args")
***************
*** 1579,1602 ****
          self.assertEqual(hash(t1), hash(t2))
  
-     def test_utc_offset_out_of_bounds(self):
-         class Edgy(tzinfo):
-             def __init__(self, offset):
-                 self.offset = offset
-             def utcoffset(self, dt):
-                 return self.offset
- 
-         for offset, legit in ((-1440, False),
-                               (-1439, True),
-                               (1439, True),
-                               (1440, False)):
-             t = timetz(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)
-                 self.assertEqual(str(t), "01:02:03" + tag)
-             else:
-                 self.assertRaises(ValueError, str, t)
- 
      def test_pickling(self):
          import pickle, cPickle
--- 1664,1667 ----
***************
*** 1624,1628 ****
          self.assertEqual(orig, derived)
          self.failUnless(isinstance(derived.tzinfo, PicklableFixedOffset))
!         self.assertEqual(derived.utcoffset(), -300)
          self.assertEqual(derived.tzname(), 'cookie')
  
--- 1689,1693 ----
          self.assertEqual(orig, derived)
          self.failUnless(isinstance(derived.tzinfo, PicklableFixedOffset))
!         self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
          self.assertEqual(derived.tzname(), 'cookie')
  
***************
*** 1634,1638 ****
                  self.failUnless(isinstance(derived.tzinfo,
                                  PicklableFixedOffset))
!                 self.assertEqual(derived.utcoffset(), -300)
                  self.assertEqual(derived.tzname(), 'cookie')
  
--- 1699,1703 ----
                  self.failUnless(isinstance(derived.tzinfo,
                                  PicklableFixedOffset))
!                 self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
                  self.assertEqual(derived.tzname(), 'cookie')
  
***************
*** 1665,1670 ****
          self.assertRaises(ValueError, lambda: bool(t))
  
! class TestDateTimeTZ(TestDateTime):
! 
      theclass = datetimetz
  
--- 1730,1734 ----
          self.assertRaises(ValueError, lambda: bool(t))
  
! class TestDateTimeTZ(TestDateTime, TZInfoBase):
      theclass = datetimetz
  
***************
*** 1745,1764 ****
          self.assertRaises(ValueError, lambda: t1 == t1)
  
-     def test_bad_tzinfo_classes(self):
-         tz = self.theclass
-         self.assertRaises(TypeError, tz, 1, 2, 3, tzinfo=12)
- 
-         class NiceTry(object):
-             def __init__(self): pass
-             def utcoffset(self, dt): pass
-         self.assertRaises(TypeError, tz, 1, 2, 3, tzinfo=NiceTry)
- 
-         class BetterTry(tzinfo):
-             def __init__(self): pass
-             def utcoffset(self, dt): pass
-         b = BetterTry()
-         t = tz(1, 2, 3, tzinfo=b)
-         self.failUnless(t.tzinfo is b)
- 
      def test_pickling(self):
          import pickle, cPickle
--- 1809,1812 ----
***************
*** 1786,1790 ****
          self.assertEqual(orig, derived)
          self.failUnless(isinstance(derived.tzinfo, PicklableFixedOffset))
!         self.assertEqual(derived.utcoffset(), -300)
          self.assertEqual(derived.tzname(), 'cookie')
  
--- 1834,1838 ----
          self.assertEqual(orig, derived)
          self.failUnless(isinstance(derived.tzinfo, PicklableFixedOffset))
!         self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
          self.assertEqual(derived.tzname(), 'cookie')
  
***************
*** 1796,1800 ****
                  self.failUnless(isinstance(derived.tzinfo,
                                  PicklableFixedOffset))
!                 self.assertEqual(derived.utcoffset(), -300)
                  self.assertEqual(derived.tzname(), 'cookie')
  
--- 1844,1848 ----
                  self.failUnless(isinstance(derived.tzinfo,
                                  PicklableFixedOffset))
!                 self.assertEqual(derived.utcoffset(), timedelta(minutes=-300))
                  self.assertEqual(derived.tzname(), 'cookie')
  
***************
*** 1823,1829 ****
          self.assertEqual(t2.tzinfo, utc)
          self.assertEqual(t3.tzinfo, met)
!         self.assertEqual(t1.utcoffset(), -300)
!         self.assertEqual(t2.utcoffset(), 0)
!         self.assertEqual(t3.utcoffset(), 60)
          self.assertEqual(t1.tzname(), "EST")
          self.assertEqual(t2.tzname(), "UTC")
--- 1871,1877 ----
          self.assertEqual(t2.tzinfo, utc)
          self.assertEqual(t3.tzinfo, met)
!         self.assertEqual(t1.utcoffset(), timedelta(minutes=-300))
!         self.assertEqual(t2.utcoffset(), timedelta(minutes=0))
!         self.assertEqual(t3.utcoffset(), timedelta(minutes=60))
          self.assertEqual(t1.tzname(), "EST")
          self.assertEqual(t2.tzname(), "UTC")
***************
*** 1915,1920 ****
          #            (nowawareplus offset - nowaware offset) =
          #            -delta + nowawareplus offset - nowaware offset
!         expected = timedelta(minutes=nowawareplus.utcoffset() -
!                                      nowaware.utcoffset()) - delta
          self.assertEqual(got, expected)
  
--- 1963,1967 ----
          #            (nowawareplus offset - nowaware offset) =
          #            -delta + nowawareplus offset - nowaware offset
!         expected = nowawareplus.utcoffset() - nowaware.utcoffset() - delta
          self.assertEqual(got, expected)
  
***************
*** 1936,1940 ****
          again = meth(tzinfo=off42)
          self.failUnless(another.tzinfo is again.tzinfo)
!         self.assertEqual(another.utcoffset(), 42)
          # Bad argument with and w/o naming the keyword.
          self.assertRaises(TypeError, meth, 16)
--- 1983,1987 ----
          again = meth(tzinfo=off42)
          self.failUnless(another.tzinfo is again.tzinfo)
!         self.assertEqual(another.utcoffset(), timedelta(minutes=42))
          # Bad argument with and w/o naming the keyword.
          self.assertRaises(TypeError, meth, 16)
***************
*** 1956,1960 ****
          again = meth(ts, tzinfo=off42)
          self.failUnless(another.tzinfo is again.tzinfo)
!         self.assertEqual(another.utcoffset(), 42)
          # Bad argument with and w/o naming the keyword.
          self.assertRaises(TypeError, meth, ts, 16)
--- 2003,2007 ----
          again = meth(ts, tzinfo=off42)
          self.failUnless(another.tzinfo is again.tzinfo)
!         self.assertEqual(another.utcoffset(), timedelta(minutes=42))
          # Bad argument with and w/o naming the keyword.
          self.assertRaises(TypeError, meth, ts, 16)