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