110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
import platform
|
|
import pytest
|
|
import numpy as np
|
|
|
|
from numpy import array
|
|
from . import util
|
|
|
|
|
|
class TestReturnReal(util.F2PyTest):
|
|
def check_function(self, t, tname):
|
|
if tname in ["t0", "t4", "s0", "s4"]:
|
|
err = 1e-5
|
|
else:
|
|
err = 0.0
|
|
assert abs(t(234) - 234.0) <= err
|
|
assert abs(t(234.6) - 234.6) <= err
|
|
assert abs(t("234") - 234) <= err
|
|
assert abs(t("234.6") - 234.6) <= err
|
|
assert abs(t(-234) + 234) <= err
|
|
assert abs(t([234]) - 234) <= err
|
|
assert abs(t((234, )) - 234.0) <= err
|
|
assert abs(t(array(234)) - 234.0) <= err
|
|
assert abs(t(array([234])) - 234.0) <= err
|
|
assert abs(t(array([[234]])) - 234.0) <= err
|
|
assert abs(t(array([234], "b")) + 22) <= err
|
|
assert abs(t(array([234], "h")) - 234.0) <= err
|
|
assert abs(t(array([234], "i")) - 234.0) <= err
|
|
assert abs(t(array([234], "l")) - 234.0) <= err
|
|
assert abs(t(array([234], "B")) - 234.0) <= err
|
|
assert abs(t(array([234], "f")) - 234.0) <= err
|
|
assert abs(t(array([234], "d")) - 234.0) <= err
|
|
if tname in ["t0", "t4", "s0", "s4"]:
|
|
assert t(1e200) == t(1e300) # inf
|
|
|
|
# pytest.raises(ValueError, t, array([234], 'S1'))
|
|
pytest.raises(ValueError, t, "abc")
|
|
|
|
pytest.raises(IndexError, t, [])
|
|
pytest.raises(IndexError, t, ())
|
|
|
|
pytest.raises(Exception, t, t)
|
|
pytest.raises(Exception, t, {})
|
|
|
|
try:
|
|
r = t(10**400)
|
|
assert repr(r) in ["inf", "Infinity"]
|
|
except OverflowError:
|
|
pass
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
platform.system() == "Darwin",
|
|
reason="Prone to error when run with numpy/f2py/tests on mac os, "
|
|
"but not when run in isolation",
|
|
)
|
|
@pytest.mark.skipif(
|
|
np.dtype(np.intp).itemsize < 8,
|
|
reason="32-bit builds are buggy"
|
|
)
|
|
class TestCReturnReal(TestReturnReal):
|
|
suffix = ".pyf"
|
|
module_name = "c_ext_return_real"
|
|
code = """
|
|
python module c_ext_return_real
|
|
usercode \'\'\'
|
|
float t4(float value) { return value; }
|
|
void s4(float *t4, float value) { *t4 = value; }
|
|
double t8(double value) { return value; }
|
|
void s8(double *t8, double value) { *t8 = value; }
|
|
\'\'\'
|
|
interface
|
|
function t4(value)
|
|
real*4 intent(c) :: t4,value
|
|
end
|
|
function t8(value)
|
|
real*8 intent(c) :: t8,value
|
|
end
|
|
subroutine s4(t4,value)
|
|
intent(c) s4
|
|
real*4 intent(out) :: t4
|
|
real*4 intent(c) :: value
|
|
end
|
|
subroutine s8(t8,value)
|
|
intent(c) s8
|
|
real*8 intent(out) :: t8
|
|
real*8 intent(c) :: value
|
|
end
|
|
end interface
|
|
end python module c_ext_return_real
|
|
"""
|
|
|
|
@pytest.mark.parametrize("name", "t4,t8,s4,s8".split(","))
|
|
def test_all(self, name):
|
|
self.check_function(getattr(self.module, name), name)
|
|
|
|
|
|
class TestFReturnReal(TestReturnReal):
|
|
sources = [
|
|
util.getpath("tests", "src", "return_real", "foo77.f"),
|
|
util.getpath("tests", "src", "return_real", "foo90.f90"),
|
|
]
|
|
|
|
@pytest.mark.parametrize("name", "t0,t4,t8,td,s0,s4,s8,sd".split(","))
|
|
def test_all_f77(self, name):
|
|
self.check_function(getattr(self.module, name), name)
|
|
|
|
@pytest.mark.parametrize("name", "t0,t4,t8,td,s0,s4,s8,sd".split(","))
|
|
def test_all_f90(self, name):
|
|
self.check_function(getattr(self.module.f90_return_real, name), name)
|