loki.tests.test_subroutine

Functions

fixture_header_path(here)

fixture_here()

test_call_args_kwargs(frontend)

test_call_args_kwargs_conversion(frontend)

test_call_kwargs(frontend)

test_call_no_arg(frontend)

test_convert_endian(tmp_path, frontend)

test_empty_spec(frontend)

test_enrich_derived_types(tmp_path, frontend)

test_enrich_explicit_interface(frontend)

Test enrich points to the actual routine and not the symbol declared in an explicit interface.

test_external_stmt(tmp_path, frontend)

Tests procedures passed as dummy arguments and declared as EXTERNAL.

test_function_array_return_type(frontend, ...)

Verify array return types are correctly represented with all frontends

test_member_procedures(tmp_path, frontend)

Test member subroutine and function

test_member_routine_clone(frontend)

Test that member subroutine scopes get cloned correctly.

test_member_routine_clone_inplace(frontend)

Test that member subroutine scopes get cloned correctly.

test_mixed_declaration_interface(frontend)

A simple test to catch and shame mixed declarations.

test_open_newunit(tmp_path, frontend)

test_resolve_typebound_var(frontend, tmp_path)

Test correct behaviour of Scope.resolve_typebound_var utility

test_resolve_typebound_var_missing_definition(...)

Test correct behaviour of Scope.resolve_typebound_var utility in the absence of type information

test_routine_arguments(tmp_path, frontend)

A set of test to test internalisation and handling of arguments.

test_routine_arguments_add_remove(frontend)

Test addition and removal of subroutine arguments.

test_routine_arguments_multiline(tmp_path, ...)

Test argument declarations with comments interjectected between dummies.

test_routine_arguments_order(frontend)

Test argument ordering honours singateu (dummy list) instead of order of apearance in spec declarations.

test_routine_call_arrays(header_path, ...)

Test that arrays passed down a subroutine call are treated as arrays.

test_routine_simple(tmp_path, frontend)

A simple standard looking routine to test argument declarations.

test_routine_type_propagation(header_path, ...)

Test for the forward propagation of derived-type information from a standalone module to a foreign subroutine via the :param typedef: argument.

test_routine_variable_caching(frontend)

Test that equivalent names in distinct routines don't cache.

test_routine_variables_add_remove(frontend)

Test local variable addition and removal.

test_routine_variables_dim_shapes(frontend)

A set of test to ensure matching different dimension and shape expressions against strings and other expressions works as expected.

test_routine_variables_dimension_pragmas(...)

Test that !$loki dimension pragmas can be used to verride the conceptual .shape of local and argument variables.

test_routine_variables_find(frontend)

Tests the FindVariables utility (not the best place to put this).

test_routine_variables_local(tmp_path, frontend)

Test local variables and types

test_routine_variables_shape_propagation(...)

Test for the correct identification and forward propagation of variable shapes from the subroutine declaration.

test_subroutine_clone_contained(frontend)

test_subroutine_comparison(frontend)

Test that string-equivalence works on relevant components.

test_subroutine_comparison_case_sensitive(...)

Test that semantic, but no string-equivalence evaluates as not eqal

test_subroutine_deep_clone(frontend)

Test that deep-cloning a subroutine actually ensures clean scope separation.

test_subroutine_interface(tmp_path, ...)

Test auto-generation of an interface block for a given subroutine.

test_subroutine_lazy_arguments_incomplete1(...)

Test that argument lists for subroutines are correctly captured when the object is made complete.

test_subroutine_lazy_arguments_incomplete2(...)

Test that argument lists for subroutines are correctly captured when the object is made complete.

test_subroutine_lazy_prefix(frontend)

Test that prefixes for functions are correctly captured when the object is made complete.

test_subroutine_prefix(frontend)

Test various prefixes that can occur in function/subroutine definitions

test_subroutine_rescope_clone(frontend)

Test the rescoping of variables in clone.

test_subroutine_rescope_symbols(frontend)

Test the rescoping of variables.

test_subroutine_stmt_func(tmp_path, frontend)

Test the correct identification of statement functions

test_subroutine_suffix(frontend, tmp_path)

Test that subroutine suffixes are supported and correctly reproduced

fixture_here()
fixture_header_path(here)
test_routine_simple(tmp_path, frontend)

A simple standard looking routine to test argument declarations.

test_routine_arguments(tmp_path, frontend)

A set of test to test internalisation and handling of arguments.

test_routine_arguments_multiline(tmp_path, frontend)

Test argument declarations with comments interjectected between dummies.

test_routine_arguments_order(frontend)

Test argument ordering honours singateu (dummy list) instead of order of apearance in spec declarations.

test_routine_arguments_add_remove(frontend)

Test addition and removal of subroutine arguments.

test_routine_variables_local(tmp_path, frontend)

Test local variables and types

test_routine_variable_caching(frontend)

Test that equivalent names in distinct routines don’t cache.

test_routine_variables_add_remove(frontend)

Test local variable addition and removal.

test_routine_variables_find(frontend)

Tests the FindVariables utility (not the best place to put this).

test_routine_variables_dim_shapes(frontend)

A set of test to ensure matching different dimension and shape expressions against strings and other expressions works as expected.

test_routine_variables_shape_propagation(tmp_path, header_path, frontend)

Test for the correct identification and forward propagation of variable shapes from the subroutine declaration.

test_routine_variables_dimension_pragmas(frontend)

Test that !$loki dimension pragmas can be used to verride the conceptual .shape of local and argument variables.

test_routine_type_propagation(header_path, frontend, tmp_path)

Test for the forward propagation of derived-type information from a standalone module to a foreign subroutine via the :param typedef: argument.

test_routine_call_arrays(header_path, frontend, tmp_path)

Test that arrays passed down a subroutine call are treated as arrays.

test_call_no_arg(frontend)
test_call_kwargs(frontend)
test_call_args_kwargs(frontend)
test_convert_endian(tmp_path, frontend)
test_open_newunit(tmp_path, frontend)
test_empty_spec(frontend)
test_member_procedures(tmp_path, frontend)

Test member subroutine and function

test_member_routine_clone(frontend)

Test that member subroutine scopes get cloned correctly.

test_member_routine_clone_inplace(frontend)

Test that member subroutine scopes get cloned correctly.

test_external_stmt(tmp_path, frontend)

Tests procedures passed as dummy arguments and declared as EXTERNAL.

test_subroutine_interface(tmp_path, frontend, header_path)

Test auto-generation of an interface block for a given subroutine.

test_subroutine_rescope_symbols(frontend)

Test the rescoping of variables.

test_subroutine_rescope_clone(frontend)

Test the rescoping of variables in clone.

test_subroutine_stmt_func(tmp_path, frontend)

Test the correct identification of statement functions

test_mixed_declaration_interface(frontend)

A simple test to catch and shame mixed declarations.

test_subroutine_prefix(frontend)

Test various prefixes that can occur in function/subroutine definitions

test_subroutine_suffix(frontend, tmp_path)

Test that subroutine suffixes are supported and correctly reproduced

test_subroutine_comparison(frontend)

Test that string-equivalence works on relevant components.

test_subroutine_comparison_case_sensitive(frontend)

Test that semantic, but no string-equivalence evaluates as not eqal

test_subroutine_lazy_arguments_incomplete1(frontend)

Test that argument lists for subroutines are correctly captured when the object is made complete.

The rationale for this test is that for dummy argument lists with interleaved comments and line breaks, matching is non-trivial and, since we don’t currently need the argument list in the incomplete REGEX-parsed IR, we accept that this information is incomplete initially. tmp_path, we make sure this information is captured correctly after completing the full frontend parse.

test_subroutine_lazy_arguments_incomplete2(frontend)

Test that argument lists for subroutines are correctly captured when the object is made complete.

The rationale for this test is that for dummy argument lists with interleaved comments and line breaks, matching is non-trivial and, since we don’t currently need the argument list in the incomplete REGEX-parsed IR, we accept that this information is not available initially. tmp_path, we make sure this information is captured correctly after completing the full frontend parse.

test_subroutine_lazy_prefix(frontend)

Test that prefixes for functions are correctly captured when the object is made complete.

This test represents a case where the REGEX frontend fails to capture these attributes correctly.

The rationale for this test is that we don’t currently need these attributes in the incomplete REGEX-parsed IR and we accept that this information is incomplete initially. tmp_path, we make sure this information is captured correctly after completing the full frontend parse.

test_subroutine_clone_contained(frontend)
test_enrich_explicit_interface(frontend)

Test enrich points to the actual routine and not the symbol declared in an explicit interface.

test_enrich_derived_types(tmp_path, frontend)
test_subroutine_deep_clone(frontend)

Test that deep-cloning a subroutine actually ensures clean scope separation.

test_call_args_kwargs_conversion(frontend)
test_resolve_typebound_var(frontend, tmp_path)

Test correct behaviour of Scope.resolve_typebound_var utility

test_resolve_typebound_var_missing_definition(frontend, tmp_path)

Test correct behaviour of Scope.resolve_typebound_var utility in the absence of type information

test_function_array_return_type(frontend, dim_decl)

Verify array return types are correctly represented with all frontends