import sys
import copy
import functools
+import operator
import pickle
import tempfile
import textwrap
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