From: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:40:48 +0000 (+0200) Subject: [3.12] gh-131015: Add test for bytes formatting errors (#131881) (#132114) X-Git-Tag: v3.12.10~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6dab90a403d755b1d91b4b2417511c02dcfaeff9;p=thirdparty%2FPython%2Fcpython.git [3.12] gh-131015: Add test for bytes formatting errors (#131881) (#132114) * gh-131015: Add test for bytes formatting errors (#131881) Co-authored-by: Ageev Maxim (cherry picked from commit 05557788f3c284ede73e6f94810ec796bb9d3721) --- diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index a3804a945f2e..b27d43695eef 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -10,6 +10,7 @@ import re import sys import copy import functools +import operator import pickle import tempfile import textwrap @@ -737,6 +738,37 @@ class BaseBytesTest: check(b'%i%b %*.*b', (10, b'3', 5, 3, b'abc',), b'103 abc') check(b'%c', b'a', b'a') + class PseudoFloat: + def __init__(self, value): + self.value = float(value) + def __int__(self): + return int(self.value) + + pi = PseudoFloat(3.1415) + + exceptions_params = [ + ('%x format: an integer is required, not float', b'%x', 3.14), + ('%X format: an integer is required, not float', b'%X', 2.11), + ('%o format: an integer is required, not float', b'%o', 1.79), + ('%x format: an integer is required, not PseudoFloat', b'%x', pi), + ('%x format: an integer is required, not complex', b'%x', 3j), + ('%X format: an integer is required, not complex', b'%X', 2j), + ('%o format: an integer is required, not complex', b'%o', 1j), + ('%u format: a real number is required, not complex', b'%u', 3j), + # See https://github.com/python/cpython/issues/130928 as for why + # the exception message contains '%d' instead of '%i'. + ('%d format: a real number is required, not complex', b'%i', 2j), + ('%d format: a real number is required, not complex', b'%d', 2j), + ( + r'%c requires an integer in range\(256\) or a single byte', + b'%c', pi + ), + ] + + for msg, format_bytes, value in exceptions_params: + with self.assertRaisesRegex(TypeError, msg): + operator.mod(format_bytes, value) + def test_imod(self): b = self.type2test(b'hello, %b!') orig = b