blob: e03b4d4e5cebfbe8a0399177cd4591505f0c3761 [file] [log] [blame]
Thomas Wouters104a7bc2000-08-24 20:14:10 +00001# Augmented assignment test.
2
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test.support import run_unittest
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004import unittest
Thomas Wouters104a7bc2000-08-24 20:14:10 +00005
6
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007class AugAssignTest(unittest.TestCase):
8 def testBasic(self):
9 x = 2
10 x += 1
11 x *= 2
12 x **= 2
13 x -= 8
14 x //= 5
15 x %= 3
16 x &= 2
17 x |= 5
18 x ^= 1
19 x /= 2
20 self.assertEquals(x, 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000021
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000022 def testInList(self):
23 x = [2]
24 x[0] += 1
25 x[0] *= 2
26 x[0] **= 2
27 x[0] -= 8
28 x[0] //= 5
29 x[0] %= 3
30 x[0] &= 2
31 x[0] |= 5
32 x[0] ^= 1
33 x[0] /= 2
34 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000035
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000036 def testInDict(self):
37 x = {0: 2}
38 x[0] += 1
39 x[0] *= 2
40 x[0] **= 2
41 x[0] -= 8
42 x[0] //= 5
43 x[0] %= 3
44 x[0] &= 2
45 x[0] |= 5
46 x[0] ^= 1
47 x[0] /= 2
48 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000049
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000050 def testSequences(self):
51 x = [1,2]
52 x += [3,4]
53 x *= 2
Thomas Wouters104a7bc2000-08-24 20:14:10 +000054
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000055 self.assertEquals(x, [1, 2, 3, 4, 1, 2, 3, 4])
Thomas Wouters104a7bc2000-08-24 20:14:10 +000056
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000057 x = [1, 2, 3]
58 y = x
59 x[1:2] *= 2
60 y[1:2] += [1]
Thomas Wouters104a7bc2000-08-24 20:14:10 +000061
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000062 self.assertEquals(x, [1, 2, 1, 2, 3])
63 self.assert_(x is y)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000064
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065 def testCustomMethods1(self):
Thomas Wouters104a7bc2000-08-24 20:14:10 +000066
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000067 class aug_test:
68 def __init__(self, value):
69 self.val = value
70 def __radd__(self, val):
71 return self.val + val
72 def __add__(self, val):
73 return aug_test(self.val + val)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000074
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000075 class aug_test2(aug_test):
76 def __iadd__(self, val):
77 self.val = self.val + val
78 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +000079
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000080 class aug_test3(aug_test):
81 def __iadd__(self, val):
82 return aug_test3(self.val + val)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000083
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000084 x = aug_test(1)
85 y = x
86 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +000087
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000088 self.assert_(isinstance(x, aug_test))
89 self.assert_(y is not x)
90 self.assertEquals(x.val, 11)
Jeremy Hylton4de8df92001-08-29 17:50:27 +000091
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000092 x = aug_test2(2)
93 y = x
94 x += 10
Jeremy Hylton4de8df92001-08-29 17:50:27 +000095
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096 self.assert_(y is x)
97 self.assertEquals(x.val, 12)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000098
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000099 x = aug_test3(3)
100 y = x
101 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000102
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000103 self.assert_(isinstance(x, aug_test3))
104 self.assert_(y is not x)
105 self.assertEquals(x.val, 13)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000106
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000107
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000108 def testCustomMethods2(test_self):
109 output = []
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000110
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000111 class testall:
112 def __add__(self, val):
113 output.append("__add__ called")
114 def __radd__(self, val):
115 output.append("__radd__ called")
116 def __iadd__(self, val):
117 output.append("__iadd__ called")
118 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000119
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000120 def __sub__(self, val):
121 output.append("__sub__ called")
122 def __rsub__(self, val):
123 output.append("__rsub__ called")
124 def __isub__(self, val):
125 output.append("__isub__ called")
126 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000127
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000128 def __mul__(self, val):
129 output.append("__mul__ called")
130 def __rmul__(self, val):
131 output.append("__rmul__ called")
132 def __imul__(self, val):
133 output.append("__imul__ called")
134 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000135
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000136 def __div__(self, val):
137 output.append("__div__ called")
138 def __rdiv__(self, val):
139 output.append("__rdiv__ called")
140 def __idiv__(self, val):
141 output.append("__idiv__ called")
142 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000143
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000144 def __floordiv__(self, val):
145 output.append("__floordiv__ called")
146 return self
147 def __ifloordiv__(self, val):
148 output.append("__ifloordiv__ called")
149 return self
150 def __rfloordiv__(self, val):
151 output.append("__rfloordiv__ called")
152 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000153
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000154 def __truediv__(self, val):
155 output.append("__truediv__ called")
156 return self
157 def __rtruediv__(self, val):
158 output.append("__rtruediv__ called")
159 return self
160 def __itruediv__(self, val):
161 output.append("__itruediv__ called")
162 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000164 def __mod__(self, val):
165 output.append("__mod__ called")
166 def __rmod__(self, val):
167 output.append("__rmod__ called")
168 def __imod__(self, val):
169 output.append("__imod__ called")
170 return self
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000171
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000172 def __pow__(self, val):
173 output.append("__pow__ called")
174 def __rpow__(self, val):
175 output.append("__rpow__ called")
176 def __ipow__(self, val):
177 output.append("__ipow__ called")
178 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000179
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000180 def __or__(self, val):
181 output.append("__or__ called")
182 def __ror__(self, val):
183 output.append("__ror__ called")
184 def __ior__(self, val):
185 output.append("__ior__ called")
186 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000187
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000188 def __and__(self, val):
189 output.append("__and__ called")
190 def __rand__(self, val):
191 output.append("__rand__ called")
192 def __iand__(self, val):
193 output.append("__iand__ called")
194 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000195
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000196 def __xor__(self, val):
197 output.append("__xor__ called")
198 def __rxor__(self, val):
199 output.append("__rxor__ called")
200 def __ixor__(self, val):
201 output.append("__ixor__ called")
202 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000203
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000204 def __rshift__(self, val):
205 output.append("__rshift__ called")
206 def __rrshift__(self, val):
207 output.append("__rrshift__ called")
208 def __irshift__(self, val):
209 output.append("__irshift__ called")
210 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000211
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000212 def __lshift__(self, val):
213 output.append("__lshift__ called")
214 def __rlshift__(self, val):
215 output.append("__rlshift__ called")
216 def __ilshift__(self, val):
217 output.append("__ilshift__ called")
218 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000219
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000220 x = testall()
221 x + 1
222 1 + x
223 x += 1
224
225 x - 1
226 1 - x
227 x -= 1
228
229 x * 1
230 1 * x
231 x *= 1
232
233 x / 1
234 1 / x
235 x /= 1
236
237 x // 1
238 1 // x
239 x //= 1
240
241 x % 1
242 1 % x
243 x %= 1
244
245 x ** 1
246 1 ** x
247 x **= 1
248
249 x | 1
250 1 | x
251 x |= 1
252
253 x & 1
254 1 & x
255 x &= 1
256
257 x ^ 1
258 1 ^ x
259 x ^= 1
260
261 x >> 1
262 1 >> x
263 x >>= 1
264
265 x << 1
266 1 << x
267 x <<= 1
268
269 test_self.assertEquals(output, '''\
270__add__ called
271__radd__ called
272__iadd__ called
273__sub__ called
274__rsub__ called
275__isub__ called
276__mul__ called
277__rmul__ called
278__imul__ called
279__truediv__ called
280__rtruediv__ called
281__itruediv__ called
282__floordiv__ called
283__rfloordiv__ called
284__ifloordiv__ called
285__mod__ called
286__rmod__ called
287__imod__ called
288__pow__ called
289__rpow__ called
290__ipow__ called
291__or__ called
292__ror__ called
293__ior__ called
294__and__ called
295__rand__ called
296__iand__ called
297__xor__ called
298__rxor__ called
299__ixor__ called
300__rshift__ called
301__rrshift__ called
302__irshift__ called
303__lshift__ called
304__rlshift__ called
305__ilshift__ called
306'''.splitlines())
307
308def test_main():
309 run_unittest(AugAssignTest)
310
311if __name__ == '__main__':
312 test_main()