blob: f01bc44b05f3d1f8c932dd920273bd86db063319 [file] [log] [blame]
Raymond Hettingerf9f4c692003-08-30 22:54:55 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Tim Petersc2fe6182001-10-30 23:20:46 +00003
4import time
5
Raymond Hettingerf9f4c692003-08-30 22:54:55 +00006class StructSeqTest(unittest.TestCase):
Tim Petersc2fe6182001-10-30 23:20:46 +00007
Raymond Hettingerf9f4c692003-08-30 22:54:55 +00008 def test_tuple(self):
9 t = time.gmtime()
Benjamin Peterson8c567c52010-07-08 22:16:05 +000010 assert isinstance(t, tuple)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000011 astuple = tuple(t)
12 self.assertEqual(len(t), len(astuple))
13 self.assertEqual(t, astuple)
Tim Petersc2fe6182001-10-30 23:20:46 +000014
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000015 # Check that slicing works the same way; at one point, slicing t[i:j] with
16 # 0 < i < j could produce NULLs in the result.
Guido van Rossum805365e2007-05-07 22:24:25 +000017 for i in range(-len(t), len(t)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000018 self.assertEqual(t[i:], astuple[i:])
Guido van Rossum805365e2007-05-07 22:24:25 +000019 for j in range(-len(t), len(t)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000020 self.assertEqual(t[i:j], astuple[i:j])
Michael W. Hudson02b28ec2002-03-06 17:18:15 +000021
Guido van Rossum805365e2007-05-07 22:24:25 +000022 for j in range(-len(t), len(t)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000023 self.assertEqual(t[:j], astuple[:j])
Michael W. Hudson02b28ec2002-03-06 17:18:15 +000024
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000025 self.assertRaises(IndexError, t.__getitem__, -len(t)-1)
26 self.assertRaises(IndexError, t.__getitem__, len(t))
Guido van Rossum805365e2007-05-07 22:24:25 +000027 for i in range(-len(t), len(t)-1):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000028 self.assertEqual(t[i], astuple[i])
29
30 def test_repr(self):
31 t = time.gmtime()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000032 self.assertTrue(repr(t))
Christian Heimesd32ed6f2008-01-14 18:49:24 +000033 t = time.gmtime(0)
34 self.assertEqual(repr(t),
35 "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, "
36 "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)")
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000037
38 def test_concat(self):
39 t1 = time.gmtime()
40 t2 = t1 + tuple(t1)
Guido van Rossum805365e2007-05-07 22:24:25 +000041 for i in range(len(t1)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000042 self.assertEqual(t2[i], t2[i+len(t1)])
43
44 def test_repeat(self):
45 t1 = time.gmtime()
46 t2 = 3 * t1
Guido van Rossum805365e2007-05-07 22:24:25 +000047 for i in range(len(t1)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000048 self.assertEqual(t2[i], t2[i+len(t1)])
49 self.assertEqual(t2[i], t2[i+2*len(t1)])
50
51 def test_contains(self):
52 t1 = time.gmtime()
53 for item in t1:
Benjamin Peterson577473f2010-01-19 00:09:57 +000054 self.assertIn(item, t1)
55 self.assertNotIn(-42, t1)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000056
57 def test_hash(self):
58 t1 = time.gmtime()
59 self.assertEqual(hash(t1), hash(tuple(t1)))
60
61 def test_cmp(self):
62 t1 = time.gmtime()
63 t2 = type(t1)(t1)
64 self.assertEqual(t1, t2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000065 self.assertTrue(not (t1 < t2))
66 self.assertTrue(t1 <= t2)
67 self.assertTrue(not (t1 > t2))
68 self.assertTrue(t1 >= t2)
69 self.assertTrue(not (t1 != t2))
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000070
71 def test_fields(self):
72 t = time.gmtime()
73 self.assertEqual(len(t), t.n_fields)
74 self.assertEqual(t.n_fields, t.n_sequence_fields+t.n_unnamed_fields)
75
76 def test_constructor(self):
77 t = time.struct_time
78
79 self.assertRaises(TypeError, t)
80 self.assertRaises(TypeError, t, None)
81 self.assertRaises(TypeError, t, "123")
82 self.assertRaises(TypeError, t, "123", dict={})
83 self.assertRaises(TypeError, t, "123456789", dict=None)
84
85 s = "123456789"
86 self.assertEqual("".join(t(s)), s)
87
88 def test_eviltuple(self):
89 class Exc(Exception):
90 pass
91
92 # Devious code could crash structseqs' contructors
93 class C:
94 def __getitem__(self, i):
95 raise Exc
96 def __len__(self):
97 return 9
98
99 self.assertRaises(Exc, time.struct_time, C())
100
101 def test_reduce(self):
102 t = time.gmtime()
103 x = t.__reduce__()
104
Thomas Woutersed03b412007-08-28 21:37:11 +0000105 def test_extended_getslice(self):
106 # Test extended slicing by comparing with list slicing.
107 t = time.gmtime()
108 L = list(t)
109 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
110 for start in indices:
111 for stop in indices:
112 # Skip step 0 (invalid)
113 for step in indices[1:]:
114 self.assertEqual(list(t[start:stop:step]),
115 L[start:stop:step])
116
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000117def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000118 support.run_unittest(StructSeqTest)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000119
120if __name__ == "__main__":
121 test_main()