17db96d56Sopenharmony_ciimport os 27db96d56Sopenharmony_ciimport time 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciclass StructSeqTest(unittest.TestCase): 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci def test_tuple(self): 97db96d56Sopenharmony_ci t = time.gmtime() 107db96d56Sopenharmony_ci self.assertIsInstance(t, tuple) 117db96d56Sopenharmony_ci astuple = tuple(t) 127db96d56Sopenharmony_ci self.assertEqual(len(t), len(astuple)) 137db96d56Sopenharmony_ci self.assertEqual(t, astuple) 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci # Check that slicing works the same way; at one point, slicing t[i:j] with 167db96d56Sopenharmony_ci # 0 < i < j could produce NULLs in the result. 177db96d56Sopenharmony_ci for i in range(-len(t), len(t)): 187db96d56Sopenharmony_ci self.assertEqual(t[i:], astuple[i:]) 197db96d56Sopenharmony_ci for j in range(-len(t), len(t)): 207db96d56Sopenharmony_ci self.assertEqual(t[i:j], astuple[i:j]) 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci for j in range(-len(t), len(t)): 237db96d56Sopenharmony_ci self.assertEqual(t[:j], astuple[:j]) 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci self.assertRaises(IndexError, t.__getitem__, -len(t)-1) 267db96d56Sopenharmony_ci self.assertRaises(IndexError, t.__getitem__, len(t)) 277db96d56Sopenharmony_ci for i in range(-len(t), len(t)-1): 287db96d56Sopenharmony_ci self.assertEqual(t[i], astuple[i]) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci def test_repr(self): 317db96d56Sopenharmony_ci t = time.gmtime() 327db96d56Sopenharmony_ci self.assertTrue(repr(t)) 337db96d56Sopenharmony_ci t = time.gmtime(0) 347db96d56Sopenharmony_ci self.assertEqual(repr(t), 357db96d56Sopenharmony_ci "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, " 367db96d56Sopenharmony_ci "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)") 377db96d56Sopenharmony_ci # os.stat() gives a complicated struct sequence. 387db96d56Sopenharmony_ci st = os.stat(__file__) 397db96d56Sopenharmony_ci rep = repr(st) 407db96d56Sopenharmony_ci self.assertTrue(rep.startswith("os.stat_result")) 417db96d56Sopenharmony_ci self.assertIn("st_mode=", rep) 427db96d56Sopenharmony_ci self.assertIn("st_ino=", rep) 437db96d56Sopenharmony_ci self.assertIn("st_dev=", rep) 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci def test_concat(self): 467db96d56Sopenharmony_ci t1 = time.gmtime() 477db96d56Sopenharmony_ci t2 = t1 + tuple(t1) 487db96d56Sopenharmony_ci for i in range(len(t1)): 497db96d56Sopenharmony_ci self.assertEqual(t2[i], t2[i+len(t1)]) 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci def test_repeat(self): 527db96d56Sopenharmony_ci t1 = time.gmtime() 537db96d56Sopenharmony_ci t2 = 3 * t1 547db96d56Sopenharmony_ci for i in range(len(t1)): 557db96d56Sopenharmony_ci self.assertEqual(t2[i], t2[i+len(t1)]) 567db96d56Sopenharmony_ci self.assertEqual(t2[i], t2[i+2*len(t1)]) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def test_contains(self): 597db96d56Sopenharmony_ci t1 = time.gmtime() 607db96d56Sopenharmony_ci for item in t1: 617db96d56Sopenharmony_ci self.assertIn(item, t1) 627db96d56Sopenharmony_ci self.assertNotIn(-42, t1) 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci def test_hash(self): 657db96d56Sopenharmony_ci t1 = time.gmtime() 667db96d56Sopenharmony_ci self.assertEqual(hash(t1), hash(tuple(t1))) 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci def test_cmp(self): 697db96d56Sopenharmony_ci t1 = time.gmtime() 707db96d56Sopenharmony_ci t2 = type(t1)(t1) 717db96d56Sopenharmony_ci self.assertEqual(t1, t2) 727db96d56Sopenharmony_ci self.assertTrue(not (t1 < t2)) 737db96d56Sopenharmony_ci self.assertTrue(t1 <= t2) 747db96d56Sopenharmony_ci self.assertTrue(not (t1 > t2)) 757db96d56Sopenharmony_ci self.assertTrue(t1 >= t2) 767db96d56Sopenharmony_ci self.assertTrue(not (t1 != t2)) 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci def test_fields(self): 797db96d56Sopenharmony_ci t = time.gmtime() 807db96d56Sopenharmony_ci self.assertEqual(len(t), t.n_sequence_fields) 817db96d56Sopenharmony_ci self.assertEqual(t.n_unnamed_fields, 0) 827db96d56Sopenharmony_ci self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS) 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci def test_constructor(self): 857db96d56Sopenharmony_ci t = time.struct_time 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci self.assertRaises(TypeError, t) 887db96d56Sopenharmony_ci self.assertRaises(TypeError, t, None) 897db96d56Sopenharmony_ci self.assertRaises(TypeError, t, "123") 907db96d56Sopenharmony_ci self.assertRaises(TypeError, t, "123", dict={}) 917db96d56Sopenharmony_ci self.assertRaises(TypeError, t, "123456789", dict=None) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci s = "123456789" 947db96d56Sopenharmony_ci self.assertEqual("".join(t(s)), s) 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci def test_eviltuple(self): 977db96d56Sopenharmony_ci class Exc(Exception): 987db96d56Sopenharmony_ci pass 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci # Devious code could crash structseqs' constructors 1017db96d56Sopenharmony_ci class C: 1027db96d56Sopenharmony_ci def __getitem__(self, i): 1037db96d56Sopenharmony_ci raise Exc 1047db96d56Sopenharmony_ci def __len__(self): 1057db96d56Sopenharmony_ci return 9 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci self.assertRaises(Exc, time.struct_time, C()) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def test_reduce(self): 1107db96d56Sopenharmony_ci t = time.gmtime() 1117db96d56Sopenharmony_ci x = t.__reduce__() 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci def test_extended_getslice(self): 1147db96d56Sopenharmony_ci # Test extended slicing by comparing with list slicing. 1157db96d56Sopenharmony_ci t = time.gmtime() 1167db96d56Sopenharmony_ci L = list(t) 1177db96d56Sopenharmony_ci indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300) 1187db96d56Sopenharmony_ci for start in indices: 1197db96d56Sopenharmony_ci for stop in indices: 1207db96d56Sopenharmony_ci # Skip step 0 (invalid) 1217db96d56Sopenharmony_ci for step in indices[1:]: 1227db96d56Sopenharmony_ci self.assertEqual(list(t[start:stop:step]), 1237db96d56Sopenharmony_ci L[start:stop:step]) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci def test_match_args(self): 1267db96d56Sopenharmony_ci expected_args = ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', 1277db96d56Sopenharmony_ci 'tm_sec', 'tm_wday', 'tm_yday', 'tm_isdst') 1287db96d56Sopenharmony_ci self.assertEqual(time.struct_time.__match_args__, expected_args) 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci def test_match_args_with_unnamed_fields(self): 1317db96d56Sopenharmony_ci expected_args = ('st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid', 1327db96d56Sopenharmony_ci 'st_gid', 'st_size') 1337db96d56Sopenharmony_ci self.assertEqual(os.stat_result.n_unnamed_fields, 3) 1347db96d56Sopenharmony_ci self.assertEqual(os.stat_result.__match_args__, expected_args) 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ciif __name__ == "__main__": 1387db96d56Sopenharmony_ci unittest.main() 139