1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
from numpy.testing import TestCase, dec, assert_equal, assert_
from scipy.weave import ext_tools, c_spec
try:
from scipy.weave.standard_array_spec import array_converter
except ImportError:
pass # requires numpy.numerix
from weave_test_utils import empty_temp_dir
build_dir = empty_temp_dir()
class TestExtModule(TestCase):
#should really do some testing of where modules end up
@dec.slow
def test_simple(self):
""" Simplest possible module """
mod = ext_tools.ext_module('simple_ext_module')
mod.compile(location = build_dir)
import simple_ext_module
@dec.slow
def test_multi_functions(self):
mod = ext_tools.ext_module('module_multi_function')
var_specs = []
code = ""
test = ext_tools.ext_function_from_specs('test',code,var_specs)
mod.add_function(test)
test2 = ext_tools.ext_function_from_specs('test2',code,var_specs)
mod.add_function(test2)
mod.compile(location = build_dir)
import module_multi_function
module_multi_function.test()
module_multi_function.test2()
@dec.slow
def test_with_include(self):
# decalaring variables
a = 2.;
# declare module
mod = ext_tools.ext_module('ext_module_with_include')
mod.customize.add_header('<iostream>')
# function 2 --> a little more complex expression
var_specs = ext_tools.assign_variable_types(['a'],locals(),globals())
code = """
std::cout.clear(std::ios_base::badbit);
std::cout << std::endl;
std::cout << "test printing a value:" << a << std::endl;
std::cout.clear(std::ios_base::goodbit);
"""
test = ext_tools.ext_function_from_specs('test',code,var_specs)
mod.add_function(test)
# build module
mod.compile(location = build_dir)
import ext_module_with_include
ext_module_with_include.test(a)
@dec.slow
def test_string_and_int(self):
# decalaring variables
a = 2;b = 'string'
# declare module
mod = ext_tools.ext_module('ext_string_and_int')
code = """
a=b.length();
return_val = PyInt_FromLong(a);
"""
test = ext_tools.ext_function('test',code,['a','b'])
mod.add_function(test)
mod.compile(location = build_dir)
import ext_string_and_int
c = ext_string_and_int.test(a,b)
assert_(c == len(b))
@dec.slow
def test_return_tuple(self):
# decalaring variables
a = 2
# declare module
mod = ext_tools.ext_module('ext_return_tuple')
var_specs = ext_tools.assign_variable_types(['a'],locals())
code = """
int b;
b = a + 1;
py::tuple returned(2);
returned[0] = a;
returned[1] = b;
return_val = returned;
"""
test = ext_tools.ext_function('test',code,['a'])
mod.add_function(test)
mod.compile(location = build_dir)
import ext_return_tuple
c,d = ext_return_tuple.test(a)
assert_(c==a and d == a+1)
class TestExtFunction(TestCase):
#should really do some testing of where modules end up
@dec.slow
def test_simple(self):
""" Simplest possible function """
mod = ext_tools.ext_module('simple_ext_function')
var_specs = []
code = ""
test = ext_tools.ext_function_from_specs('test',code,var_specs)
mod.add_function(test)
mod.compile(location = build_dir)
import simple_ext_function
simple_ext_function.test()
class TestAssignVariableTypes(TestCase):
def test_assign_variable_types(self):
try:
from numpy.numerix import arange, Float32, Float64
except:
# skip this test if numpy.numerix not installed
return
import types
a = arange(10,typecode = Float32)
b = arange(5,typecode = Float64)
c = 5
arg_list = ['a','b','c']
actual = ext_tools.assign_variable_types(arg_list,locals())
#desired = {'a':(Float32,1),'b':(Float32,1),'i':(Int32,0)}
ad = array_converter()
ad.name, ad.var_type, ad.dims = 'a', Float32, 1
bd = array_converter()
bd.name, bd.var_type, bd.dims = 'b', Float64, 1
cd = c_spec.int_converter()
cd.name, cd.var_type = 'c', types.IntType
desired = [ad,bd,cd]
assert_equal(actual,desired)
if __name__ == "__main__":
import nose
nose.run(argv=['', __file__])
|