3
Tests for intent(in,out) arguments in Fortran subroutine's.
6
Permission to use, modify, and distribute this software is given under the
7
terms of the NumPy License. See http://scipy.org.
9
NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
10
Author: Pearu Peterson <pearu@cens.ioc.ee>
17
from numpy.testing import *
19
def build(fortran_code, rebuild=True, build_dir='tmp'):
20
modulename = os.path.splitext(os.path.basename(__file__))[0]+'_ext'
22
exec ('import %s as m' % (modulename))
23
if rebuild and os.stat(m.__file__)[8] < os.stat(__file__)[8]:
24
del sys.modules[m.__name__] # soft unload extension module
26
raise ImportError,'%s is newer than %s' % (__file__, m.__file__)
27
except ImportError,msg:
28
assert str(msg)==('No module named %s' % (modulename)) \
29
or str(msg).startswith('%s is newer than' % (__file__)),str(msg)
30
print msg, ', recompiling %s.' % (modulename)
31
if not os.path.isdir(build_dir): os.makedirs(build_dir)
32
fname = os.path.join(build_dir,'%s_source.f' % (modulename))
36
sys_argv = ['--build-dir',build_dir]
37
#sys_argv.extend(['-DF2PY_DEBUG_PYOBJ_TOFROM'])
38
from main import build_extension
39
sys_argv.extend(['-m',modulename, fname])
40
build_extension(sys_argv)
41
status = os.system(' '.join([sys.executable] + sys.argv))
48
!f2py intent(in,out) a
53
!f2py intent(in,out) a
58
!f2py intent(in,out) a
63
!f2py intent(in,out) a
66
subroutine foofloat4(a)
68
!f2py intent(in,out) a
71
subroutine foofloat8(a)
73
!f2py intent(in,out) a
76
subroutine foocomplex8(a)
78
!f2py intent(in,out) a
81
subroutine foocomplex16(a)
83
!f2py intent(in,out) a
86
subroutine foobool1(a)
88
!f2py intent(in,out) a
91
subroutine foobool2(a)
93
!f2py intent(in,out) a
96
subroutine foobool4(a)
98
!f2py intent(in,out) a
101
subroutine foobool8(a)
103
!f2py intent(in,out) a
106
subroutine foostring1(a)
108
!f2py intent(in,out) a
111
subroutine foostring5(a)
113
!f2py intent(in,out) a
116
subroutine foostringstar(a)
118
!f2py intent(in,out) a
119
if (len(a).gt.0) then
125
# tester note: set rebuild=True when changing fortan_code and for SVN
126
m = build(fortran_code, rebuild=True)
130
class test_m(NumpyTestCase):
132
def check_foo_integer1(self, level=1):
136
assert isinstance(i,int8),`type(i)`
138
assert isinstance(r,int8),`type(r)`
139
assert i is not r,`id(i),id(r)`
143
assert isinstance(r,int8),`type(r)`
146
for intx in [int64,int16,int32]:
148
assert isinstance(r,int8),`type(r)`
152
assert isinstance(r,int8),`type(r)`
156
assert isinstance(r,int8),`type(r)`
160
assert isinstance(r,int8),`type(r)`
163
self.assertRaises(TypeError,lambda :func(2.2j))
164
self.assertRaises(TypeError,lambda :func([2,1]))
165
self.assertRaises(TypeError,lambda :func({}))
167
def check_foo_integer2(self, level=1):
171
assert isinstance(i,int16),`type(i)`
173
assert isinstance(r,int16),`type(r)`
174
assert i is not r,`id(i),id(r)`
178
assert isinstance(r,int16),`type(r)`
181
for intx in [int8,int64,int32]:
183
assert isinstance(r,int16),`type(r)`
187
assert isinstance(r,int16),`type(r)`
191
assert isinstance(r,int16),`type(r)`
195
assert isinstance(r,int16),`type(r)`
198
self.assertRaises(TypeError,lambda :func(2.2j))
199
self.assertRaises(TypeError,lambda :func([2,1]))
200
self.assertRaises(TypeError,lambda :func({}))
202
def check_foo_integer4(self, level=1):
206
assert isinstance(i,int32),`type(i)`
208
assert isinstance(r,int32),`type(r)`
209
assert i is not r,`id(i),id(r)`
213
assert isinstance(r,int32),`type(r)`
216
for intx in [int8,int16,int64]:
218
assert isinstance(r,int32),`type(r)`
222
assert isinstance(r,int32),`type(r)`
226
assert isinstance(r,int32),`type(r)`
230
assert isinstance(r,int32),`type(r)`
233
self.assertRaises(TypeError,lambda :func(2.2j))
234
self.assertRaises(TypeError,lambda :func([2,1]))
235
self.assertRaises(TypeError,lambda :func({}))
237
def check_foo_integer8(self, level=1):
241
assert isinstance(i,int64),`type(i)`
243
assert isinstance(r,int64),`type(r)`
244
assert i is not r,`id(i),id(r)`
248
assert isinstance(r,int64),`type(r)`
252
assert isinstance(r,int64),`type(r)`
256
assert isinstance(r,int64),`type(r)`
259
for intx in [int8,int16,int32]:
261
assert isinstance(r,int64),`type(r)`
265
assert isinstance(r,int64),`type(r)`
268
self.assertRaises(TypeError,lambda :func(2.2j))
269
self.assertRaises(TypeError,lambda :func([2,1]))
270
self.assertRaises(TypeError,lambda :func({}))
272
def check_foo_real4(self, level=1):
276
assert isinstance(i,float32),`type(i)`
278
assert isinstance(r,float32),`type(r)`
279
assert i is not r,`id(i),id(r)`
283
assert isinstance(r,float32),`type(r)`
287
assert isinstance(r,float32),`type(r)`
291
assert isinstance(r,float32),`type(r)`
292
assert_equal(r,e+float32(0.2))
294
r = func(float64(2.0))
295
assert isinstance(r,float32),`type(r)`
299
assert isinstance(r,float32),`type(r)`
302
self.assertRaises(TypeError,lambda :func(2.2j))
303
self.assertRaises(TypeError,lambda :func([2,1]))
304
self.assertRaises(TypeError,lambda :func({}))
306
def check_foo_real8(self, level=1):
310
assert isinstance(i,float64),`type(i)`
312
assert isinstance(r,float64),`type(r)`
313
assert i is not r,`id(i),id(r)`
317
assert isinstance(r,float64),`type(r)`
321
assert isinstance(r,float64),`type(r)`
325
assert isinstance(r,float64),`type(r)`
326
assert_equal(r,e+float64(0.2))
328
r = func(float32(2.0))
329
assert isinstance(r,float64),`type(r)`
333
assert isinstance(r,float64),`type(r)`
336
self.assertRaises(TypeError,lambda :func(2.2j))
337
self.assertRaises(TypeError,lambda :func([2,1]))
338
self.assertRaises(TypeError,lambda :func({}))
340
def check_foo_complex8(self, level=1):
344
assert isinstance(i,complex64),`type(i)`
346
assert isinstance(r,complex64),`type(r)`
347
assert i is not r,`id(i),id(r)`
351
assert isinstance(r,complex64),`type(r)`
355
assert isinstance(r,complex64),`type(r)`
359
assert isinstance(r,complex64),`type(r)`
360
assert_equal(r,e+complex64(0.2))
363
assert isinstance(r,complex64),`type(r)`
364
assert_equal(r,e+complex64(1j))
366
r = func(complex128(2.0))
367
assert isinstance(r,complex64),`type(r)`
371
assert isinstance(r,complex64),`type(r)`
375
assert isinstance(r,complex64),`type(r)`
376
assert_equal(r,e+complex64(3j))
378
self.assertRaises(TypeError,lambda :func([2,1,3]))
379
self.assertRaises(TypeError,lambda :func({}))
381
def check_foo_complex16(self, level=1):
384
func = m.foocomplex16
385
assert isinstance(i,complex128),`type(i)`
387
assert isinstance(r,complex128),`type(r)`
388
assert i is not r,`id(i),id(r)`
392
assert isinstance(r,complex128),`type(r)`
396
assert isinstance(r,complex128),`type(r)`
400
assert isinstance(r,complex128),`type(r)`
401
assert_equal(r,e+complex128(0.2))
404
assert isinstance(r,complex128),`type(r)`
405
assert_equal(r,e+complex128(1j))
408
assert isinstance(r,complex128),`type(r)`
412
assert isinstance(r,complex128),`type(r)`
413
assert_equal(r,e+complex128(3j))
415
r = func(complex64(2.0))
416
assert isinstance(r,complex128),`type(r)`
419
self.assertRaises(TypeError,lambda :func([2,1,3]))
420
self.assertRaises(TypeError,lambda :func({}))
422
def check_foo_bool1(self, level=1):
426
assert isinstance(i,bool8),`type(i)`
428
assert isinstance(r,bool8),`type(r)`
429
assert i is not r,`id(i),id(r)`
432
for tv in [1,2,2.1,-1j,[0],True]:
434
assert isinstance(r,bool8),`type(r)`
437
for fv in [0,0.0,0j,False,(),{},[]]:
439
assert isinstance(r,bool8),`type(r)`
440
assert_equal(r,not e)
442
def check_foo_bool2(self, level=1):
446
assert isinstance(i,bool8),`type(i)`
448
assert isinstance(r,bool8),`type(r)`
449
assert i is not r,`id(i),id(r)`
452
for tv in [1,2,2.1,-1j,[0],True]:
454
assert isinstance(r,bool8),`type(r)`
457
for fv in [0,0.0,0j,False,(),{},[]]:
459
assert isinstance(r,bool8),`type(r)`
460
assert_equal(r,not e)
462
def check_foo_bool4(self, level=1):
466
assert isinstance(i,bool8),`type(i)`
468
assert isinstance(r,bool8),`type(r)`
469
assert i is not r,`id(i),id(r)`
472
for tv in [1,2,2.1,-1j,[0],True]:
474
assert isinstance(r,bool8),`type(r)`
477
for fv in [0,0.0,0j,False,(),{},[]]:
479
assert isinstance(r,bool8),`type(r)`
480
assert_equal(r,not e)
482
def check_foo_bool8(self, level=1):
486
assert isinstance(i,bool8),`type(i)`
488
assert isinstance(r,bool8),`type(r)`
489
assert i is not r,`id(i),id(r)`
492
for tv in [1,2,2.1,-1j,[0],True]:
494
assert isinstance(r,bool8),`type(r)`
497
for fv in [0,0.0,0j,False,(),{},[]]:
499
assert isinstance(r,bool8),`type(r)`
500
assert_equal(r,not e)
502
def check_foo_string1(self, level=1):
506
assert isinstance(i,string0),`type(i)`
508
assert isinstance(r,string0),`type(r)`
509
assert i is not r,`id(i),id(r)`
513
assert isinstance(r,string0),`type(r)`
517
assert isinstance(r,string0),`type(r)`
520
def check_foo_string5(self, level=1):
524
assert isinstance(i,string0),`type(i)`
526
assert isinstance(r,string0),`type(r)`
527
assert i is not r,`id(i),id(r)`
531
assert isinstance(r,string0),`type(r)`
532
assert_equal(r,'12c ')
534
r = func('abcdefghi')
535
assert isinstance(r,string0),`type(r)`
536
assert_equal(r,'12cde')
539
assert isinstance(r,string0),`type(r)`
540
assert_equal(r,'12] ')
542
def check_foo_string0(self, level=1):
545
func = m.foostringstar
547
assert_equal(r,'1bcde')
551
if __name__ == "__main__":