10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# tests for slice objects; in particular the indices method.
20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest
40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test import test_support
50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom cPickle import loads, dumps
60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport sys
80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass SliceTest(unittest.TestCase):
100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_constructor(self):
120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(TypeError, slice)
130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(TypeError, slice, 1, 2, 3, 4)
140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_repr(self):
160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(repr(slice(1, 2, 3)), "slice(1, 2, 3)")
170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_hash(self):
190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # Verify clearing of SF bug #800796
200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(TypeError, hash, slice(5))
210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(TypeError, slice(5).__hash__)
220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_cmp(self):
240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s1 = slice(1, 2, 3)
250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s2 = slice(1, 2, 3)
260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s3 = slice(1, 2, 4)
270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s1, s2)
280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertNotEqual(s1, s3)
290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class Exc(Exception):
310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class BadCmp(object):
340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __eq__(self, other):
350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                raise Exc
360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            __hash__ = None # Silence Py3k warning
370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s1 = slice(BadCmp())
390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s2 = slice(BadCmp())
400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(Exc, cmp, s1, s2)
410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s1, s1)
420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s1 = slice(1, BadCmp())
440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s2 = slice(1, BadCmp())
450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s1, s1)
460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(Exc, cmp, s1, s2)
470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s1 = slice(1, 2, BadCmp())
490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s2 = slice(1, 2, BadCmp())
500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s1, s1)
510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(Exc, cmp, s1, s2)
520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_members(self):
540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s = slice(1)
550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.start, None)
560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.stop, 1)
570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.step, None)
580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s = slice(1, 2)
600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.start, 1)
610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.stop, 2)
620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.step, None)
630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s = slice(1, 2, 3)
650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.start, 1)
660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.stop, 2)
670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(s.step, 3)
680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class AnyClass:
700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            pass
710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        obj = AnyClass()
730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s = slice(obj)
740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertTrue(s.stop is obj)
750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_indices(self):
770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None           ).indices(10), (0, 10,  1))
780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None,  None,  2).indices(10), (0, 10,  2))
790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(1,     None,  2).indices(10), (1, 10,  2))
800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None,  None, -1).indices(10), (9, -1, -1))
810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None,  None, -2).indices(10), (9, -1, -2))
820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(3,     None, -2).indices(10), (3, -1, -2))
830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # issue 3004 tests
840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -9).indices(10), (0, 1, 1))
850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -10).indices(10), (0, 0, 1))
860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -11).indices(10), (0, 0, 1))
870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -10, -1).indices(10), (9, 0, -1))
880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -11, -1).indices(10), (9, -1, -1))
890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, -12, -1).indices(10), (9, -1, -1))
900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 9).indices(10), (0, 9, 1))
910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 10).indices(10), (0, 10, 1))
920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 11).indices(10), (0, 10, 1))
930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 8, -1).indices(10), (9, 8, -1))
940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 9, -1).indices(10), (9, 9, -1))
950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(None, 10, -1).indices(10), (9, 9, -1))
960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(
980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            slice(-100,  100     ).indices(10),
990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            slice(None).indices(10)
1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        )
1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(
1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            slice(100,  -100,  -1).indices(10),
1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            slice(None, None, -1).indices(10)
1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        )
1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(slice(-100L, 100L, 2L).indices(10), (0, 10,  2))
1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(range(10)[::sys.maxint - 1], [0])
1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertRaises(OverflowError, slice(None).indices, 1L<<100)
1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_setslice_without_getslice(self):
1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        tmp = []
1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        class X(object):
1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            def __setslice__(self, i, j, k):
1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                tmp.append((i, j, k))
1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        x = X()
1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        with test_support.check_py3k_warnings():
1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            x[1:2] = 42
1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        self.assertEqual(tmp, [(1, 2, 42)])
1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    def test_pickle(self):
1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        s = slice(10, 20, 3)
1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        for protocol in (0,1,2):
1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            t = loads(dumps(s, protocol))
1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(s, t)
1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertEqual(s.indices(15), t.indices(15))
1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            self.assertNotEqual(id(s), id(t))
1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main():
1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_support.run_unittest(SliceTest)
1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__":
1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    test_main()
135