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