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