From 9b9394df5fa808f9a125e3e472e7df4c24aea5a1 Mon Sep 17 00:00:00 2001 From: Charlie Zhao Date: Sun, 4 Sep 2022 18:37:04 +0800 Subject: gh-93884: Improve test coverage of `PyNumber_ToBase` (GH-93932) 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 | 32 ++++++++++++++++------ .../2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst | 1 + 2 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index d0c4811..94f0809 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -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 index 0000000..ce38914 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-06-17-13-27-21.gh-issue-93884.5pvPvl.rst @@ -0,0 +1 @@ +Add test cases for :c:func:`PyNumber_ToBase` that take a large number or a non-int object as parameter. -- cgit v0.12