summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/tests
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/f2py/lib/tests')
-rw-r--r--numpy/f2py/lib/tests/test_derived_scalar.py74
-rw-r--r--numpy/f2py/lib/tests/test_module_module.py61
-rw-r--r--numpy/f2py/lib/tests/test_module_scalar.py58
-rw-r--r--numpy/f2py/lib/tests/test_scalar_function_in.py532
-rw-r--r--numpy/f2py/lib/tests/test_scalar_in_out.py529
5 files changed, 1254 insertions, 0 deletions
diff --git a/numpy/f2py/lib/tests/test_derived_scalar.py b/numpy/f2py/lib/tests/test_derived_scalar.py
new file mode 100644
index 000000000..c57778020
--- /dev/null
+++ b/numpy/f2py/lib/tests/test_derived_scalar.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+"""
+Tests for intent(in,out) derived type arguments in Fortran subroutine's.
+
+-----
+Permission to use, modify, and distribute this software is given under the
+terms of the NumPy License. See http://scipy.org.
+
+NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+Author: Pearu Peterson <pearu@cens.ioc.ee>
+Created: Oct 2006
+-----
+"""
+
+import os
+import sys
+from numpy.testing import *
+set_package_path()
+from lib.main import build_extension, compile
+restore_path()
+
+fortran_code = '''
+subroutine foo(a)
+ type myt
+ integer flag
+ end type myt
+ type(myt) a
+!f2py intent(in,out) a
+ a % flag = a % flag + 1
+end
+function foo2(a)
+ type myt
+ integer flag
+ end type myt
+ type(myt) a
+ type(myt) foo2
+ foo2 % flag = a % flag + 2
+end
+'''
+
+m, = compile(fortran_code, 'test_derived_scalar_ext')
+
+from numpy import *
+
+class test_m(NumpyTestCase):
+
+ def check_foo_simple(self, level=1):
+ a = m.myt(2)
+ assert_equal(a.flag,2)
+ assert isinstance(a,m.myt),`a`
+ r = m.foo(a)
+ assert isinstance(r,m.myt),`r`
+ assert r is a
+ assert_equal(r.flag,3)
+ assert_equal(a.flag,3)
+
+ a.flag = 5
+ assert_equal(r.flag,5)
+
+ #s = m.foo((5,))
+
+ def check_foo2_simple(self, level=1):
+ a = m.myt(2)
+ assert_equal(a.flag,2)
+ assert isinstance(a,m.myt),`a`
+ r = m.foo2(a)
+ assert isinstance(r,m.myt),`r`
+ assert r is not a
+ assert_equal(a.flag,2)
+ assert_equal(r.flag,4)
+
+
+if __name__ == "__main__":
+ NumpyTest().run()
diff --git a/numpy/f2py/lib/tests/test_module_module.py b/numpy/f2py/lib/tests/test_module_module.py
new file mode 100644
index 000000000..4d242ed54
--- /dev/null
+++ b/numpy/f2py/lib/tests/test_module_module.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+"""
+Tests for module with scalar derived types and subprograms.
+
+-----
+Permission to use, modify, and distribute this software is given under the
+terms of the NumPy License. See http://scipy.org.
+
+NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+Author: Pearu Peterson <pearu@cens.ioc.ee>
+Created: Oct 2006
+-----
+"""
+
+import os
+import sys
+from numpy.testing import *
+
+set_package_path()
+from lib.main import build_extension, compile
+restore_path()
+
+fortran_code = '''
+module test_module_module_ext2
+ type rat
+ integer n,d
+ end type rat
+ contains
+ subroutine foo2()
+ print*,"In foo2"
+ end subroutine foo2
+end module
+module test_module_module_ext
+ contains
+ subroutine foo
+ use test_module_module_ext2
+ print*,"In foo"
+ call foo2
+ end subroutine foo
+ subroutine bar(a)
+ use test_module_module_ext2
+ type(rat) a
+ print*,"In bar,a=",a
+ end subroutine bar
+end module test_module_module_ext
+'''
+
+m,m2 = compile(fortran_code, modulenames=['test_module_module_ext',
+ 'test_module_module_ext2',
+ ])
+
+from numpy import *
+
+class test_m(NumpyTestCase):
+
+ def check_foo_simple(self, level=1):
+ foo = m.foo
+ foo()
+
+if __name__ == "__main__":
+ NumpyTest().run()
diff --git a/numpy/f2py/lib/tests/test_module_scalar.py b/numpy/f2py/lib/tests/test_module_scalar.py
new file mode 100644
index 000000000..e11a1e0ae
--- /dev/null
+++ b/numpy/f2py/lib/tests/test_module_scalar.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+"""
+Tests for module with scalar derived types and subprograms.
+
+-----
+Permission to use, modify, and distribute this software is given under the
+terms of the NumPy License. See http://scipy.org.
+
+NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+Author: Pearu Peterson <pearu@cens.ioc.ee>
+Created: Oct 2006
+-----
+"""
+
+import os
+import sys
+from numpy.testing import *
+set_package_path()
+from lib.main import build_extension, compile
+restore_path()
+
+fortran_code = '''
+module test_module_scalar_ext
+
+ contains
+ subroutine foo(a)
+ integer a
+!f2py intent(in,out) a
+ a = a + 1
+ end subroutine foo
+ function foo2(a)
+ integer a
+ integer foo2
+ foo2 = a + 2
+ end function foo2
+end module test_module_scalar_ext
+'''
+
+m, = compile(fortran_code, modulenames = ['test_module_scalar_ext'])
+
+from numpy import *
+
+class test_m(NumpyTestCase):
+
+ def check_foo_simple(self, level=1):
+ foo = m.foo
+ r = foo(2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,3)
+
+ def check_foo2_simple(self, level=1):
+ foo2 = m.foo2
+ r = foo2(2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,4)
+
+if __name__ == "__main__":
+ NumpyTest().run()
diff --git a/numpy/f2py/lib/tests/test_scalar_function_in.py b/numpy/f2py/lib/tests/test_scalar_function_in.py
new file mode 100644
index 000000000..9c5cd8aba
--- /dev/null
+++ b/numpy/f2py/lib/tests/test_scalar_function_in.py
@@ -0,0 +1,532 @@
+#!/usr/bin/env python
+"""
+Tests for intent(in) arguments in subroutine-wrapped Fortran functions.
+
+-----
+Permission to use, modify, and distribute this software is given under the
+terms of the NumPy License. See http://scipy.org.
+
+NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+Author: Pearu Peterson <pearu@cens.ioc.ee>
+Created: Oct 2006
+-----
+"""
+
+import os
+import sys
+from numpy.testing import *
+
+set_package_path()
+from lib.main import build_extension, compile
+restore_path()
+
+fortran_code = '''\
+! -*- f77 -*-
+ function fooint1(a)
+ integer*1 a
+ integer*1 fooint1
+ fooint1 = a + 1
+ end
+ function fooint2(a)
+ integer*2 a
+ integer*2 fooint2
+ fooint2 = a + 1
+ end
+ function fooint4(a)
+ integer*4 a
+ integer*4 fooint4
+ fooint4 = a + 1
+ end
+ function fooint8(a)
+ integer*8 a
+ integer*8 fooint8
+ fooint8 = a + 1
+ end
+ function foofloat4(a)
+ real*4 a
+ real*4 foofloat4
+ foofloat4 = a + 1.0e0
+ end
+ function foofloat8(a)
+ real*8 a
+ real*8 foofloat8
+ foofloat8 = a + 1.0d0
+ end
+ function foocomplex8(a)
+ complex*8 a
+ complex*8 foocomplex8
+ foocomplex8 = a + 1.0e0
+ end
+ function foocomplex16(a)
+ complex*16 a
+ complex*16 foocomplex16
+ foocomplex16 = a + 1.0d0
+ end
+ function foobool1(a)
+ logical*1 a
+ logical*1 foobool1
+ foobool1 = .not. a
+ end
+ function foobool2(a)
+ logical*2 a
+ logical*2 foobool2
+ foobool2 = .not. a
+ end
+ function foobool4(a)
+ logical*4 a
+ logical*4 foobool4
+ foobool4 = .not. a
+ end
+ function foobool8(a)
+ logical*8 a
+ logical*8 foobool8
+ foobool8 = .not. a
+ end
+ function foostring1(a)
+ character*1 a
+ character*1 foostring1
+ foostring1 = "1"
+ end
+ function foostring5(a)
+ character*5 a
+ character*5 foostring5
+ foostring5 = a
+ foostring5(1:2) = "12"
+ end
+! function foostringstar(a)
+! character*(*) a
+! character*(*) foostringstar
+! if (len(a).gt.0) then
+! foostringstar = a
+! foostringstar(1:1) = "1"
+! endif
+! end
+'''
+
+m, = compile(fortran_code, 'test_scalar_function_in_ext')
+
+from numpy import *
+
+class test_m(NumpyTestCase):
+
+ def check_foo_integer1(self, level=1):
+ i = int8(2)
+ e = int8(3)
+ func = m.fooint1
+ assert isinstance(i,int8),`type(i)`
+ r = func(i)
+ assert isinstance(r,int8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int64,int16,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer2(self, level=1):
+ i = int16(2)
+ e = int16(3)
+ func = m.fooint2
+ assert isinstance(i,int16),`type(i)`
+ r = func(i)
+ assert isinstance(r,int16),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int64,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer4(self, level=1):
+ i = int32(2)
+ e = int32(3)
+ func = m.fooint4
+ assert isinstance(i,int32),`type(i)`
+ r = func(i)
+ assert isinstance(r,int32),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int16,int64]:
+ r = func(intx(2))
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer8(self, level=1):
+ i = int64(2)
+ e = int64(3)
+ func = m.fooint8
+ assert isinstance(i,int64),`type(i)`
+ r = func(i)
+ assert isinstance(r,int64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int16,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_real4(self, level=1):
+ i = float32(2)
+ e = float32(3)
+ func = m.foofloat4
+ assert isinstance(i,float32),`type(i)`
+ r = func(i)
+ assert isinstance(r,float32),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e+float32(0.2))
+
+ r = func(float64(2.0))
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_real8(self, level=1):
+ i = float64(2)
+ e = float64(3)
+ func = m.foofloat8
+ assert isinstance(i,float64),`type(i)`
+ r = func(i)
+ assert isinstance(r,float64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e+float64(0.2))
+
+ r = func(float32(2.0))
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_complex8(self, level=1):
+ i = complex64(2)
+ e = complex64(3)
+ func = m.foocomplex8
+ assert isinstance(i,complex64),`type(i)`
+ r = func(i)
+ assert isinstance(r,complex64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(0.2))
+
+ r = func(2+1j)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(1j))
+
+ r = func(complex128(2.0))
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2,3])
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(3j))
+
+ self.assertRaises(TypeError,lambda :func([2,1,3]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_complex16(self, level=1):
+ i = complex128(2)
+ e = complex128(3)
+ func = m.foocomplex16
+ assert isinstance(i,complex128),`type(i)`
+ r = func(i)
+ assert isinstance(r,complex128),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(0.2))
+
+ r = func(2+1j)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(1j))
+
+ r = func([2])
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2,3])
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(3j))
+
+ r = func(complex64(2.0))
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func([2,1,3]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_bool1(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool1
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool2(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool2
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool4(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool4
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool8(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool8
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_string1(self, level=1):
+ i = string0('a')
+ e = string0('1')
+ func = m.foostring1
+ assert isinstance(i,string0),`type(i)`
+ r = func(i)
+ assert isinstance(r,string0),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func('ab')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,e)
+
+ r = func('')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,e)
+
+ def check_foo_string5(self, level=1):
+ i = string0('abcde')
+ e = string0('12cde')
+ func = m.foostring5
+ assert isinstance(i,string0),`type(i)`
+ r = func(i)
+ assert isinstance(r,string0),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func('abc')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12c ')
+
+ r = func('abcdefghi')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12cde')
+
+ r = func([1])
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12] ')
+
+ def _check_foo_string0(self, level=1):
+ i = string0('abcde')
+ e = string0('12cde')
+ func = m.foostringstar
+ r = func('abcde')
+ assert_equal(r,'1bcde')
+ r = func('')
+ assert_equal(r,'')
+
+if __name__ == "__main__":
+ NumpyTest().run()
diff --git a/numpy/f2py/lib/tests/test_scalar_in_out.py b/numpy/f2py/lib/tests/test_scalar_in_out.py
new file mode 100644
index 000000000..b73036848
--- /dev/null
+++ b/numpy/f2py/lib/tests/test_scalar_in_out.py
@@ -0,0 +1,529 @@
+#!/usr/bin/env python
+"""
+Tests for intent(in,out) arguments in Fortran subroutine's.
+
+-----
+Permission to use, modify, and distribute this software is given under the
+terms of the NumPy License. See http://scipy.org.
+
+NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+Author: Pearu Peterson <pearu@cens.ioc.ee>
+Created: Oct 2006
+-----
+"""
+
+import os
+import sys
+from numpy.testing import *
+
+set_package_path()
+from lib.main import build_extension, compile
+restore_path()
+
+fortran_code = '''
+ subroutine fooint1(a)
+ integer*1 a
+!f2py intent(in,out) a
+ a = a + 1
+ end
+ subroutine fooint2(a)
+ integer*2 a
+!f2py intent(in,out) a
+ a = a + 1
+ end
+ subroutine fooint4(a)
+ integer*4 a
+!f2py intent(in,out) a
+ a = a + 1
+ end
+ subroutine fooint8(a)
+ integer*8 a
+!f2py intent(in,out) a
+ a = a + 1
+ end
+ subroutine foofloat4(a)
+ real*4 a
+!f2py intent(in,out) a
+ a = a + 1.0e0
+ end
+ subroutine foofloat8(a)
+ real*8 a
+!f2py intent(in,out) a
+ a = a + 1.0d0
+ end
+ subroutine foocomplex8(a)
+ complex*8 a
+!f2py intent(in,out) a
+ a = a + 1.0e0
+ end
+ subroutine foocomplex16(a)
+ complex*16 a
+!f2py intent(in,out) a
+ a = a + 1.0d0
+ end
+ subroutine foobool1(a)
+ logical*1 a
+!f2py intent(in,out) a
+ a = .not. a
+ end
+ subroutine foobool2(a)
+ logical*2 a
+!f2py intent(in,out) a
+ a = .not. a
+ end
+ subroutine foobool4(a)
+ logical*4 a
+!f2py intent(in,out) a
+ a = .not. a
+ end
+ subroutine foobool8(a)
+ logical*8 a
+!f2py intent(in,out) a
+ a = .not. a
+ end
+ subroutine foostring1(a)
+ character*1 a
+!f2py intent(in,out) a
+ a = "1"
+ end
+ subroutine foostring5(a)
+ character*5 a
+!f2py intent(in,out) a
+ a(1:2) = "12"
+ end
+ subroutine foostringstar(a)
+ character*(*) a
+!f2py intent(in,out) a
+ if (len(a).gt.0) then
+ a(1:1) = "1"
+ endif
+ end
+'''
+
+m, = compile(fortran_code, 'test_scalar_in_out_ext', source_ext = '.f')
+
+from numpy import *
+
+class test_m(NumpyTestCase):
+
+ def check_foo_integer1(self, level=1):
+ i = int8(2)
+ e = int8(3)
+ func = m.fooint1
+ assert isinstance(i,int8),`type(i)`
+ r = func(i)
+ assert isinstance(r,int8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int64,int16,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int8),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer2(self, level=1):
+ i = int16(2)
+ e = int16(3)
+ func = m.fooint2
+ assert isinstance(i,int16),`type(i)`
+ r = func(i)
+ assert isinstance(r,int16),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int64,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int16),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer4(self, level=1):
+ i = int32(2)
+ e = int32(3)
+ func = m.fooint4
+ assert isinstance(i,int32),`type(i)`
+ r = func(i)
+ assert isinstance(r,int32),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int16,int64]:
+ r = func(intx(2))
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int32),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_integer8(self, level=1):
+ i = int64(2)
+ e = int64(3)
+ func = m.fooint8
+ assert isinstance(i,int64),`type(i)`
+ r = func(i)
+ assert isinstance(r,int64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ for intx in [int8,int16,int32]:
+ r = func(intx(2))
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,int64),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_real4(self, level=1):
+ i = float32(2)
+ e = float32(3)
+ func = m.foofloat4
+ assert isinstance(i,float32),`type(i)`
+ r = func(i)
+ assert isinstance(r,float32),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e+float32(0.2))
+
+ r = func(float64(2.0))
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,float32),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_real8(self, level=1):
+ i = float64(2)
+ e = float64(3)
+ func = m.foofloat8
+ assert isinstance(i,float64),`type(i)`
+ r = func(i)
+ assert isinstance(r,float64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e+float64(0.2))
+
+ r = func(float32(2.0))
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,float64),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func(2.2j))
+ self.assertRaises(TypeError,lambda :func([2,1]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_complex8(self, level=1):
+ i = complex64(2)
+ e = complex64(3)
+ func = m.foocomplex8
+ assert isinstance(i,complex64),`type(i)`
+ r = func(i)
+ assert isinstance(r,complex64),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(0.2))
+
+ r = func(2+1j)
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(1j))
+
+ r = func(complex128(2.0))
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2])
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2,3])
+ assert isinstance(r,complex64),`type(r)`
+ assert_equal(r,e+complex64(3j))
+
+ self.assertRaises(TypeError,lambda :func([2,1,3]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_complex16(self, level=1):
+ i = complex128(2)
+ e = complex128(3)
+ func = m.foocomplex16
+ assert isinstance(i,complex128),`type(i)`
+ r = func(i)
+ assert isinstance(r,complex128),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func(2)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.0)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func(2.2)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(0.2))
+
+ r = func(2+1j)
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(1j))
+
+ r = func([2])
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ r = func([2,3])
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e+complex128(3j))
+
+ r = func(complex64(2.0))
+ assert isinstance(r,complex128),`type(r)`
+ assert_equal(r,e)
+
+ self.assertRaises(TypeError,lambda :func([2,1,3]))
+ self.assertRaises(TypeError,lambda :func({}))
+
+ def check_foo_bool1(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool1
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool2(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool2
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool4(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool4
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_bool8(self, level=1):
+ i = bool8(True)
+ e = bool8(False)
+ func = m.foobool8
+ assert isinstance(i,bool8),`type(i)`
+ r = func(i)
+ assert isinstance(r,bool8),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ for tv in [1,2,2.1,-1j,[0],True]:
+ r = func(tv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,e)
+
+ for fv in [0,0.0,0j,False,(),{},[]]:
+ r = func(fv)
+ assert isinstance(r,bool8),`type(r)`
+ assert_equal(r,not e)
+
+ def check_foo_string1(self, level=1):
+ i = string0('a')
+ e = string0('1')
+ func = m.foostring1
+ assert isinstance(i,string0),`type(i)`
+ r = func(i)
+ assert isinstance(r,string0),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func('ab')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,e)
+
+ r = func('')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,e)
+
+ def check_foo_string5(self, level=1):
+ i = string0('abcde')
+ e = string0('12cde')
+ func = m.foostring5
+ assert isinstance(i,string0),`type(i)`
+ r = func(i)
+ assert isinstance(r,string0),`type(r)`
+ assert i is not r,`id(i),id(r)`
+ assert_equal(r,e)
+
+ r = func('abc')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12c ')
+
+ r = func('abcdefghi')
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12cde')
+
+ r = func([1])
+ assert isinstance(r,string0),`type(r)`
+ assert_equal(r,'12] ')
+
+ def check_foo_string0(self, level=1):
+ i = string0('abcde')
+ e = string0('12cde')
+ func = m.foostringstar
+ r = func('abcde')
+ assert_equal(r,'1bcde')
+ r = func('')
+ assert_equal(r,'')
+
+if __name__ == "__main__":
+ NumpyTest().run()