blob: 26ab7dc111896708edde51fce9acc8fc2cdfbf68 [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
Georg Brandl24c274f2006-04-12 21:14:09 +00008class TbError(Exception):
9 pass
10
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000011class TracebackCases(unittest.TestCase):
12 # For now, a very minimal set of tests. I want to be sure that
13 # formatting of SyntaxErrors works based on changes for 2.1.
14
15 def get_exception_format(self, func, exc):
16 try:
17 func()
18 except exc, value:
19 return traceback.format_exception_only(exc, value)
20 else:
21 raise ValueError, "call did not raise exception"
Tim Peters7e01e282001-04-08 07:44:07 +000022
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000023 def syntax_error_with_caret(self):
24 compile("def fact(x):\n\treturn x!\n", "?", "exec")
25
26 def syntax_error_without_caret(self):
27 # XXX why doesn't compile raise the same traceback?
Barry Warsaw408b6d32002-07-30 23:27:12 +000028 import test.badsyntax_nocaret
Tim Peters480725d2006-04-03 02:46:44 +000029
Georg Brandl51dbc4c2006-03-31 15:59:13 +000030 def syntax_error_bad_indentation(self):
31 compile("def spam():\n print 1\n print 2", "?", "exec")
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000032
33 def test_caret(self):
34 err = self.get_exception_format(self.syntax_error_with_caret,
35 SyntaxError)
36 self.assert_(len(err) == 4)
37 self.assert_("^" in err[2]) # third line has caret
38 self.assert_(err[1].strip() == "return x!")
Tim Peters7e01e282001-04-08 07:44:07 +000039
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000040 def test_nocaret(self):
Finn Bock57f0f342002-11-06 11:45:15 +000041 if is_jython:
42 # jython adds a caret in this case (why shouldn't it?)
43 return
Jeremy Hylton09ccc3a2001-03-21 20:33:04 +000044 err = self.get_exception_format(self.syntax_error_without_caret,
45 SyntaxError)
46 self.assert_(len(err) == 3)
47 self.assert_(err[1].strip() == "[x for x in x] = x")
48
Georg Brandl51dbc4c2006-03-31 15:59:13 +000049 def test_bad_indentation(self):
50 err = self.get_exception_format(self.syntax_error_bad_indentation,
51 IndentationError)
52 self.assert_(len(err) == 4)
53 self.assert_("^" in err[2])
54 self.assert_(err[1].strip() == "print 2")
55
Hye-Shik Chang182ac852004-10-26 09:16:42 +000056 def test_bug737473(self):
Tim Petersf1af9c02004-10-27 02:33:15 +000057 import sys, os, tempfile, time
58
Hye-Shik Chang182ac852004-10-26 09:16:42 +000059 savedpath = sys.path[:]
60 testdir = tempfile.mkdtemp()
61 try:
62 sys.path.insert(0, testdir)
63 testfile = os.path.join(testdir, 'test_bug737473.py')
Raymond Hettingerf7010be2004-11-01 22:27:14 +000064 print >> open(testfile, 'w'), """
Hye-Shik Chang182ac852004-10-26 09:16:42 +000065def test():
66 raise ValueError"""
67
Hye-Shik Chang182ac852004-10-26 09:16:42 +000068 if 'test_bug737473' in sys.modules:
69 del sys.modules['test_bug737473']
70 import test_bug737473
71
72 try:
73 test_bug737473.test()
74 except ValueError:
Tim Peters10d59f32004-10-27 02:43:25 +000075 # this loads source code to linecache
Hye-Shik Chang182ac852004-10-26 09:16:42 +000076 traceback.extract_tb(sys.exc_traceback)
77
Raymond Hettingerf7010be2004-11-01 22:27:14 +000078 # If this test runs too quickly, test_bug737473.py's mtime
79 # attribute will remain unchanged even if the file is rewritten.
80 # Consequently, the file would not reload. So, added a sleep()
81 # delay to assure that a new, distinct timestamp is written.
82 # Since WinME with FAT32 has multisecond resolution, more than
83 # three seconds are needed for this test to pass reliably :-(
84 time.sleep(4)
Hye-Shik Chang4a8d8512004-11-01 08:26:09 +000085
Raymond Hettingerf7010be2004-11-01 22:27:14 +000086 print >> open(testfile, 'w'), """
Hye-Shik Chang182ac852004-10-26 09:16:42 +000087def test():
88 raise NotImplementedError"""
89 reload(test_bug737473)
90 try:
91 test_bug737473.test()
92 except NotImplementedError:
93 src = traceback.extract_tb(sys.exc_traceback)[-1][-1]
94 self.failUnlessEqual(src, 'raise NotImplementedError')
95 finally:
96 sys.path[:] = savedpath
97 for f in os.listdir(testdir):
98 os.unlink(os.path.join(testdir, f))
99 os.rmdir(testdir)
Fred Drake2e2be372001-09-20 21:33:42 +0000100
Walter Dörwaldc85c74c2005-11-18 16:51:05 +0000101 def test_members(self):
102 # Covers Python/structmember.c::listmembers()
103 try:
104 1/0
105 except:
106 import sys
107 sys.exc_traceback.__members__
108
Georg Brandl24c274f2006-04-12 21:14:09 +0000109 def raise_tberror(self):
110 raise TbError
111
112 def raise_typeerror(self):
113 raise TypeError
114
115 def test_modulename(self):
116 # Bug 860326: format_exception_only should prepend module name
117 # to exceptions not in "exceptions", like PyErr_Print does.
118 err = self.get_exception_format(self.raise_tberror, TbError)
119 self.assertEquals(len(err), 1)
120 self.assert_(err[0] == '__main__.TbError\n' or
121 err[0] == 'test.test_traceback.TbError\n')
122
123 err = self.get_exception_format(self.raise_typeerror, TypeError)
124 self.assertEquals(err[0], 'TypeError\n')
125
126
Fred Drake2e2be372001-09-20 21:33:42 +0000127def test_main():
128 run_unittest(TracebackCases)
129
130
131if __name__ == "__main__":
132 test_main()