import textwrap from . import util from numpy.f2py import crackfortran class TestAbstractInterface(util.F2PyTest): suffix = '.f90' skip = ['add1', 'add2'] code = textwrap.dedent(""" module ops_module abstract interface subroutine op(x, y, z) integer, intent(in) :: x, y integer, intent(out) :: z end subroutine end interface contains subroutine foo(x, y, r1, r2) integer, intent(in) :: x, y integer, intent(out) :: r1, r2 procedure (op) add1, add2 procedure (op), pointer::p p=>add1 call p(x, y, r1) p=>add2 call p(x, y, r2) end subroutine end module subroutine add1(x, y, z) integer, intent(in) :: x, y integer, intent(out) :: z z = x + y end subroutine subroutine add2(x, y, z) integer, intent(in) :: x, y integer, intent(out) :: z z = x + 2 * y end subroutine """) def test_abstract_interface(self): assert self.module.ops_module.foo(3, 5) == (8, 13) def test_parse_abstract_interface(self, tmp_path): # Test gh18403 f_path = tmp_path / "gh18403_mod.f90" with f_path.open('w') as ff: ff.write(textwrap.dedent("""\ module test abstract interface subroutine foo() end subroutine end interface end module test """)) mod = crackfortran.crackfortran([str(f_path)]) assert len(mod) == 1 assert len(mod[0]['body']) == 1 assert mod[0]['body'][0]['block'] == 'abstract interface'