183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test import test_support
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport time
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass StructSeqTest(unittest.TestCase):
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_tuple(self):
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime()
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        astuple = tuple(t)
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(len(t), len(astuple))
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(t, astuple)
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Check that slicing works the same way; at one point, slicing t[i:j] with
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # 0 < i < j could produce NULLs in the result.
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in xrange(-len(t), len(t)):
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t[i:], astuple[i:])
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for j in xrange(-len(t), len(t)):
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.assertEqual(t[i:j], astuple[i:j])
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for j in xrange(-len(t), len(t)):
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t[:j], astuple[:j])
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(IndexError, t.__getitem__, -len(t)-1)
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(IndexError, t.__getitem__, len(t))
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in xrange(-len(t), len(t)-1):
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t[i], astuple[i])
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_repr(self):
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime()
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(repr(t))
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime(0)
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(repr(t),
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, "
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)")
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_concat(self):
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t1 = time.gmtime()
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t2 = t1 + tuple(t1)
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in xrange(len(t1)):
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t2[i], t2[i+len(t1)])
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_repeat(self):
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t1 = time.gmtime()
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t2 = 3 * t1
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in xrange(len(t1)):
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t2[i], t2[i+len(t1)])
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(t2[i], t2[i+2*len(t1)])
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_contains(self):
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t1 = time.gmtime()
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for item in t1:
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertIn(item, t1)
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotIn(-42, t1)
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_hash(self):
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t1 = time.gmtime()
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(hash(t1), hash(tuple(t1)))
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_cmp(self):
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t1 = time.gmtime()
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t2 = type(t1)(t1)
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(t1, t2)
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(not (t1 < t2))
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(t1 <= t2)
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(not (t1 > t2))
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(t1 >= t2)
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(not (t1 != t2))
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_fields(self):
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime()
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(len(t), t.n_fields)
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(t.n_fields, t.n_sequence_fields+t.n_unnamed_fields)
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_constructor(self):
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.struct_time
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, t)
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, t, None)
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, t, "123")
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, t, "123", dict={})
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, t, "123456789", dict=None)
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        s = "123456789"
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("".join(t(s)), s)
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_eviltuple(self):
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class Exc(Exception):
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            pass
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Devious code could crash structseqs' contructors
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class C:
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __getitem__(self, i):
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise Exc
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            def __len__(self):
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return 9
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(Exc, time.struct_time, C())
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_reduce(self):
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime()
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = t.__reduce__()
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_extended_getslice(self):
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Test extended slicing by comparing with list slicing.
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        t = time.gmtime()
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        L = list(t)
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for start in indices:
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for stop in indices:
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Skip step 0 (invalid)
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for step in indices[1:]:
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.assertEqual(list(t[start:stop:step]),
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     L[start:stop:step])
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_support.run_unittest(StructSeqTest)
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == "__main__":
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
121