summaryrefslogtreecommitdiff
path: root/numpy/f2py
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2010-03-06 19:10:14 +0000
committerPauli Virtanen <pav@iki.fi>2010-03-06 19:10:14 +0000
commit399018f2b1f68877c622f8ca015c10fb40e6f625 (patch)
treee007f0eedf8959597e1efddf63c99f60f37129c1 /numpy/f2py
parent0132351b0073f464060e1bac8b0595198c31a4e9 (diff)
downloadnumpy-399018f2b1f68877c622f8ca015c10fb40e6f625.tar.gz
ENH: f2py: convert test suite to Nose form
Rewrite F2Py's test suite, so that it is run as a part of Numpy's tests. These tests require compiling extension modules on-the-fly, so I added a small helper module for that.
Diffstat (limited to 'numpy/f2py')
-rw-r--r--numpy/f2py/setup.py1
-rw-r--r--numpy/f2py/tests/array_from_pyobj/__init__.py0
-rw-r--r--numpy/f2py/tests/array_from_pyobj/setup.py25
-rw-r--r--numpy/f2py/tests/c/return_real.py107
-rw-r--r--numpy/f2py/tests/f77/callback.py98
-rw-r--r--numpy/f2py/tests/f77/return_character.py99
-rw-r--r--numpy/f2py/tests/f77/return_complex.py124
-rw-r--r--numpy/f2py/tests/f77/return_integer.py147
-rw-r--r--numpy/f2py/tests/f77/return_logical.py133
-rw-r--r--numpy/f2py/tests/f77/return_real.py126
-rw-r--r--numpy/f2py/tests/f90/return_character.py105
-rw-r--r--numpy/f2py/tests/f90/return_complex.py141
-rw-r--r--numpy/f2py/tests/f90/return_integer.py165
-rw-r--r--numpy/f2py/tests/f90/return_logical.py138
-rw-r--r--numpy/f2py/tests/f90/return_real.py144
-rw-r--r--numpy/f2py/tests/mixed/run.py49
-rwxr-xr-xnumpy/f2py/tests/run_all.py55
-rw-r--r--numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c (renamed from numpy/f2py/tests/array_from_pyobj/wrapmodule.c)28
-rw-r--r--numpy/f2py/tests/src/mixed/foo.f (renamed from numpy/f2py/tests/mixed/foo.f)0
-rw-r--r--numpy/f2py/tests/src/mixed/foo_fixed.f90 (renamed from numpy/f2py/tests/mixed/foo_fixed.f90)0
-rw-r--r--numpy/f2py/tests/src/mixed/foo_free.f90 (renamed from numpy/f2py/tests/mixed/foo_free.f90)0
-rw-r--r--numpy/f2py/tests/test_array_from_pyobj.py (renamed from numpy/f2py/tests/array_from_pyobj/tests/test_array_from_pyobj.py)52
-rw-r--r--numpy/f2py/tests/test_callback.py74
-rw-r--r--numpy/f2py/tests/test_mixed.py24
-rw-r--r--numpy/f2py/tests/test_return_character.py146
-rw-r--r--numpy/f2py/tests/test_return_complex.py172
-rw-r--r--numpy/f2py/tests/test_return_integer.py181
-rw-r--r--numpy/f2py/tests/test_return_logical.py190
-rw-r--r--numpy/f2py/tests/test_return_real.py206
-rw-r--r--numpy/f2py/tests/util.py346
30 files changed, 1391 insertions, 1685 deletions
diff --git a/numpy/f2py/setup.py b/numpy/f2py/setup.py
index de53569a2..500ab58ec 100644
--- a/numpy/f2py/setup.py
+++ b/numpy/f2py/setup.py
@@ -31,6 +31,7 @@ def configuration(parent_package='',top_path=None):
config = Configuration('f2py', parent_package, top_path)
config.add_data_dir('docs')
+ config.add_data_dir('tests')
config.add_data_files('src/fortranobject.c',
'src/fortranobject.h',
diff --git a/numpy/f2py/tests/array_from_pyobj/__init__.py b/numpy/f2py/tests/array_from_pyobj/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/numpy/f2py/tests/array_from_pyobj/__init__.py
+++ /dev/null
diff --git a/numpy/f2py/tests/array_from_pyobj/setup.py b/numpy/f2py/tests/array_from_pyobj/setup.py
deleted file mode 100644
index 520e3dd94..000000000
--- a/numpy/f2py/tests/array_from_pyobj/setup.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import os
-def configuration(parent_name='',top_path=None):
- from numpy.distutils.misc_util import Configuration
-
- config = Configuration('array_from_pyobj',parent_name,top_path)
- #import numpy.f2py as f2py
- #f2pydir=os.path.dirname(os.path.abspath(f2py.__file__))
- f2pydir=os.path.join(config.local_path,'..','..')
- fobjhsrc = os.path.join(f2pydir,'src','fortranobject.h')
- fobjcsrc = os.path.join(f2pydir,'src','fortranobject.c')
- config.add_extension('wrap',
- sources = ['wrapmodule.c',fobjcsrc],
- include_dirs = [os.path.dirname(fobjhsrc)],
- depends = [fobjhsrc,fobjcsrc],
- define_macros = [('DEBUG_COPY_ND_ARRAY',1),
- #('F2PY_REPORT_ON_ARRAY_COPY',1),
- #('F2PY_REPORT_ATEXIT',1)
- ]
- )
-
- return config
-
-if __name__ == "__main__":
- from numpy.distutils.core import setup
- setup(configuration=configuration)
diff --git a/numpy/f2py/tests/c/return_real.py b/numpy/f2py/tests/c/return_real.py
deleted file mode 100644
index 62dbd2f74..000000000
--- a/numpy/f2py/tests/c/return_real.py
+++ /dev/null
@@ -1,107 +0,0 @@
-__usage__ = """
-Run:
- python return_real.py [<f2py options>]
-Examples:
- python return_real.py --fcompiler=Gnu --no-wrap-functions
- python return_real.py --quiet
-"""
-
-import f2py2e
-from Numeric import array
-
-def build(f2py_opts):
- try:
- import c_ext_return_real
- except ImportError:
- assert not f2py2e.compile('''\
-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
-''','c_ext_return_real',f2py_opts,source_fn='c_ret_real.pyf')
-
- from c_ext_return_real import t4,t8,s4,s8
- test_functions = [t4,t8,s4,s8]
- return test_functions
-
-def runtest(t):
- import sys
- if t.__doc__.split()[0] 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(234l)-234.0)<=err
- if sys.version[:3]<'2.3':
- assert abs(t(234.6+3j)-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.)<=err
- assert abs(t(array(234))-234.)<=err
- assert abs(t(array([234]))-234.)<=err
- assert abs(t(array([[234]]))-234.)<=err
- assert abs(t(array([234],'1'))+22)<=err
- assert abs(t(array([234],'s'))-234.)<=err
- assert abs(t(array([234],'i'))-234.)<=err
- assert abs(t(array([234],'l'))-234.)<=err
- assert abs(t(array([234],'b'))-234.)<=err
- assert abs(t(array([234],'f'))-234.)<=err
- assert abs(t(array([234],'d'))-234.)<=err
- if sys.version[:3]<'2.3':
- assert abs(t(array([234+3j],'F'))-234.)<=err
- assert abs(t(array([234],'D'))-234.)<=err
- if t.__doc__.split()[0] in ['t0','t4','s0','s4']:
- assert t(1e200)==t(1e300) # inf
-
- try: raise RuntimeError,`t(array([234],'c'))`
- except ValueError: pass
- try: raise RuntimeError,`t('abc')`
- except ValueError: pass
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- try: raise RuntimeError,`t(())`
- except IndexError: pass
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- try: raise RuntimeError,`t({})`
- except TypeError: pass
-
- try:
- try: raise RuntimeError,`t(10l**400)`
- except OverflowError: pass
- except RuntimeError:
- r = t(10l**400); assert `r` in ['inf','Infinity'],`r`
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f77/callback.py b/numpy/f2py/tests/f77/callback.py
deleted file mode 100644
index bfe4eb547..000000000
--- a/numpy/f2py/tests/f77/callback.py
+++ /dev/null
@@ -1,98 +0,0 @@
-__usage__ = """
-Run:
- python callback.py [<f2py options>]
-Examples:
- python callback.py --fcompiler=Gnu --no-wrap-functions
- python callback.py --quiet
-"""
-
-import f2py2e
-import math
-import sys
-from Numeric import array
-
-def build(f2py_opts):
- try:
- import f77_ext_callback
- except ImportError:
- assert not f2py2e.compile('''\
- subroutine t(fun,a)
- integer a
-cf2py intent(out) a
- external fun
- call fun(a)
- end
-
- subroutine func(a)
-cf2py intent(in,out) a
- integer a
- a = a + 11
- end
-
- subroutine func0(a)
-cf2py intent(out) a
- integer a
- a = 11
- end
-
- subroutine t2(a)
-cf2py intent(callback) fun
- integer a
-cf2py intent(out) a
- external fun
- call fun(a)
- end
-
-''','f77_ext_callback',f2py_opts,source_fn='f77_callback.f')
-
- from f77_ext_callback import t,t2
- test_functions = [t,t2]
- return test_functions
-
-def runtest(t):
- r = t(lambda : 4)
- assert r==4,`r`
- r = t(lambda a:5,fun_extra_args=(6,))
- assert r==5,`r`
- r = t(lambda a:a,fun_extra_args=(6,))
- assert r==6,`r`
- r = t(lambda a:5+a,fun_extra_args=(7,))
- assert r==12,`r`
- if sys.version[:3]>='2.3':
- r = t(lambda a:math.degrees(a),fun_extra_args=(math.pi,))
- assert r==180,`r`
- r = t(math.degrees,fun_extra_args=(math.pi,))
- assert r==180,`r`
- from f77_ext_callback import func,func0
- r = t(func,fun_extra_args=(6,))
- assert r==17,`r`
- r = t(func0)
- assert r==11,`r`
- r = t(func0._cpointer)
- assert r==11,`r`
- class A:
- def __call__(self):
- return 7
- def mth(self):
- return 9
- a = A()
- r = t(a)
- assert r==7,`r`
- r = t(a.mth)
- assert r==9,`r`
-
-if __name__=='__main__':
- #import libwadpy
- status = 1
- try:
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
- status = 0
- finally:
- if status:
- print '*'*20
- print 'Running f2py2e.diagnose'
- import f2py2e.diagnose
- f2py2e.diagnose.run()
diff --git a/numpy/f2py/tests/f77/return_character.py b/numpy/f2py/tests/f77/return_character.py
deleted file mode 100644
index b44b6ee70..000000000
--- a/numpy/f2py/tests/f77/return_character.py
+++ /dev/null
@@ -1,99 +0,0 @@
-__usage__ = """
-Run:
- python return_character.py [<f2py options>]
-Examples:
- python return_character.py --fcompiler=Gnu --no-wrap-functions
- python return_character.py --quiet
-"""
-
-import sys
-import f2py2e
-from Numeric import array
-
-def build(f2py_opts):
- try:
- import f77_ext_return_character
- except ImportError:
- assert not f2py2e.compile('''\
- function t0(value)
- character value
- character t0
- t0 = value
- end
- function t1(value)
- character*1 value
- character*1 t1
- t1 = value
- end
- function t5(value)
- character*5 value
- character*5 t5
- t5 = value
- end
- function ts(value)
- character*(*) value
- character*(*) ts
- ts = value
- end
-
- subroutine s0(t0,value)
- character value
- character t0
-cf2py intent(out) t0
- t0 = value
- end
- subroutine s1(t1,value)
- character*1 value
- character*1 t1
-cf2py intent(out) t1
- t1 = value
- end
- subroutine s5(t5,value)
- character*5 value
- character*5 t5
-cf2py intent(out) t5
- t5 = value
- end
- subroutine ss(ts,value)
- character*(*) value
- character*10 ts
-cf2py intent(out) ts
- ts = value
- end
-''','f77_ext_return_character',f2py_opts,source_fn='f77_ret_char.f')
-
- from f77_ext_return_character import t0,t1,t5,s0,s1,s5,ss
- test_functions = [t0,t1,t5,s0,s1,s5,ss]
- if sys.platform!='win32': # this is acctually compiler dependent case
- from f77_ext_return_character import ts
- test_functions.append(ts)
-
- return test_functions
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- if tname in ['t0','t1','s0','s1']:
- assert t(23)=='2'
- r = t('ab');assert r=='a',`r`
- r = t(array('ab'));assert r=='a',`r`
- r = t(array(77,'1'));assert r=='M',`r`
- try: raise RuntimeError,`t(array([77,87]))`
- except ValueError: pass
- try: raise RuntimeError,`t(array(77))`
- except ValueError: pass
- elif tname in ['ts','ss']:
- assert t(23)=='23 ',`t(23)`
- assert t('123456789abcdef')=='123456789a'
- elif tname in ['t5','s5']:
- assert t(23)=='23 ',`t(23)`
- assert t('ab')=='ab ',`t('ab')`
- assert t('123456789abcdef')=='12345'
- else:
- raise NotImplementedError
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f77/return_complex.py b/numpy/f2py/tests/f77/return_complex.py
deleted file mode 100644
index e182902b3..000000000
--- a/numpy/f2py/tests/f77/return_complex.py
+++ /dev/null
@@ -1,124 +0,0 @@
-__usage__ = """
-Run:
- python return_complex.py [<f2py options>]
-Examples:
- python return_complex.py --fcompiler=Gnu --no-wrap-functions
- python return_complex.py --quiet
-"""
-
-import f2py2e
-from Numeric import array
-
-def build(f2py_opts):
- try:
- import f77_ext_return_complex
- except ImportError:
- assert not f2py2e.compile('''\
- function t0(value)
- complex value
- complex t0
- t0 = value
- end
- function t8(value)
- complex*8 value
- complex*8 t8
- t8 = value
- end
- function t16(value)
- complex*16 value
- complex*16 t16
- t16 = value
- end
- function td(value)
- double complex value
- double complex td
- td = value
- end
-
- subroutine s0(t0,value)
- complex value
- complex t0
-cf2py intent(out) t0
- t0 = value
- end
- subroutine s8(t8,value)
- complex*8 value
- complex*8 t8
-cf2py intent(out) t8
- t8 = value
- end
- subroutine s16(t16,value)
- complex*16 value
- complex*16 t16
-cf2py intent(out) t16
- t16 = value
- end
- subroutine sd(td,value)
- double complex value
- double complex td
-cf2py intent(out) td
- td = value
- end
-''','f77_ext_return_complex',f2py_opts)
-
- from f77_ext_return_complex import t0,t8,t16,td,s0,s8,s16,sd
- test_functions = [t0,t8,t16,td,s0,s8,s16,sd]
- return test_functions
-
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- if tname in ['t0','t8','s0','s8']:
- err = 1e-5
- else:
- err = 0.0
- assert abs(t(234j)-234.0j)<=err
- assert abs(t(234.6)-234.6)<=err
- assert abs(t(234l)-234.0)<=err
- assert abs(t(234.6+3j)-(234.6+3j))<=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.)<=err
- assert abs(t(array(234))-234.)<=err
- assert abs(t(array(23+4j,'F'))-(23+4j))<=err
- assert abs(t(array([234]))-234.)<=err
- assert abs(t(array([[234]]))-234.)<=err
- assert abs(t(array([234],'1'))+22.)<=err
- assert abs(t(array([234],'s'))-234.)<=err
- assert abs(t(array([234],'i'))-234.)<=err
- assert abs(t(array([234],'l'))-234.)<=err
- assert abs(t(array([234],'b'))-234.)<=err
- assert abs(t(array([234],'f'))-234.)<=err
- assert abs(t(array([234],'d'))-234.)<=err
- assert abs(t(array([234+3j],'F'))-(234+3j))<=err
- assert abs(t(array([234],'D'))-234.)<=err
-
- try: raise RuntimeError,`t(array([234],'c'))`
- except TypeError: pass
- try: raise RuntimeError,`t('abc')`
- except TypeError: pass
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- try: raise RuntimeError,`t(())`
- except IndexError: pass
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- try: raise RuntimeError,`t({})`
- except TypeError: pass
-
- try:
- try: raise RuntimeError,`t(10l**400)`
- except OverflowError: pass
- except RuntimeError:
- r = t(10l**400); assert `r` in ['(inf+0j)','(Infinity+0j)'],`r`
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f77/return_integer.py b/numpy/f2py/tests/f77/return_integer.py
deleted file mode 100644
index fe9e70fda..000000000
--- a/numpy/f2py/tests/f77/return_integer.py
+++ /dev/null
@@ -1,147 +0,0 @@
-__usage__ = """
-Run:
- python return_integer.py [<f2py options>]
-Examples:
- python return_integer.py --fcompiler=Gnu --no-wrap-functions
- python return_integer.py --quiet
-"""
-
-import numpy.f2py as f2py2e
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f77_ext_return_integer
- except ImportError:
- assert not f2py2e.compile('''\
- function t0(value)
- integer value
- integer t0
- t0 = value
- end
- function t1(value)
- integer*1 value
- integer*1 t1
- t1 = value
- end
- function t2(value)
- integer*2 value
- integer*2 t2
- t2 = value
- end
- function t4(value)
- integer*4 value
- integer*4 t4
- t4 = value
- end
- function t8(value)
- integer*8 value
- integer*8 t8
- t8 = value
- end
-
- subroutine s0(t0,value)
- integer value
- integer t0
-cf2py intent(out) t0
- t0 = value
- end
- subroutine s1(t1,value)
- integer*1 value
- integer*1 t1
-cf2py intent(out) t1
- t1 = value
- end
- subroutine s2(t2,value)
- integer*2 value
- integer*2 t2
-cf2py intent(out) t2
- t2 = value
- end
- subroutine s4(t4,value)
- integer*4 value
- integer*4 t4
-cf2py intent(out) t4
- t4 = value
- end
- subroutine s8(t8,value)
- integer*8 value
- integer*8 t8
-cf2py intent(out) t8
- t8 = value
- end
-
-''','f77_ext_return_integer',f2py_opts,source_fn='f77_ret_int.f')
-
- from f77_ext_return_integer import t0,t1,t2,t4,t8,s0,s1,s2,s4,s8
- test_functions = [t0,t1,t2,t4,t8,s0,s1,s2,s4,s8]
- return test_functions
-
-def runtest(t):
- import sys
- assert t(123)==123,`t(123)`
- assert t(123.6)==123
- assert t(123l)==123
- if sys.version[:3]<'2.3':
- assert t(123.6+3j)==123
- assert t('123')==123
- assert t(-123)==-123
- assert t([123])==123
- assert t((123,))==123
- assert t(array(123))==123
- assert t(array([123]))==123
- assert t(array([[123]]))==123
- assert t(array([123],'b'))==123
- assert t(array([123],'h'))==123
- assert t(array([123],'i'))==123
- assert t(array([123],'l'))==123
- assert t(array([123],'B'))==123
- assert t(array([123],'f'))==123
- assert t(array([123],'d'))==123
- if sys.version[:3]<'2.3':
- assert t(array([123+3j],'F'))==123
- assert t(array([123],'D'))==123
-
-
- try: raise RuntimeError,`t(array([123],'c'))`
- except ValueError: pass
- try: raise RuntimeError,`t('abc')`
- except ValueError: pass
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- try: raise RuntimeError,`t(())`
- except IndexError: pass
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- try: raise RuntimeError,`t({})`
- except TypeError: pass
-
- if t.__doc__.split()[0] in ['t8','s8']:
- try: raise RuntimeError,`t(100000000000000000000000l)`
- except OverflowError: pass
- try: raise RuntimeError,`t(10000000011111111111111.23)`
- except OverflowError: pass
- else:
- if sys.version[:3]<'2.3':
- try: raise RuntimeError,`t(10000000000000l)`
- except OverflowError: pass
- try: raise RuntimeError,`t(10000000000.23)`
- except OverflowError: pass
-
-if __name__=='__main__':
- #import libwadpy
- status = 1
- try:
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
- status = 0
- finally:
- if status:
- print '*'*20
- print 'Running f2py2e.diagnose'
- import numpy.f2py.diagnose as diagnose
- #diagnose.run()
diff --git a/numpy/f2py/tests/f77/return_logical.py b/numpy/f2py/tests/f77/return_logical.py
deleted file mode 100644
index cc5f9cb05..000000000
--- a/numpy/f2py/tests/f77/return_logical.py
+++ /dev/null
@@ -1,133 +0,0 @@
-__usage__ = """
-Run:
- python return_logical.py [<f2py options>]
-Examples:
- python return_logical.py --fcompiler=Gnu --no-wrap-functions
- python return_logical.py --quiet
-"""
-
-import f2py2e
-from Numeric import array
-try: True
-except NameError:
- True = 1
- False = 0
-
-def build(f2py_opts):
- try:
- import f77_ext_return_logical
- except ImportError:
- assert not f2py2e.compile('''\
- function t0(value)
- logical value
- logical t0
- t0 = value
- end
- function t1(value)
- logical*1 value
- logical*1 t1
- t1 = value
- end
- function t2(value)
- logical*2 value
- logical*2 t2
- t2 = value
- end
- function t4(value)
- logical*4 value
- logical*4 t4
- t4 = value
- end
-c function t8(value)
-c logical*8 value
-c logical*8 t8
-c t8 = value
-c end
-
- subroutine s0(t0,value)
- logical value
- logical t0
-cf2py intent(out) t0
- t0 = value
- end
- subroutine s1(t1,value)
- logical*1 value
- logical*1 t1
-cf2py intent(out) t1
- t1 = value
- end
- subroutine s2(t2,value)
- logical*2 value
- logical*2 t2
-cf2py intent(out) t2
- t2 = value
- end
- subroutine s4(t4,value)
- logical*4 value
- logical*4 t4
-cf2py intent(out) t4
- t4 = value
- end
-c subroutine s8(t8,value)
-c logical*8 value
-c logical*8 t8
-cf2py intent(out) t8
-c t8 = value
-c end
-''','f77_ext_return_logical',f2py_opts)
-
- #from f77_ext_return_logical import t0,t1,t2,t4,t8,s0,s1,s2,s4,s8
- #test_functions = [t0,t1,t2,t4,t8,s0,s1,s2,s4,s8]
- from f77_ext_return_logical import t0,t1,t2,t4,s0,s1,s2,s4
- test_functions = [t0,t1,t2,t4,s0,s1,s2,s4]
- return test_functions
-
-def runtest(t):
- assert t(True)==1,`t(True)`
- assert t(False)==0,`t(False)`
- assert t(0)==0
- assert t(None)==0
- assert t(0.0)==0
- assert t(0j)==0
- assert t(1j)==1
- assert t(234)==1
- assert t(234.6)==1
- assert t(234l)==1
- assert t(234.6+3j)==1
- assert t('234')==1
- assert t('aaa')==1
- assert t('')==0
- assert t([])==0
- assert t(())==0
- assert t({})==0
- assert t(t)==1
- assert t(-234)==1
- assert t(10l**100)==1
- assert t([234])==1
- assert t((234,))==1
- assert t(array(234))==1
- assert t(array([234]))==1
- assert t(array([[234]]))==1
- assert t(array([234],'1'))==1
- assert t(array([234],'s'))==1
- assert t(array([234],'i'))==1
- assert t(array([234],'l'))==1
- assert t(array([234],'b'))==1
- assert t(array([234],'f'))==1
- assert t(array([234],'d'))==1
- assert t(array([234+3j],'F'))==1
- assert t(array([234],'D'))==1
- assert t(array(0))==0
- assert t(array([0]))==0
- assert t(array([[0]]))==0
- assert t(array([0j]))==0
- assert t(array([1]))==1
- assert t(array([0,0]))==0
- assert t(array([0,1]))==1 #XXX: is this expected?
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f77/return_real.py b/numpy/f2py/tests/f77/return_real.py
deleted file mode 100644
index a751743e9..000000000
--- a/numpy/f2py/tests/f77/return_real.py
+++ /dev/null
@@ -1,126 +0,0 @@
-__usage__ = """
-Run:
- python return_real.py [<f2py options>]
-Examples:
- python return_real.py --fcompiler=Gnu --no-wrap-functions
- python return_real.py --quiet
-"""
-
-import numpy.f2py as f2py2e
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f77_ext_return_real
- except ImportError:
- assert not f2py2e.compile('''\
- function t0(value)
- real value
- real t0
- t0 = value
- end
- function t4(value)
- real*4 value
- real*4 t4
- t4 = value
- end
- function t8(value)
- real*8 value
- real*8 t8
- t8 = value
- end
- function td(value)
- double precision value
- double precision td
- td = value
- end
-
- subroutine s0(t0,value)
- real value
- real t0
-cf2py intent(out) t0
- t0 = value
- end
- subroutine s4(t4,value)
- real*4 value
- real*4 t4
-cf2py intent(out) t4
- t4 = value
- end
- subroutine s8(t8,value)
- real*8 value
- real*8 t8
-cf2py intent(out) t8
- t8 = value
- end
- subroutine sd(td,value)
- double precision value
- double precision td
-cf2py intent(out) td
- td = value
- end
-''','f77_ext_return_real',f2py_opts,source_fn='f77_ret_real.f')
-
- from f77_ext_return_real import t0,t4,t8,td,s0,s4,s8,sd
- test_functions = [t0,t4,t8,td,s0,s4,s8,sd]
- return test_functions
-
-def runtest(t):
- import sys
- if t.__doc__.split()[0] 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(234l)-234.0)<=err
- if sys.version[:3]<'2.3':
- assert abs(t(234.6+3j)-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.)<=err
- assert abs(t(array(234))-234.)<=err
- assert abs(t(array([234]))-234.)<=err
- assert abs(t(array([[234]]))-234.)<=err
- assert abs(t(array([234],'b'))+22)<=err
- assert abs(t(array([234],'h'))-234.)<=err
- assert abs(t(array([234],'i'))-234.)<=err
- assert abs(t(array([234],'l'))-234.)<=err
- assert abs(t(array([234],'B'))-234.)<=err
- assert abs(t(array([234],'f'))-234.)<=err
- assert abs(t(array([234],'d'))-234.)<=err
- if sys.version[:3]<'2.3':
- assert abs(t(array([234+3j],'F'))-234.)<=err
- assert abs(t(array([234],'D'))-234.)<=err
- if t.__doc__.split()[0] in ['t0','t4','s0','s4']:
- assert t(1e200)==t(1e300) # inf
-
- try: raise RuntimeError,`t(array([234],'c'))`
- except ValueError: pass
- try: raise RuntimeError,`t('abc')`
- except ValueError: pass
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- try: raise RuntimeError,`t(())`
- except IndexError: pass
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- try: raise RuntimeError,`t({})`
- except TypeError: pass
-
- try:
- try: raise RuntimeError,`t(10l**400)`
- except OverflowError: pass
- except RuntimeError:
- r = t(10l**400); assert `r` in ['inf','Infinity'],`r`
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f90/return_character.py b/numpy/f2py/tests/f90/return_character.py
deleted file mode 100644
index b7384bd36..000000000
--- a/numpy/f2py/tests/f90/return_character.py
+++ /dev/null
@@ -1,105 +0,0 @@
-__usage__ = """
-Run:
- python return_character.py [<f2py options>]
-Examples:
- python return_character.py --fcompiler=Gnu --no-wrap-functions
- python return_character.py --quiet
-"""
-
-import numpy.f2py as f2py
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f90_ext_return_character
- except ImportError:
- assert not f2py.compile('''\
-module f90_return_char
- contains
- function t0(value)
- character :: value
- character :: t0
- t0 = value
- end function t0
- function t1(value)
- character(len=1) :: value
- character(len=1) :: t1
- t1 = value
- end function t1
- function t5(value)
- character(len=5) :: value
- character(len=5) :: t5
- t5 = value
- end function t5
- function ts(value)
- character(len=*) :: value
- character(len=10) :: ts
- ts = value
- end function ts
-
- subroutine s0(t0,value)
- character :: value
- character :: t0
-!f2py intent(out) t0
- t0 = value
- end subroutine s0
- subroutine s1(t1,value)
- character(len=1) :: value
- character(len=1) :: t1
-!f2py intent(out) t1
- t1 = value
- end subroutine s1
- subroutine s5(t5,value)
- character(len=5) :: value
- character(len=5) :: t5
-!f2py intent(out) t5
- t5 = value
- end subroutine s5
- subroutine ss(ts,value)
- character(len=*) :: value
- character(len=10) :: ts
-!f2py intent(out) ts
- ts = value
- end subroutine ss
-end module f90_return_char
-''','f90_ext_return_character',f2py_opts,source_fn='f90_ret_char.f90')
-
- from f90_ext_return_character import f90_return_char as m
- test_functions = [m.t0,m.t1,m.t5,m.ts,m.s0,m.s1,m.s5,m.ss]
- return test_functions
-
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- if tname in ['t0','t1','s0','s1']:
- assert t(23)=='2'
- r = t('ab');assert r=='a',`r`
- r = t(array('ab'));assert r=='a',`r`
- r = t(array(77,'l'));assert r=='M',`r`
-
- try: raise RuntimeError,`t(array([77,87]))`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 1"
-
- try: raise RuntimeError,`t(array(77))`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 2"
-
- elif tname in ['ts','ss']:
- assert t(23)=='23 ',`t(23)`
- assert t('123456789abcdef')=='123456789a',`t('123456789abcdef')`
- elif tname in ['t5','s5']:
- assert t(23)=='23 '
- assert t('ab')=='ab '
- assert t('123456789abcdef')=='12345'
- else:
- raise NotImplementedError
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f90/return_complex.py b/numpy/f2py/tests/f90/return_complex.py
deleted file mode 100644
index fa513dcb0..000000000
--- a/numpy/f2py/tests/f90/return_complex.py
+++ /dev/null
@@ -1,141 +0,0 @@
-__usage__ = """
-Run:
- python return_complex.py [<f2py options>]
-Examples:
- python return_complex.py --quiet
-"""
-
-import numpy.f2py as f2py
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f90_ext_return_complex
- except ImportError:
- assert not f2py.compile('''\
-module f90_return_complex
- contains
- function t0(value)
- complex :: value
- complex :: t0
- t0 = value
- end function t0
- function t8(value)
- complex(kind=4) :: value
- complex(kind=4) :: t8
- t8 = value
- end function t8
- function t16(value)
- complex(kind=8) :: value
- complex(kind=8) :: t16
- t16 = value
- end function t16
- function td(value)
- double complex :: value
- double complex :: td
- td = value
- end function td
-
- subroutine s0(t0,value)
- complex :: value
- complex :: t0
-!f2py intent(out) t0
- t0 = value
- end subroutine s0
- subroutine s8(t8,value)
- complex(kind=4) :: value
- complex(kind=4) :: t8
-!f2py intent(out) t8
- t8 = value
- end subroutine s8
- subroutine s16(t16,value)
- complex(kind=8) :: value
- complex(kind=8) :: t16
-!f2py intent(out) t16
- t16 = value
- end subroutine s16
- subroutine sd(td,value)
- double complex :: value
- double complex :: td
-!f2py intent(out) td
- td = value
- end subroutine sd
-end module f90_return_complex
-''','f90_ext_return_complex',f2py_opts,source_fn='f90_ret_cmlx.f90')
-
- from f90_ext_return_complex import f90_return_complex as m
- test_functions = [m.t0,m.t8,m.t16,m.td,m.s0,m.s8,m.s16,m.sd]
- return test_functions
-
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- if tname in ['t0','t8','s0','s8']:
- err = 1e-5
- else:
- err = 0.0
- #assert abs(t(234j)-234.0j)<=err
- assert abs(t(234.6)-234.6)<=err
- assert abs(t(234l)-234.0)<=err
- assert abs(t(234.6+3j)-(234.6+3j))<=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.)<=err
- assert abs(t(array(234))-234.)<=err
- assert abs(t(array(23+4j,'F'))-(23+4j))<=err
- assert abs(t(array([234]))-234.)<=err
- assert abs(t(array([[234]]))-234.)<=err
- assert abs(t(array([234],'b'))+22.)<=err
- assert abs(t(array([234],'h'))-234.)<=err
- assert abs(t(array([234],'i'))-234.)<=err
- assert abs(t(array([234],'l'))-234.)<=err
- assert abs(t(array([234],'q'))-234.)<=err
- assert abs(t(array([234],'f'))-234.)<=err
- assert abs(t(array([234],'d'))-234.)<=err
- assert abs(t(array([234+3j],'F'))-(234+3j))<=err
- assert abs(t(array([234],'D'))-234.)<=err
-
- try: raise RuntimeError,`t(array([234],'c'))`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 1"
-
- try: raise RuntimeError,`t('abc')`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 2"
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 3"
-
- try: raise RuntimeError,`t(())`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 4"
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 5"
-
- try: raise RuntimeError,`t({})`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 6"
-
- try:
- try: raise RuntimeError,`t(10l**400)`
- except OverflowError: pass
- except RuntimeError:
- r = t(10l**400); assert `r` in ['(inf+0j)','(Infinity+0j)'],`r`
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f90/return_integer.py b/numpy/f2py/tests/f90/return_integer.py
deleted file mode 100644
index de77e4dfb..000000000
--- a/numpy/f2py/tests/f90/return_integer.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# XXX: investigate cases that are disabled under win32
-#
-
-__usage__ = """
-Run:
- python return_integer.py [<f2py options>]
-Examples:
- python return_integer.py --quiet
-"""
-
-import sys
-import numpy.f2py as f2py
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f90_ext_return_integer
- except ImportError:
- assert not f2py.compile('''\
-module f90_return_integer
- contains
- function t0(value)
- integer :: value
- integer :: t0
- t0 = value
- end function t0
- function t1(value)
- integer(kind=1) :: value
- integer(kind=1) :: t1
- t1 = value
- end function t1
- function t2(value)
- integer(kind=2) :: value
- integer(kind=2) :: t2
- t2 = value
- end function t2
- function t4(value)
- integer(kind=4) :: value
- integer(kind=4) :: t4
- t4 = value
- end function t4
- function t8(value)
- integer(kind=8) :: value
- integer(kind=8) :: t8
- t8 = value
- end function t8
-
- subroutine s0(t0,value)
- integer :: value
- integer :: t0
-!f2py intent(out) t0
- t0 = value
- end subroutine s0
- subroutine s1(t1,value)
- integer(kind=1) :: value
- integer(kind=1) :: t1
-!f2py intent(out) t1
- t1 = value
- end subroutine s1
- subroutine s2(t2,value)
- integer(kind=2) :: value
- integer(kind=2) :: t2
-!f2py intent(out) t2
- t2 = value
- end subroutine s2
- subroutine s4(t4,value)
- integer(kind=4) :: value
- integer(kind=4) :: t4
-!f2py intent(out) t4
- t4 = value
- end subroutine s4
- subroutine s8(t8,value)
- integer(kind=8) :: value
- integer(kind=8) :: t8
-!f2py intent(out) t8
- t8 = value
- end subroutine s8
-end module f90_return_integer
-''','f90_ext_return_integer',f2py_opts,source_fn='f90_ret_int.f90')
-
- from f90_ext_return_integer import f90_return_integer as m
- test_functions = [m.t0,m.t1,m.t2,m.t4,m.t8,m.s0,m.s1,m.s2,m.s4,m.s8]
- return test_functions
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- assert t(123)==123
- assert t(123.6)==123
- assert t(123l)==123
- if sys.version[:3]<='2.2':
- assert t(123.6+3j)==123
- assert t('123')==123
- assert t(-123)==-123
- assert t([123])==123
- assert t((123,))==123
- assert t(array(123))==123
- assert t(array([123]))==123
- assert t(array([[123]]))==123
- assert t(array([123],'b'))==123
- assert t(array([123],'h'))==123
- assert t(array([123],'i'))==123
- assert t(array([123],'l'))==123
- assert t(array([123],'q'))==123
- assert t(array([123],'f'))==123
- assert t(array([123],'d'))==123
- if sys.version[:3]<='2.2':
- assert t(array([123+3j],'F'))==123
- assert t(array([123],'D'))==123
-
- try: raise RuntimeError,`t(array([123],'c'))`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 1"
-
- try: raise RuntimeError,`t('abc')`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 2"
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 3"
-
- try: raise RuntimeError,`t(())`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 4"
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 5"
-
- try: raise RuntimeError,`t({})`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 6"
-
- if tname in ['t8','s8']:
- try: raise RuntimeError,`t(100000000000000000000000l)`
- except OverflowError: pass
- try: raise RuntimeError,`t(10000000011111111111111.23)`
- except OverflowError: pass
- else:
- if sys.version[:3]<='2.2':
- try: raise RuntimeError,`t(10000000000000l)`
- except OverflowError: pass
- try: raise RuntimeError,`t(10000000000.23)`
- except OverflowError: pass
-
-if __name__=='__main__':
- #import libwadpy
- status = 1
- try:
- repeat,f2py_opts = f2py.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
- status = 0
- finally:
- if status:
- print '*'*20
- print 'Running f2py.diagnose'
- f2py.diagnose.run()
diff --git a/numpy/f2py/tests/f90/return_logical.py b/numpy/f2py/tests/f90/return_logical.py
deleted file mode 100644
index 27d7f7d35..000000000
--- a/numpy/f2py/tests/f90/return_logical.py
+++ /dev/null
@@ -1,138 +0,0 @@
-__usage__ = """
-Run:
- python return_logical.py [<f2py options>]
-Examples:
- python return_logical.py --quiet
-"""
-
-import numpy.f2py as f2py
-from numpy import array
-
-try: True
-except NameError:
- True = 1
- False = 0
-
-def build(f2py_opts):
- try:
- import f90_ext_return_logical
- except ImportError:
- assert not f2py.compile('''\
-module f90_return_logical
- contains
- function t0(value)
- logical :: value
- logical :: t0
- t0 = value
- end function t0
- function t1(value)
- logical(kind=1) :: value
- logical(kind=1) :: t1
- t1 = value
- end function t1
- function t2(value)
- logical(kind=2) :: value
- logical(kind=2) :: t2
- t2 = value
- end function t2
- function t4(value)
- logical(kind=4) :: value
- logical(kind=4) :: t4
- t4 = value
- end function t4
- function t8(value)
- logical(kind=8) :: value
- logical(kind=8) :: t8
- t8 = value
- end function t8
-
- subroutine s0(t0,value)
- logical :: value
- logical :: t0
-!f2py intent(out) t0
- t0 = value
- end subroutine s0
- subroutine s1(t1,value)
- logical(kind=1) :: value
- logical(kind=1) :: t1
-!f2py intent(out) t1
- t1 = value
- end subroutine s1
- subroutine s2(t2,value)
- logical(kind=2) :: value
- logical(kind=2) :: t2
-!f2py intent(out) t2
- t2 = value
- end subroutine s2
- subroutine s4(t4,value)
- logical(kind=4) :: value
- logical(kind=4) :: t4
-!f2py intent(out) t4
- t4 = value
- end subroutine s4
- subroutine s8(t8,value)
- logical(kind=8) :: value
- logical(kind=8) :: t8
-!f2py intent(out) t8
- t8 = value
- end subroutine s8
-end module f90_return_logical
-''','f90_ext_return_logical',f2py_opts,source_fn='f90_ret_log.f90')
-
- from f90_ext_return_logical import f90_return_logical as m
- test_functions = [m.t0,m.t1,m.t2,m.t4,m.t8,m.s0,m.s1,m.s2,m.s4,m.s8]
- return test_functions
-
-
-
-
-def runtest(t):
- assert t(True)==1,`t(True)`
- assert t(False)==0,`t(False)`
- assert t(0)==0
- assert t(None)==0
- assert t(0.0)==0
- assert t(0j)==0
- assert t(1j)==1
- assert t(234)==1
- assert t(234.6)==1
- assert t(234l)==1
- assert t(234.6+3j)==1
- assert t('234')==1
- assert t('aaa')==1
- assert t('')==0
- assert t([])==0
- assert t(())==0
- assert t({})==0
- assert t(t)==1
- assert t(-234)==1
- assert t(10l**100)==1
- assert t([234])==1
- assert t((234,))==1
- assert t(array(234))==1
- assert t(array([234]))==1
- assert t(array([[234]]))==1
- assert t(array([234],'b'))==1
- assert t(array([234],'h'))==1
- assert t(array([234],'i'))==1
- assert t(array([234],'l'))==1
- assert t(array([234],'q'))==1
- assert t(array([234],'f'))==1
- assert t(array([234],'d'))==1
- assert t(array([234+3j],'F'))==1
- assert t(array([234],'D'))==1
- assert t(array(0))==0
- assert t(array([0]))==0
- assert t(array([[0]]))==0
- assert t(array([0j]))==0
- assert t(array([1]))==1
- # The call itself raises an error.
- #assert t(array([0,0])) == 0 # fails
- #assert t(array([1,1])) == 1 # fails
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/f90/return_real.py b/numpy/f2py/tests/f90/return_real.py
deleted file mode 100644
index 5a7e2b249..000000000
--- a/numpy/f2py/tests/f90/return_real.py
+++ /dev/null
@@ -1,144 +0,0 @@
-__usage__ = """
-Run:
- python return_real.py [<f2py options>]
-Examples:
- python return_real.py --quiet
-"""
-
-import sys
-import numpy.f2py as f2py
-from numpy import array
-
-def build(f2py_opts):
- try:
- import f90_ext_return_real
- except ImportError:
- assert not f2py.compile('''\
-module f90_return_real
- contains
- function t0(value)
- real :: value
- real :: t0
- t0 = value
- end function t0
- function t4(value)
- real(kind=4) :: value
- real(kind=4) :: t4
- t4 = value
- end function t4
- function t8(value)
- real(kind=8) :: value
- real(kind=8) :: t8
- t8 = value
- end function t8
- function td(value)
- double precision :: value
- double precision :: td
- td = value
- end function td
-
- subroutine s0(t0,value)
- real :: value
- real :: t0
-!f2py intent(out) t0
- t0 = value
- end subroutine s0
- subroutine s4(t4,value)
- real(kind=4) :: value
- real(kind=4) :: t4
-!f2py intent(out) t4
- t4 = value
- end subroutine s4
- subroutine s8(t8,value)
- real(kind=8) :: value
- real(kind=8) :: t8
-!f2py intent(out) t8
- t8 = value
- end subroutine s8
- subroutine sd(td,value)
- double precision :: value
- double precision :: td
-!f2py intent(out) td
- td = value
- end subroutine sd
-end module f90_return_real
-''','f90_ext_return_real',f2py_opts,source_fn='f90_ret_real.f90')
-
- from f90_ext_return_real import f90_return_real as m
- test_functions = [m.t0,m.t4,m.t8,m.td,m.s0,m.s4,m.s8,m.sd]
- return test_functions
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- 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(234l)-234.0)<=err
- if sys.version[:3]<='2.2':
- assert abs(t(234.6+3j)-234.6)<=err,`t(234.6+3j)`
- 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.)<=err
- assert abs(t(array(234))-234.)<=err
- assert abs(t(array([234]))-234.)<=err
- assert abs(t(array([[234]]))-234.)<=err
- assert abs(t(array([234],'b'))+22)<=err
- assert abs(t(array([234],'h'))-234.)<=err
- assert abs(t(array([234],'i'))-234.)<=err
- assert abs(t(array([234],'l'))-234.)<=err
- assert abs(t(array([234],'q'))-234.)<=err
- assert abs(t(array([234],'f'))-234.)<=err
- assert abs(t(array([234],'d'))-234.)<=err
- if sys.version[:3]<='2.2':
- assert abs(t(array([234+3j],'F'))-234.)<=err,`t(array([234+3j],'F'))`
- assert abs(t(array([234],'D'))-234.)<=err,`t(array([234],'D'))`
- if tname in ['t0','t4','s0','s4']:
- assert t(1e200)==t(1e300) # inf
-
- try: raise RuntimeError,`t(array([234],'c'))`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 1"
-
- try: raise RuntimeError,`t('abc')`
- except ValueError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 2"
-
- try: raise RuntimeError,`t([])`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 3"
-
- try: raise RuntimeError,`t(())`
- except IndexError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 4"
-
- try: raise RuntimeError,`t(t)`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 5"
-
- try: raise RuntimeError,`t({})`
- except TypeError: pass
- except RuntimeError: print "Failed Error"
- except: print "Wrong Error Type 6"
-
- try:
- try: raise RuntimeError,`t(10l**400)`
- except OverflowError: pass
- except RuntimeError:
- r = t(10l**400); assert `r` in ['inf','Infinity'],`r`
-
-if __name__=='__main__':
- #import libwadpy
- repeat,f2py_opts = f2py.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/mixed/run.py b/numpy/f2py/tests/mixed/run.py
deleted file mode 100644
index 8dbbf21f2..000000000
--- a/numpy/f2py/tests/mixed/run.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-__usage__ = """
-Run:
- python run.py [<f2py options>]
-Examples:
- python run.py --quiet
-"""
-
-import os
-import sys
-import f2py2e
-from Numeric import array
-
-def build(f2py_opts):
- try:
- import mixed_f77_f90
- except:
- d,b=os.path.split(sys.argv[0])
- files = ['foo.f','foo_fixed.f90','foo_free.f90']
- files = [os.path.join(d,f) for f in files]
- files = ' '.join(files)
- args = ' -c -m mixed_f77_f90 %s %s'%(files,f2py_opts)
- c = '%s -c "import f2py2e;f2py2e.main()" %s' %(sys.executable,args)
- s = os.system(c)
- assert not s
- from mixed_f77_f90 import bar11
- test_functions = [bar11]
- from mixed_f77_f90 import foo_fixed as m
- test_functions.append(m.bar12)
- from mixed_f77_f90 import foo_free as m
- test_functions.append(m.bar13)
- return test_functions
-
-def runtest(t):
- tname = t.__doc__.split()[0]
- if tname=='bar11':
- assert t()==11
- elif tname=='bar12':
- assert t()==12
- elif tname=='bar13':
- assert t()==13
- else:
- raise NotImplementedError
-
-if __name__=='__main__':
- repeat,f2py_opts = f2py2e.f2py_testing.cmdline()
- test_functions = build(f2py_opts)
- f2py2e.f2py_testing.run(runtest,test_functions,repeat)
- print 'ok'
diff --git a/numpy/f2py/tests/run_all.py b/numpy/f2py/tests/run_all.py
deleted file mode 100755
index 016e68c29..000000000
--- a/numpy/f2py/tests/run_all.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python
-
-import os,sys
-
-opts = sys.argv[1:]
-if not opts:
- opts = ['10','--quiet']
-
-NUMARRAY = "-DNUMARRAY" in sys.argv
-
-test_f77_files = [\
- 'f77/return_integer.py',
- 'f77/return_logical.py',
- 'f77/return_real.py',
- 'f77/return_complex.py',
- 'f77/callback.py',
- ]
-
-if not NUMARRAY: # no support for character yet in numarray
- test_f77_files.append('f77/return_character.py')
-
-test_f90_files = [\
- 'f90/return_integer.py',
- 'f90/return_logical.py',
- 'f90/return_real.py',
- 'f90/return_complex.py',
- 'f90/return_character.py',
- 'mixed/run.py',
- ]
-
-test_files = test_f77_files
-
-if NUMARRAY:
- print >>sys.stderr,"NOTE: f2py for numarray does not support"\
- " f90 or character arrays."
-else:
- test_files += test_f90_files
-
-py_path = os.environ.get('PYTHONPATH')
-if py_path is None:
- py_path = '.'
-else:
- py_path = os.pathsep.join(['.',py_path])
-os.environ['PYTHONPATH'] = py_path
-
-for f in test_files:
- print "**********************************************"
- ff = os.path.join(sys.path[0],f)
- args = [sys.executable,ff]+opts
- print "Running",' '.join(args)
- status = os.spawnve(os.P_WAIT,sys.executable,args,os.environ)
- if status:
- print 'TEST FAILURE (status=%s)' % (status)
- if f=='f90/return_integer.py':
- sys.exit()
diff --git a/numpy/f2py/tests/array_from_pyobj/wrapmodule.c b/numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c
index 38a794a7d..df316c2b5 100644
--- a/numpy/f2py/tests/array_from_pyobj/wrapmodule.c
+++ b/numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c
@@ -36,7 +36,7 @@ static PyObject *f2py_rout_wrap_call(PyObject *capi_self,
PyObject *capi_args) {
PyObject * volatile capi_buildvalue = NULL;
int type_num = 0;
- intp *dims = NULL;
+ npy_intp *dims = NULL;
PyObject *dims_capi = Py_None;
int rank = 0;
int intent = 0;
@@ -48,9 +48,9 @@ static PyObject *f2py_rout_wrap_call(PyObject *capi_self,
&type_num,&dims_capi,&intent,&arr_capi))
return NULL;
rank = PySequence_Length(dims_capi);
- dims = malloc(rank*sizeof(intp));
+ dims = malloc(rank*sizeof(npy_intp));
for (i=0;i<rank;++i)
- dims[i] = (intp)PyInt_AsLong(PySequence_GetItem(dims_capi,i));
+ dims[i] = (npy_intp)PyInt_AsLong(PySequence_GetItem(dims_capi,i));
capi_arr_tmp = array_from_pyobj(type_num,dims,rank,intent|F2PY_INTENT_OUT,arr_capi);
if (capi_arr_tmp == NULL)
@@ -114,9 +114,9 @@ static PyMethodDef f2py_module_methods[] = {
{NULL,NULL}
};
-PyMODINIT_FUNC initwrap(void) {
+PyMODINIT_FUNC inittest_array_from_pyobj_ext(void) {
PyObject *m,*d, *s;
- m = wrap_module = Py_InitModule("wrap", f2py_module_methods);
+ m = wrap_module = Py_InitModule("test_array_from_pyobj_ext", f2py_module_methods);
PyFortran_Type.ob_type = &PyType_Type;
import_array();
if (PyErr_Occurred())
@@ -164,15 +164,15 @@ PyMODINIT_FUNC initwrap(void) {
PyDict_SetItemString(d, "PyArray_NOTYPE", PyInt_FromLong(PyArray_NOTYPE));
PyDict_SetItemString(d, "PyArray_UDERDEF", PyInt_FromLong(PyArray_USERDEF));
- PyDict_SetItemString(d, "CONTIGUOUS", PyInt_FromLong(CONTIGUOUS));
- PyDict_SetItemString(d, "FORTRAN", PyInt_FromLong(FORTRAN));
- PyDict_SetItemString(d, "OWNDATA", PyInt_FromLong(OWNDATA));
- PyDict_SetItemString(d, "FORCECAST", PyInt_FromLong(FORCECAST));
- PyDict_SetItemString(d, "ENSURECOPY", PyInt_FromLong(ENSURECOPY));
- PyDict_SetItemString(d, "ENSUREARRAY", PyInt_FromLong(ENSUREARRAY));
- PyDict_SetItemString(d, "ALIGNED", PyInt_FromLong(ALIGNED));
- PyDict_SetItemString(d, "WRITEABLE", PyInt_FromLong(WRITEABLE));
- PyDict_SetItemString(d, "UPDATEIFCOPY", PyInt_FromLong(UPDATEIFCOPY));
+ PyDict_SetItemString(d, "CONTIGUOUS", PyInt_FromLong(NPY_CONTIGUOUS));
+ PyDict_SetItemString(d, "FORTRAN", PyInt_FromLong(NPY_FORTRAN));
+ PyDict_SetItemString(d, "OWNDATA", PyInt_FromLong(NPY_OWNDATA));
+ PyDict_SetItemString(d, "FORCECAST", PyInt_FromLong(NPY_FORCECAST));
+ PyDict_SetItemString(d, "ENSURECOPY", PyInt_FromLong(NPY_ENSURECOPY));
+ PyDict_SetItemString(d, "ENSUREARRAY", PyInt_FromLong(NPY_ENSUREARRAY));
+ PyDict_SetItemString(d, "ALIGNED", PyInt_FromLong(NPY_ALIGNED));
+ PyDict_SetItemString(d, "WRITEABLE", PyInt_FromLong(NPY_WRITEABLE));
+ PyDict_SetItemString(d, "UPDATEIFCOPY", PyInt_FromLong(NPY_UPDATEIFCOPY));
PyDict_SetItemString(d, "BEHAVED", PyInt_FromLong(NPY_BEHAVED));
PyDict_SetItemString(d, "BEHAVED_NS", PyInt_FromLong(NPY_BEHAVED_NS));
diff --git a/numpy/f2py/tests/mixed/foo.f b/numpy/f2py/tests/src/mixed/foo.f
index c34742578..c34742578 100644
--- a/numpy/f2py/tests/mixed/foo.f
+++ b/numpy/f2py/tests/src/mixed/foo.f
diff --git a/numpy/f2py/tests/mixed/foo_fixed.f90 b/numpy/f2py/tests/src/mixed/foo_fixed.f90
index 7543a6acb..7543a6acb 100644
--- a/numpy/f2py/tests/mixed/foo_fixed.f90
+++ b/numpy/f2py/tests/src/mixed/foo_fixed.f90
diff --git a/numpy/f2py/tests/mixed/foo_free.f90 b/numpy/f2py/tests/src/mixed/foo_free.f90
index c1b641f13..c1b641f13 100644
--- a/numpy/f2py/tests/mixed/foo_free.f90
+++ b/numpy/f2py/tests/src/mixed/foo_free.f90
diff --git a/numpy/f2py/tests/array_from_pyobj/tests/test_array_from_pyobj.py b/numpy/f2py/tests/test_array_from_pyobj.py
index c43c3eaba..7db481981 100644
--- a/numpy/f2py/tests/array_from_pyobj/tests/test_array_from_pyobj.py
+++ b/numpy/f2py/tests/test_array_from_pyobj.py
@@ -1,11 +1,33 @@
import unittest
+import os
import sys
import copy
from numpy.testing import *
from numpy import array, alltrue, ndarray, asarray, can_cast,zeros, dtype
from numpy.core.multiarray import typeinfo
-from array_from_pyobj import wrap
+
+import util
+
+wrap = None
+def setup():
+ """
+ Build the required testing extension module
+
+ """
+ global wrap
+ if wrap is None:
+ config_code = """
+ config.add_extension('test_array_from_pyobj_ext',
+ sources=['wrapmodule.c', 'fortranobject.c'],
+ define_macros=[])
+ """
+ d = os.path.dirname(__file__)
+ src = [os.path.join(d, 'src', 'array_from_pyobj', 'wrapmodule.c'),
+ os.path.join(d, '..', 'src', 'fortranobject.c'),
+ os.path.join(d, '..', 'src', 'fortranobject.h')]
+ wrap = util.build_module_distutils(src, config_code,
+ 'test_array_from_pyobj_ext')
def flags_info(arr):
flags = wrap.array_attrs(arr)[6]
@@ -51,7 +73,6 @@ class Intent:
intent = Intent()
class Type(object):
-
_type_names = ['BOOL','BYTE','UBYTE','SHORT','USHORT','INT','UINT',
'LONG','ULONG','LONGLONG','ULONGLONG',
'FLOAT','DOUBLE','LONGDOUBLE','CFLOAT','CDOUBLE',
@@ -170,15 +191,14 @@ class Array:
if intent.is_intent('cache'):
assert isinstance(obj,ndarray),`type(obj)`
- self.pyarr = array(obj).reshape(*dims)
-
+ self.pyarr = array(obj).reshape(*dims).copy()
else:
self.pyarr = array(array(obj,
dtype = typ.dtypechar).reshape(*dims),
- fortran=not self.intent.is_intent('c'))
- assert self.pyarr.dtype.char==typ.dtypechar,\
- `self.pyarr.dtype.char,typ.dtypechar`
- assert self.pyarr.flags['OWNDATA']
+ order=self.intent.is_intent('c') and 'C' or 'F')
+ assert self.pyarr.dtype == typ, \
+ `self.pyarr.dtype,typ`
+ assert self.pyarr.flags['OWNDATA'], (obj, intent)
self.pyarr_attr = wrap.array_attrs(self.pyarr)
if len(dims)>1:
@@ -275,12 +295,12 @@ class _test_shared_memory:
raise SystemError,'intent(inout) should have failed on sequence'
def test_f_inout_23seq(self):
- obj = array(self.num23seq,dtype=self.type.dtype,fortran=1)
+ obj = array(self.num23seq,dtype=self.type.dtype,order='F')
shape = (len(self.num23seq),len(self.num23seq[0]))
a = self.array(shape,intent.in_.inout,obj)
assert a.has_shared_memory()
- obj = array(self.num23seq,dtype=self.type.dtype,fortran=0)
+ obj = array(self.num23seq,dtype=self.type.dtype,order='C')
shape = (len(self.num23seq),len(self.num23seq[0]))
try:
a = self.array(shape,intent.in_.inout,obj)
@@ -316,7 +336,7 @@ class _test_shared_memory:
def test_f_in_from_23casttype(self):
for t in self.type.cast_types():
- obj = array(self.num23seq,dtype=t.dtype,fortran=1)
+ obj = array(self.num23seq,dtype=t.dtype,order='F')
a = self.array([len(self.num23seq),len(self.num23seq[0])],
intent.in_,obj)
if t.elsize==self.type.elsize:
@@ -336,7 +356,7 @@ class _test_shared_memory:
def test_f_copy_in_from_23casttype(self):
for t in self.type.cast_types():
- obj = array(self.num23seq,dtype=t.dtype,fortran=1)
+ obj = array(self.num23seq,dtype=t.dtype,order='F')
a = self.array([len(self.num23seq),len(self.num23seq[0])],
intent.in_.copy,obj)
assert not a.has_shared_memory(),`t.dtype`
@@ -360,7 +380,7 @@ class _test_shared_memory:
a = self.array(shape,intent.in_.cache,obj)
assert a.has_shared_memory(),`t.dtype`
- obj = array(self.num2seq,dtype=t.dtype,fortran=1)
+ obj = array(self.num2seq,dtype=t.dtype,order='F')
a = self.array(shape,intent.in_.c.cache,obj)
assert a.has_shared_memory(),`t.dtype`
@@ -505,9 +525,11 @@ for t in Type._type_names:
class test_%s_gen(unittest.TestCase,
_test_shared_memory
):
- type = Type(%r)
+ def setUp(self):
+ self.type = Type(%r)
array = lambda self,dims,intent,obj: Array(Type(%r),dims,intent,obj)
''' % (t,t,t)
if __name__ == "__main__":
- run_module_suite()
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_callback.py b/numpy/f2py/tests/test_callback.py
new file mode 100644
index 000000000..f2c99d7a4
--- /dev/null
+++ b/numpy/f2py/tests/test_callback.py
@@ -0,0 +1,74 @@
+from numpy.testing import *
+from numpy import array
+import math
+import util
+
+class TestF77Callback(util.F2PyTest):
+ code = """
+ subroutine t(fun,a)
+ integer a
+cf2py intent(out) a
+ external fun
+ call fun(a)
+ end
+
+ subroutine func(a)
+cf2py intent(in,out) a
+ integer a
+ a = a + 11
+ end
+
+ subroutine func0(a)
+cf2py intent(out) a
+ integer a
+ a = 11
+ end
+
+ subroutine t2(a)
+cf2py intent(callback) fun
+ integer a
+cf2py intent(out) a
+ external fun
+ call fun(a)
+ end
+ """
+
+ def test_all(self):
+ for name in "t,t2".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module, name)
+ r = t(lambda : 4)
+ assert r==4,`r`
+ r = t(lambda a:5,fun_extra_args=(6,))
+ assert r==5,`r`
+ r = t(lambda a:a,fun_extra_args=(6,))
+ assert r==6,`r`
+ r = t(lambda a:5+a,fun_extra_args=(7,))
+ assert r==12,`r`
+ r = t(lambda a:math.degrees(a),fun_extra_args=(math.pi,))
+ assert r==180,`r`
+ r = t(math.degrees,fun_extra_args=(math.pi,))
+ assert r==180,`r`
+
+ r = t(self.module.func, fun_extra_args=(6,))
+ assert r==17,`r`
+ r = t(self.module.func0)
+ assert r==11,`r`
+ r = t(self.module.func0._cpointer)
+ assert r==11,`r`
+ class A:
+ def __call__(self):
+ return 7
+ def mth(self):
+ return 9
+ a = A()
+ r = t(a)
+ assert r==7,`r`
+ r = t(a.mth)
+ assert r==9,`r`
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_mixed.py b/numpy/f2py/tests/test_mixed.py
new file mode 100644
index 000000000..53534c114
--- /dev/null
+++ b/numpy/f2py/tests/test_mixed.py
@@ -0,0 +1,24 @@
+import os
+import math
+
+from numpy.testing import *
+from numpy import array
+
+import util
+
+def _path(*a):
+ return os.path.join(*((os.path.dirname(__file__),) + a))
+
+class TestMixed(util.F2PyTest):
+ sources = [_path('src', 'mixed', 'foo.f'),
+ _path('src', 'mixed', 'foo_fixed.f90'),
+ _path('src', 'mixed', 'foo_free.f90')]
+
+ def test_all(self):
+ assert self.module.bar11() == 11
+ assert self.module.foo_fixed.bar12() == 12
+ assert self.module.foo_free.bar13() == 13
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_return_character.py b/numpy/f2py/tests/test_return_character.py
new file mode 100644
index 000000000..166ed1f54
--- /dev/null
+++ b/numpy/f2py/tests/test_return_character.py
@@ -0,0 +1,146 @@
+from numpy.testing import *
+from numpy import array
+import util
+
+class TestReturnCharacter(util.F2PyTest):
+ def _check_function(self, t):
+ tname = t.__doc__.split()[0]
+ if tname in ['t0','t1','s0','s1']:
+ assert t(23)=='2'
+ r = t('ab');assert r=='a',`r`
+ r = t(array('ab'));assert r=='a',`r`
+ r = t(array(77,'u1'));assert r=='M',`r`
+ #assert_raises(ValueError, t, array([77,87]))
+ #assert_raises(ValueError, t, array(77))
+ elif tname in ['ts','ss']:
+ assert t(23)=='23 ',`t(23)`
+ assert t('123456789abcdef')=='123456789a'
+ elif tname in ['t5','s5']:
+ assert t(23)=='23 ',`t(23)`
+ assert t('ab')=='ab ',`t('ab')`
+ assert t('123456789abcdef')=='12345'
+ else:
+ raise NotImplementedError
+
+class TestF77ReturnCharacter(TestReturnCharacter):
+ code = """
+ function t0(value)
+ character value
+ character t0
+ t0 = value
+ end
+ function t1(value)
+ character*1 value
+ character*1 t1
+ t1 = value
+ end
+ function t5(value)
+ character*5 value
+ character*5 t5
+ t5 = value
+ end
+ function ts(value)
+ character*(*) value
+ character*(*) ts
+ ts = value
+ end
+
+ subroutine s0(t0,value)
+ character value
+ character t0
+cf2py intent(out) t0
+ t0 = value
+ end
+ subroutine s1(t1,value)
+ character*1 value
+ character*1 t1
+cf2py intent(out) t1
+ t1 = value
+ end
+ subroutine s5(t5,value)
+ character*5 value
+ character*5 t5
+cf2py intent(out) t5
+ t5 = value
+ end
+ subroutine ss(ts,value)
+ character*(*) value
+ character*10 ts
+cf2py intent(out) ts
+ ts = value
+ end
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t5,s0,s1,s5,ss".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module, name)
+ self._check_function(t)
+
+
+class TestF90ReturnCharacter(TestReturnCharacter):
+ suffix = ".f90"
+ code = """
+module f90_return_char
+ contains
+ function t0(value)
+ character :: value
+ character :: t0
+ t0 = value
+ end function t0
+ function t1(value)
+ character(len=1) :: value
+ character(len=1) :: t1
+ t1 = value
+ end function t1
+ function t5(value)
+ character(len=5) :: value
+ character(len=5) :: t5
+ t5 = value
+ end function t5
+ function ts(value)
+ character(len=*) :: value
+ character(len=10) :: ts
+ ts = value
+ end function ts
+
+ subroutine s0(t0,value)
+ character :: value
+ character :: t0
+!f2py intent(out) t0
+ t0 = value
+ end subroutine s0
+ subroutine s1(t1,value)
+ character(len=1) :: value
+ character(len=1) :: t1
+!f2py intent(out) t1
+ t1 = value
+ end subroutine s1
+ subroutine s5(t5,value)
+ character(len=5) :: value
+ character(len=5) :: t5
+!f2py intent(out) t5
+ t5 = value
+ end subroutine s5
+ subroutine ss(ts,value)
+ character(len=*) :: value
+ character(len=10) :: ts
+!f2py intent(out) ts
+ ts = value
+ end subroutine ss
+end module f90_return_char
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t5,ts,s0,s1,s5,ss".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module.f90_return_char, name)
+ self._check_function(t)
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_return_complex.py b/numpy/f2py/tests/test_return_complex.py
new file mode 100644
index 000000000..ce5355a62
--- /dev/null
+++ b/numpy/f2py/tests/test_return_complex.py
@@ -0,0 +1,172 @@
+from numpy.testing import *
+from numpy import array
+import util
+
+class TestReturnComplex(util.F2PyTest):
+ def _check_function(self, t):
+ tname = t.__doc__.split()[0]
+ if tname in ['t0','t8','s0','s8']:
+ err = 1e-5
+ else:
+ err = 0.0
+ assert abs(t(234j)-234.0j)<=err
+ assert abs(t(234.6)-234.6)<=err
+ assert abs(t(234l)-234.0)<=err
+ assert abs(t(234.6+3j)-(234.6+3j))<=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.)<=err
+ assert abs(t(array(234))-234.)<=err
+ assert abs(t(array(23+4j,'F'))-(23+4j))<=err
+ assert abs(t(array([234]))-234.)<=err
+ assert abs(t(array([[234]]))-234.)<=err
+ assert abs(t(array([234],'b'))+22.)<=err
+ assert abs(t(array([234],'h'))-234.)<=err
+ assert abs(t(array([234],'i'))-234.)<=err
+ assert abs(t(array([234],'l'))-234.)<=err
+ assert abs(t(array([234],'q'))-234.)<=err
+ assert abs(t(array([234],'f'))-234.)<=err
+ assert abs(t(array([234],'d'))-234.)<=err
+ assert abs(t(array([234+3j],'F'))-(234+3j))<=err
+ assert abs(t(array([234],'D'))-234.)<=err
+
+ #assert_raises(TypeError, t, array([234], 'a1'))
+ assert_raises(TypeError, t, 'abc')
+
+ assert_raises(IndexError, t, [])
+ assert_raises(IndexError, t, ())
+
+ assert_raises(TypeError, t, t)
+ assert_raises(TypeError, t, {})
+
+ try:
+ r = t(10l**400)
+ assert `r` in ['(inf+0j)','(Infinity+0j)'],`r`
+ except OverflowError:
+ pass
+
+
+class TestF77ReturnComplex(TestReturnComplex):
+ code = """
+ function t0(value)
+ complex value
+ complex t0
+ t0 = value
+ end
+ function t8(value)
+ complex*8 value
+ complex*8 t8
+ t8 = value
+ end
+ function t16(value)
+ complex*16 value
+ complex*16 t16
+ t16 = value
+ end
+ function td(value)
+ double complex value
+ double complex td
+ td = value
+ end
+
+ subroutine s0(t0,value)
+ complex value
+ complex t0
+cf2py intent(out) t0
+ t0 = value
+ end
+ subroutine s8(t8,value)
+ complex*8 value
+ complex*8 t8
+cf2py intent(out) t8
+ t8 = value
+ end
+ subroutine s16(t16,value)
+ complex*16 value
+ complex*16 t16
+cf2py intent(out) t16
+ t16 = value
+ end
+ subroutine sd(td,value)
+ double complex value
+ double complex td
+cf2py intent(out) td
+ td = value
+ end
+ """
+
+ def test_all(self):
+ for name in "t0,t8,t16,td,s0,s8,s16,sd".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module, name)
+ self._check_function(t)
+
+
+class TestF90ReturnComplex(TestReturnComplex):
+ suffix = ".f90"
+ code = """
+module f90_return_complex
+ contains
+ function t0(value)
+ complex :: value
+ complex :: t0
+ t0 = value
+ end function t0
+ function t8(value)
+ complex(kind=4) :: value
+ complex(kind=4) :: t8
+ t8 = value
+ end function t8
+ function t16(value)
+ complex(kind=8) :: value
+ complex(kind=8) :: t16
+ t16 = value
+ end function t16
+ function td(value)
+ double complex :: value
+ double complex :: td
+ td = value
+ end function td
+
+ subroutine s0(t0,value)
+ complex :: value
+ complex :: t0
+!f2py intent(out) t0
+ t0 = value
+ end subroutine s0
+ subroutine s8(t8,value)
+ complex(kind=4) :: value
+ complex(kind=4) :: t8
+!f2py intent(out) t8
+ t8 = value
+ end subroutine s8
+ subroutine s16(t16,value)
+ complex(kind=8) :: value
+ complex(kind=8) :: t16
+!f2py intent(out) t16
+ t16 = value
+ end subroutine s16
+ subroutine sd(td,value)
+ double complex :: value
+ double complex :: td
+!f2py intent(out) td
+ td = value
+ end subroutine sd
+end module f90_return_complex
+ """
+
+ def test_all(self):
+ for name in "t0,t8,t16,td,s0,s8,s16,sd".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module.f90_return_complex, name)
+ self._check_function(t)
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_return_integer.py b/numpy/f2py/tests/test_return_integer.py
new file mode 100644
index 000000000..fbda46e08
--- /dev/null
+++ b/numpy/f2py/tests/test_return_integer.py
@@ -0,0 +1,181 @@
+from numpy.testing import *
+from numpy import array
+import util
+
+class TestReturnInteger(util.F2PyTest):
+ def _check_function(self, t):
+ assert t(123)==123,`t(123)`
+ assert t(123.6)==123
+ assert t(123l)==123
+ assert t('123')==123
+ assert t(-123)==-123
+ assert t([123])==123
+ assert t((123,))==123
+ assert t(array(123))==123
+ assert t(array([123]))==123
+ assert t(array([[123]]))==123
+ assert t(array([123],'b'))==123
+ assert t(array([123],'h'))==123
+ assert t(array([123],'i'))==123
+ assert t(array([123],'l'))==123
+ assert t(array([123],'B'))==123
+ assert t(array([123],'f'))==123
+ assert t(array([123],'d'))==123
+
+ #assert_raises(ValueError, t, array([123],'S3'))
+ assert_raises(ValueError, t, 'abc')
+
+ assert_raises(IndexError, t, [])
+ assert_raises(IndexError, t, ())
+
+ assert_raises(Exception, t, t)
+ assert_raises(Exception, t, {})
+
+ if t.__doc__.split()[0] in ['t8','s8']:
+ assert_raises(OverflowError, t, 100000000000000000000000l)
+ assert_raises(OverflowError, t, 10000000011111111111111.23)
+
+class TestF77ReturnInteger(TestReturnInteger):
+ code = """
+ function t0(value)
+ integer value
+ integer t0
+ t0 = value
+ end
+ function t1(value)
+ integer*1 value
+ integer*1 t1
+ t1 = value
+ end
+ function t2(value)
+ integer*2 value
+ integer*2 t2
+ t2 = value
+ end
+ function t4(value)
+ integer*4 value
+ integer*4 t4
+ t4 = value
+ end
+ function t8(value)
+ integer*8 value
+ integer*8 t8
+ t8 = value
+ end
+
+ subroutine s0(t0,value)
+ integer value
+ integer t0
+cf2py intent(out) t0
+ t0 = value
+ end
+ subroutine s1(t1,value)
+ integer*1 value
+ integer*1 t1
+cf2py intent(out) t1
+ t1 = value
+ end
+ subroutine s2(t2,value)
+ integer*2 value
+ integer*2 t2
+cf2py intent(out) t2
+ t2 = value
+ end
+ subroutine s4(t4,value)
+ integer*4 value
+ integer*4 t4
+cf2py intent(out) t4
+ t4 = value
+ end
+ subroutine s8(t8,value)
+ integer*8 value
+ integer*8 t8
+cf2py intent(out) t8
+ t8 = value
+ end
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t2,t4,t8,s0,s1,s2,s4,s8".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module, name)
+ self._check_function(t)
+
+
+class TestF90ReturnInteger(TestReturnInteger):
+ suffix = ".f90"
+ code = """
+module f90_return_integer
+ contains
+ function t0(value)
+ integer :: value
+ integer :: t0
+ t0 = value
+ end function t0
+ function t1(value)
+ integer(kind=1) :: value
+ integer(kind=1) :: t1
+ t1 = value
+ end function t1
+ function t2(value)
+ integer(kind=2) :: value
+ integer(kind=2) :: t2
+ t2 = value
+ end function t2
+ function t4(value)
+ integer(kind=4) :: value
+ integer(kind=4) :: t4
+ t4 = value
+ end function t4
+ function t8(value)
+ integer(kind=8) :: value
+ integer(kind=8) :: t8
+ t8 = value
+ end function t8
+
+ subroutine s0(t0,value)
+ integer :: value
+ integer :: t0
+!f2py intent(out) t0
+ t0 = value
+ end subroutine s0
+ subroutine s1(t1,value)
+ integer(kind=1) :: value
+ integer(kind=1) :: t1
+!f2py intent(out) t1
+ t1 = value
+ end subroutine s1
+ subroutine s2(t2,value)
+ integer(kind=2) :: value
+ integer(kind=2) :: t2
+!f2py intent(out) t2
+ t2 = value
+ end subroutine s2
+ subroutine s4(t4,value)
+ integer(kind=4) :: value
+ integer(kind=4) :: t4
+!f2py intent(out) t4
+ t4 = value
+ end subroutine s4
+ subroutine s8(t8,value)
+ integer(kind=8) :: value
+ integer(kind=8) :: t8
+!f2py intent(out) t8
+ t8 = value
+ end subroutine s8
+end module f90_return_integer
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t2,t4,t8,s0,s1,s2,s4,s8".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module.f90_return_integer, name)
+ self._check_function(t)
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_return_logical.py b/numpy/f2py/tests/test_return_logical.py
new file mode 100644
index 000000000..f75a5a0ac
--- /dev/null
+++ b/numpy/f2py/tests/test_return_logical.py
@@ -0,0 +1,190 @@
+from numpy.testing import *
+from numpy import array
+import util
+
+class TestReturnLogical(util.F2PyTest):
+ def _check_function(self, t):
+ assert t(True)==1,`t(True)`
+ assert t(False)==0,`t(False)`
+ assert t(0)==0
+ assert t(None)==0
+ assert t(0.0)==0
+ assert t(0j)==0
+ assert t(1j)==1
+ assert t(234)==1
+ assert t(234.6)==1
+ assert t(234l)==1
+ assert t(234.6+3j)==1
+ assert t('234')==1
+ assert t('aaa')==1
+ assert t('')==0
+ assert t([])==0
+ assert t(())==0
+ assert t({})==0
+ assert t(t)==1
+ assert t(-234)==1
+ assert t(10l**100)==1
+ assert t([234])==1
+ assert t((234,))==1
+ assert t(array(234))==1
+ assert t(array([234]))==1
+ assert t(array([[234]]))==1
+ assert t(array([234],'b'))==1
+ assert t(array([234],'h'))==1
+ assert t(array([234],'i'))==1
+ assert t(array([234],'l'))==1
+ assert t(array([234],'f'))==1
+ assert t(array([234],'d'))==1
+ assert t(array([234+3j],'F'))==1
+ assert t(array([234],'D'))==1
+ assert t(array(0))==0
+ assert t(array([0]))==0
+ assert t(array([[0]]))==0
+ assert t(array([0j]))==0
+ assert t(array([1]))==1
+ assert_raises(ValueError, t, array([0,0]))
+
+
+class TestF77ReturnLogical(TestReturnLogical):
+ code = """
+ function t0(value)
+ logical value
+ logical t0
+ t0 = value
+ end
+ function t1(value)
+ logical*1 value
+ logical*1 t1
+ t1 = value
+ end
+ function t2(value)
+ logical*2 value
+ logical*2 t2
+ t2 = value
+ end
+ function t4(value)
+ logical*4 value
+ logical*4 t4
+ t4 = value
+ end
+c function t8(value)
+c logical*8 value
+c logical*8 t8
+c t8 = value
+c end
+
+ subroutine s0(t0,value)
+ logical value
+ logical t0
+cf2py intent(out) t0
+ t0 = value
+ end
+ subroutine s1(t1,value)
+ logical*1 value
+ logical*1 t1
+cf2py intent(out) t1
+ t1 = value
+ end
+ subroutine s2(t2,value)
+ logical*2 value
+ logical*2 t2
+cf2py intent(out) t2
+ t2 = value
+ end
+ subroutine s4(t4,value)
+ logical*4 value
+ logical*4 t4
+cf2py intent(out) t4
+ t4 = value
+ end
+c subroutine s8(t8,value)
+c logical*8 value
+c logical*8 t8
+cf2py intent(out) t8
+c t8 = value
+c end
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t2,t4,s0,s1,s2,s4".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module, name)
+ self._check_function(t)
+
+class TestF90ReturnLogical(TestReturnLogical):
+ suffix = ".f90"
+ code = """
+module f90_return_logical
+ contains
+ function t0(value)
+ logical :: value
+ logical :: t0
+ t0 = value
+ end function t0
+ function t1(value)
+ logical(kind=1) :: value
+ logical(kind=1) :: t1
+ t1 = value
+ end function t1
+ function t2(value)
+ logical(kind=2) :: value
+ logical(kind=2) :: t2
+ t2 = value
+ end function t2
+ function t4(value)
+ logical(kind=4) :: value
+ logical(kind=4) :: t4
+ t4 = value
+ end function t4
+ function t8(value)
+ logical(kind=8) :: value
+ logical(kind=8) :: t8
+ t8 = value
+ end function t8
+
+ subroutine s0(t0,value)
+ logical :: value
+ logical :: t0
+!f2py intent(out) t0
+ t0 = value
+ end subroutine s0
+ subroutine s1(t1,value)
+ logical(kind=1) :: value
+ logical(kind=1) :: t1
+!f2py intent(out) t1
+ t1 = value
+ end subroutine s1
+ subroutine s2(t2,value)
+ logical(kind=2) :: value
+ logical(kind=2) :: t2
+!f2py intent(out) t2
+ t2 = value
+ end subroutine s2
+ subroutine s4(t4,value)
+ logical(kind=4) :: value
+ logical(kind=4) :: t4
+!f2py intent(out) t4
+ t4 = value
+ end subroutine s4
+ subroutine s8(t8,value)
+ logical(kind=8) :: value
+ logical(kind=8) :: t8
+!f2py intent(out) t8
+ t8 = value
+ end subroutine s8
+end module f90_return_logical
+ """
+
+ def test_all(self):
+ for name in "t0,t1,t2,t4,t8,s0,s1,s2,s4,s8".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ t = getattr(self.module.f90_return_logical, name)
+ self._check_function(t)
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/test_return_real.py b/numpy/f2py/tests/test_return_real.py
new file mode 100644
index 000000000..dd4c93fb9
--- /dev/null
+++ b/numpy/f2py/tests/test_return_real.py
@@ -0,0 +1,206 @@
+from numpy.testing import *
+from numpy import array
+import math
+import util
+
+class TestReturnReal(util.F2PyTest):
+ def _check_function(self, t):
+ if t.__doc__.split()[0] 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(234l)-234.0)<=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.)<=err
+ assert abs(t(array(234))-234.)<=err
+ assert abs(t(array([234]))-234.)<=err
+ assert abs(t(array([[234]]))-234.)<=err
+ assert abs(t(array([234],'b'))+22)<=err
+ assert abs(t(array([234],'h'))-234.)<=err
+ assert abs(t(array([234],'i'))-234.)<=err
+ assert abs(t(array([234],'l'))-234.)<=err
+ assert abs(t(array([234],'B'))-234.)<=err
+ assert abs(t(array([234],'f'))-234.)<=err
+ assert abs(t(array([234],'d'))-234.)<=err
+ if t.__doc__.split()[0] in ['t0','t4','s0','s4']:
+ assert t(1e200)==t(1e300) # inf
+
+ #assert_raises(ValueError, t, array([234], 'S1'))
+ assert_raises(ValueError, t, 'abc')
+
+ assert_raises(IndexError, t, [])
+ assert_raises(IndexError, t, ())
+
+ assert_raises(Exception, t, t)
+ assert_raises(Exception, t, {})
+
+ try:
+ r = t(10l**400)
+ assert `r` in ['inf','Infinity'],`r`
+ except OverflowError:
+ pass
+
+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
+ """
+
+ def test_all(self):
+ for name in "t4,t8,s4,s8".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ self._check_function(getattr(self.module, name))
+
+class TestF77ReturnReal(TestReturnReal):
+ code = """
+ function t0(value)
+ real value
+ real t0
+ t0 = value
+ end
+ function t4(value)
+ real*4 value
+ real*4 t4
+ t4 = value
+ end
+ function t8(value)
+ real*8 value
+ real*8 t8
+ t8 = value
+ end
+ function td(value)
+ double precision value
+ double precision td
+ td = value
+ end
+
+ subroutine s0(t0,value)
+ real value
+ real t0
+cf2py intent(out) t0
+ t0 = value
+ end
+ subroutine s4(t4,value)
+ real*4 value
+ real*4 t4
+cf2py intent(out) t4
+ t4 = value
+ end
+ subroutine s8(t8,value)
+ real*8 value
+ real*8 t8
+cf2py intent(out) t8
+ t8 = value
+ end
+ subroutine sd(td,value)
+ double precision value
+ double precision td
+cf2py intent(out) td
+ td = value
+ end
+ """
+
+ def test_all(self):
+ for name in "t0,t4,t8,td,s0,s4,s8,sd".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ self._check_function(getattr(self.module, name))
+
+class TestF90ReturnReal(TestReturnReal):
+ suffix = ".f90"
+ code = """
+module f90_return_real
+ contains
+ function t0(value)
+ real :: value
+ real :: t0
+ t0 = value
+ end function t0
+ function t4(value)
+ real(kind=4) :: value
+ real(kind=4) :: t4
+ t4 = value
+ end function t4
+ function t8(value)
+ real(kind=8) :: value
+ real(kind=8) :: t8
+ t8 = value
+ end function t8
+ function td(value)
+ double precision :: value
+ double precision :: td
+ td = value
+ end function td
+
+ subroutine s0(t0,value)
+ real :: value
+ real :: t0
+!f2py intent(out) t0
+ t0 = value
+ end subroutine s0
+ subroutine s4(t4,value)
+ real(kind=4) :: value
+ real(kind=4) :: t4
+!f2py intent(out) t4
+ t4 = value
+ end subroutine s4
+ subroutine s8(t8,value)
+ real(kind=8) :: value
+ real(kind=8) :: t8
+!f2py intent(out) t8
+ t8 = value
+ end subroutine s8
+ subroutine sd(td,value)
+ double precision :: value
+ double precision :: td
+!f2py intent(out) td
+ td = value
+ end subroutine sd
+end module f90_return_real
+ """
+
+ def test_all(self):
+ for name in "t0,t4,t8,td,s0,s4,s8,sd".split(","):
+ yield self.check_function, name
+
+ def check_function(self, name):
+ self._check_function(getattr(self.module.f90_return_real, name))
+
+
+if __name__ == "__main__":
+ import nose
+ nose.runmodule()
diff --git a/numpy/f2py/tests/util.py b/numpy/f2py/tests/util.py
new file mode 100644
index 000000000..4895dc7ca
--- /dev/null
+++ b/numpy/f2py/tests/util.py
@@ -0,0 +1,346 @@
+"""
+Utility functions for
+
+- building and importing modules on test time, using a temporary location
+- detecting if compilers are present
+
+"""
+
+import os
+import sys
+import subprocess
+import tempfile
+import shutil
+import atexit
+import textwrap
+import re
+import random
+
+import nose
+
+from numpy.compat import asbytes
+import numpy.f2py
+
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import new as md5
+
+#
+# Maintaining a temporary module directory
+#
+
+_module_dir = None
+
+def _cleanup():
+ global _module_dir
+ if _module_dir is not None:
+ try:
+ sys.path.remove(_module_dir)
+ except ValueError:
+ pass
+ try:
+ shutil.rmtree(_module_dir)
+ except (IOError, OSError):
+ pass
+ _module_dir = None
+
+def get_module_dir():
+ global _module_dir
+ if _module_dir is None:
+ _module_dir = tempfile.mkdtemp()
+ atexit.register(_cleanup)
+ if _module_dir not in sys.path:
+ sys.path.insert(0, _module_dir)
+ return _module_dir
+
+def get_temp_module_name():
+ # Assume single-threaded, and the module dir usable only by this thread
+ d = get_module_dir()
+ for j in xrange(5403, 9999999):
+ name = "_test_ext_module_%d" % j
+ fn = os.path.join(d, name)
+ if name not in sys.modules and not os.path.isfile(fn+'.py'):
+ return name
+ raise RuntimeError("Failed to create a temporary module name")
+
+def _memoize(func):
+ memo = {}
+ def wrapper(*a, **kw):
+ key = repr((a, kw))
+ if key not in memo:
+ try:
+ memo[key] = func(*a, **kw)
+ except Exception, e:
+ memo[key] = e
+ raise
+ ret = memo[key]
+ if isinstance(ret, Exception):
+ raise ret
+ return ret
+ wrapper.__name__ = func.__name__
+ return wrapper
+
+#
+# Building modules
+#
+
+@_memoize
+def build_module(source_files, options=[], skip=[], only=[], module_name=None):
+ """
+ Compile and import a f2py module, built from the given files.
+
+ """
+
+ code = ("import sys; sys.path = %s; import numpy.f2py as f2py2e; "
+ "f2py2e.main()" % repr(sys.path))
+
+ d = get_module_dir()
+
+ # Copy files
+ dst_sources = []
+ for fn in source_files:
+ if not os.path.isfile(fn):
+ raise RuntimeError("%s is not a file" % fn)
+ dst = os.path.join(d, os.path.basename(fn))
+ shutil.copyfile(fn, dst)
+ dst_sources.append(dst)
+
+ # Prepare options
+ if module_name is None:
+ module_name = get_temp_module_name()
+ f2py_opts = ['-c', '-m', module_name] + options + dst_sources
+ if skip:
+ f2py_opts += ['skip:'] + skip
+ if only:
+ f2py_opts += ['only:'] + only
+
+ # Build
+ cwd = os.getcwd()
+ try:
+ os.chdir(d)
+ cmd = [sys.executable, '-c', code] + f2py_opts
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ out, err = p.communicate()
+ if p.returncode != 0:
+ raise RuntimeError("Running f2py failed: %s\n%s"
+ % (cmd[4:], out))
+ finally:
+ os.chdir(cwd)
+
+ # Partial cleanup
+ for fn in dst_sources:
+ os.unlink(fn)
+
+ # Import
+ __import__(module_name)
+ return sys.modules[module_name]
+
+@_memoize
+def build_code(source_code, options=[], skip=[], only=[], suffix=None,
+ module_name=None):
+ """
+ Compile and import Fortran code using f2py.
+
+ """
+ if suffix is None:
+ suffix = '.f'
+
+ fd, tmp_fn = tempfile.mkstemp(suffix=suffix)
+ os.write(fd, asbytes(source_code))
+ os.close(fd)
+
+ try:
+ return build_module([tmp_fn], options=options, skip=skip, only=only,
+ module_name=module_name)
+ finally:
+ os.unlink(tmp_fn)
+
+#
+# Check if compilers are available at all...
+#
+
+_compiler_status = None
+def _get_compiler_status():
+ global _compiler_status
+ if _compiler_status is not None:
+ return _compiler_status
+
+ _compiler_status = (False, False, False)
+
+ # XXX: this is really ugly. But I don't know how to invoke Distutils
+ # in a safer way...
+ code = """
+import os
+import sys
+sys.path = %(syspath)s
+
+def configuration(parent_name='',top_path=None):
+ global config
+ from numpy.distutils.misc_util import Configuration
+ config = Configuration('', parent_name, top_path)
+ return config
+
+from numpy.distutils.core import setup
+setup(configuration=configuration)
+
+config_cmd = config.get_config_cmd()
+have_c = config_cmd.try_compile('void foo() {}')
+print('COMPILERS:%%d,%%d,%%d' %% (have_c,
+ config.have_f77c(),
+ config.have_f90c()))
+sys.exit(99)
+"""
+ code = code % dict(syspath=repr(sys.path))
+
+ fd, script = tempfile.mkstemp(suffix='.py')
+ os.write(fd, asbytes(code))
+ os.close(fd)
+
+ try:
+ cmd = [sys.executable, script, 'config']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ out, err = p.communicate()
+ m = re.search(r'COMPILERS:(\d+),(\d+),(\d+)', out)
+ if m:
+ _compiler_status = (bool(m.group(1)), bool(m.group(2)),
+ bool(m.group(3)))
+ finally:
+ os.unlink(script)
+
+ # Finished
+ return _compiler_status
+
+def has_c_compiler():
+ return _get_compiler_status()[0]
+
+def has_f77_compiler():
+ return _get_compiler_status()[1]
+
+def has_f90_compiler():
+ return _get_compiler_status()[2]
+
+#
+# Building with distutils
+#
+
+@_memoize
+def build_module_distutils(source_files, config_code, module_name, **kw):
+ """
+ Build a module via distutils and import it.
+
+ """
+ from numpy.distutils.misc_util import Configuration
+ from numpy.distutils.core import setup
+
+ d = get_module_dir()
+
+ # Copy files
+ dst_sources = []
+ for fn in source_files:
+ if not os.path.isfile(fn):
+ raise RuntimeError("%s is not a file" % fn)
+ dst = os.path.join(d, os.path.basename(fn))
+ shutil.copyfile(fn, dst)
+ dst_sources.append(dst)
+
+ # Build script
+ config_code = textwrap.dedent(config_code).replace("\n", "\n ")
+
+ code = """\
+import os
+import sys
+sys.path = %(syspath)s
+
+def configuration(parent_name='',top_path=None):
+ from numpy.distutils.misc_util import Configuration
+ config = Configuration('', parent_name, top_path)
+ %(config_code)s
+ return config
+
+if __name__ == "__main__":
+ from numpy.distutils.core import setup
+ setup(configuration=configuration)
+""" % dict(config_code=config_code, syspath = repr(sys.path))
+
+ script = os.path.join(d, get_temp_module_name() + '.py')
+ dst_sources.append(script)
+ f = open(script, 'wb')
+ f.write(asbytes(code))
+ f.close()
+
+ # Build
+ cwd = os.getcwd()
+ try:
+ os.chdir(d)
+ cmd = [sys.executable, script, 'build_ext', '-i']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ out, err = p.communicate()
+ if p.returncode != 0:
+ raise RuntimeError("Running distutils build failed: %s\n%s"
+ % (cmd[4:], out))
+ finally:
+ os.chdir(cwd)
+
+ # Partial cleanup
+ for fn in dst_sources:
+ os.unlink(fn)
+
+ # Import
+ __import__(module_name)
+ return sys.modules[module_name]
+
+#
+# Unittest convenience
+#
+
+class F2PyTest(object):
+ code = None
+ sources = None
+ options = []
+ skip = []
+ only = []
+ suffix = '.f'
+ module = None
+ module_name = None
+
+ def setUp(self):
+ if self.module is not None:
+ return
+
+ # Check compiler availability first
+ if not has_c_compiler():
+ raise nose.SkipTest("No C compiler available")
+
+ codes = []
+ if self.sources:
+ codes.extend(self.sources)
+ if self.code is not None:
+ codes.append(self.suffix)
+
+ needs_f77 = False
+ needs_f90 = False
+ for fn in codes:
+ if fn.endswith('.f'):
+ needs_f77 = True
+ elif fn.endswith('.f90'):
+ needs_f90 = True
+ if needs_f77 and not has_f77_compiler():
+ raise nose.SkipTest("No Fortran 77 compiler available")
+ if needs_f90 and not has_f90_compiler():
+ raise nose.SkipTest("No Fortran 90 compiler available")
+
+ # Build the module
+ if self.code is not None:
+ self.module = build_code(self.code, options=self.options,
+ skip=self.skip, only=self.only,
+ suffix=self.suffix,
+ module_name=self.module_name)
+
+ if self.sources is not None:
+ self.module = build_module(self.sources, options=self.options,
+ skip=self.skip, only=self.only,
+ module_name=self.module_name)