blob: 93e512601d5aa387e0df344d314ea21111e7d3aa [file] [log] [blame]
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +00001"""Test cases for traceback module"""
2
3import unittest
Finn Bock57f0f342002-11-06 11:45:15 +00004from test.test_support import run_unittest, is_jython
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +00005
6import traceback
7
8class TracebackCases(unittest.TestCase):
9 # For now, a very minimal set of tests. I want to be sure that
10 # formatting of SyntaxErrors works based on changes for 2.1.
11
12 def get_exception_format(self, func, exc):
13 try:
14 func()
Guido van Rossumb940e112007-01-10 16:19:56 +000015 except exc as value:
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000016 return traceback.format_exception_only(exc, value)
17 else:
Collin Winter3add4d72007-08-29 23:37:32 +000018 raise ValueError("call did not raise exception")
Tim Peters7e01e282001-04-08 07:44:07 +000019
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000020 def syntax_error_with_caret(self):
21 compile("def fact(x):\n\treturn x!\n", "?", "exec")
22
23 def syntax_error_without_caret(self):
24 # XXX why doesn't compile raise the same traceback?
Barry Warsaw408b6d32002-07-30 23:27:12 +000025 import test.badsyntax_nocaret
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000026
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000027 def syntax_error_bad_indentation(self):
Georg Brandl88fc6642007-02-09 21:28:07 +000028 compile("def spam():\n print(1)\n print(2)", "?", "exec")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000029
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000030 def test_caret(self):
31 err = self.get_exception_format(self.syntax_error_with_caret,
32 SyntaxError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000033 self.assertEqual(len(err), 4)
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000034 self.assert_(err[1].strip() == "return x!")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000035 self.assert_("^" in err[2]) # third line has caret
Guido van Rossume61fd5b2007-07-11 12:20:59 +000036 self.assertEqual(err[1].find("!"), err[2].find("^")) # in the right place
Tim Peters7e01e282001-04-08 07:44:07 +000037
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000038 def test_nocaret(self):
Finn Bock57f0f342002-11-06 11:45:15 +000039 if is_jython:
40 # jython adds a caret in this case (why shouldn't it?)
41 return
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000042 err = self.get_exception_format(self.syntax_error_without_caret,
43 SyntaxError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000044 self.assertEqual(len(err), 3)
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000045 self.assert_(err[1].strip() == "[x for x in x] = x")
46
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000047 def test_bad_indentation(self):
48 err = self.get_exception_format(self.syntax_error_bad_indentation,
49 IndentationError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000050 self.assertEqual(len(err), 4)
51 self.assertEqual(err[1].strip(), "print(2)")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000052 self.assert_("^" in err[2])
Guido van Rossume61fd5b2007-07-11 12:20:59 +000053 self.assertEqual(err[1].find(")"), err[2].find("^"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000054
Thomas Wouters477c8d52006-05-27 19:21:47 +000055 def test_base_exception(self):
56 # Test that exceptions derived from BaseException are formatted right
57 e = KeyboardInterrupt()
58 lst = traceback.format_exception_only(e.__class__, e)
59 self.assertEqual(lst, ['KeyboardInterrupt\n'])
60
Thomas Wouters0e3f5912006-08-11 14:57:12 +000061 def test_format_exception_only_bad__str__(self):
62 class X(Exception):
63 def __str__(self):
64 1/0
65 err = traceback.format_exception_only(X, X())
66 self.assertEqual(len(err), 1)
67 str_value = '<unprintable %s object>' % X.__name__
Georg Brandl1a3284e2007-12-02 09:40:06 +000068 if X.__module__ in ('__main__', 'builtins'):
Brett Cannon44c52612007-02-27 00:12:43 +000069 str_name = X.__name__
70 else:
71 str_name = '.'.join([X.__module__, X.__name__])
72 self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000073
Thomas Wouters89f507f2006-12-13 04:49:30 +000074 def test_without_exception(self):
75 err = traceback.format_exception_only(None, None)
76 self.assertEqual(err, ['None\n'])
77
Thomas Wouters0e3f5912006-08-11 14:57:12 +000078
Fred Drake2e2be372001-09-20 21:33:42 +000079def test_main():
80 run_unittest(TracebackCases)
81
82
83if __name__ == "__main__":
84 test_main()