/Lib/test/test_time.py

http://unladen-swallow.googlecode.com/ · Python · 226 lines · 156 code · 28 blank · 42 comment · 15 complexity · 2e84293bf5774e15134b4f14c5ecca60 MD5 · raw file

  1. from test import test_support
  2. import time
  3. import unittest
  4. class TimeTestCase(unittest.TestCase):
  5. def setUp(self):
  6. self.t = time.time()
  7. def test_data_attributes(self):
  8. time.altzone
  9. time.daylight
  10. time.timezone
  11. time.tzname
  12. def test_clock(self):
  13. time.clock()
  14. def test_conversions(self):
  15. self.assert_(time.ctime(self.t)
  16. == time.asctime(time.localtime(self.t)))
  17. self.assert_(long(time.mktime(time.localtime(self.t)))
  18. == long(self.t))
  19. def test_sleep(self):
  20. time.sleep(1.2)
  21. def test_strftime(self):
  22. tt = time.gmtime(self.t)
  23. for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
  24. 'j', 'm', 'M', 'p', 'S',
  25. 'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
  26. format = ' %' + directive
  27. try:
  28. time.strftime(format, tt)
  29. except ValueError:
  30. self.fail('conversion specifier: %r failed.' % format)
  31. def test_strftime_bounds_checking(self):
  32. # Make sure that strftime() checks the bounds of the various parts
  33. #of the time tuple (0 is valid for *all* values).
  34. # Check year [1900, max(int)]
  35. self.assertRaises(ValueError, time.strftime, '',
  36. (1899, 1, 1, 0, 0, 0, 0, 1, -1))
  37. if time.accept2dyear:
  38. self.assertRaises(ValueError, time.strftime, '',
  39. (-1, 1, 1, 0, 0, 0, 0, 1, -1))
  40. self.assertRaises(ValueError, time.strftime, '',
  41. (100, 1, 1, 0, 0, 0, 0, 1, -1))
  42. # Check month [1, 12] + zero support
  43. self.assertRaises(ValueError, time.strftime, '',
  44. (1900, -1, 1, 0, 0, 0, 0, 1, -1))
  45. self.assertRaises(ValueError, time.strftime, '',
  46. (1900, 13, 1, 0, 0, 0, 0, 1, -1))
  47. # Check day of month [1, 31] + zero support
  48. self.assertRaises(ValueError, time.strftime, '',
  49. (1900, 1, -1, 0, 0, 0, 0, 1, -1))
  50. self.assertRaises(ValueError, time.strftime, '',
  51. (1900, 1, 32, 0, 0, 0, 0, 1, -1))
  52. # Check hour [0, 23]
  53. self.assertRaises(ValueError, time.strftime, '',
  54. (1900, 1, 1, -1, 0, 0, 0, 1, -1))
  55. self.assertRaises(ValueError, time.strftime, '',
  56. (1900, 1, 1, 24, 0, 0, 0, 1, -1))
  57. # Check minute [0, 59]
  58. self.assertRaises(ValueError, time.strftime, '',
  59. (1900, 1, 1, 0, -1, 0, 0, 1, -1))
  60. self.assertRaises(ValueError, time.strftime, '',
  61. (1900, 1, 1, 0, 60, 0, 0, 1, -1))
  62. # Check second [0, 61]
  63. self.assertRaises(ValueError, time.strftime, '',
  64. (1900, 1, 1, 0, 0, -1, 0, 1, -1))
  65. # C99 only requires allowing for one leap second, but Python's docs say
  66. # allow two leap seconds (0..61)
  67. self.assertRaises(ValueError, time.strftime, '',
  68. (1900, 1, 1, 0, 0, 62, 0, 1, -1))
  69. # No check for upper-bound day of week;
  70. # value forced into range by a ``% 7`` calculation.
  71. # Start check at -2 since gettmarg() increments value before taking
  72. # modulo.
  73. self.assertRaises(ValueError, time.strftime, '',
  74. (1900, 1, 1, 0, 0, 0, -2, 1, -1))
  75. # Check day of the year [1, 366] + zero support
  76. self.assertRaises(ValueError, time.strftime, '',
  77. (1900, 1, 1, 0, 0, 0, 0, -1, -1))
  78. self.assertRaises(ValueError, time.strftime, '',
  79. (1900, 1, 1, 0, 0, 0, 0, 367, -1))
  80. # Check daylight savings flag [-1, 1]
  81. self.assertRaises(ValueError, time.strftime, '',
  82. (1900, 1, 1, 0, 0, 0, 0, 1, -2))
  83. self.assertRaises(ValueError, time.strftime, '',
  84. (1900, 1, 1, 0, 0, 0, 0, 1, 2))
  85. def test_default_values_for_zero(self):
  86. # Make sure that using all zeros uses the proper default values.
  87. # No test for daylight savings since strftime() does not change output
  88. # based on its value.
  89. expected = "2000 01 01 00 00 00 1 001"
  90. result = time.strftime("%Y %m %d %H %M %S %w %j", (0,)*9)
  91. self.assertEquals(expected, result)
  92. def test_strptime(self):
  93. # Should be able to go round-trip from strftime to strptime without
  94. # throwing an exception.
  95. tt = time.gmtime(self.t)
  96. for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
  97. 'j', 'm', 'M', 'p', 'S',
  98. 'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
  99. format = '%' + directive
  100. strf_output = time.strftime(format, tt)
  101. try:
  102. time.strptime(strf_output, format)
  103. except ValueError:
  104. self.fail("conversion specifier %r failed with '%s' input." %
  105. (format, strf_output))
  106. def test_asctime(self):
  107. time.asctime(time.gmtime(self.t))
  108. self.assertRaises(TypeError, time.asctime, 0)
  109. def test_tzset(self):
  110. if not hasattr(time, "tzset"):
  111. return # Can't test this; don't want the test suite to fail
  112. from os import environ
  113. # Epoch time of midnight Dec 25th 2002. Never DST in northern
  114. # hemisphere.
  115. xmas2002 = 1040774400.0
  116. # These formats are correct for 2002, and possibly future years
  117. # This format is the 'standard' as documented at:
  118. # http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html
  119. # They are also documented in the tzset(3) man page on most Unix
  120. # systems.
  121. eastern = 'EST+05EDT,M4.1.0,M10.5.0'
  122. victoria = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
  123. utc='UTC+0'
  124. org_TZ = environ.get('TZ',None)
  125. try:
  126. # Make sure we can switch to UTC time and results are correct
  127. # Note that unknown timezones default to UTC.
  128. # Note that altzone is undefined in UTC, as there is no DST
  129. environ['TZ'] = eastern
  130. time.tzset()
  131. environ['TZ'] = utc
  132. time.tzset()
  133. self.failUnlessEqual(
  134. time.gmtime(xmas2002), time.localtime(xmas2002)
  135. )
  136. self.failUnlessEqual(time.daylight, 0)
  137. self.failUnlessEqual(time.timezone, 0)
  138. self.failUnlessEqual(time.localtime(xmas2002).tm_isdst, 0)
  139. # Make sure we can switch to US/Eastern
  140. environ['TZ'] = eastern
  141. time.tzset()
  142. self.failIfEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
  143. self.failUnlessEqual(time.tzname, ('EST', 'EDT'))
  144. self.failUnlessEqual(len(time.tzname), 2)
  145. self.failUnlessEqual(time.daylight, 1)
  146. self.failUnlessEqual(time.timezone, 18000)
  147. self.failUnlessEqual(time.altzone, 14400)
  148. self.failUnlessEqual(time.localtime(xmas2002).tm_isdst, 0)
  149. self.failUnlessEqual(len(time.tzname), 2)
  150. # Now go to the southern hemisphere.
  151. environ['TZ'] = victoria
  152. time.tzset()
  153. self.failIfEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
  154. self.failUnless(time.tzname[0] == 'AEST', str(time.tzname[0]))
  155. self.failUnless(time.tzname[1] == 'AEDT', str(time.tzname[1]))
  156. self.failUnlessEqual(len(time.tzname), 2)
  157. self.failUnlessEqual(time.daylight, 1)
  158. self.failUnlessEqual(time.timezone, -36000)
  159. self.failUnlessEqual(time.altzone, -39600)
  160. self.failUnlessEqual(time.localtime(xmas2002).tm_isdst, 1)
  161. finally:
  162. # Repair TZ environment variable in case any other tests
  163. # rely on it.
  164. if org_TZ is not None:
  165. environ['TZ'] = org_TZ
  166. elif environ.has_key('TZ'):
  167. del environ['TZ']
  168. time.tzset()
  169. def test_insane_timestamps(self):
  170. # It's possible that some platform maps time_t to double,
  171. # and that this test will fail there. This test should
  172. # exempt such platforms (provided they return reasonable
  173. # results!).
  174. for func in time.ctime, time.gmtime, time.localtime:
  175. for unreasonable in -1e200, 1e200:
  176. self.assertRaises(ValueError, func, unreasonable)
  177. def test_ctime_without_arg(self):
  178. # Not sure how to check the values, since the clock could tick
  179. # at any time. Make sure these are at least accepted and
  180. # don't raise errors.
  181. time.ctime()
  182. time.ctime(None)
  183. def test_gmtime_without_arg(self):
  184. gt0 = time.gmtime()
  185. gt1 = time.gmtime(None)
  186. t0 = time.mktime(gt0)
  187. t1 = time.mktime(gt1)
  188. self.assert_(0 <= (t1-t0) < 0.2)
  189. def test_localtime_without_arg(self):
  190. lt0 = time.localtime()
  191. lt1 = time.localtime(None)
  192. t0 = time.mktime(lt0)
  193. t1 = time.mktime(lt1)
  194. self.assert_(0 <= (t1-t0) < 0.2)
  195. def test_main():
  196. test_support.run_unittest(TimeTestCase)
  197. if __name__ == "__main__":
  198. test_main()