diff options
Diffstat (limited to 'Lib/test/test_exceptions.py')
-rw-r--r-- | Lib/test/test_exceptions.py | 155 |
1 files changed, 143 insertions, 12 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index e0e81918383..b3c00b04a37 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -8,6 +8,7 @@ import unittest import pickle import weakref import errno +from textwrap import dedent from test.support import (captured_stderr, check_impl_detail, cpython_only, gc_collect, @@ -255,13 +256,13 @@ class ExceptionTests(unittest.TestCase): check('from __future__ import doesnt_exist', 1, 1) check('from __future__ import braces', 1, 1) check('x=1\nfrom __future__ import division', 2, 1) - check('foo(1=2)', 1, 6) + check('foo(1=2)', 1, 5) check('def f():\n x, y: int', 2, 3) check('[*x for x in xs]', 1, 2) check('foo(x for x in range(10), 100)', 1, 5) check('for 1 in []: pass', 1, 5) - check('(yield i) = 2', 1, 11) - check('def f(*):\n pass', 1, 8) + check('(yield i) = 2', 1, 2) + check('def f(*):\n pass', 1, 7) @cpython_only def testSettingException(self): @@ -395,25 +396,31 @@ class ExceptionTests(unittest.TestCase): 'filename' : 'filenameStr', 'filename2' : None}), (SyntaxError, (), {'msg' : None, 'text' : None, 'filename' : None, 'lineno' : None, 'offset' : None, - 'print_file_and_line' : None}), + 'end_offset': None, 'print_file_and_line' : None}), (SyntaxError, ('msgStr',), {'args' : ('msgStr',), 'text' : None, 'print_file_and_line' : None, 'msg' : 'msgStr', - 'filename' : None, 'lineno' : None, 'offset' : None}), + 'filename' : None, 'lineno' : None, 'offset' : None, + 'end_offset': None}), (SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr', - 'textStr')), + 'textStr', 'endLinenoStr', 'endOffsetStr')), {'offset' : 'offsetStr', 'text' : 'textStr', 'args' : ('msgStr', ('filenameStr', 'linenoStr', - 'offsetStr', 'textStr')), + 'offsetStr', 'textStr', + 'endLinenoStr', 'endOffsetStr')), 'print_file_and_line' : None, 'msg' : 'msgStr', - 'filename' : 'filenameStr', 'lineno' : 'linenoStr'}), + 'filename' : 'filenameStr', 'lineno' : 'linenoStr', + 'end_lineno': 'endLinenoStr', 'end_offset': 'endOffsetStr'}), (SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr', - 'textStr', 'print_file_and_lineStr'), + 'textStr', 'endLinenoStr', 'endOffsetStr', + 'print_file_and_lineStr'), {'text' : None, 'args' : ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr', - 'textStr', 'print_file_and_lineStr'), + 'textStr', 'endLinenoStr', 'endOffsetStr', + 'print_file_and_lineStr'), 'print_file_and_line' : None, 'msg' : 'msgStr', - 'filename' : None, 'lineno' : None, 'offset' : None}), + 'filename' : None, 'lineno' : None, 'offset' : None, + 'end_lineno': None, 'end_offset': None}), (UnicodeError, (), {'args' : (),}), (UnicodeEncodeError, ('ascii', 'a', 0, 1, 'ordinal not in range'), @@ -459,7 +466,7 @@ class ExceptionTests(unittest.TestCase): e = exc(*args) except: print("\nexc=%r, args=%r" % (exc, args), file=sys.stderr) - raise + # raise else: # Verify module name if not type(e).__name__.endswith('NaiveException'): @@ -1827,6 +1834,130 @@ class ImportErrorTests(unittest.TestCase): self.assertEqual(exc.name, orig.name) self.assertEqual(exc.path, orig.path) +class SyntaxErrorTests(unittest.TestCase): + def test_range_of_offsets(self): + cases = [ + # Basic range from 2->7 + (("bad.py", 1, 2, "abcdefg", 1, 7), + dedent( + """ + File "bad.py", line 1 + abcdefg + ^^^^^ + SyntaxError: bad bad + """)), + # end_offset = start_offset + 1 + (("bad.py", 1, 2, "abcdefg", 1, 3), + dedent( + """ + File "bad.py", line 1 + abcdefg + ^ + SyntaxError: bad bad + """)), + # Negative end offset + (("bad.py", 1, 2, "abcdefg", 1, -2), + dedent( + """ + File "bad.py", line 1 + abcdefg + ^ + SyntaxError: bad bad + """)), + # end offset before starting offset + (("bad.py", 1, 4, "abcdefg", 1, 2), + dedent( + """ + File "bad.py", line 1 + abcdefg + ^ + SyntaxError: bad bad + """)), + # Both offsets negative + (("bad.py", 1, -4, "abcdefg", 1, -2), + dedent( + """ + File "bad.py", line 1 + abcdefg + SyntaxError: bad bad + """)), + # Both offsets negative and the end more negative + (("bad.py", 1, -4, "abcdefg", 1, -5), + dedent( + """ + File "bad.py", line 1 + abcdefg + SyntaxError: bad bad + """)), + # Both offsets 0 + (("bad.py", 1, 0, "abcdefg", 1, 0), + dedent( + """ + File "bad.py", line 1 + abcdefg + SyntaxError: bad bad + """)), + # Start offset 0 and end offset not 0 + (("bad.py", 1, 0, "abcdefg", 1, 5), + dedent( + """ + File "bad.py", line 1 + abcdefg + SyntaxError: bad bad + """)), + # End offset pass the source lenght + (("bad.py", 1, 2, "abcdefg", 1, 100), + dedent( + """ + File "bad.py", line 1 + abcdefg + ^^^^^^ + SyntaxError: bad bad + """)), + ] + for args, expected in cases: + with self.subTest(args=args): + try: + raise SyntaxError("bad bad", args) + except SyntaxError as exc: + with support.captured_stderr() as err: + sys.__excepthook__(*sys.exc_info()) + the_exception = exc + + def test_attributes_new_constructor(self): + args = ("bad.py", 1, 2, "abcdefg", 1, 100) + the_exception = SyntaxError("bad bad", args) + filename, lineno, offset, error, end_lineno, end_offset = args + self.assertEqual(filename, the_exception.filename) + self.assertEqual(lineno, the_exception.lineno) + self.assertEqual(end_lineno, the_exception.end_lineno) + self.assertEqual(offset, the_exception.offset) + self.assertEqual(end_offset, the_exception.end_offset) + self.assertEqual(error, the_exception.text) + self.assertEqual("bad bad", the_exception.msg) + + def test_attributes_old_constructor(self): + args = ("bad.py", 1, 2, "abcdefg") + the_exception = SyntaxError("bad bad", args) + filename, lineno, offset, error = args + self.assertEqual(filename, the_exception.filename) + self.assertEqual(lineno, the_exception.lineno) + self.assertEqual(None, the_exception.end_lineno) + self.assertEqual(offset, the_exception.offset) + self.assertEqual(None, the_exception.end_offset) + self.assertEqual(error, the_exception.text) + self.assertEqual("bad bad", the_exception.msg) + + def test_incorrect_constructor(self): + args = ("bad.py", 1, 2) + self.assertRaises(TypeError, SyntaxError, "bad bad", args) + + args = ("bad.py", 1, 2, 4, 5, 6, 7) + self.assertRaises(TypeError, SyntaxError, "bad bad", args) + + args = ("bad.py", 1, 2, "abcdefg", 1) + self.assertRaises(TypeError, SyntaxError, "bad bad", args) + class PEP626Tests(unittest.TestCase): |