blob: 45b3b2b6cde4006113c61adec5d0ecd86a1a773c [file] [log] [blame]
Armin Rigo5eca19b2006-03-30 11:28:43 +00001import unittest
2from test import test_support
3import operator
4
5class oldstyle:
6 def __index__(self):
7 return self.ind
8
9class newstyle(object):
10 def __index__(self):
11 return self.ind
12
Armin Rigo314861c2006-03-30 14:04:02 +000013class BaseTestCase(unittest.TestCase):
Armin Rigo5eca19b2006-03-30 11:28:43 +000014 def setUp(self):
Armin Rigo5eca19b2006-03-30 11:28:43 +000015 self.o = oldstyle()
16 self.n = newstyle()
17 self.o2 = oldstyle()
18 self.n2 = newstyle()
Anthony Baxter4ef3a232006-03-30 12:59:11 +000019
Armin Rigo5eca19b2006-03-30 11:28:43 +000020 def test_basic(self):
21 self.o.ind = -2
22 self.n.ind = 2
Armin Rigo5eca19b2006-03-30 11:28:43 +000023 assert(self.seq[self.n] == self.seq[2])
24 assert(self.seq[self.o] == self.seq[-2])
25 assert(operator.index(self.o) == -2)
26 assert(operator.index(self.n) == 2)
Anthony Baxter4ef3a232006-03-30 12:59:11 +000027
Armin Rigo5eca19b2006-03-30 11:28:43 +000028 def test_error(self):
29 self.o.ind = 'dumb'
30 self.n.ind = 'bad'
31 myfunc = lambda x, obj: obj.seq[x]
32 self.failUnlessRaises(TypeError, operator.index, self.o)
33 self.failUnlessRaises(TypeError, operator.index, self.n)
34 self.failUnlessRaises(TypeError, myfunc, self.o, self)
35 self.failUnlessRaises(TypeError, myfunc, self.n, self)
36
37 def test_slice(self):
38 self.o.ind = 1
39 self.o2.ind = 3
40 self.n.ind = 2
41 self.n2.ind = 4
42 assert(self.seq[self.o:self.o2] == self.seq[1:3])
43 assert(self.seq[self.n:self.n2] == self.seq[2:4])
44
Armin Rigo314861c2006-03-30 14:04:02 +000045 def test_repeat(self):
46 self.o.ind = 3
47 self.n.ind = 2
48 assert(self.seq * self.o == self.seq * 3)
49 assert(self.seq * self.n == self.seq * 2)
50 assert(self.o * self.seq == self.seq * 3)
51 assert(self.n * self.seq == self.seq * 2)
Armin Rigo5eca19b2006-03-30 11:28:43 +000052
Armin Rigo314861c2006-03-30 14:04:02 +000053 def test_wrappers(self):
54 n = self.n
55 n.ind = 5
56 assert n.__index__() == 5
57 assert 6 .__index__() == 6
58 assert -7L.__index__() == -7
59 assert self.seq.__getitem__(n) == self.seq[5]
60 assert self.seq.__mul__(n) == self.seq * 5
61 assert self.seq.__rmul__(n) == self.seq * 5
62
63 def test_infinite_recusion(self):
64 class Trap1(int):
65 def __index__(self):
66 return self
67 class Trap2(long):
68 def __index__(self):
69 return self
70 self.failUnlessRaises(TypeError, operator.getitem, self.seq, Trap1())
71 self.failUnlessRaises(TypeError, operator.getitem, self.seq, Trap2())
Anthony Baxter4ef3a232006-03-30 12:59:11 +000072
73
Armin Rigo314861c2006-03-30 14:04:02 +000074class ListTestCase(BaseTestCase):
75 seq = [0,10,20,30,40,50]
76
77 def test_setdelitem(self):
Armin Rigo5eca19b2006-03-30 11:28:43 +000078 self.o.ind = -2
79 self.n.ind = 2
Armin Rigo314861c2006-03-30 14:04:02 +000080 lst = list('ab!cdefghi!j')
81 del lst[self.o]
82 del lst[self.n]
83 lst[self.o] = 'X'
84 lst[self.n] = 'Y'
85 assert lst == list('abYdefghXj')
Anthony Baxter4ef3a232006-03-30 12:59:11 +000086
Armin Rigo314861c2006-03-30 14:04:02 +000087 lst = [5, 6, 7, 8, 9, 10, 11]
88 lst.__setitem__(self.n, "here")
89 assert lst == [5, 6, "here", 8, 9, 10, 11]
90 lst.__delitem__(self.n)
91 assert lst == [5, 6, 8, 9, 10, 11]
Armin Rigo5eca19b2006-03-30 11:28:43 +000092
Armin Rigo314861c2006-03-30 14:04:02 +000093 def test_inplace_repeat(self):
94 self.o.ind = 2
95 self.n.ind = 3
96 lst = [6, 4]
97 lst *= self.o
98 assert lst == [6, 4, 6, 4]
99 lst *= self.n
100 assert lst == [6, 4, 6, 4] * 3
101
102 lst = [5, 6, 7, 8, 9, 11]
103 l2 = lst.__imul__(self.n)
104 assert l2 is lst
105 assert lst == [5, 6, 7, 8, 9, 11] * 3
106
107
108class TupleTestCase(BaseTestCase):
109 seq = (0,10,20,30,40,50)
110
111class StringTestCase(BaseTestCase):
112 seq = "this is a test"
113
114class UnicodeTestCase(BaseTestCase):
115 seq = u"this is a test"
116
117
118class XRangeTestCase(unittest.TestCase):
119
120 def test_xrange(self):
121 n = newstyle()
122 n.ind = 5
123 assert xrange(1, 20)[n] == 6
124 assert xrange(1, 20).__getitem__(n) == 6
Armin Rigo5eca19b2006-03-30 11:28:43 +0000125
126
127def test_main():
128 test_support.run_unittest(
129 ListTestCase,
130 TupleTestCase,
131 StringTestCase,
Armin Rigo314861c2006-03-30 14:04:02 +0000132 UnicodeTestCase,
133 XRangeTestCase,
Armin Rigo5eca19b2006-03-30 11:28:43 +0000134 )
135
136if __name__ == "__main__":
137 test_main()