blob: 3f89e6a795bb3c77c77a32901552a97f5d0a67ed [file] [log] [blame]
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +00001"""Test cases for traceback module"""
2
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003from _testcapi import traceback_print
4from io import StringIO
5import sys
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test.support import run_unittest, is_jython, Error
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +00008
9import traceback
10
Christian Heimes81ee3ef2008-05-04 22:42:01 +000011try:
12 raise KeyError
13except KeyError:
14 type_, value, tb = sys.exc_info()
15 file_ = StringIO()
16 traceback_print(tb, file_)
17 example_traceback = file_.getvalue()
18else:
19 raise Error("unable to create test traceback string")
20
21
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000022class TracebackCases(unittest.TestCase):
23 # For now, a very minimal set of tests. I want to be sure that
24 # formatting of SyntaxErrors works based on changes for 2.1.
25
26 def get_exception_format(self, func, exc):
27 try:
28 func()
Guido van Rossumb940e112007-01-10 16:19:56 +000029 except exc as value:
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000030 return traceback.format_exception_only(exc, value)
31 else:
Collin Winter3add4d72007-08-29 23:37:32 +000032 raise ValueError("call did not raise exception")
Tim Peters7e01e282001-04-08 07:44:07 +000033
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000034 def syntax_error_with_caret(self):
35 compile("def fact(x):\n\treturn x!\n", "?", "exec")
36
37 def syntax_error_without_caret(self):
38 # XXX why doesn't compile raise the same traceback?
Barry Warsaw408b6d32002-07-30 23:27:12 +000039 import test.badsyntax_nocaret
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000040
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000041 def syntax_error_bad_indentation(self):
Georg Brandl88fc6642007-02-09 21:28:07 +000042 compile("def spam():\n print(1)\n print(2)", "?", "exec")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000043
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000044 def test_caret(self):
45 err = self.get_exception_format(self.syntax_error_with_caret,
46 SyntaxError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000047 self.assertEqual(len(err), 4)
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000048 self.assert_(err[1].strip() == "return x!")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000049 self.assert_("^" in err[2]) # third line has caret
Guido van Rossume61fd5b2007-07-11 12:20:59 +000050 self.assertEqual(err[1].find("!"), err[2].find("^")) # in the right place
Tim Peters7e01e282001-04-08 07:44:07 +000051
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000052 def test_nocaret(self):
Finn Bock57f0f342002-11-06 11:45:15 +000053 if is_jython:
54 # jython adds a caret in this case (why shouldn't it?)
55 return
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000056 err = self.get_exception_format(self.syntax_error_without_caret,
57 SyntaxError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000058 self.assertEqual(len(err), 3)
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000059 self.assert_(err[1].strip() == "[x for x in x] = x")
60
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000061 def test_bad_indentation(self):
62 err = self.get_exception_format(self.syntax_error_bad_indentation,
63 IndentationError)
Guido van Rossume61fd5b2007-07-11 12:20:59 +000064 self.assertEqual(len(err), 4)
65 self.assertEqual(err[1].strip(), "print(2)")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000066 self.assert_("^" in err[2])
Guido van Rossume61fd5b2007-07-11 12:20:59 +000067 self.assertEqual(err[1].find(")"), err[2].find("^"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000068
Thomas Wouters477c8d52006-05-27 19:21:47 +000069 def test_base_exception(self):
70 # Test that exceptions derived from BaseException are formatted right
71 e = KeyboardInterrupt()
72 lst = traceback.format_exception_only(e.__class__, e)
73 self.assertEqual(lst, ['KeyboardInterrupt\n'])
74
Thomas Wouters0e3f5912006-08-11 14:57:12 +000075 def test_format_exception_only_bad__str__(self):
76 class X(Exception):
77 def __str__(self):
78 1/0
79 err = traceback.format_exception_only(X, X())
80 self.assertEqual(len(err), 1)
81 str_value = '<unprintable %s object>' % X.__name__
Georg Brandl1a3284e2007-12-02 09:40:06 +000082 if X.__module__ in ('__main__', 'builtins'):
Brett Cannon44c52612007-02-27 00:12:43 +000083 str_name = X.__name__
84 else:
85 str_name = '.'.join([X.__module__, X.__name__])
86 self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000087
Thomas Wouters89f507f2006-12-13 04:49:30 +000088 def test_without_exception(self):
89 err = traceback.format_exception_only(None, None)
90 self.assertEqual(err, ['None\n'])
91
Thomas Wouters0e3f5912006-08-11 14:57:12 +000092
Christian Heimes81ee3ef2008-05-04 22:42:01 +000093class TracebackFormatTests(unittest.TestCase):
94
95 def test_traceback_indentation(self):
96 # Make sure that the traceback is properly indented.
97 tb_lines = example_traceback.splitlines()
98 self.assertEquals(len(tb_lines), 3)
99 banner, location, source_line = tb_lines
100 self.assert_(banner.startswith('Traceback'))
101 self.assert_(location.startswith(' File'))
102 self.assert_(source_line.startswith('raise'))
103
104
Fred Drake2e2be372001-09-20 21:33:42 +0000105def test_main():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000106 run_unittest(TracebackCases, TracebackFormatTests)
Fred Drake2e2be372001-09-20 21:33:42 +0000107
108
109if __name__ == "__main__":
110 test_main()