blob: 24aa2b7c9e3286c86ec970710f32c74657cc9e05 [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
Thomas Wouters104a7bc2000-08-24 20:14:10 +00005
6
Georg Brandl019514e2006-03-28 10:26:45 +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 if 1/2 == 0:
21 # classic division
22 self.assertEquals(x, 3)
23 else:
24 # new-style division (with -Qnew)
25 self.assertEquals(x, 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000026
Georg Brandl019514e2006-03-28 10:26:45 +000027 def testInList(self):
28 x = [2]
29 x[0] += 1
30 x[0] *= 2
31 x[0] **= 2
32 x[0] -= 8
33 x[0] //= 5
34 x[0] %= 3
35 x[0] &= 2
36 x[0] |= 5
37 x[0] ^= 1
38 x[0] /= 2
39 if 1/2 == 0:
40 self.assertEquals(x[0], 3)
41 else:
42 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000043
Georg Brandl019514e2006-03-28 10:26:45 +000044 def testInDict(self):
45 x = {0: 2}
46 x[0] += 1
47 x[0] *= 2
48 x[0] **= 2
49 x[0] -= 8
50 x[0] //= 5
51 x[0] %= 3
52 x[0] &= 2
53 x[0] |= 5
54 x[0] ^= 1
55 x[0] /= 2
56 if 1/2 == 0:
57 self.assertEquals(x[0], 3)
58 else:
59 self.assertEquals(x[0], 3.0)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000060
Georg Brandl019514e2006-03-28 10:26:45 +000061 def testSequences(self):
62 x = [1,2]
63 x += [3,4]
64 x *= 2
Thomas Wouters104a7bc2000-08-24 20:14:10 +000065
Georg Brandl019514e2006-03-28 10:26:45 +000066 self.assertEquals(x, [1, 2, 3, 4, 1, 2, 3, 4])
Anthony Baxter4ef3a232006-03-30 12:59:11 +000067
Georg Brandl019514e2006-03-28 10:26:45 +000068 x = [1, 2, 3]
69 y = x
70 x[1:2] *= 2
71 y[1:2] += [1]
Thomas Wouters104a7bc2000-08-24 20:14:10 +000072
Georg Brandl019514e2006-03-28 10:26:45 +000073 self.assertEquals(x, [1, 2, 1, 2, 3])
Benjamin Peterson5c8da862009-06-30 22:57:08 +000074 self.assertTrue(x is y)
Thomas Wouters104a7bc2000-08-24 20:14:10 +000075
Georg Brandl019514e2006-03-28 10:26:45 +000076 def testCustomMethods1(self):
Thomas Wouters104a7bc2000-08-24 20:14:10 +000077
Georg Brandl019514e2006-03-28 10:26:45 +000078 class aug_test:
79 def __init__(self, value):
80 self.val = value
81 def __radd__(self, val):
82 return self.val + val
83 def __add__(self, val):
84 return aug_test(self.val + val)
Anthony Baxter4ef3a232006-03-30 12:59:11 +000085
Georg Brandl019514e2006-03-28 10:26:45 +000086 class aug_test2(aug_test):
87 def __iadd__(self, val):
88 self.val = self.val + val
89 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +000090
Georg Brandl019514e2006-03-28 10:26:45 +000091 class aug_test3(aug_test):
92 def __iadd__(self, val):
93 return aug_test3(self.val + val)
Anthony Baxter4ef3a232006-03-30 12:59:11 +000094
Georg Brandl019514e2006-03-28 10:26:45 +000095 x = aug_test(1)
96 y = x
97 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +000098
Benjamin Peterson5c8da862009-06-30 22:57:08 +000099 self.assertTrue(isinstance(x, aug_test))
100 self.assertTrue(y is not x)
Georg Brandl019514e2006-03-28 10:26:45 +0000101 self.assertEquals(x.val, 11)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000102
Georg Brandl019514e2006-03-28 10:26:45 +0000103 x = aug_test2(2)
104 y = x
105 x += 10
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000106
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000107 self.assertTrue(y is x)
Georg Brandl019514e2006-03-28 10:26:45 +0000108 self.assertEquals(x.val, 12)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000109
Georg Brandl019514e2006-03-28 10:26:45 +0000110 x = aug_test3(3)
111 y = x
112 x += 10
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000113
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000114 self.assertTrue(isinstance(x, aug_test3))
115 self.assertTrue(y is not x)
Georg Brandl019514e2006-03-28 10:26:45 +0000116 self.assertEquals(x.val, 13)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000117
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000118
Georg Brandl019514e2006-03-28 10:26:45 +0000119 def testCustomMethods2(test_self):
120 output = []
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000121
Georg Brandl019514e2006-03-28 10:26:45 +0000122 class testall:
123 def __add__(self, val):
124 output.append("__add__ called")
125 def __radd__(self, val):
126 output.append("__radd__ called")
127 def __iadd__(self, val):
128 output.append("__iadd__ called")
129 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000130
Georg Brandl019514e2006-03-28 10:26:45 +0000131 def __sub__(self, val):
132 output.append("__sub__ called")
133 def __rsub__(self, val):
134 output.append("__rsub__ called")
135 def __isub__(self, val):
136 output.append("__isub__ called")
137 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000138
Georg Brandl019514e2006-03-28 10:26:45 +0000139 def __mul__(self, val):
140 output.append("__mul__ called")
141 def __rmul__(self, val):
142 output.append("__rmul__ called")
143 def __imul__(self, val):
144 output.append("__imul__ called")
145 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000146
Georg Brandl019514e2006-03-28 10:26:45 +0000147 def __div__(self, val):
148 output.append("__div__ called")
149 def __rdiv__(self, val):
150 output.append("__rdiv__ called")
151 def __idiv__(self, val):
152 output.append("__idiv__ called")
153 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000154
Georg Brandl019514e2006-03-28 10:26:45 +0000155 def __floordiv__(self, val):
156 output.append("__floordiv__ called")
157 return self
158 def __ifloordiv__(self, val):
159 output.append("__ifloordiv__ called")
160 return self
161 def __rfloordiv__(self, val):
162 output.append("__rfloordiv__ called")
163 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000164
Georg Brandl019514e2006-03-28 10:26:45 +0000165 def __truediv__(self, val):
166 output.append("__truediv__ called")
167 return self
168 def __itruediv__(self, val):
169 output.append("__itruediv__ called")
170 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000171
Georg Brandl019514e2006-03-28 10:26:45 +0000172 def __mod__(self, val):
173 output.append("__mod__ called")
174 def __rmod__(self, val):
175 output.append("__rmod__ called")
176 def __imod__(self, val):
177 output.append("__imod__ called")
178 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000179
Georg Brandl019514e2006-03-28 10:26:45 +0000180 def __pow__(self, val):
181 output.append("__pow__ called")
182 def __rpow__(self, val):
183 output.append("__rpow__ called")
184 def __ipow__(self, val):
185 output.append("__ipow__ called")
186 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000187
Georg Brandl019514e2006-03-28 10:26:45 +0000188 def __or__(self, val):
189 output.append("__or__ called")
190 def __ror__(self, val):
191 output.append("__ror__ called")
192 def __ior__(self, val):
193 output.append("__ior__ called")
194 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000195
Georg Brandl019514e2006-03-28 10:26:45 +0000196 def __and__(self, val):
197 output.append("__and__ called")
198 def __rand__(self, val):
199 output.append("__rand__ called")
200 def __iand__(self, val):
201 output.append("__iand__ called")
202 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000203
Georg Brandl019514e2006-03-28 10:26:45 +0000204 def __xor__(self, val):
205 output.append("__xor__ called")
206 def __rxor__(self, val):
207 output.append("__rxor__ called")
208 def __ixor__(self, val):
209 output.append("__ixor__ called")
210 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000211
Georg Brandl019514e2006-03-28 10:26:45 +0000212 def __rshift__(self, val):
213 output.append("__rshift__ called")
214 def __rrshift__(self, val):
215 output.append("__rrshift__ called")
216 def __irshift__(self, val):
217 output.append("__irshift__ called")
218 return self
Jeremy Hylton4de8df92001-08-29 17:50:27 +0000219
Georg Brandl019514e2006-03-28 10:26:45 +0000220 def __lshift__(self, val):
221 output.append("__lshift__ called")
222 def __rlshift__(self, val):
223 output.append("__rlshift__ called")
224 def __ilshift__(self, val):
225 output.append("__ilshift__ called")
226 return self
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000227
Georg Brandl019514e2006-03-28 10:26:45 +0000228 x = testall()
229 x + 1
230 1 + x
231 x += 1
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000232
Georg Brandl019514e2006-03-28 10:26:45 +0000233 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 if 1/2 == 0:
242 x / 1
243 1 / x
244 x /= 1
245 else:
246 # True division is in effect, so "/" doesn't map to __div__ etc;
247 # but the canned expected-output file requires that those get called.
248 x.__div__(1)
249 x.__rdiv__(1)
250 x.__idiv__(1)
Thomas Wouters104a7bc2000-08-24 20:14:10 +0000251
Georg Brandl019514e2006-03-28 10:26:45 +0000252 x // 1
253 1 // x
254 x //= 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
259
260 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 test_self.assertEquals(output, '''\
285__add__ called
286__radd__ called
287__iadd__ called
288__sub__ called
289__rsub__ called
290__isub__ called
291__mul__ called
292__rmul__ called
293__imul__ called
294__div__ called
295__rdiv__ called
296__idiv__ called
297__floordiv__ called
298__rfloordiv__ called
299__ifloordiv__ called
300__mod__ called
301__rmod__ called
302__imod__ called
303__pow__ called
304__rpow__ called
305__ipow__ called
306__or__ called
307__ror__ called
308__ior__ called
309__and__ called
310__rand__ called
311__iand__ called
312__xor__ called
313__rxor__ called
314__ixor__ called
315__rshift__ called
316__rrshift__ called
317__irshift__ called
318__lshift__ called
319__rlshift__ called
320__ilshift__ called
321'''.splitlines())
Anthony Baxter4ef3a232006-03-30 12:59:11 +0000322
Georg Brandl019514e2006-03-28 10:26:45 +0000323def test_main():
324 run_unittest(AugAssignTest)
325
326if __name__ == '__main__':
327 test_main()