test_stl_binders.py 4.67 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
# As of pypy 5.7.1, running this and the next test seems to trigger a segfault
# related to the PyPy's buffer protocol.
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


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

    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

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

89

Dean Moldovan's avatar
Dean Moldovan committed
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
113

114

Sergey Lyskov's avatar
Sergey Lyskov committed
115
116
117
118
119
120
121
def test_map_string_double():
    from pybind11_tests import MapStringDouble, UnorderedMapStringDouble

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

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

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

130
131
132
    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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147


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)
148

149

150
def test_noncopyable_vector():
151
    from pybind11_tests import get_vnc
152
153
154

    vnc = get_vnc(5)
    for i in range(0, 5):
155
156
157
158
        assert vnc[i].value == i + 1

    for i, j in enumerate(vnc, start=1):
        assert j.value == i
159
160
161


def test_noncopyable_deque():
162
    from pybind11_tests import get_dnc
163
164
165

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

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

173

174
def test_noncopyable_map():
175
    from pybind11_tests import get_mnc
176
177
178

    mnc = get_mnc(5)
    for i in range(1, 6):
179
        assert mnc[i].value == 10 * i
180
181
182

    vsum = 0
    for k, v in mnc.items():
183
        assert v.value == 10 * k
184
185
        vsum += v.value

186
187
    assert vsum == 150

188
189

def test_noncopyable_unordered_map():
190
    from pybind11_tests import get_umnc
191
192
193

    mnc = get_umnc(5)
    for i in range(1, 6):
194
        assert mnc[i].value == 10 * i
195
196
197

    vsum = 0
    for k, v in mnc.items():
198
        assert v.value == 10 * k
199
200
        vsum += v.value

201
    assert vsum == 150