@@ -205,8 +205,9 @@ def test_misc_multiply(self):
205205 self .assertRaises (MemoryError , inplacemultiply , [1 , 2 ], PY_SSIZE_T_MAX // 2 + 1 )
206206
207207 def test_misc_power (self ):
208- # PyNumber_Power()
208+ # PyNumber_Power(), PyNumber_InPlacePower()
209209 power = _testcapi .number_power
210+ inplacepower = _testcapi .number_inplacepower
210211
211212 class HasPow (WithDunder ):
212213 methname = '__pow__'
@@ -216,6 +217,39 @@ class HasPow(WithDunder):
216217 self .assertRaises (TypeError , power , 4 , 11 , 1.25 )
217218 self .assertRaises (TypeError , power , 4 , 11 , HasPow .with_val (NotImplemented ))
218219 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 (TypeError , 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 ))
219253
220254 @cpython_only
221255 def test_rshift_print (self ):
0 commit comments