bpo-23867: Argument Clinic: inline parsing code for a single positional parameter. by serhiy-storchaka · Pull Request #9689 · python/cpython
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index dafcf004c0..0e40829395 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -306,6 +306,9 @@ class BuiltinTest(unittest.TestCase): self.assertRaises(ValueError, chr, 0x00110000) self.assertRaises((OverflowError, ValueError), chr, 2**32) + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + chr(1.0) + def test_cmp(self): self.assertTrue(not hasattr(builtins, "cmp")) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 00b5d317c4..529ebaf9dd 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1758,6 +1758,10 @@ class CodecsModuleTest(unittest.TestCase): self.assertRaises(TypeError, codecs.lookup) self.assertRaises(LookupError, codecs.lookup, "__spam__") self.assertRaises(LookupError, codecs.lookup, " ") + with self.assertRaisesRegex(TypeError, 'argument must be str, not list'): + codecs.lookup([]) + with self.assertRaisesRegex(ValueError, 'embedded null character'): + codecs.lookup('abcd\0ef') def test_getencoder(self): self.assertRaises(TypeError, codecs.getencoder) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 3b442fe6a4..ae0ec49703 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -109,6 +109,9 @@ class TestCurses(unittest.TestCase): stdscr.addnstr(4,4, '1234', 3) stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD) + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + stdscr.attron(1.0) + stdscr.attron(curses.A_BOLD) stdscr.attroff(curses.A_BOLD) stdscr.attrset(curses.A_BOLD) @@ -250,6 +253,14 @@ class TestCurses(unittest.TestCase): f.seek(0) curses.getwin(f) + # Make sure type errors in halfdelay are caught + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + curses.halfdelay(1.0) + with self.assertRaisesRegex(OverflowError, 'unsigned byte integer is less than minimum'): + curses.halfdelay(-1) + with self.assertRaisesRegex(OverflowError, 'unsigned byte integer is greater than maximum'): + curses.halfdelay(5000) + curses.halfdelay(1) curses.intrflush(1) curses.meta(1) @@ -272,6 +283,11 @@ class TestCurses(unittest.TestCase): curses.unctrl('a') curses.ungetch('a') if hasattr(curses, 'use_env'): + # Make sure type errors in use_env are caught + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + curses.use_env(1.0) + with self.assertRaisesRegex(TypeError, r'an integer is required \(got type list\)'): + curses.use_env([]) curses.use_env(1) # Functions only available on a few platforms @@ -285,6 +301,14 @@ class TestCurses(unittest.TestCase): curses.pair_content(curses.COLOR_PAIRS - 1) curses.pair_number(0) + # Make sure type errors in color_content are caught + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + curses.color_content(1.0) + with self.assertRaisesRegex(OverflowError, 'signed short integer is less than minimum'): + curses.color_content(-100000) + with self.assertRaisesRegex(OverflowError, 'signed short integer is greater than maximum'): + curses.color_content(100000) + if hasattr(curses, 'use_default_colors'): curses.use_default_colors() @@ -301,6 +325,11 @@ class TestCurses(unittest.TestCase): (availmask, oldmask) = curses.mousemask(curses.BUTTON1_PRESSED) if availmask == 0: self.skipTest('mouse stuff not available') + + # type check arguments to mousemask + with self.assertRaisesRegex(TypeError, 'argument must be int, not float'): + curses.mousemask(1.0) + curses.mouseinterval(10) # just verify these don't cause errors curses.ungetmouse(0, 0, 0, 0, curses.BUTTON1_PRESSED) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index c68b2fea85..97865fade9 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1312,6 +1312,7 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): self.assertEqual(bufio.readinto1(b), 6) self.assertEqual(b[:6], b"fghjkl") self.assertEqual(rawio._reads, 4) + self.assertRaises(TypeError, bufio.readinto1, []) def test_readinto_array(self): buffer_size = 60 diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 9b2f55e1f4..0730738afc 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -271,6 +271,7 @@ class MathTests(unittest.TestCase): def testAcos(self): self.assertRaises(TypeError, math.acos) + self.assertRaises(TypeError, math.acos, 'a') self.ftest('acos(-1)', math.acos(-1), math.pi) self.ftest('acos(0)', math.acos(0), math.pi/2) self.ftest('acos(1)', math.acos(1), 0) @@ -475,6 +476,8 @@ class MathTests(unittest.TestCase): def testDegrees(self): self.assertRaises(TypeError, math.degrees) + with self.assertRaisesRegex(TypeError, 'must be real number, not str'): + math.degrees('a') self.ftest('degrees(pi)', math.degrees(math.pi), 180.0) self.ftest('degrees(pi/2)', math.degrees(math.pi/2), 90.0) self.ftest('degrees(-pi/4)', math.degrees(-math.pi/4), -45.0) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 6dbc255612..6bb81ab7dd 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1332,6 +1332,15 @@ class URandomTests(unittest.TestCase): data2 = self.get_urandom_subprocess(16) self.assertNotEqual(data1, data2) + def test_uranom_typechecking(self): + with self.assertRaisesRegex(TypeError, 'integer argument expected, got float'): + os.urandom(1.0) + with self.assertRaisesRegex(TypeError, 'object cannot be interpreted as an integer'): + os.urandom([]) + # This test should be rewritten to reliably overflow ssize_t on any platform + with self.assertRaisesRegex(OverflowError, 'Python int too large to convert to C ssize_t'): + os.urandom(2**128) + @unittest.skipUnless(hasattr(os, 'getrandom'), 'need os.getrandom()') class GetRandomTests(unittest.TestCase): diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 170778fa97..ee7587e0d8 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -158,6 +158,9 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): self.assertRaises(TypeError, self.db.bidirectional) self.assertRaises(TypeError, self.db.bidirectional, 'xx') + with self.assertRaisesRegex(TypeError, 'argument must be a unicode character, not list'): + self.db.bidirectional([]) + def test_decomposition(self): self.assertEqual(self.db.decomposition('\uFFFE'),'') self.assertEqual(self.db.decomposition('\u00bc'), '<fraction> 0031 2044 0034')