| # Copyright 2007 Google, Inc. All Rights Reserved. |
| # Licensed to PSF under a Contributor Agreement. |
| |
| """Tests for the raise statement.""" |
| |
| from test import test_support |
| import sys |
| import types |
| import unittest |
| |
| |
| def get_tb(): |
| try: |
| raise OSError() |
| except: |
| return sys.exc_info()[2] |
| |
| |
| class TestRaise(unittest.TestCase): |
| def test_invalid_reraise(self): |
| try: |
| raise |
| except RuntimeError as e: |
| self.failUnless("No active exception" in str(e)) |
| else: |
| self.fail("No exception raised") |
| |
| def test_reraise(self): |
| try: |
| try: |
| raise IndexError() |
| except IndexError as e: |
| exc1 = e |
| raise |
| except IndexError as exc2: |
| self.failUnless(exc1 is exc2) |
| else: |
| self.fail("No exception raised") |
| |
| |
| class TestCause(unittest.TestCase): |
| def test_invalid_cause(self): |
| try: |
| raise IndexError from 5 |
| except TypeError as e: |
| self.failUnless("exception cause" in str(e)) |
| else: |
| self.fail("No exception raised") |
| |
| def test_class_cause(self): |
| try: |
| raise IndexError from KeyError |
| except IndexError as e: |
| self.failUnless(isinstance(e.__cause__, KeyError)) |
| else: |
| self.fail("No exception raised") |
| |
| def test_instance_cause(self): |
| cause = KeyError() |
| try: |
| raise IndexError from cause |
| except IndexError as e: |
| self.failUnless(e.__cause__ is cause) |
| else: |
| self.fail("No exception raised") |
| |
| |
| class TestTraceback(unittest.TestCase): |
| def test_sets_traceback(self): |
| try: |
| raise IndexError() |
| except IndexError as e: |
| self.failUnless(isinstance(e.__traceback__, types.TracebackType)) |
| else: |
| self.fail("No exception raised") |
| |
| def test_accepts_traceback(self): |
| tb = get_tb() |
| try: |
| raise IndexError().with_traceback(tb) |
| except IndexError as e: |
| self.assertNotEqual(e.__traceback__, tb) |
| self.assertEqual(e.__traceback__.tb_next, tb) |
| else: |
| self.fail("No exception raised") |
| |
| |
| # Disabled until context is implemented |
| # class TestContext(object): |
| # def test_instance_context_bare_raise(self): |
| # context = IndexError() |
| # try: |
| # try: |
| # raise context |
| # except: |
| # raise OSError() |
| # except OSError as e: |
| # self.assertEqual(e.__context__, context) |
| # else: |
| # self.fail("No exception raised") |
| # |
| # def test_class_context_bare_raise(self): |
| # context = IndexError |
| # try: |
| # try: |
| # raise context |
| # except: |
| # raise OSError() |
| # except OSError as e: |
| # self.assertNotEqual(e.__context__, context) |
| # self.failUnless(isinstance(e.__context__, context)) |
| # else: |
| # self.fail("No exception raised") |
| |
| |
| class TestRemovedFunctionality(unittest.TestCase): |
| def test_tuples(self): |
| try: |
| raise (IndexError, KeyError) # This should be a tuple! |
| except TypeError: |
| pass |
| else: |
| self.fail("No exception raised") |
| |
| def test_strings(self): |
| try: |
| raise "foo" |
| except TypeError: |
| pass |
| else: |
| self.fail("No exception raised") |
| |
| |
| def test_main(): |
| test_support.run_unittest(__name__) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |