@@ -205,8 +205,9 @@ def test_misc_multiply(self):
205
205
self .assertRaises (MemoryError , inplacemultiply , [1 , 2 ], PY_SSIZE_T_MAX // 2 + 1 )
206
206
207
207
def test_misc_power (self ):
208
- # PyNumber_Power()
208
+ # PyNumber_Power(), PyNumber_InPlacePower()
209
209
power = _testcapi .number_power
210
+ inplacepower = _testcapi .number_inplacepower
210
211
211
212
class HasPow (WithDunder ):
212
213
methname = '__pow__'
@@ -216,6 +217,39 @@ class HasPow(WithDunder):
216
217
self .assertRaises (TypeError , power , 4 , 11 , 1.25 )
217
218
self .assertRaises (TypeError , power , 4 , 11 , HasPow .with_val (NotImplemented ))
218
219
self .assertRaises (TypeError , power , 4 , 11 , object ())
220
+ self .assertEqual (inplacepower (4 , 11 , 5 ), pow (4 , 11 , 5 ))
221
+ self .assertRaises (TypeError , inplacepower , 4 , 11 , 1.25 )
222
+ self .assertRaises (TypeError , inplacepower , 4 , 11 , object ())
223
+
224
+ class X :
225
+ def __pow__ (* args ):
226
+ return args
227
+
228
+ x = X ()
229
+ self .assertEqual (power (x , 11 ), (x , 11 ))
230
+ self .assertEqual (inplacepower (x , 11 ), (x , 11 ))
231
+ self .assertEqual (power (x , 11 , 5 ), (x , 11 , 5 ))
232
+ self .assertEqual (inplacepower (x , 11 , 5 ), (x , 11 , 5 ))
233
+
234
+ class X :
235
+ def __rpow__ (* args ):
236
+ return args
237
+
238
+ x = X ()
239
+ self .assertEqual (power (4 , x ), (x , 4 ))
240
+ self .assertEqual (inplacepower (4 , x ), (x , 4 ))
241
+ # XXX: Three-arg power doesn't use __rpow__.
242
+ self .assertRaises (TypeError , power , 4 , x , 5 )
243
+ self .assertRaises (Ty
7CDD
peError , inplacepower , 4 , x , 5 )
244
+
245
+ class X :
246
+ def __ipow__ (* args ):
247
+ return args
248
+
249
+ x = X ()
250
+ self .assertEqual (inplacepower (x , 11 ), (x , 11 ))
251
+ # XXX: In-place power doesn't pass the third arg to __ipow__.
252
+ self .assertEqual (inplacepower (x , 11 , 5 ), (x , 11 ))
219
253
220
254
def test_long (self ):
221
255
# Test PyNumber_Long()
0 commit comments