From f76f843f0ebc1be7d4de08a3ca9cb1cc08704139 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 17 Feb 2025 02:07:10 +0200 Subject: [PATCH] gh-86069: Add more PyNumber_InPlacePower() tests (GH-130111) Test it with the third argument. (cherry picked from commit cfe41037eb5293a051846ddc0b4afdb7a5f60540) Co-authored-by: Serhiy Storchaka --- Lib/test/test_capi/test_number.py | 36 ++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_capi/test_number.py b/Lib/test/test_capi/test_number.py index 3c1f0f248c37cb..ca3494e8a5092a 100644 --- a/Lib/test/test_capi/test_number.py +++ b/Lib/test/test_capi/test_number.py @@ -205,8 +205,9 @@ def test_misc_multiply(self): self.assertRaises(MemoryError, inplacemultiply, [1, 2], PY_SSIZE_T_MAX//2 + 1) def test_misc_power(self): - # PyNumber_Power() + # PyNumber_Power(), PyNumber_InPlacePower() power = _testcapi.number_power + inplacepower = _testcapi.number_inplacepower class HasPow(WithDunder): methname = '__pow__' @@ -216,6 +217,39 @@ class HasPow(WithDunder): self.assertRaises(TypeError, power, 4, 11, 1.25) self.assertRaises(TypeError, power, 4, 11, HasPow.with_val(NotImplemented)) self.assertRaises(TypeError, power, 4, 11, object()) + self.assertEqual(inplacepower(4, 11, 5), pow(4, 11, 5)) + self.assertRaises(TypeError, inplacepower, 4, 11, 1.25) + self.assertRaises(TypeError, inplacepower, 4, 11, object()) + + class X: + def __pow__(*args): + return args + + x = X() + self.assertEqual(power(x, 11), (x, 11)) + self.assertEqual(inplacepower(x, 11), (x, 11)) + self.assertEqual(power(x, 11, 5), (x, 11, 5)) + self.assertEqual(inplacepower(x, 11, 5), (x, 11, 5)) + + class X: + def __rpow__(*args): + return args + + x = X() + self.assertEqual(power(4, x), (x, 4)) + self.assertEqual(inplacepower(4, x), (x, 4)) + # XXX: Three-arg power doesn't use __rpow__. + self.assertRaises(TypeError, power, 4, x, 5) + self.assertRaises(TypeError, inplacepower, 4, x, 5) + + class X: + def __ipow__(*args): + return args + + x = X() + self.assertEqual(inplacepower(x, 11), (x, 11)) + # XXX: In-place power doesn't pass the third arg to __ipow__. + self.assertEqual(inplacepower(x, 11, 5), (x, 11)) @cpython_only def test_rshift_print(self):