blob: 36630a17367fff4dfcbdd9d483665712d1bd0977 [file] [log] [blame]
Benjamin Petersond02441e2010-07-08 22:33:03 +00001import os
2import time
Raymond Hettingerf9f4c692003-08-30 22:54:55 +00003import unittest
Tim Petersc2fe6182001-10-30 23:20:46 +00004
Tim Petersc2fe6182001-10-30 23:20:46 +00005
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 Peterson8b0ef212010-07-09 01:58:26 +000010 self.assertIsInstance(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)")
Benjamin Petersond02441e2010-07-08 22:33:03 +000037 # os.stat() gives a complicated struct sequence.
38 st = os.stat(__file__)
39 rep = repr(st)
Christian Heimesc1df2722013-10-12 01:38:52 +020040 self.assertTrue(rep.startswith("os.stat_result"))
Benjamin Petersond02441e2010-07-08 22:33:03 +000041 self.assertIn("st_mode=", rep)
42 self.assertIn("st_ino=", rep)
43 self.assertIn("st_dev=", rep)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000044
45 def test_concat(self):
46 t1 = time.gmtime()
47 t2 = t1 + tuple(t1)
Guido van Rossum805365e2007-05-07 22:24:25 +000048 for i in range(len(t1)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000049 self.assertEqual(t2[i], t2[i+len(t1)])
50
51 def test_repeat(self):
52 t1 = time.gmtime()
53 t2 = 3 * t1
Guido van Rossum805365e2007-05-07 22:24:25 +000054 for i in range(len(t1)):
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000055 self.assertEqual(t2[i], t2[i+len(t1)])
56 self.assertEqual(t2[i], t2[i+2*len(t1)])
57
58 def test_contains(self):
59 t1 = time.gmtime()
60 for item in t1:
Benjamin Peterson577473f2010-01-19 00:09:57 +000061 self.assertIn(item, t1)
62 self.assertNotIn(-42, t1)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000063
64 def test_hash(self):
65 t1 = time.gmtime()
66 self.assertEqual(hash(t1), hash(tuple(t1)))
67
68 def test_cmp(self):
69 t1 = time.gmtime()
70 t2 = type(t1)(t1)
71 self.assertEqual(t1, t2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000072 self.assertTrue(not (t1 < t2))
73 self.assertTrue(t1 <= t2)
74 self.assertTrue(not (t1 > t2))
75 self.assertTrue(t1 >= t2)
76 self.assertTrue(not (t1 != t2))
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000077
78 def test_fields(self):
79 t = time.gmtime()
Alexander Belopolskyc142bba2012-06-13 22:15:26 -040080 self.assertEqual(len(t), t.n_sequence_fields)
81 self.assertEqual(t.n_unnamed_fields, 0)
82 self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +000083
84 def test_constructor(self):
85 t = time.struct_time
86
87 self.assertRaises(TypeError, t)
88 self.assertRaises(TypeError, t, None)
89 self.assertRaises(TypeError, t, "123")
90 self.assertRaises(TypeError, t, "123", dict={})
91 self.assertRaises(TypeError, t, "123456789", dict=None)
92
93 s = "123456789"
94 self.assertEqual("".join(t(s)), s)
95
96 def test_eviltuple(self):
97 class Exc(Exception):
98 pass
99
Martin Pantereb995702016-07-28 01:11:04 +0000100 # Devious code could crash structseqs' constructors
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000101 class C:
102 def __getitem__(self, i):
103 raise Exc
104 def __len__(self):
105 return 9
106
107 self.assertRaises(Exc, time.struct_time, C())
108
109 def test_reduce(self):
110 t = time.gmtime()
111 x = t.__reduce__()
112
Thomas Woutersed03b412007-08-28 21:37:11 +0000113 def test_extended_getslice(self):
114 # Test extended slicing by comparing with list slicing.
115 t = time.gmtime()
116 L = list(t)
117 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
118 for start in indices:
119 for stop in indices:
120 # Skip step 0 (invalid)
121 for step in indices[1:]:
122 self.assertEqual(list(t[start:stop:step]),
123 L[start:stop:step])
124
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000125if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500126 unittest.main()