blob: 1d52b8b8df50ace34e19dfaeff04093980d0e95c [file] [log] [blame]
Patrick Stewart54679792016-11-08 13:03:34 +00001import pytest
2import sys
3
4with pytest.suppress(ImportError):
5 import numpy as np
6
7
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02008def test_vector_int():
9 from pybind11_tests import VectorInt
10
11 v_int = VectorInt([0, 0])
12 assert len(v_int) == 2
13 assert bool(v_int) is True
14
15 v_int2 = VectorInt([0, 0])
16 assert v_int == v_int2
17 v_int2[1] = 1
18 assert v_int != v_int2
19
20 v_int2.append(2)
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020021 v_int2.insert(0, 1)
22 v_int2.insert(0, 2)
23 v_int2.insert(0, 3)
Bruce Merryeee4f4f2017-05-25 15:17:36 +020024 v_int2.insert(6, 3)
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020025 assert str(v_int2) == "VectorInt[3, 2, 1, 0, 1, 2, 3]"
Bruce Merryeee4f4f2017-05-25 15:17:36 +020026 with pytest.raises(IndexError):
27 v_int2.insert(8, 4)
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020028
29 v_int.append(99)
30 v_int2[2:-2] = v_int
31 assert v_int2 == VectorInt([3, 2, 0, 0, 99, 2, 3])
32 del v_int2[1:3]
33 assert v_int2 == VectorInt([3, 0, 99, 2, 3])
34 del v_int2[0]
35 assert v_int2 == VectorInt([0, 99, 2, 3])
36
37
Jason Rhinelander90bac962017-04-14 17:50:44 -040038# As of pypy 5.7.1, running this and the next test seems to trigger a segfault
39# related to the PyPy's buffer protocol.
Patrick Stewart54679792016-11-08 13:03:34 +000040@pytest.unsupported_on_pypy
41def test_vector_buffer():
42 from pybind11_tests import VectorUChar, create_undeclstruct
43 b = bytearray([1, 2, 3, 4])
44 v = VectorUChar(b)
45 assert v[1] == 2
46 v[2] = 5
47 m = memoryview(v) # We expose the buffer interface
48 if sys.version_info.major > 2:
49 assert m[2] == 5
50 m[2] = 6
51 else:
52 assert m[2] == '\x05'
53 m[2] = '\x06'
54 assert v[2] == 6
55
56 with pytest.raises(RuntimeError):
57 create_undeclstruct() # Undeclared struct contents, no buffer interface
58
59
Jason Rhinelander90bac962017-04-14 17:50:44 -040060@pytest.unsupported_on_pypy
Patrick Stewart54679792016-11-08 13:03:34 +000061@pytest.requires_numpy
62def test_vector_buffer_numpy():
Patrick Stewart0b6d08a2016-11-21 17:40:43 +000063 from pybind11_tests import VectorInt, VectorStruct, get_vectorstruct
Patrick Stewart54679792016-11-08 13:03:34 +000064
65 a = np.array([1, 2, 3, 4], dtype=np.int32)
66 with pytest.raises(TypeError):
67 VectorInt(a)
68
69 a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.uintc)
70 v = VectorInt(a[0, :])
71 assert len(v) == 4
72 assert v[2] == 3
73 m = np.asarray(v)
74 m[2] = 5
75 assert v[2] == 5
76
77 v = VectorInt(a[:, 1])
78 assert len(v) == 3
79 assert v[2] == 10
80
81 v = get_vectorstruct()
82 assert v[0].x == 5
83 m = np.asarray(v)
84 m[1]['x'] = 99
85 assert v[1].x == 99
86
Patrick Stewart0b6d08a2016-11-21 17:40:43 +000087 v = VectorStruct(np.zeros(3, dtype=np.dtype([('w', 'bool'), ('x', 'I'),
88 ('y', 'float64'), ('z', 'bool')], align=True)))
89 assert len(v) == 3
90
Patrick Stewart54679792016-11-08 13:03:34 +000091
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020092def test_vector_custom():
93 from pybind11_tests import El, VectorEl, VectorVectorEl
94
95 v_a = VectorEl()
96 v_a.append(El(1))
97 v_a.append(El(2))
98 assert str(v_a) == "VectorEl[El{1}, El{2}]"
99
100 vv_a = VectorVectorEl()
101 vv_a.append(v_a)
102 vv_b = vv_a[0]
103 assert str(vv_b) == "VectorEl[El{1}, El{2}]"
104
105
106def test_vector_bool():
107 from pybind11_tests import VectorBool
108
109 vv_c = VectorBool()
110 for i in range(10):
111 vv_c.append(i % 2 == 0)
112 for i in range(10):
113 assert vv_c[i] == (i % 2 == 0)
114 assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]"
Sergey Lyskov75204182016-08-29 22:50:38 -0400115
Dean Moldovanbad17402016-11-20 21:21:54 +0100116
Sergey Lyskov75204182016-08-29 22:50:38 -0400117def test_map_string_double():
118 from pybind11_tests import MapStringDouble, UnorderedMapStringDouble
119
120 m = MapStringDouble()
121 m['a'] = 1
122 m['b'] = 2.5
123
Dean Moldovanbad17402016-11-20 21:21:54 +0100124 assert list(m) == ['a', 'b']
125 assert list(m.items()) == [('a', 1), ('b', 2.5)]
Sergey Lyskov75204182016-08-29 22:50:38 -0400126 assert str(m) == "MapStringDouble{a: 1, b: 2.5}"
127
Sergey Lyskov75204182016-08-29 22:50:38 -0400128 um = UnorderedMapStringDouble()
129 um['ua'] = 1.1
130 um['ub'] = 2.6
131
Dean Moldovanbad17402016-11-20 21:21:54 +0100132 assert sorted(list(um)) == ['ua', 'ub']
133 assert sorted(list(um.items())) == [('ua', 1.1), ('ub', 2.6)]
134 assert "UnorderedMapStringDouble" in str(um)
Sergey Lyskov75204182016-08-29 22:50:38 -0400135
136
137def test_map_string_double_const():
138 from pybind11_tests import MapStringDoubleConst, UnorderedMapStringDoubleConst
139
140 mc = MapStringDoubleConst()
141 mc['a'] = 10
142 mc['b'] = 20.5
143 assert str(mc) == "MapStringDoubleConst{a: 10, b: 20.5}"
144
145 umc = UnorderedMapStringDoubleConst()
146 umc['a'] = 11
147 umc['b'] = 21.5
148
149 str(umc)
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500150
Dean Moldovanbad17402016-11-20 21:21:54 +0100151
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500152def test_noncopyable_vector():
Dean Moldovanbad17402016-11-20 21:21:54 +0100153 from pybind11_tests import get_vnc
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500154
155 vnc = get_vnc(5)
156 for i in range(0, 5):
Dean Moldovanbad17402016-11-20 21:21:54 +0100157 assert vnc[i].value == i + 1
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500158
Dean Moldovanbad17402016-11-20 21:21:54 +0100159 for i, j in enumerate(vnc, start=1):
160 assert j.value == i
161
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500162
163def test_noncopyable_deque():
Dean Moldovanbad17402016-11-20 21:21:54 +0100164 from pybind11_tests import get_dnc
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500165
166 dnc = get_dnc(5)
167 for i in range(0, 5):
Dean Moldovanbad17402016-11-20 21:21:54 +0100168 assert dnc[i].value == i + 1
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500169
170 i = 1
171 for j in dnc:
172 assert(j.value == i)
173 i += 1
174
Dean Moldovanbad17402016-11-20 21:21:54 +0100175
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500176def test_noncopyable_map():
Dean Moldovanbad17402016-11-20 21:21:54 +0100177 from pybind11_tests import get_mnc
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500178
179 mnc = get_mnc(5)
180 for i in range(1, 6):
Dean Moldovanbad17402016-11-20 21:21:54 +0100181 assert mnc[i].value == 10 * i
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500182
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500183 vsum = 0
184 for k, v in mnc.items():
Dean Moldovanbad17402016-11-20 21:21:54 +0100185 assert v.value == 10 * k
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500186 vsum += v.value
187
Dean Moldovanbad17402016-11-20 21:21:54 +0100188 assert vsum == 150
189
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500190
191def test_noncopyable_unordered_map():
Dean Moldovanbad17402016-11-20 21:21:54 +0100192 from pybind11_tests import get_umnc
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500193
194 mnc = get_umnc(5)
195 for i in range(1, 6):
Dean Moldovanbad17402016-11-20 21:21:54 +0100196 assert mnc[i].value == 10 * i
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500197
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500198 vsum = 0
199 for k, v in mnc.items():
Dean Moldovanbad17402016-11-20 21:21:54 +0100200 assert v.value == 10 * k
Jason Rhinelander617fbcf2016-11-15 06:30:38 -0500201 vsum += v.value
202
Dean Moldovanbad17402016-11-20 21:21:54 +0100203 assert vsum == 150