blob: 51db28b80869ca730ab6dd54de8026a033e029fa [file] [log] [blame]
Thomas Wouters104a7bc2000-08-24 20:14:10 +00001# Augmented assignment test.
2
Georg Brandl019514e2006-03-28 10:26:45 +00003from test.test_support import run_unittest
4import unittest
Senthil Kumaran3ddc4352010-01-08 18:41:40 +00005import warnings
Thomas Wouters104a7bc2000-08-24 20:14:10 +00006
7
Georg Brandl019514e2006-03-28 10:26:45 +00008class AugAssignTest(unittest.TestCase):
9 def testBasic(self):
10 x = 2
11 x += 1
12 x *= 2
13 x **= 2
14 x -= 8
15 x //= 5
16 x %= 3
17 x &= 2
18 x |= 5
19 x ^= 1
20 x /= 2
21 if 1/2 == 0:
22 # classic division
23 self.assertEquals(x, 3)
24 else:
25 # new-style division (with -Qnew)
26 self.assertEquals(x, 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000027
Benjamin Peterson7adbb5a2009-10-03 20:23:24 +000028 def test_with_unpacking(self):
29 self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec")
30
Georg Brandl019514e2006-03-28 10:26:45 +000031 def testInList(self):
32 x = [2]
33 x[0] += 1
34 x[0] *= 2
35 x[0] **= 2
36 x[0] -= 8
37 x[0] //= 5
38 x[0] %= 3
39 x[0] &= 2
40 x[0] |= 5
41 x[0] ^= 1
42 x[0] /= 2
43 if 1/2 == 0:
44 self.assertEquals(x[0], 3)
45 else:
46 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000047
Georg Brandl019514e2006-03-28 10:26:45 +000048 def testInDict(self):
49 x = {0: 2}
50 x[0] += 1
51 x[0] *= 2
52 x[0] **= 2
53 x[0] -= 8
54 x[0] //= 5
55 x[0] %= 3
56 x[0] &= 2
57 x[0] |= 5
58 x[0] ^= 1
59 x[0] /= 2
60 if 1/2 == 0:
61 self.assertEquals(x[0], 3)
62 else:
63 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000064
Georg Brandl019514e2006-03-28 10:26:45 +000065 def testSequences(self):
66 x = [1,2]
67 x += [3,4]
68 x *= 2
Thomas Wouters104a7bc2000-08-24 20:14:10 +000069
Georg Brandl019514e2006-03-28 10:26:45 +000070 self.assertEquals(x, [1, 2, 3, 4, 1, 2, 3, 4])
Anthony Baxter4ef3a232006-03-30 12:59:11 +000071
Georg Brandl019514e2006-03-28 10:26:45 +000072 x = [1, 2, 3]
73 y = x
74 x[1:2] *= 2
75 y[1:2] += [1]
Thomas Wouters104a7bc2000-08-24 20:14:10 +000076
Georg Brandl019514e2006-03-28 10:26:45 +000077 self.assertEquals(x, [1, 2, 1, 2, 3])
Benjamin Peterson5c8da862009-06-30 22:57:08 +000078 self.assertTrue(x is y)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000079
Georg Brandl019514e2006-03-28 10:26:45 +000080 def testCustomMethods1(self):
Thomas Wouters104a7bc2000-08-24 20:14:10 +000081
Georg Brandl019514e2006-03-28 10:26:45 +000082 class aug_test:
83 def __init__(self, value):
84 self.val = value
85 def __radd__(self, val):
86 return self.val + val
87 def __add__(self, val):
88 return aug_test(self.val + val)
Anthony Baxter4ef3a232006-03-30 12:59:11 +000089
Georg Brandl019514e2006-03-28 10:26:45 +000090 class aug_test2(aug_test):
91 def __iadd__(self, val):
92 self.val = self.val + val
93 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +000094
Georg Brandl019514e2006-03-28 10:26:45 +000095 class aug_test3(aug_test):
96 def __iadd__(self, val):
97 return aug_test3(self.val + val)
Anthony Baxter4ef3a232006-03-30 12:59:11 +000098
Georg Brandl019514e2006-03-28 10:26:45 +000099 x = aug_test(1)
100 y = x
101 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000102
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000103 self.assertTrue(isinstance(x, aug_test))
104 self.assertTrue(y is not x)
Georg Brandl019514e2006-03-28 10:26:45 +0000105 self.assertEquals(x.val, 11)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000106
Georg Brandl019514e2006-03-28 10:26:45 +0000107 x = aug_test2(2)
108 y = x
109 x += 10
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000110
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000111 self.assertTrue(y is x)
Georg Brandl019514e2006-03-28 10:26:45 +0000112 self.assertEquals(x.val, 12)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000113
Georg Brandl019514e2006-03-28 10:26:45 +0000114 x = aug_test3(3)
115 y = x
116 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000117
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000118 self.assertTrue(isinstance(x, aug_test3))
119 self.assertTrue(y is not x)
Georg Brandl019514e2006-03-28 10:26:45 +0000120 self.assertEquals(x.val, 13)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000121
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000122
Georg Brandl019514e2006-03-28 10:26:45 +0000123 def testCustomMethods2(test_self):
124 output = []
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000125
Georg Brandl019514e2006-03-28 10:26:45 +0000126 class testall:
127 def __add__(self, val):
128 output.append("__add__ called")
129 def __radd__(self, val):
130 output.append("__radd__ called")
131 def __iadd__(self, val):
132 output.append("__iadd__ called")
133 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000134
Georg Brandl019514e2006-03-28 10:26:45 +0000135 def __sub__(self, val):
136 output.append("__sub__ called")
137 def __rsub__(self, val):
138 output.append("__rsub__ called")
139 def __isub__(self, val):
140 output.append("__isub__ called")
141 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000142
Georg Brandl019514e2006-03-28 10:26:45 +0000143 def __mul__(self, val):
144 output.append("__mul__ called")
145 def __rmul__(self, val):
146 output.append("__rmul__ called")
147 def __imul__(self, val):
148 output.append("__imul__ called")
149 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000150
Georg Brandl019514e2006-03-28 10:26:45 +0000151 def __div__(self, val):
152 output.append("__div__ called")
153 def __rdiv__(self, val):
154 output.append("__rdiv__ called")
155 def __idiv__(self, val):
156 output.append("__idiv__ called")
157 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000158
Georg Brandl019514e2006-03-28 10:26:45 +0000159 def __floordiv__(self, val):
160 output.append("__floordiv__ called")
161 return self
162 def __ifloordiv__(self, val):
163 output.append("__ifloordiv__ called")
164 return self
165 def __rfloordiv__(self, val):
166 output.append("__rfloordiv__ called")
167 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000168
Georg Brandl019514e2006-03-28 10:26:45 +0000169 def __truediv__(self, val):
170 output.append("__truediv__ called")
171 return self
172 def __itruediv__(self, val):
173 output.append("__itruediv__ called")
174 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000175
Georg Brandl019514e2006-03-28 10:26:45 +0000176 def __mod__(self, val):
177 output.append("__mod__ called")
178 def __rmod__(self, val):
179 output.append("__rmod__ called")
180 def __imod__(self, val):
181 output.append("__imod__ called")
182 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000183
Georg Brandl019514e2006-03-28 10:26:45 +0000184 def __pow__(self, val):
185 output.append("__pow__ called")
186 def __rpow__(self, val):
187 output.append("__rpow__ called")
188 def __ipow__(self, val):
189 output.append("__ipow__ called")
190 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000191
Georg Brandl019514e2006-03-28 10:26:45 +0000192 def __or__(self, val):
193 output.append("__or__ called")
194 def __ror__(self, val):
195 output.append("__ror__ called")
196 def __ior__(self, val):
197 output.append("__ior__ called")
198 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000199
Georg Brandl019514e2006-03-28 10:26:45 +0000200 def __and__(self, val):
201 output.append("__and__ called")
202 def __rand__(self, val):
203 output.append("__rand__ called")
204 def __iand__(self, val):
205 output.append("__iand__ called")
206 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000207
Georg Brandl019514e2006-03-28 10:26:45 +0000208 def __xor__(self, val):
209 output.append("__xor__ called")
210 def __rxor__(self, val):
211 output.append("__rxor__ called")
212 def __ixor__(self, val):
213 output.append("__ixor__ called")
214 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000215
Georg Brandl019514e2006-03-28 10:26:45 +0000216 def __rshift__(self, val):
217 output.append("__rshift__ called")
218 def __rrshift__(self, val):
219 output.append("__rrshift__ called")
220 def __irshift__(self, val):
221 output.append("__irshift__ called")
222 return self
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000223
Georg Brandl019514e2006-03-28 10:26:45 +0000224 def __lshift__(self, val):
225 output.append("__lshift__ called")
226 def __rlshift__(self, val):
227 output.append("__rlshift__ called")
228 def __ilshift__(self, val):
229 output.append("__ilshift__ called")
230 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000231
Georg Brandl019514e2006-03-28 10:26:45 +0000232 x = testall()
233 x + 1
234 1 + x
235 x += 1
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000236
Georg Brandl019514e2006-03-28 10:26:45 +0000237 x - 1
238 1 - x
239 x -= 1
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000240
Georg Brandl019514e2006-03-28 10:26:45 +0000241 x * 1
242 1 * x
243 x *= 1
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000244
Georg Brandl019514e2006-03-28 10:26:45 +0000245 if 1/2 == 0:
246 x / 1
247 1 / x
248 x /= 1
249 else:
250 # True division is in effect, so "/" doesn't map to __div__ etc;
251 # but the canned expected-output file requires that those get called.
252 x.__div__(1)
253 x.__rdiv__(1)
254 x.__idiv__(1)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000255
Georg Brandl019514e2006-03-28 10:26:45 +0000256 x // 1
257 1 // x
258 x //= 1
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000259
Georg Brandl019514e2006-03-28 10:26:45 +0000260 x % 1
261 1 % x
262 x %= 1
263
264 x ** 1
265 1 ** x
266 x **= 1
267
268 x | 1
269 1 | x
270 x |= 1
271
272 x & 1
273 1 & x
274 x &= 1
275
276 x ^ 1
277 1 ^ x
278 x ^= 1
279
280 x >> 1
281 1 >> x
282 x >>= 1
283
284 x << 1
285 1 << x
286 x <<= 1
287
288 test_self.assertEquals(output, '''\
289__add__ called
290__radd__ called
291__iadd__ called
292__sub__ called
293__rsub__ called
294__isub__ called
295__mul__ called
296__rmul__ called
297__imul__ called
298__div__ called
299__rdiv__ called
300__idiv__ called
301__floordiv__ called
302__rfloordiv__ called
303__ifloordiv__ called
304__mod__ called
305__rmod__ called
306__imod__ called
307__pow__ called
308__rpow__ called
309__ipow__ called
310__or__ called
311__ror__ called
312__ior__ called
313__and__ called
314__rand__ called
315__iand__ called
316__xor__ called
317__rxor__ called
318__ixor__ called
319__rshift__ called
320__rrshift__ called
321__irshift__ called
322__lshift__ called
323__rlshift__ called
324__ilshift__ called
325'''.splitlines())
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000326
Georg Brandl019514e2006-03-28 10:26:45 +0000327def test_main():
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000328 with warnings.catch_warnings():
329 # Silence Py3k warning
330 warnings.filterwarnings("ignore", "classic int division",
331 DeprecationWarning)
332 run_unittest(AugAssignTest)
Georg Brandl019514e2006-03-28 10:26:45 +0000333
334if __name__ == '__main__':
335 test_main()