[Zope-Checkins] CVS: Zope/lib/python/zExceptions/tests - __init__.py:1.2 testExceptionFormatter.py:1.2

Shane Hathaway shane@cvs.zope.org
Wed, 3 Apr 2002 15:44:02 -0500


Update of /cvs-repository/Zope/lib/python/zExceptions/tests
In directory cvs.zope.org:/tmp/cvs-serv3170/lib/python/zExceptions/tests

Added Files:
	__init__.py testExceptionFormatter.py 
Log Message:
Merged shane-better-tracebacks-branch.  The changes are explained in http://dev.zope.org/Wikis/DevSite/Proposals/BetterTracebacks

=== Zope/lib/python/zExceptions/tests/__init__.py 1.1 => 1.2 ===


=== Zope/lib/python/zExceptions/tests/testExceptionFormatter.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+# 
+##############################################################################
+"""
+ExceptionFormatter tests.
+
+Revision information:
+$Id$
+"""
+
+from __future__ import nested_scopes
+
+from unittest import TestCase, TestSuite, main, makeSuite
+
+try:
+    from Zope.Testing.CleanUp import CleanUp # Base class w registry cleanup
+except ImportError:
+    class CleanUp:
+        pass
+
+import sys
+from zExceptions.ExceptionFormatter import format_exception
+
+
+def tb(as_html=0):
+    t, v, b = sys.exc_info()
+    try:
+        return ''.join(format_exception(t, v, b, as_html=as_html))
+    finally:
+        del b
+
+
+class ExceptionForTesting (Exception):
+    pass
+
+
+
+class TestingTracebackSupplement:
+
+    source_url = '/somepath'
+    line = 634
+    column = 57
+    warnings = ['Repent, for the end is nigh']
+
+    def __init__(self, expression):
+        self.expression = expression
+
+
+
+class Test(CleanUp, TestCase):
+
+    def testBasicNamesText(self, as_html=0):
+        try:
+            raise ExceptionForTesting
+        except ExceptionForTesting:
+            s = tb(as_html)
+            # The traceback should include the name of this function.
+            self.assert_(s.find('testBasicNamesText') >= 0)
+            # The traceback should include the name of the exception.
+            self.assert_(s.find('ExceptionForTesting') >= 0)
+        else:
+            self.fail('no exception occurred')
+
+    def testBasicNamesHTML(self):
+        self.testBasicNamesText(1)
+
+    def testSupplement(self, as_html=0):
+        try:
+            __traceback_supplement__ = (TestingTracebackSupplement,
+                                        "You're one in a million")
+            raise ExceptionForTesting
+        except ExceptionForTesting:
+            s = tb(as_html)
+            # The source URL
+            self.assert_(s.find('/somepath') >= 0, s)
+            # The line number
+            self.assert_(s.find('634') >= 0, s)
+            # The column number
+            self.assert_(s.find('57') >= 0, s)
+            # The expression
+            self.assert_(s.find("You're one in a million") >= 0, s)
+            # The warning
+            self.assert_(s.find("Repent, for the end is nigh") >= 0, s)
+        else:
+            self.fail('no exception occurred')
+
+    def testSupplementHTML(self):
+        self.testSupplement(1)
+
+    def testTracebackInfo(self, as_html=0):
+        try:
+            __traceback_info__ = "Adam & Eve"
+            raise ExceptionForTesting
+        except ExceptionForTesting:
+            s = tb(as_html)
+            if as_html:
+                # Be sure quoting is happening.
+                self.assert_(s.find('Adam & Eve') >= 0, s)
+            else:
+                self.assert_(s.find('Adam & Eve') >= 0, s)
+        else:
+            self.fail('no exception occurred')
+
+    def testTracebackInfoHTML(self):
+        self.testTracebackInfo(1)
+
+    def testMultipleLevels(self):
+        # Makes sure many levels are shown in a traceback.
+        def f(n):
+            """Produces a (n + 1)-level traceback."""
+            __traceback_info__ = 'level%d' % n
+            if n > 0:
+                f(n - 1)
+            else:
+                raise ExceptionForTesting
+
+        try:
+            f(10)
+        except ExceptionForTesting:
+            s = tb()
+            for n in range(11):
+                self.assert_(s.find('level%d' % n) >= 0, s)
+        else:
+            self.fail('no exception occurred')
+
+    def testQuoteLastLine(self):
+        class C: pass
+        try: raise TypeError, C()
+        except:
+            s = tb(1)
+        else:
+            self.fail('no exception occurred')
+        self.assert_(s.find('<') >= 0, s)
+        self.assert_(s.find('>') >= 0, s)
+
+
+
+def test_suite():
+    return TestSuite((
+        makeSuite(Test),
+        ))
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')