)
self.assertEqual(s, expected_failure_message)
+ def test_self_param_placement(self):
+ expected_error_msg = (
+ "Error on line 0:\n"
+ "A 'self' parameter, if specified, must be the very first thing "
+ "in the parameter block.\n"
+ )
+ block = """
+ module foo
+ foo.func
+ a: int
+ self: self(type="PyObject *")
+ """
+ out = self.parse_function_should_fail(block)
+ self.assertEqual(out, expected_error_msg)
+
+ def test_self_param_cannot_be_optional(self):
+ expected_error_msg = (
+ "Error on line 0:\n"
+ "A 'self' parameter cannot be marked optional.\n"
+ )
+ block = """
+ module foo
+ foo.func
+ self: self(type="PyObject *") = None
+ """
+ out = self.parse_function_should_fail(block)
+ self.assertEqual(out, expected_error_msg)
+
+ def test_defining_class_param_placement(self):
+ expected_error_msg = (
+ "Error on line 0:\n"
+ "A 'defining_class' parameter, if specified, must either be the "
+ "first thing in the parameter block, or come just after 'self'.\n"
+ )
+ block = """
+ module foo
+ foo.func
+ self: self(type="PyObject *")
+ a: int
+ cls: defining_class
+ """
+ out = self.parse_function_should_fail(block)
+ self.assertEqual(out, expected_error_msg)
+
+ def test_defining_class_param_cannot_be_optional(self):
+ expected_error_msg = (
+ "Error on line 0:\n"
+ "A 'defining_class' parameter cannot be marked optional.\n"
+ )
+ block = """
+ module foo
+ foo.func
+ cls: defining_class(type="PyObject *") = None
+ """
+ out = self.parse_function_should_fail(block)
+ self.assertEqual(out, expected_error_msg)
+
def parse(self, text):
c = FakeClinic()
parser = DSLParser(c)