python (3.11.7)
1 # Augmented assignment test.
2
3 import unittest
4
5
6 class ESC[4;38;5;81mAugAssignTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
7 def testBasic(self):
8 x = 2
9 x += 1
10 x *= 2
11 x **= 2
12 x -= 8
13 x //= 5
14 x %= 3
15 x &= 2
16 x |= 5
17 x ^= 1
18 x /= 2
19 self.assertEqual(x, 3.0)
20
21 def test_with_unpacking(self):
22 self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec")
23
24 def testInList(self):
25 x = [2]
26 x[0] += 1
27 x[0] *= 2
28 x[0] **= 2
29 x[0] -= 8
30 x[0] //= 5
31 x[0] %= 3
32 x[0] &= 2
33 x[0] |= 5
34 x[0] ^= 1
35 x[0] /= 2
36 self.assertEqual(x[0], 3.0)
37
38 def testInDict(self):
39 x = {0: 2}
40 x[0] += 1
41 x[0] *= 2
42 x[0] **= 2
43 x[0] -= 8
44 x[0] //= 5
45 x[0] %= 3
46 x[0] &= 2
47 x[0] |= 5
48 x[0] ^= 1
49 x[0] /= 2
50 self.assertEqual(x[0], 3.0)
51
52 def testSequences(self):
53 x = [1,2]
54 x += [3,4]
55 x *= 2
56
57 self.assertEqual(x, [1, 2, 3, 4, 1, 2, 3, 4])
58
59 x = [1, 2, 3]
60 y = x
61 x[1:2] *= 2
62 y[1:2] += [1]
63
64 self.assertEqual(x, [1, 2, 1, 2, 3])
65 self.assertTrue(x is y)
66
67 def testCustomMethods1(self):
68
69 class ESC[4;38;5;81maug_test:
70 def __init__(self, value):
71 self.val = value
72 def __radd__(self, val):
73 return self.val + val
74 def __add__(self, val):
75 return aug_test(self.val + val)
76
77 class ESC[4;38;5;81maug_test2(ESC[4;38;5;149maug_test):
78 def __iadd__(self, val):
79 self.val = self.val + val
80 return self
81
82 class ESC[4;38;5;81maug_test3(ESC[4;38;5;149maug_test):
83 def __iadd__(self, val):
84 return aug_test3(self.val + val)
85
86 class ESC[4;38;5;81maug_test4(ESC[4;38;5;149maug_test3):
87 """Blocks inheritance, and fallback to __add__"""
88 __iadd__ = None
89
90 x = aug_test(1)
91 y = x
92 x += 10
93
94 self.assertIsInstance(x, aug_test)
95 self.assertTrue(y is not x)
96 self.assertEqual(x.val, 11)
97
98 x = aug_test2(2)
99 y = x
100 x += 10
101
102 self.assertTrue(y is x)
103 self.assertEqual(x.val, 12)
104
105 x = aug_test3(3)
106 y = x
107 x += 10
108
109 self.assertIsInstance(x, aug_test3)
110 self.assertTrue(y is not x)
111 self.assertEqual(x.val, 13)
112
113 x = aug_test4(4)
114 with self.assertRaises(TypeError):
115 x += 10
116
117
118 def testCustomMethods2(test_self):
119 output = []
120
121 class ESC[4;38;5;81mtestall:
122 def __add__(self, val):
123 output.append("__add__ called")
124 def __radd__(self, val):
125 output.append("__radd__ called")
126 def __iadd__(self, val):
127 output.append("__iadd__ called")
128 return self
129
130 def __sub__(self, val):
131 output.append("__sub__ called")
132 def __rsub__(self, val):
133 output.append("__rsub__ called")
134 def __isub__(self, val):
135 output.append("__isub__ called")
136 return self
137
138 def __mul__(self, val):
139 output.append("__mul__ called")
140 def __rmul__(self, val):
141 output.append("__rmul__ called")
142 def __imul__(self, val):
143 output.append("__imul__ called")
144 return self
145
146 def __matmul__(self, val):
147 output.append("__matmul__ called")
148 def __rmatmul__(self, val):
149 output.append("__rmatmul__ called")
150 def __imatmul__(self, val):
151 output.append("__imatmul__ called")
152 return self
153
154 def __floordiv__(self, val):
155 output.append("__floordiv__ called")
156 return self
157 def __ifloordiv__(self, val):
158 output.append("__ifloordiv__ called")
159 return self
160 def __rfloordiv__(self, val):
161 output.append("__rfloordiv__ called")
162 return self
163
164 def __truediv__(self, val):
165 output.append("__truediv__ called")
166 return self
167 def __rtruediv__(self, val):
168 output.append("__rtruediv__ called")
169 return self
170 def __itruediv__(self, val):
171 output.append("__itruediv__ called")
172 return self
173
174 def __mod__(self, val):
175 output.append("__mod__ called")
176 def __rmod__(self, val):
177 output.append("__rmod__ called")
178 def __imod__(self, val):
179 output.append("__imod__ called")
180 return self
181
182 def __pow__(self, val):
183 output.append("__pow__ called")
184 def __rpow__(self, val):
185 output.append("__rpow__ called")
186 def __ipow__(self, val):
187 output.append("__ipow__ called")
188 return self
189
190 def __or__(self, val):
191 output.append("__or__ called")
192 def __ror__(self, val):
193 output.append("__ror__ called")
194 def __ior__(self, val):
195 output.append("__ior__ called")
196 return self
197
198 def __and__(self, val):
199 output.append("__and__ called")
200 def __rand__(self, val):
201 output.append("__rand__ called")
202 def __iand__(self, val):
203 output.append("__iand__ called")
204 return self
205
206 def __xor__(self, val):
207 output.append("__xor__ called")
208 def __rxor__(self, val):
209 output.append("__rxor__ called")
210 def __ixor__(self, val):
211 output.append("__ixor__ called")
212 return self
213
214 def __rshift__(self, val):
215 output.append("__rshift__ called")
216 def __rrshift__(self, val):
217 output.append("__rrshift__ called")
218 def __irshift__(self, val):
219 output.append("__irshift__ called")
220 return self
221
222 def __lshift__(self, val):
223 output.append("__lshift__ called")
224 def __rlshift__(self, val):
225 output.append("__rlshift__ called")
226 def __ilshift__(self, val):
227 output.append("__ilshift__ called")
228 return self
229
230 x = testall()
231 x + 1
232 1 + x
233 x += 1
234
235 x - 1
236 1 - x
237 x -= 1
238
239 x * 1
240 1 * x
241 x *= 1
242
243 x @ 1
244 1 @ x
245 x @= 1
246
247 x / 1
248 1 / x
249 x /= 1
250
251 x // 1
252 1 // x
253 x //= 1
254
255 x % 1
256 1 % x
257 x %= 1
258
259 x ** 1
260 1 ** x
261 x **= 1
262
263 x | 1
264 1 | x
265 x |= 1
266
267 x & 1
268 1 & x
269 x &= 1
270
271 x ^ 1
272 1 ^ x
273 x ^= 1
274
275 x >> 1
276 1 >> x
277 x >>= 1
278
279 x << 1
280 1 << x
281 x <<= 1
282
283 test_self.assertEqual(output, '''\
284 __add__ called
285 __radd__ called
286 __iadd__ called
287 __sub__ called
288 __rsub__ called
289 __isub__ called
290 __mul__ called
291 __rmul__ called
292 __imul__ called
293 __matmul__ called
294 __rmatmul__ called
295 __imatmul__ called
296 __truediv__ called
297 __rtruediv__ called
298 __itruediv__ called
299 __floordiv__ called
300 __rfloordiv__ called
301 __ifloordiv__ called
302 __mod__ called
303 __rmod__ called
304 __imod__ called
305 __pow__ called
306 __rpow__ called
307 __ipow__ called
308 __or__ called
309 __ror__ called
310 __ior__ called
311 __and__ called
312 __rand__ called
313 __iand__ called
314 __xor__ called
315 __rxor__ called
316 __ixor__ called
317 __rshift__ called
318 __rrshift__ called
319 __irshift__ called
320 __lshift__ called
321 __rlshift__ called
322 __ilshift__ called
323 '''.splitlines())
324
325 if __name__ == '__main__':
326 unittest.main()