Variety of test cases for call to builtin functions
diff --git a/Lib/test/output/test_call b/Lib/test/output/test_call
new file mode 100644
index 0000000..da00c27
--- /dev/null
+++ b/Lib/test/output/test_call
@@ -0,0 +1 @@
+test_call
diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py
new file mode 100644
index 0000000..529f15b
--- /dev/null
+++ b/Lib/test/test_call.py
@@ -0,0 +1,125 @@
+import unittest
+from test_support import run_unittest
+
+# The test cases here cover several paths through the function calling
+# code.  They depend on the METH_XXX flag that is used to define a C
+# function, which can't be verified from Python.  If the METH_XXX decl
+# for a C function changes, these tests may not cover the right paths.
+
+class CFunctionCalls(unittest.TestCase):
+
+    def test_varargs0(self):
+        self.assertRaises(TypeError, {}.has_key)
+
+    def test_varargs1(self):
+        {}.has_key(0)
+
+    def test_varargs2(self):
+        self.assertRaises(TypeError, {}.has_key, 0, 1)
+
+    def test_varargs0_ext(self):
+        try:
+            {}.has_key(*())
+        except TypeError:
+            pass
+
+    def test_varargs1_ext(self):
+        {}.has_key(*(0,))
+
+    def test_varargs2_ext(self):
+        try:
+            {}.has_key(*(1, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_varargs0_kw(self):
+        self.assertRaises(TypeError, {}.has_key, x=2)
+
+    def test_varargs1_kw(self):
+        self.assertRaises(TypeError, {}.has_key, x=2)
+
+    def test_varargs2_kw(self):
+        self.assertRaises(TypeError, {}.has_key, x=2, y=2)
+
+    def test_oldargs0_0(self):
+        {}.keys()
+
+    def test_oldargs0_1(self):
+        self.assertRaises(TypeError, {}.keys, 0)
+
+    def test_oldargs0_2(self):
+        self.assertRaises(TypeError, {}.keys, 0, 1)
+
+    def test_oldargs0_0_ext(self):
+        {}.keys(*())
+
+    def test_oldargs0_1_ext(self):
+        try:
+            {}.keys(*(0,))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs0_2_ext(self):
+        try:
+            {}.keys(*(1, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs0_0_kw(self):
+        try:
+            {}.keys(x=2)
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs0_1_kw(self):
+        self.assertRaises(TypeError, {}.keys, x=2)
+
+    def test_oldargs0_2_kw(self):
+        self.assertRaises(TypeError, {}.keys, x=2, y=2)
+
+    def test_oldargs1_0(self):
+        self.assertRaises(TypeError, {}.update)
+
+    def test_oldargs1_1(self):
+        {}.update({})
+
+    def test_oldargs1_2(self):
+        self.assertRaises(TypeError, {}.update, {}, 1)
+
+    def test_oldargs1_0_ext(self):
+        try:
+            {}.update(*())
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs1_1_ext(self):
+        {}.update(*({},))
+
+    def test_oldargs1_2_ext(self):
+        try:
+            {}.update(*({}, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs1_0_kw(self):
+        self.assertRaises(TypeError, {}.update, x=2)
+
+    def test_oldargs1_1_kw(self):
+        self.assertRaises(TypeError, {}.update, {}, x=2)
+
+    def test_oldargs1_2_kw(self):
+        self.assertRaises(TypeError, {}.update, x=2, y=2)
+
+run_unittest(CFunctionCalls)