Chris@87
|
1 from __future__ import division, absolute_import, print_function
|
Chris@87
|
2
|
Chris@87
|
3 from numpy.testing import *
|
Chris@87
|
4 from numpy import array
|
Chris@87
|
5 import math
|
Chris@87
|
6 import util
|
Chris@87
|
7 import textwrap
|
Chris@87
|
8
|
Chris@87
|
9 class TestF77Callback(util.F2PyTest):
|
Chris@87
|
10 code = """
|
Chris@87
|
11 subroutine t(fun,a)
|
Chris@87
|
12 integer a
|
Chris@87
|
13 cf2py intent(out) a
|
Chris@87
|
14 external fun
|
Chris@87
|
15 call fun(a)
|
Chris@87
|
16 end
|
Chris@87
|
17
|
Chris@87
|
18 subroutine func(a)
|
Chris@87
|
19 cf2py intent(in,out) a
|
Chris@87
|
20 integer a
|
Chris@87
|
21 a = a + 11
|
Chris@87
|
22 end
|
Chris@87
|
23
|
Chris@87
|
24 subroutine func0(a)
|
Chris@87
|
25 cf2py intent(out) a
|
Chris@87
|
26 integer a
|
Chris@87
|
27 a = 11
|
Chris@87
|
28 end
|
Chris@87
|
29
|
Chris@87
|
30 subroutine t2(a)
|
Chris@87
|
31 cf2py intent(callback) fun
|
Chris@87
|
32 integer a
|
Chris@87
|
33 cf2py intent(out) a
|
Chris@87
|
34 external fun
|
Chris@87
|
35 call fun(a)
|
Chris@87
|
36 end
|
Chris@87
|
37
|
Chris@87
|
38 subroutine string_callback(callback, a)
|
Chris@87
|
39 external callback
|
Chris@87
|
40 double precision callback
|
Chris@87
|
41 double precision a
|
Chris@87
|
42 character*1 r
|
Chris@87
|
43 cf2py intent(out) a
|
Chris@87
|
44 r = 'r'
|
Chris@87
|
45 a = callback(r)
|
Chris@87
|
46 end
|
Chris@87
|
47
|
Chris@87
|
48 """
|
Chris@87
|
49
|
Chris@87
|
50 @dec.slow
|
Chris@87
|
51 def test_all(self):
|
Chris@87
|
52 for name in "t,t2".split(","):
|
Chris@87
|
53 self.check_function(name)
|
Chris@87
|
54
|
Chris@87
|
55 @dec.slow
|
Chris@87
|
56 def test_docstring(self):
|
Chris@87
|
57 expected = """
|
Chris@87
|
58 a = t(fun,[fun_extra_args])
|
Chris@87
|
59
|
Chris@87
|
60 Wrapper for ``t``.
|
Chris@87
|
61
|
Chris@87
|
62 Parameters
|
Chris@87
|
63 ----------
|
Chris@87
|
64 fun : call-back function
|
Chris@87
|
65
|
Chris@87
|
66 Other Parameters
|
Chris@87
|
67 ----------------
|
Chris@87
|
68 fun_extra_args : input tuple, optional
|
Chris@87
|
69 Default: ()
|
Chris@87
|
70
|
Chris@87
|
71 Returns
|
Chris@87
|
72 -------
|
Chris@87
|
73 a : int
|
Chris@87
|
74
|
Chris@87
|
75 Notes
|
Chris@87
|
76 -----
|
Chris@87
|
77 Call-back functions::
|
Chris@87
|
78
|
Chris@87
|
79 def fun(): return a
|
Chris@87
|
80 Return objects:
|
Chris@87
|
81 a : int
|
Chris@87
|
82 """
|
Chris@87
|
83 assert_equal(self.module.t.__doc__, textwrap.dedent(expected).lstrip())
|
Chris@87
|
84
|
Chris@87
|
85 def check_function(self, name):
|
Chris@87
|
86 t = getattr(self.module, name)
|
Chris@87
|
87 r = t(lambda : 4)
|
Chris@87
|
88 assert_( r==4, repr(r))
|
Chris@87
|
89 r = t(lambda a:5, fun_extra_args=(6,))
|
Chris@87
|
90 assert_( r==5, repr(r))
|
Chris@87
|
91 r = t(lambda a:a, fun_extra_args=(6,))
|
Chris@87
|
92 assert_( r==6, repr(r))
|
Chris@87
|
93 r = t(lambda a:5+a, fun_extra_args=(7,))
|
Chris@87
|
94 assert_( r==12, repr(r))
|
Chris@87
|
95 r = t(lambda a:math.degrees(a), fun_extra_args=(math.pi,))
|
Chris@87
|
96 assert_( r==180, repr(r))
|
Chris@87
|
97 r = t(math.degrees, fun_extra_args=(math.pi,))
|
Chris@87
|
98 assert_( r==180, repr(r))
|
Chris@87
|
99
|
Chris@87
|
100 r = t(self.module.func, fun_extra_args=(6,))
|
Chris@87
|
101 assert_( r==17, repr(r))
|
Chris@87
|
102 r = t(self.module.func0)
|
Chris@87
|
103 assert_( r==11, repr(r))
|
Chris@87
|
104 r = t(self.module.func0._cpointer)
|
Chris@87
|
105 assert_( r==11, repr(r))
|
Chris@87
|
106 class A(object):
|
Chris@87
|
107 def __call__(self):
|
Chris@87
|
108 return 7
|
Chris@87
|
109 def mth(self):
|
Chris@87
|
110 return 9
|
Chris@87
|
111 a = A()
|
Chris@87
|
112 r = t(a)
|
Chris@87
|
113 assert_( r==7, repr(r))
|
Chris@87
|
114 r = t(a.mth)
|
Chris@87
|
115 assert_( r==9, repr(r))
|
Chris@87
|
116
|
Chris@87
|
117 def test_string_callback(self):
|
Chris@87
|
118
|
Chris@87
|
119 def callback(code):
|
Chris@87
|
120 if code == 'r':
|
Chris@87
|
121 return 0
|
Chris@87
|
122 else:
|
Chris@87
|
123 return 1
|
Chris@87
|
124
|
Chris@87
|
125 f = getattr(self.module, 'string_callback')
|
Chris@87
|
126 r = f(callback)
|
Chris@87
|
127 assert_(r == 0, repr(r))
|
Chris@87
|
128
|
Chris@87
|
129
|
Chris@87
|
130 if __name__ == "__main__":
|
Chris@87
|
131 import nose
|
Chris@87
|
132 nose.runmodule()
|