blob: 5cd300ac7600d077f209dc0f58af27aa49ba6b7d [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:
18 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
Walter Dörwaldc85c74c2005-11-18 16:51:05 +000055 def test_members(self):
56 # Covers Python/structmember.c::listmembers()
57 try:
58 1/0
59 except:
60 import sys
Guido van Rossume7ba4952007-06-06 23:52:48 +000061 sys.exc_info()[2].__members__
Walter Dörwaldc85c74c2005-11-18 16:51:05 +000062
Thomas Wouters477c8d52006-05-27 19:21:47 +000063 def test_base_exception(self):
64 # Test that exceptions derived from BaseException are formatted right
65 e = KeyboardInterrupt()
66 lst = traceback.format_exception_only(e.__class__, e)
67 self.assertEqual(lst, ['KeyboardInterrupt\n'])
68
Thomas Wouters0e3f5912006-08-11 14:57:12 +000069 def test_format_exception_only_bad__str__(self):
70 class X(Exception):
71 def __str__(self):
72 1/0
73 err = traceback.format_exception_only(X, X())
74 self.assertEqual(len(err), 1)
75 str_value = '<unprintable %s object>' % X.__name__
Brett Cannon44c52612007-02-27 00:12:43 +000076 if X.__module__ in ('__main__', '__builtin__'):
77 str_name = X.__name__
78 else:
79 str_name = '.'.join([X.__module__, X.__name__])
80 self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000081
Thomas Wouters89f507f2006-12-13 04:49:30 +000082 def test_without_exception(self):
83 err = traceback.format_exception_only(None, None)
84 self.assertEqual(err, ['None\n'])
85
Thomas Wouters0e3f5912006-08-11 14:57:12 +000086
Fred Drake2e2be372001-09-20 21:33:42 +000087def test_main():
88 run_unittest(TracebackCases)
89
90
91if __name__ == "__main__":
92 test_main()