test_stl_binders.py 4.53 KB
Newer Older
1
2
3
4
5
6
7
import pytest
import sys

with pytest.suppress(ImportError):
    import numpy as np


Dean Moldovan's avatar
Dean Moldovan committed
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
def test_vector_int():
    from pybind11_tests import VectorInt

    v_int = VectorInt([0, 0])
    assert len(v_int) == 2
    assert bool(v_int) is True

    v_int2 = VectorInt([0, 0])
    assert v_int == v_int2
    v_int2[1] = 1
    assert v_int != v_int2

    v_int2.append(2)
    v_int2.append(3)
    v_int2.insert(0, 1)
    v_int2.insert(0, 2)
    v_int2.insert(0, 3)
    assert str(v_int2) == "VectorInt[3, 2, 1, 0, 1, 2, 3]"

    v_int.append(99)
    v_int2[2:-2] = v_int
    assert v_int2 == VectorInt([3, 2, 0, 0, 99, 2, 3])
    del v_int2[1:3]
    assert v_int2 == VectorInt([3, 0, 99, 2, 3])
    del v_int2[0]
    assert v_int2 == VectorInt([0, 99, 2, 3])


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@pytest.unsupported_on_pypy
def test_vector_buffer():
    from pybind11_tests import VectorUChar, create_undeclstruct
    b = bytearray([1, 2, 3, 4])
    v = VectorUChar(b)
    assert v[1] == 2
    v[2] = 5
    m = memoryview(v)  # We expose the buffer interface
    if sys.version_info.major > 2:
        assert m[2] == 5
        m[2] = 6
    else:
        assert m[2] == '\x05'
        m[2] = '\x06'
    assert v[2] == 6

    with pytest.raises(RuntimeError):
        create_undeclstruct()  # Undeclared struct contents, no buffer interface


@pytest.requires_numpy
def test_vector_buffer_numpy():
58
    from pybind11_tests import VectorInt, VectorStruct, get_vectorstruct
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

    a = np.array([1, 2, 3, 4], dtype=np.int32)
    with pytest.raises(TypeError):
        VectorInt(a)

    a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.uintc)
    v = VectorInt(a[0, :])
    assert len(v) == 4
    assert v[2] == 3
    m = np.asarray(v)
    m[2] = 5
    assert v[2] == 5

    v = VectorInt(a[:, 1])
    assert len(v) == 3
    assert v[2] == 10

    v = get_vectorstruct()
    assert v[0].x == 5
    m = np.asarray(v)
    m[1]['x'] = 99
    assert v[1].x == 99

82
83
84
85
    v = VectorStruct(np.zeros(3, dtype=np.dtype([('w', 'bool'), ('x', 'I'),
                                                 ('y', 'float64'), ('z', 'bool')], align=True)))
    assert len(v) == 3

86

Dean Moldovan's avatar
Dean Moldovan committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
def test_vector_custom():
    from pybind11_tests import El, VectorEl, VectorVectorEl

    v_a = VectorEl()
    v_a.append(El(1))
    v_a.append(El(2))
    assert str(v_a) == "VectorEl[El{1}, El{2}]"

    vv_a = VectorVectorEl()
    vv_a.append(v_a)
    vv_b = vv_a[0]
    assert str(vv_b) == "VectorEl[El{1}, El{2}]"


def test_vector_bool():
    from pybind11_tests import VectorBool

    vv_c = VectorBool()
    for i in range(10):
        vv_c.append(i % 2 == 0)
    for i in range(10):
        assert vv_c[i] == (i % 2 == 0)
    assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]"
Sergey Lyskov's avatar
Sergey Lyskov committed
110

111

Sergey Lyskov's avatar
Sergey Lyskov committed
112
113
114
115
116
117
118
def test_map_string_double():
    from pybind11_tests import MapStringDouble, UnorderedMapStringDouble

    m = MapStringDouble()
    m['a'] = 1
    m['b'] = 2.5

119
120
    assert list(m) == ['a', 'b']
    assert list(m.items()) == [('a', 1), ('b', 2.5)]
Sergey Lyskov's avatar
Sergey Lyskov committed
121
122
123
124
125
126
    assert str(m) == "MapStringDouble{a: 1, b: 2.5}"

    um = UnorderedMapStringDouble()
    um['ua'] = 1.1
    um['ub'] = 2.6

127
128
129
    assert sorted(list(um)) == ['ua', 'ub']
    assert sorted(list(um.items())) == [('ua', 1.1), ('ub', 2.6)]
    assert "UnorderedMapStringDouble" in str(um)
Sergey Lyskov's avatar
Sergey Lyskov committed
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144


def test_map_string_double_const():
    from pybind11_tests import MapStringDoubleConst, UnorderedMapStringDoubleConst

    mc = MapStringDoubleConst()
    mc['a'] = 10
    mc['b'] = 20.5
    assert str(mc) == "MapStringDoubleConst{a: 10, b: 20.5}"

    umc = UnorderedMapStringDoubleConst()
    umc['a'] = 11
    umc['b'] = 21.5

    str(umc)
145

146

147
def test_noncopyable_vector():
148
    from pybind11_tests import get_vnc
149
150
151

    vnc = get_vnc(5)
    for i in range(0, 5):
152
153
154
155
        assert vnc[i].value == i + 1

    for i, j in enumerate(vnc, start=1):
        assert j.value == i
156
157
158


def test_noncopyable_deque():
159
    from pybind11_tests import get_dnc
160
161
162

    dnc = get_dnc(5)
    for i in range(0, 5):
163
        assert dnc[i].value == i + 1
164
165
166
167
168
169

    i = 1
    for j in dnc:
        assert(j.value == i)
        i += 1

170

171
def test_noncopyable_map():
172
    from pybind11_tests import get_mnc
173
174
175

    mnc = get_mnc(5)
    for i in range(1, 6):
176
        assert mnc[i].value == 10 * i
177
178
179

    vsum = 0
    for k, v in mnc.items():
180
        assert v.value == 10 * k
181
182
        vsum += v.value

183
184
    assert vsum == 150

185
186

def test_noncopyable_unordered_map():
187
    from pybind11_tests import get_umnc
188
189
190

    mnc = get_umnc(5)
    for i in range(1, 6):
191
        assert mnc[i].value == 10 * i
192
193
194

    vsum = 0
    for k, v in mnc.items():
195
        assert v.value == 10 * k
196
197
        vsum += v.value

198
    assert vsum == 150