File size: 5,849 Bytes
7885a28 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
import os
import pytest
import platform
import numpy as np
import numpy.testing as npt
from . import util
class TestIntentInOut(util.F2PyTest):
# Check that intent(in out) translates as intent(inout)
sources = [util.getpath("tests", "src", "regression", "inout.f90")]
@pytest.mark.slow
def test_inout(self):
# non-contiguous should raise error
x = np.arange(6, dtype=np.float32)[::2]
pytest.raises(ValueError, self.module.foo, x)
# check values with contiguous array
x = np.arange(3, dtype=np.float32)
self.module.foo(x)
assert np.allclose(x, [3, 1, 2])
class TestDataOnlyMultiModule(util.F2PyTest):
# Check that modules without subroutines work
sources = [util.getpath("tests", "src", "regression", "datonly.f90")]
@pytest.mark.slow
def test_mdat(self):
assert self.module.datonly.max_value == 100
assert self.module.dat.max_ == 1009
int_in = 5
assert self.module.simple_subroutine(5) == 1014
class TestNegativeBounds(util.F2PyTest):
# Check that negative bounds work correctly
sources = [util.getpath("tests", "src", "negative_bounds", "issue_20853.f90")]
@pytest.mark.slow
def test_negbound(self):
xvec = np.arange(12)
xlow = -6
xhigh = 4
# Calculate the upper bound,
# Keeping the 1 index in mind
def ubound(xl, xh):
return xh - xl + 1
rval = self.module.foo(is_=xlow, ie_=xhigh,
arr=xvec[:ubound(xlow, xhigh)])
expval = np.arange(11, dtype = np.float32)
assert np.allclose(rval, expval)
class TestNumpyVersionAttribute(util.F2PyTest):
# Check that th attribute __f2py_numpy_version__ is present
# in the compiled module and that has the value np.__version__.
sources = [util.getpath("tests", "src", "regression", "inout.f90")]
@pytest.mark.slow
def test_numpy_version_attribute(self):
# Check that self.module has an attribute named "__f2py_numpy_version__"
assert hasattr(self.module, "__f2py_numpy_version__")
# Check that the attribute __f2py_numpy_version__ is a string
assert isinstance(self.module.__f2py_numpy_version__, str)
# Check that __f2py_numpy_version__ has the value numpy.__version__
assert np.__version__ == self.module.__f2py_numpy_version__
def test_include_path():
incdir = np.f2py.get_include()
fnames_in_dir = os.listdir(incdir)
for fname in ("fortranobject.c", "fortranobject.h"):
assert fname in fnames_in_dir
class TestIncludeFiles(util.F2PyTest):
sources = [util.getpath("tests", "src", "regression", "incfile.f90")]
options = [f"-I{util.getpath('tests', 'src', 'regression')}",
f"--include-paths {util.getpath('tests', 'src', 'regression')}"]
@pytest.mark.slow
def test_gh25344(self):
exp = 7.0
res = self.module.add(3.0, 4.0)
assert exp == res
class TestF77Comments(util.F2PyTest):
# Check that comments are stripped from F77 continuation lines
sources = [util.getpath("tests", "src", "regression", "f77comments.f")]
@pytest.mark.slow
def test_gh26148(self):
x1 = np.array(3, dtype=np.int32)
x2 = np.array(5, dtype=np.int32)
res=self.module.testsub(x1, x2)
assert(res[0] == 8)
assert(res[1] == 15)
@pytest.mark.slow
def test_gh26466(self):
# Check that comments after PARAMETER directions are stripped
expected = np.arange(1, 11, dtype=np.float32)*2
res=self.module.testsub2()
npt.assert_allclose(expected, res)
class TestF90Contiuation(util.F2PyTest):
# Check that comments are stripped from F90 continuation lines
sources = [util.getpath("tests", "src", "regression", "f90continuation.f90")]
@pytest.mark.slow
def test_gh26148b(self):
x1 = np.array(3, dtype=np.int32)
x2 = np.array(5, dtype=np.int32)
res=self.module.testsub(x1, x2)
assert(res[0] == 8)
assert(res[1] == 15)
class TestLowerF2PYDirectives(util.F2PyTest):
# Check variables are cased correctly
sources = [util.getpath("tests", "src", "regression", "lower_f2py_fortran.f90")]
@pytest.mark.slow
def test_gh28014(self):
self.module.inquire_next(3)
assert True
@pytest.mark.slow
def test_gh26623():
# Including libraries with . should not generate an incorrect meson.build
try:
aa = util.build_module(
[util.getpath("tests", "src", "regression", "f90continuation.f90")],
["-lfoo.bar"],
module_name="Blah",
)
except RuntimeError as rerr:
assert "lparen got assign" not in str(rerr)
@pytest.mark.slow
@pytest.mark.skipif(platform.system() not in ['Linux', 'Darwin'], reason='Unsupported on this platform for now')
def test_gh25784():
# Compile dubious file using passed flags
try:
aa = util.build_module(
[util.getpath("tests", "src", "regression", "f77fixedform.f95")],
options=[
# Meson will collect and dedup these to pass to fortran_args:
"--f77flags='-ffixed-form -O2'",
"--f90flags=\"-ffixed-form -Og\"",
],
module_name="Blah",
)
except ImportError as rerr:
assert "unknown_subroutine_" in str(rerr)
@pytest.mark.slow
class TestAssignmentOnlyModules(util.F2PyTest):
# Ensure that variables are exposed without functions or subroutines in a module
sources = [util.getpath("tests", "src", "regression", "assignOnlyModule.f90")]
@pytest.mark.slow
def test_gh27167(self):
assert (self.module.f_globals.n_max == 16)
assert (self.module.f_globals.i_max == 18)
assert (self.module.f_globals.j_max == 72)
|