summaryrefslogtreecommitdiff
path: root/numpy/f2py/tests/test_compile_function.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/f2py/tests/test_compile_function.py')
-rw-r--r--numpy/f2py/tests/test_compile_function.py135
1 files changed, 61 insertions, 74 deletions
diff --git a/numpy/f2py/tests/test_compile_function.py b/numpy/f2py/tests/test_compile_function.py
index a83987e98..74e0804e2 100644
--- a/numpy/f2py/tests/test_compile_function.py
+++ b/numpy/f2py/tests/test_compile_function.py
@@ -15,107 +15,94 @@ from numpy.testing import assert_equal
from . import util
-@pytest.mark.xfail(sys.version_info[0] < 3 and os.name == 'nt',
- reason="our Appveyor CI configuration does not"
- " have Fortran compilers available for"
- " Python 2.x")
-@pytest.mark.parametrize("extra_args", [
- # extra_args can be a list as of gh-11937
- ['--noopt', '--debug'],
- # test for string as well, using the same
- # fcompiler options
- '--noopt --debug',
- # also test absence of extra_args
- '',
- ])
+def setup_module():
+ if sys.platform == 'win32' and sys.version_info[0] < 3:
+ pytest.skip('Fails with MinGW64 Gfortran (Issue #9673)')
+ if not util.has_c_compiler():
+ pytest.skip("Needs C compiler")
+ if not util.has_f77_compiler():
+ pytest.skip('Needs FORTRAN 77 compiler')
+
+
+# extra_args can be a list (since gh-11937) or string.
+# also test absence of extra_args
+@pytest.mark.parametrize(
+ "extra_args", [['--noopt', '--debug'], '--noopt --debug', '']
+ )
def test_f2py_init_compile(extra_args):
- # flush through the f2py __init__
- # compile() function code path
- # as a crude test for input handling
- # following migration from exec_command()
- # to subprocess.check_output() in gh-11937
-
- # the Fortran 77 syntax requires 6 spaces
- # before any commands, but more space may
- # be added; gfortran can also compile
- # with --ffree-form to remove the indentation
- # requirement; here, the Fortran source is
- # formatted to roughly match an example from
- # the F2PY User Guide
- fsource = '''
- integer function foo()
- foo = 10 + 5
- return
- end
- '''
- # use various helper functions in util.py to
- # enable robust build / compile and
- # reimport cycle in test suite
- d = util.get_module_dir()
- modulename = util.get_temp_module_name()
+ # flush through the f2py __init__ compile() function code path as a
+ # crude test for input handling following migration from
+ # exec_command() to subprocess.check_output() in gh-11937
+
+ # the Fortran 77 syntax requires 6 spaces before any commands, but
+ # more space may be added/
+ fsource = """
+ integer function foo()
+ foo = 10 + 5
+ return
+ end
+ """
+ # use various helper functions in util.py to enable robust build /
+ # compile and reimport cycle in test suite
+ moddir = util.get_module_dir()
+ modname = util.get_temp_module_name()
cwd = os.getcwd()
- target = os.path.join(d, str(uuid.uuid4()) + '.f')
- # try running compile() with and without a
- # source_fn provided so that the code path
- # where a temporary file for writing Fortran
+ target = os.path.join(moddir, str(uuid.uuid4()) + '.f')
+ # try running compile() with and without a source_fn provided so
+ # that the code path where a temporary file for writing Fortran
# source is created is also explored
for source_fn in [target, None]:
-
- # mimic the path changing behavior used
- # by build_module() in util.py, but don't
- # actually use build_module() because it
- # has its own invocation of subprocess
- # that circumvents the f2py.compile code
- # block under test
+ # mimic the path changing behavior used by build_module() in
+ # util.py, but don't actually use build_module() because it has
+ # its own invocation of subprocess that circumvents the
+ # f2py.compile code block under test
try:
- os.chdir(d)
- ret_val = numpy.f2py.compile(fsource,
- modulename=modulename,
- extra_args=extra_args,
- source_fn=source_fn)
+ os.chdir(moddir)
+ ret_val = numpy.f2py.compile(
+ fsource,
+ modulename=modname,
+ extra_args=extra_args,
+ source_fn=source_fn
+ )
finally:
os.chdir(cwd)
# check for compile success return value
assert_equal(ret_val, 0)
- # we are not currently able to import the
- # Python-Fortran interface module on Windows /
- # Appveyor, even though we do get successful
- # compilation on that platform with Python 3.x
- if os.name != 'nt':
- # check for sensible result of Fortran function;
- # that means we can import the module name in Python
- # and retrieve the result of the sum operation
- return_check = import_module(modulename)
+ # we are not currently able to import the Python-Fortran
+ # interface module on Windows / Appveyor, even though we do get
+ # successful compilation on that platform with Python 3.x
+ if sys.platform != 'win32':
+ # check for sensible result of Fortran function; that means
+ # we can import the module name in Python and retrieve the
+ # result of the sum operation
+ return_check = import_module(modname)
calc_result = return_check.foo()
assert_equal(calc_result, 15)
+
def test_f2py_init_compile_failure():
- # verify an appropriate integer status
- # value returned by f2py.compile() when
- # invalid Fortran is provided
+ # verify an appropriate integer status value returned by
+ # f2py.compile() when invalid Fortran is provided
ret_val = numpy.f2py.compile(b"invalid")
assert_equal(ret_val, 1)
+
def test_f2py_init_compile_bad_cmd():
- # verify that usage of invalid command in
- # f2py.compile() returns status value of 127
- # for historic consistency with exec_command()
+ # verify that usage of invalid command in f2py.compile() returns
+ # status value of 127 for historic consistency with exec_command()
# error handling
- # patch the sys Python exe path temporarily to
- # induce an OSError downstream
- # NOTE: how bad of an idea is this patching?
+ # patch the sys Python exe path temporarily to induce an OSError
+ # downstream NOTE: how bad of an idea is this patching?
try:
temp = sys.executable
sys.executable = 'does not exist'
- # the OSError should take precedence over the invalid
- # Fortran
+ # the OSError should take precedence over invalid Fortran
ret_val = numpy.f2py.compile(b"invalid")
-
assert_equal(ret_val, 127)
finally:
sys.executable = temp