Home | History | Annotate | Download | only in test
      1 # tests for slice objects; in particular the indices method.
      2 
      3 import unittest
      4 from test import test_support
      5 from cPickle import loads, dumps
      6 
      7 import sys
      8 
      9 class SliceTest(unittest.TestCase):
     10 
     11     def test_constructor(self):
     12         self.assertRaises(TypeError, slice)
     13         self.assertRaises(TypeError, slice, 1, 2, 3, 4)
     14 
     15     def test_repr(self):
     16         self.assertEqual(repr(slice(1, 2, 3)), "slice(1, 2, 3)")
     17 
     18     def test_hash(self):
     19         # Verify clearing of SF bug #800796
     20         self.assertRaises(TypeError, hash, slice(5))
     21         self.assertRaises(TypeError, slice(5).__hash__)
     22 
     23     def test_cmp(self):
     24         s1 = slice(1, 2, 3)
     25         s2 = slice(1, 2, 3)
     26         s3 = slice(1, 2, 4)
     27         self.assertEqual(s1, s2)
     28         self.assertNotEqual(s1, s3)
     29 
     30         class Exc(Exception):
     31             pass
     32 
     33         class BadCmp(object):
     34             def __eq__(self, other):
     35                 raise Exc
     36             __hash__ = None # Silence Py3k warning
     37 
     38         s1 = slice(BadCmp())
     39         s2 = slice(BadCmp())
     40         self.assertRaises(Exc, cmp, s1, s2)
     41         self.assertEqual(s1, s1)
     42 
     43         s1 = slice(1, BadCmp())
     44         s2 = slice(1, BadCmp())
     45         self.assertEqual(s1, s1)
     46         self.assertRaises(Exc, cmp, s1, s2)
     47 
     48         s1 = slice(1, 2, BadCmp())
     49         s2 = slice(1, 2, BadCmp())
     50         self.assertEqual(s1, s1)
     51         self.assertRaises(Exc, cmp, s1, s2)
     52 
     53     def test_members(self):
     54         s = slice(1)
     55         self.assertEqual(s.start, None)
     56         self.assertEqual(s.stop, 1)
     57         self.assertEqual(s.step, None)
     58 
     59         s = slice(1, 2)
     60         self.assertEqual(s.start, 1)
     61         self.assertEqual(s.stop, 2)
     62         self.assertEqual(s.step, None)
     63 
     64         s = slice(1, 2, 3)
     65         self.assertEqual(s.start, 1)
     66         self.assertEqual(s.stop, 2)
     67         self.assertEqual(s.step, 3)
     68 
     69         class AnyClass:
     70             pass
     71 
     72         obj = AnyClass()
     73         s = slice(obj)
     74         self.assertTrue(s.stop is obj)
     75 
     76     def test_indices(self):
     77         self.assertEqual(slice(None           ).indices(10), (0, 10,  1))
     78         self.assertEqual(slice(None,  None,  2).indices(10), (0, 10,  2))
     79         self.assertEqual(slice(1,     None,  2).indices(10), (1, 10,  2))
     80         self.assertEqual(slice(None,  None, -1).indices(10), (9, -1, -1))
     81         self.assertEqual(slice(None,  None, -2).indices(10), (9, -1, -2))
     82         self.assertEqual(slice(3,     None, -2).indices(10), (3, -1, -2))
     83         # issue 3004 tests
     84         self.assertEqual(slice(None, -9).indices(10), (0, 1, 1))
     85         self.assertEqual(slice(None, -10).indices(10), (0, 0, 1))
     86         self.assertEqual(slice(None, -11).indices(10), (0, 0, 1))
     87         self.assertEqual(slice(None, -10, -1).indices(10), (9, 0, -1))
     88         self.assertEqual(slice(None, -11, -1).indices(10), (9, -1, -1))
     89         self.assertEqual(slice(None, -12, -1).indices(10), (9, -1, -1))
     90         self.assertEqual(slice(None, 9).indices(10), (0, 9, 1))
     91         self.assertEqual(slice(None, 10).indices(10), (0, 10, 1))
     92         self.assertEqual(slice(None, 11).indices(10), (0, 10, 1))
     93         self.assertEqual(slice(None, 8, -1).indices(10), (9, 8, -1))
     94         self.assertEqual(slice(None, 9, -1).indices(10), (9, 9, -1))
     95         self.assertEqual(slice(None, 10, -1).indices(10), (9, 9, -1))
     96 
     97         self.assertEqual(
     98             slice(-100,  100     ).indices(10),
     99             slice(None).indices(10)
    100         )
    101         self.assertEqual(
    102             slice(100,  -100,  -1).indices(10),
    103             slice(None, None, -1).indices(10)
    104         )
    105         self.assertEqual(slice(-100L, 100L, 2L).indices(10), (0, 10,  2))
    106 
    107         self.assertEqual(range(10)[::sys.maxint - 1], [0])
    108 
    109         self.assertRaises(OverflowError, slice(None).indices, 1L<<100)
    110 
    111     def test_setslice_without_getslice(self):
    112         tmp = []
    113         class X(object):
    114             def __setslice__(self, i, j, k):
    115                 tmp.append((i, j, k))
    116 
    117         x = X()
    118         with test_support.check_py3k_warnings():
    119             x[1:2] = 42
    120         self.assertEqual(tmp, [(1, 2, 42)])
    121 
    122     def test_pickle(self):
    123         s = slice(10, 20, 3)
    124         for protocol in (0,1,2):
    125             t = loads(dumps(s, protocol))
    126             self.assertEqual(s, t)
    127             self.assertEqual(s.indices(15), t.indices(15))
    128             self.assertNotEqual(id(s), id(t))
    129 
    130 def test_main():
    131     test_support.run_unittest(SliceTest)
    132 
    133 if __name__ == "__main__":
    134     test_main()
    135