Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py
new file mode 100644
index 0000000..ac0a32b
--- /dev/null
+++ b/Lib/test/test_raise.py
@@ -0,0 +1,417 @@
+# 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()
+# 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()
+# 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()