diff options
-rw-r--r-- | Lib/test/test_traceback.py | 30 | ||||
-rw-r--r-- | Modules/_testcapimodule.c | 19 | ||||
-rw-r--r-- | Python/traceback.c | 2 |
3 files changed, 47 insertions, 4 deletions
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index b42dbc4..a3a5e39 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1,10 +1,24 @@ """Test cases for traceback module""" +from _testcapi import test_traceback_print +from StringIO import StringIO +import sys import unittest -from test.test_support import run_unittest, is_jython +from test.test_support import run_unittest, is_jython, Error import traceback +try: + raise KeyError +except KeyError: + type_, value, tb = sys.exc_info() + file_ = StringIO() + test_traceback_print(tb, file_) + example_traceback = file_.getvalue() +else: + raise Error("unable to create test traceback string") + + class TracebackCases(unittest.TestCase): # For now, a very minimal set of tests. I want to be sure that # formatting of SyntaxErrors works based on changes for 2.1. @@ -154,8 +168,20 @@ def test(): self.assertEqual(err, ['None\n']) +class TracebackFormatTests(unittest.TestCase): + + def test_traceback_indentation(self): + # Make sure that the traceback is properly indented. + tb_lines = example_traceback.splitlines() + self.assertEquals(len(tb_lines), 3) + banner, location, source_line = tb_lines + self.assert_(banner.startswith('Traceback')) + self.assert_(location.startswith(' File')) + self.assert_(source_line.startswith('raise')) + + def test_main(): - run_unittest(TracebackCases) + run_unittest(TracebackCases, TracebackFormatTests) if __name__ == "__main__": diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 40eaaad..8b4dbce 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -734,6 +734,24 @@ test_with_docstring(PyObject *self) Py_RETURN_NONE; } +/* To test the format of tracebacks as printed out. */ +static PyObject * +test_traceback_print(PyObject *self, PyObject *args) +{ + PyObject *file; + PyObject *traceback; + int result; + + if (!PyArg_ParseTuple(args, "OO:test_traceback_print", + &traceback, &file)) + return NULL; + + result = PyTraceBack_Print(traceback, file); + if (result < 0) + return NULL; + Py_RETURN_NONE; +} + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"test_config", (PyCFunction)test_config, METH_NOARGS}, @@ -774,6 +792,7 @@ static PyMethodDef TestMethods[] = { #ifdef WITH_THREAD {"_test_thread_state", test_thread_state, METH_VARARGS}, #endif + {"test_traceback_print", test_traceback_print, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/traceback.c b/Python/traceback.c index 7433997..a481963 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -222,8 +222,6 @@ tb_displayline(PyObject *f, const char *filename, int lineno, const char *name) err = PyFile_WriteString(linebuf, f); if (err != 0) return err; - - err = PyFile_WriteString(" ", f); return Py_DisplaySourceLine(f, filename, lineno); } |