mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-90716: bugfixes and more tests for _pylong. (#99073)
* Properly decref on _pylong import error. * Improve the error message on _pylong TypeError. * Fix the assertion error in pydebug builds to be a TypeError. * Tie the return value comments together. These are minor followups to issues not caught among the reviewers on https://github.com/python/cpython/pull/96673.
This commit is contained in:
parent
bee1070289
commit
4c4b5ce2e5
2 changed files with 50 additions and 4 deletions
|
@ -2,10 +2,16 @@ import sys
|
|||
import time
|
||||
|
||||
import unittest
|
||||
from unittest import mock
|
||||
from test import support
|
||||
from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
|
||||
INVALID_UNDERSCORE_LITERALS)
|
||||
|
||||
try:
|
||||
import _pylong
|
||||
except ImportError:
|
||||
_pylong = None
|
||||
|
||||
L = [
|
||||
('0', 0),
|
||||
('1', 1),
|
||||
|
@ -841,6 +847,39 @@ class PyLongModuleTests(unittest.TestCase):
|
|||
with self.assertRaises(ValueError) as err:
|
||||
int('_' + s)
|
||||
|
||||
@support.cpython_only # tests implementation details of CPython.
|
||||
@unittest.skipUnless(_pylong, "_pylong module required")
|
||||
@mock.patch.object(_pylong, "int_to_decimal_string")
|
||||
def test_pylong_misbehavior_error_path_to_str(
|
||||
self, mock_int_to_str):
|
||||
with support.adjust_int_max_str_digits(20_000):
|
||||
big_value = int('7'*19_999)
|
||||
mock_int_to_str.return_value = None # not a str
|
||||
with self.assertRaises(TypeError) as ctx:
|
||||
str(big_value)
|
||||
self.assertIn('_pylong.int_to_decimal_string did not',
|
||||
str(ctx.exception))
|
||||
mock_int_to_str.side_effect = RuntimeError("testABC")
|
||||
with self.assertRaises(RuntimeError):
|
||||
str(big_value)
|
||||
|
||||
@support.cpython_only # tests implementation details of CPython.
|
||||
@unittest.skipUnless(_pylong, "_pylong module required")
|
||||
@mock.patch.object(_pylong, "int_from_string")
|
||||
def test_pylong_misbehavior_error_path_from_str(
|
||||
self, mock_int_from_str):
|
||||
big_value = '7'*19_999
|
||||
with support.adjust_int_max_str_digits(20_000):
|
||||
mock_int_from_str.return_value = b'not an int'
|
||||
with self.assertRaises(TypeError) as ctx:
|
||||
int(big_value)
|
||||
self.assertIn('_pylong.int_from_string did not',
|
||||
str(ctx.exception))
|
||||
|
||||
mock_int_from_str.side_effect = RuntimeError("test123")
|
||||
with self.assertRaises(RuntimeError):
|
||||
int(big_value)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue