Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: from numpy.testing import * Chris@87: from numpy import array Chris@87: import math Chris@87: import util Chris@87: import textwrap Chris@87: Chris@87: class TestF77Callback(util.F2PyTest): Chris@87: code = """ Chris@87: subroutine t(fun,a) Chris@87: integer a Chris@87: cf2py intent(out) a Chris@87: external fun Chris@87: call fun(a) Chris@87: end Chris@87: Chris@87: subroutine func(a) Chris@87: cf2py intent(in,out) a Chris@87: integer a Chris@87: a = a + 11 Chris@87: end Chris@87: Chris@87: subroutine func0(a) Chris@87: cf2py intent(out) a Chris@87: integer a Chris@87: a = 11 Chris@87: end Chris@87: Chris@87: subroutine t2(a) Chris@87: cf2py intent(callback) fun Chris@87: integer a Chris@87: cf2py intent(out) a Chris@87: external fun Chris@87: call fun(a) Chris@87: end Chris@87: Chris@87: subroutine string_callback(callback, a) Chris@87: external callback Chris@87: double precision callback Chris@87: double precision a Chris@87: character*1 r Chris@87: cf2py intent(out) a Chris@87: r = 'r' Chris@87: a = callback(r) Chris@87: end Chris@87: Chris@87: """ Chris@87: Chris@87: @dec.slow Chris@87: def test_all(self): Chris@87: for name in "t,t2".split(","): Chris@87: self.check_function(name) Chris@87: Chris@87: @dec.slow Chris@87: def test_docstring(self): Chris@87: expected = """ Chris@87: a = t(fun,[fun_extra_args]) Chris@87: Chris@87: Wrapper for ``t``. Chris@87: Chris@87: Parameters Chris@87: ---------- Chris@87: fun : call-back function Chris@87: Chris@87: Other Parameters Chris@87: ---------------- Chris@87: fun_extra_args : input tuple, optional Chris@87: Default: () Chris@87: Chris@87: Returns Chris@87: ------- Chris@87: a : int Chris@87: Chris@87: Notes Chris@87: ----- Chris@87: Call-back functions:: Chris@87: Chris@87: def fun(): return a Chris@87: Return objects: Chris@87: a : int Chris@87: """ Chris@87: assert_equal(self.module.t.__doc__, textwrap.dedent(expected).lstrip()) Chris@87: Chris@87: def check_function(self, name): Chris@87: t = getattr(self.module, name) Chris@87: r = t(lambda : 4) Chris@87: assert_( r==4, repr(r)) Chris@87: r = t(lambda a:5, fun_extra_args=(6,)) Chris@87: assert_( r==5, repr(r)) Chris@87: r = t(lambda a:a, fun_extra_args=(6,)) Chris@87: assert_( r==6, repr(r)) Chris@87: r = t(lambda a:5+a, fun_extra_args=(7,)) Chris@87: assert_( r==12, repr(r)) Chris@87: r = t(lambda a:math.degrees(a), fun_extra_args=(math.pi,)) Chris@87: assert_( r==180, repr(r)) Chris@87: r = t(math.degrees, fun_extra_args=(math.pi,)) Chris@87: assert_( r==180, repr(r)) Chris@87: Chris@87: r = t(self.module.func, fun_extra_args=(6,)) Chris@87: assert_( r==17, repr(r)) Chris@87: r = t(self.module.func0) Chris@87: assert_( r==11, repr(r)) Chris@87: r = t(self.module.func0._cpointer) Chris@87: assert_( r==11, repr(r)) Chris@87: class A(object): Chris@87: def __call__(self): Chris@87: return 7 Chris@87: def mth(self): Chris@87: return 9 Chris@87: a = A() Chris@87: r = t(a) Chris@87: assert_( r==7, repr(r)) Chris@87: r = t(a.mth) Chris@87: assert_( r==9, repr(r)) Chris@87: Chris@87: def test_string_callback(self): Chris@87: Chris@87: def callback(code): Chris@87: if code == 'r': Chris@87: return 0 Chris@87: else: Chris@87: return 1 Chris@87: Chris@87: f = getattr(self.module, 'string_callback') Chris@87: r = f(callback) Chris@87: assert_(r == 0, repr(r)) Chris@87: Chris@87: Chris@87: if __name__ == "__main__": Chris@87: import nose Chris@87: nose.runmodule()