File: test_ext_tools.py

package info (click to toggle)
python-scipy 0.14.0-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 52,228 kB
  • ctags: 63,719
  • sloc: python: 112,726; fortran: 88,685; cpp: 86,979; ansic: 85,860; makefile: 530; sh: 236
file content (144 lines) | stat: -rw-r--r-- 4,484 bytes parent folder | download
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
from __future__ import absolute_import, print_function

import types

from numpy import arange, float32, float64
from numpy.testing import (TestCase, dec, assert_equal, assert_,
                           run_module_suite)

from scipy.weave import ext_tools, c_spec
from scipy.weave.standard_array_spec import array_converter
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):
    # TODO: 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):
        a = arange(10, dtype=float32)
        b = arange(5, dtype=float64)
        c = 5
        arg_list = ['a','b','c']
        actual = ext_tools.assign_variable_types(arg_list,locals())

        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__":
    run_module_suite()