14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport __builtin__
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport exceptions
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import run_unittest, check_warnings
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom platform import system as platform_system
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDEPRECATION_WARNINGS = ["BaseException.message has been deprecated"]
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif sys.py3kwarning:
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    DEPRECATION_WARNINGS.extend(
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ["exceptions must derive from BaseException",
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         "catching classes that don't inherit from BaseException is not allowed",
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         "__get(item|slice)__ not supported for exception classes"])
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_deprecations = [(msg, DeprecationWarning) for msg in DEPRECATION_WARNINGS]
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Silence Py3k and other deprecation warnings
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef ignore_deprecation_warnings(func):
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Ignore the known DeprecationWarnings."""
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def wrapper(*args, **kw):
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with check_warnings(*_deprecations, quiet=True):
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return func(*args, **kw)
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return wrapper
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ExceptionClassTests(unittest.TestCase):
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests for anything relating to exception objects themselves (e.g.,
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    inheritance hierarchy)"""
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_builtins_new_style(self):
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(issubclass(Exception, object))
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    @ignore_deprecation_warnings
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def verify_instance_interface(self, ins):
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for attr in ("args", "message", "__str__", "__repr__", "__getitem__"):
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(hasattr(ins, attr),
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "%s missing %s attribute" %
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            (ins.__class__.__name__, attr))
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_inheritance(self):
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Make sure the inheritance hierarchy matches the documentation
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc_set = set(x for x in dir(exceptions) if not x.startswith('_'))
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inheritance_tree = open(os.path.join(os.path.split(__file__)[0],
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                'exception_hierarchy.txt'))
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            superclass_name = inheritance_tree.readline().rstrip()
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                last_exc = getattr(__builtin__, superclass_name)
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except AttributeError:
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.fail("base class %s not a built-in" % superclass_name)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(superclass_name, exc_set)
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exc_set.discard(superclass_name)
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            superclasses = []  # Loop will insert base exception
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            last_depth = 0
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for exc_line in inheritance_tree:
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                exc_line = exc_line.rstrip()
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                depth = exc_line.rindex('-')
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                exc_name = exc_line[depth+2:]  # Slice past space
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if '(' in exc_name:
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    paren_index = exc_name.index('(')
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    platform_name = exc_name[paren_index+1:-1]
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    exc_name = exc_name[:paren_index-1]  # Slice off space
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if platform_system() != platform_name:
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        exc_set.discard(exc_name)
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        continue
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if '[' in exc_name:
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    left_bracket = exc_name.index('[')
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    exc_name = exc_name[:left_bracket-1]  # cover space
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    exc = getattr(__builtin__, exc_name)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except AttributeError:
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.fail("%s not a built-in exception" % exc_name)
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if last_depth < depth:
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    superclasses.append((last_depth, last_exc))
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif last_depth > depth:
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    while superclasses[-1][0] >= depth:
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        superclasses.pop()
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertTrue(issubclass(exc, superclasses[-1][1]),
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "%s is not a subclass of %s" % (exc.__name__,
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    superclasses[-1][1].__name__))
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:  # Some exceptions require arguments; just skip them
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.verify_instance_interface(exc())
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except TypeError:
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    pass
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.assertIn(exc_name, exc_set)
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                exc_set.discard(exc_name)
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                last_exc = exc
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                last_depth = depth
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            inheritance_tree.close()
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(exc_set), 0, "%s not accounted for" % exc_set)
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    interface_tests = ("length", "args", "message", "str", "unicode", "repr",
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "indexing")
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def interface_test_driver(self, results):
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for test_name, (given, expected) in zip(self.interface_tests, results):
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(given, expected, "%s: %s != %s" % (test_name,
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                given, expected))
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    @ignore_deprecation_warnings
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_interface_single_arg(self):
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Make sure interface works properly when given a single argument
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arg = "spam"
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc = Exception(arg)
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        results = ([len(exc.args), 1], [exc.args[0], arg], [exc.message, arg],
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [str(exc), str(arg)], [unicode(exc), unicode(arg)],
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [repr(exc), exc.__class__.__name__ + repr(exc.args)],
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [exc[0], arg])
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.interface_test_driver(results)
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    @ignore_deprecation_warnings
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_interface_multi_arg(self):
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Make sure interface correct when multiple arguments given
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arg_count = 3
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = tuple(range(arg_count))
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc = Exception(*args)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        results = ([len(exc.args), arg_count], [exc.args, args],
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [exc.message, ''], [str(exc), str(args)],
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [unicode(exc), unicode(args)],
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [repr(exc), exc.__class__.__name__ + repr(exc.args)],
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [exc[-1], args[-1]])
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.interface_test_driver(results)
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    @ignore_deprecation_warnings
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_interface_no_arg(self):
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Make sure that with no args that interface is correct
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc = Exception()
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        results = ([len(exc.args), 0], [exc.args, tuple()],
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [exc.message, ''],
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [str(exc), ''], [unicode(exc), u''],
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   [repr(exc), exc.__class__.__name__ + '()'], [True, True])
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.interface_test_driver(results)
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_message_deprecation(self):
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # As of Python 2.6, BaseException.message is deprecated.
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with check_warnings(("", DeprecationWarning)):
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            BaseException().message
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass UsageTests(unittest.TestCase):
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test usage of exceptions"""
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def raise_fails(self, object_):
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Make sure that raising 'object_' triggers a TypeError."""
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise object_
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return  # What is expected.
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.fail("TypeError expected for raising %s" % type(object_))
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def catch_fails(self, object_):
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Catching 'object_' should raise a TypeError."""
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise StandardError
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except object_:
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except StandardError:
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("TypeError expected when catching %s" % type(object_))
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise StandardError
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except (object_,):
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except StandardError:
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("TypeError expected when catching %s as specified in a "
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "tuple" % type(object_))
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    @ignore_deprecation_warnings
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_raise_classic(self):
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Raising a classic class is okay (for now).
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class ClassicClass:
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ClassicClass
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ClassicClass:
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except:
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("unable to raise classic class")
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise ClassicClass()
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ClassicClass:
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except:
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("unable to raise classic class instance")
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_raise_new_style_non_exception(self):
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # You cannot raise a new-style class that does not inherit from
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # BaseException; the ability was not possible until BaseException's
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # introduction so no need to support new-style objects that do not
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # inherit from it.
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class NewStyleClass(object):
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.raise_fails(NewStyleClass)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.raise_fails(NewStyleClass())
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_raise_string(self):
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Raising a string raises TypeError.
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.raise_fails("spam")
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_catch_string(self):
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Catching a string should trigger a DeprecationWarning.
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with warnings.catch_warnings():
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            warnings.resetwarnings()
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            warnings.filterwarnings("error")
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            str_exc = "spam"
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with self.assertRaises(DeprecationWarning):
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise StandardError
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except str_exc:
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    pass
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Make sure that even if the string exception is listed in a tuple
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # that a warning is raised.
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with self.assertRaises(DeprecationWarning):
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise StandardError
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except (AssertionError, str_exc):
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    pass
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    run_unittest(ExceptionClassTests, UsageTests)
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
240