"vscode:/vscode.git/clone" did not exist on "e3cb2a674a3a8131717c2eb89f813698b4546fdb"
test_stl_binders.py 4.74 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
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.insert(0, 1)
    v_int2.insert(0, 2)
    v_int2.insert(0, 3)
24
    v_int2.insert(6, 3)
Dean Moldovan's avatar
Dean Moldovan committed
25
    assert str(v_int2) == "VectorInt[3, 2, 1, 0, 1, 2, 3]"
26
27
    with pytest.raises(IndexError):
        v_int2.insert(8, 4)
Dean Moldovan's avatar
Dean Moldovan committed
28
29
30
31
32
33
34
35
36
37

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


38
39
# As of pypy 5.7.1, running this and the next test seems to trigger a segfault
# related to the PyPy's buffer protocol.
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@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


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

    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

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

91

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

116

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

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

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

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

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


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

151

152
def test_noncopyable_vector():
153
    from pybind11_tests import get_vnc
154
155
156

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

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


def test_noncopyable_deque():
164
    from pybind11_tests import get_dnc
165
166
167

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

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

175

176
def test_noncopyable_map():
177
    from pybind11_tests import get_mnc
178
179
180

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

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

188
189
    assert vsum == 150

190
191

def test_noncopyable_unordered_map():
192
    from pybind11_tests import get_umnc
193
194
195

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

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

203
    assert vsum == 150