]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93884: Improve test coverage of `PyNumber_ToBase` (GH-93932)
authorCharlie Zhao <zhaoyu_hit@qq.com>
Sun, 4 Sep 2022 10:37:04 +0000 (18:37 +0800)
committerGitHub <noreply@github.com>
Sun, 4 Sep 2022 10:37:04 +0000 (03:37 -0700)
Link to #93884
* Test with some large negative and positive values(out of range of a longlong,i.e.[-2\*\*63, 2\*\*63-1])
* Test with objects of non-int type

Automerge-Triggered-By: GH:mdickinson
Lib/test/test_capi.py
Misc/NEWS.d/next/Tests/2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst [new file with mode: 0644]

index d0c4811cad1993f58e4c11e06476bb5fbd2f0184..94f080978b030f04c850c2811d901262e7b94e7f 100644 (file)
@@ -753,14 +753,30 @@ class CAPITest(unittest.TestCase):
 
     def test_pynumber_tobase(self):
         from _testcapi import pynumber_tobase
-        self.assertEqual(pynumber_tobase(123, 2), '0b1111011')
-        self.assertEqual(pynumber_tobase(123, 8), '0o173')
-        self.assertEqual(pynumber_tobase(123, 10), '123')
-        self.assertEqual(pynumber_tobase(123, 16), '0x7b')
-        self.assertEqual(pynumber_tobase(-123, 2), '-0b1111011')
-        self.assertEqual(pynumber_tobase(-123, 8), '-0o173')
-        self.assertEqual(pynumber_tobase(-123, 10), '-123')
-        self.assertEqual(pynumber_tobase(-123, 16), '-0x7b')
+        small_number = 123
+        large_number = 2**64
+        class IDX:
+            def __init__(self, val):
+                self.val = val
+            def __index__(self):
+                return self.val
+
+        test_cases = ((2, '0b1111011', '0b10000000000000000000000000000000000000000000000000000000000000000'),
+                      (8, '0o173', '0o2000000000000000000000'),
+                      (10, '123', '18446744073709551616'),
+                      (16, '0x7b', '0x10000000000000000'))
+        for base, small_target, large_target in test_cases:
+            with self.subTest(base=base, st=small_target, lt=large_target):
+                # Test for small number
+                self.assertEqual(pynumber_tobase(small_number, base), small_target)
+                self.assertEqual(pynumber_tobase(-small_number, base), '-' + small_target)
+                self.assertEqual(pynumber_tobase(IDX(small_number), base), small_target)
+                # Test for large number(out of range of a longlong,i.e.[-2**63, 2**63-1])
+                self.assertEqual(pynumber_tobase(large_number, base), large_target)
+                self.assertEqual(pynumber_tobase(-large_number, base), '-' + large_target)
+                self.assertEqual(pynumber_tobase(IDX(large_number), base), large_target)
+        self.assertRaises(TypeError, pynumber_tobase, IDX(123.0), 10)
+        self.assertRaises(TypeError, pynumber_tobase, IDX('123'), 10)
         self.assertRaises(TypeError, pynumber_tobase, 123.0, 10)
         self.assertRaises(TypeError, pynumber_tobase, '123', 10)
         self.assertRaises(SystemError, pynumber_tobase, 123, 0)
diff --git a/Misc/NEWS.d/next/Tests/2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst b/Misc/NEWS.d/next/Tests/2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst
new file mode 100644 (file)
index 0000000..ce38914
--- /dev/null
@@ -0,0 +1 @@
+Add test cases for :c:func:`PyNumber_ToBase` that take a large number or a non-int object as parameter.