def test_variable_not_declared(): assert_interface_error( """ main { write a; } """, ReferenceNotDefined(expression="'a'"))
def test_call_extra_return_expression(): assert_interface_error( """ procedure f(); main { call a = f(); } """, NoReturnValue(name="f"))
def test_call_missing_return_expression(): assert_interface_error( """ function f(); main { call f(); } """, IgnoredReturnValue(name="f"))
def test_call_not_defined(): assert_interface_error( """ procedure f(); main { call g(); } """, MethodNotDeclared(name="g"))
def test_call_missing_arguments(): assert_interface_error( """ procedure f(a, b); main { call f(0); } """, InvalidNumberOfArguments(name="f", n_parameters=2, n_arguments=1))
def test_call_extra_arguments(): assert_interface_error( """ procedure f(); main { call f(0, 1); } """, InvalidNumberOfArguments(name="f", n_parameters=0, n_arguments=2))
def test_variable_reused(): assert_interface_error( """ main { read a; read a; } """, ReferenceAlreadyDefined(expression="'a'"))
def test_variable_not_written(): assert_interface_error( """ function f(); main { call x = f(); } """, ReferenceNotUsed(expression="x"))
def test_callback_accept_scalars(): assert_interface_error( """ procedure f() callbacks { procedure cb(a[]); } main { } """, CallbackParameterNotScalar(parameter="'a[]'"))
def test_variable_not_declared_for(): assert_interface_error( """ procedure p(t[]); main { for i to a { read b[i]; } call p(b); } """, ReferenceNotDefined(expression="'a'"))
def test_call_argument_wrong_type(): assert_interface_error( """ procedure f(a[]); main { call f(0); } """, InvalidArgument( name="f", parameter="a", dimensions=1, argument="'0'", argument_dimensions=0, ))