1 import copy
2 import os
3 import pickle
4 import time
5 import unittest
6
7
8 class ESC[4;38;5;81mStructSeqTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
9
10 def test_tuple(self):
11 t = time.gmtime()
12 self.assertIsInstance(t, tuple)
13 astuple = tuple(t)
14 self.assertEqual(len(t), len(astuple))
15 self.assertEqual(t, astuple)
16
17 # Check that slicing works the same way; at one point, slicing t[i:j] with
18 # 0 < i < j could produce NULLs in the result.
19 for i in range(-len(t), len(t)):
20 self.assertEqual(t[i:], astuple[i:])
21 for j in range(-len(t), len(t)):
22 self.assertEqual(t[i:j], astuple[i:j])
23
24 for j in range(-len(t), len(t)):
25 self.assertEqual(t[:j], astuple[:j])
26
27 self.assertRaises(IndexError, t.__getitem__, -len(t)-1)
28 self.assertRaises(IndexError, t.__getitem__, len(t))
29 for i in range(-len(t), len(t)-1):
30 self.assertEqual(t[i], astuple[i])
31
32 def test_repr(self):
33 t = time.gmtime()
34 self.assertTrue(repr(t))
35 t = time.gmtime(0)
36 self.assertEqual(repr(t),
37 "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, "
38 "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)")
39 # os.stat() gives a complicated struct sequence.
40 st = os.stat(__file__)
41 rep = repr(st)
42 self.assertTrue(rep.startswith("os.stat_result"))
43 self.assertIn("st_mode=", rep)
44 self.assertIn("st_ino=", rep)
45 self.assertIn("st_dev=", rep)
46
47 def test_concat(self):
48 t1 = time.gmtime()
49 t2 = t1 + tuple(t1)
50 for i in range(len(t1)):
51 self.assertEqual(t2[i], t2[i+len(t1)])
52
53 def test_repeat(self):
54 t1 = time.gmtime()
55 t2 = 3 * t1
56 for i in range(len(t1)):
57 self.assertEqual(t2[i], t2[i+len(t1)])
58 self.assertEqual(t2[i], t2[i+2*len(t1)])
59
60 def test_contains(self):
61 t1 = time.gmtime()
62 for item in t1:
63 self.assertIn(item, t1)
64 self.assertNotIn(-42, t1)
65
66 def test_hash(self):
67 t1 = time.gmtime()
68 self.assertEqual(hash(t1), hash(tuple(t1)))
69
70 def test_cmp(self):
71 t1 = time.gmtime()
72 t2 = type(t1)(t1)
73 self.assertEqual(t1, t2)
74 self.assertTrue(not (t1 < t2))
75 self.assertTrue(t1 <= t2)
76 self.assertTrue(not (t1 > t2))
77 self.assertTrue(t1 >= t2)
78 self.assertTrue(not (t1 != t2))
79
80 def test_fields(self):
81 t = time.gmtime()
82 self.assertEqual(len(t), t.n_sequence_fields)
83 self.assertEqual(t.n_unnamed_fields, 0)
84 self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
85
86 def test_constructor(self):
87 t = time.struct_time
88
89 self.assertRaises(TypeError, t)
90 self.assertRaises(TypeError, t, None)
91 self.assertRaises(TypeError, t, "123")
92 self.assertRaises(TypeError, t, "123", dict={})
93 self.assertRaises(TypeError, t, "123456789", dict=None)
94
95 s = "123456789"
96 self.assertEqual("".join(t(s)), s)
97
98 def test_eviltuple(self):
99 class ESC[4;38;5;81mExc(ESC[4;38;5;149mException):
100 pass
101
102 # Devious code could crash structseqs' constructors
103 class ESC[4;38;5;81mC:
104 def __getitem__(self, i):
105 raise Exc
106 def __len__(self):
107 return 9
108
109 self.assertRaises(Exc, time.struct_time, C())
110
111 def test_pickling(self):
112 t = time.gmtime()
113 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
114 p = pickle.dumps(t, proto)
115 t2 = pickle.loads(p)
116 self.assertEqual(t2.__class__, t.__class__)
117 self.assertEqual(t2, t)
118 self.assertEqual(t2.tm_year, t.tm_year)
119 self.assertEqual(t2.tm_zone, t.tm_zone)
120
121 def test_pickling_with_unnamed_fields(self):
122 assert os.stat_result.n_unnamed_fields > 0
123
124 r = os.stat_result(range(os.stat_result.n_sequence_fields),
125 {'st_atime': 1.0, 'st_atime_ns': 2.0})
126 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
127 p = pickle.dumps(r, proto)
128 r2 = pickle.loads(p)
129 self.assertEqual(r2.__class__, r.__class__)
130 self.assertEqual(r2, r)
131 self.assertEqual(r2.st_mode, r.st_mode)
132 self.assertEqual(r2.st_atime, r.st_atime)
133 self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
134
135 def test_copying(self):
136 n_fields = time.struct_time.n_fields
137 t = time.struct_time([[i] for i in range(n_fields)])
138
139 t2 = copy.copy(t)
140 self.assertEqual(t2.__class__, t.__class__)
141 self.assertEqual(t2, t)
142 self.assertEqual(t2.tm_year, t.tm_year)
143 self.assertEqual(t2.tm_zone, t.tm_zone)
144 self.assertIs(t2[0], t[0])
145 self.assertIs(t2.tm_year, t.tm_year)
146
147 t3 = copy.deepcopy(t)
148 self.assertEqual(t3.__class__, t.__class__)
149 self.assertEqual(t3, t)
150 self.assertEqual(t3.tm_year, t.tm_year)
151 self.assertEqual(t3.tm_zone, t.tm_zone)
152 self.assertIsNot(t3[0], t[0])
153 self.assertIsNot(t3.tm_year, t.tm_year)
154
155 def test_copying_with_unnamed_fields(self):
156 assert os.stat_result.n_unnamed_fields > 0
157
158 n_sequence_fields = os.stat_result.n_sequence_fields
159 r = os.stat_result([[i] for i in range(n_sequence_fields)],
160 {'st_atime': [1.0], 'st_atime_ns': [2.0]})
161
162 r2 = copy.copy(r)
163 self.assertEqual(r2.__class__, r.__class__)
164 self.assertEqual(r2, r)
165 self.assertEqual(r2.st_mode, r.st_mode)
166 self.assertEqual(r2.st_atime, r.st_atime)
167 self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
168 self.assertIs(r2[0], r[0])
169 self.assertIs(r2.st_mode, r.st_mode)
170 self.assertIs(r2.st_atime, r.st_atime)
171 self.assertIs(r2.st_atime_ns, r.st_atime_ns)
172
173 r3 = copy.deepcopy(r)
174 self.assertEqual(r3.__class__, r.__class__)
175 self.assertEqual(r3, r)
176 self.assertEqual(r3.st_mode, r.st_mode)
177 self.assertEqual(r3.st_atime, r.st_atime)
178 self.assertEqual(r3.st_atime_ns, r.st_atime_ns)
179 self.assertIsNot(r3[0], r[0])
180 self.assertIsNot(r3.st_mode, r.st_mode)
181 self.assertIsNot(r3.st_atime, r.st_atime)
182 self.assertIsNot(r3.st_atime_ns, r.st_atime_ns)
183
184 def test_extended_getslice(self):
185 # Test extended slicing by comparing with list slicing.
186 t = time.gmtime()
187 L = list(t)
188 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
189 for start in indices:
190 for stop in indices:
191 # Skip step 0 (invalid)
192 for step in indices[1:]:
193 self.assertEqual(list(t[start:stop:step]),
194 L[start:stop:step])
195
196 def test_match_args(self):
197 expected_args = ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min',
198 'tm_sec', 'tm_wday', 'tm_yday', 'tm_isdst')
199 self.assertEqual(time.struct_time.__match_args__, expected_args)
200
201 def test_match_args_with_unnamed_fields(self):
202 expected_args = ('st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid',
203 'st_gid', 'st_size')
204 self.assertEqual(os.stat_result.n_unnamed_fields, 3)
205 self.assertEqual(os.stat_result.__match_args__, expected_args)
206
207
208 if __name__ == "__main__":
209 unittest.main()