1 #include <catch2/catch_all.hpp>
5 static_assert(std::is_nothrow_swappable_v<zmq::const_buffer>);
6 static_assert(std::is_nothrow_swappable_v<zmq::mutable_buffer>);
7 static_assert(std::is_trivially_copyable_v<zmq::const_buffer>);
8 static_assert(std::is_trivially_copyable_v<zmq::mutable_buffer>);
15 TEST_CASE(
"buffer default ctor",
"[buffer]")
17 constexpr zmq::mutable_buffer mb;
18 constexpr zmq::const_buffer cb;
19 CHECK(mb.size() == 0);
20 CHECK(mb.data() ==
nullptr);
21 CHECK(cb.size() == 0);
22 CHECK(cb.data() ==
nullptr);
27 std::vector<BT>
v(10);
28 zmq::const_buffer cb(
v.data(),
v.size() *
sizeof(BT));
29 CHECK(cb.size() ==
v.size() *
sizeof(BT));
30 CHECK(cb.data() ==
v.data());
31 zmq::mutable_buffer mb(
v.data(),
v.size() *
sizeof(BT));
32 CHECK(mb.size() ==
v.size() *
sizeof(BT));
33 CHECK(mb.data() ==
v.data());
34 zmq::const_buffer from_mut = mb;
35 CHECK(mb.size() == from_mut.size());
36 CHECK(mb.data() == from_mut.data());
38 static_assert(std::is_same<decltype(cmb.data()),
void *>::
value,
"");
40 constexpr
const void *cp =
nullptr;
41 constexpr
void *
p =
nullptr;
44 CHECK(cecb.data() ==
nullptr);
45 CHECK(cemb.data() ==
nullptr);
48 TEST_CASE(
"const_buffer operator+",
"[buffer]")
50 std::vector<BT>
v(10);
51 zmq::const_buffer cb(
v.data(),
v.size() *
sizeof(BT));
52 const size_t shift = 4;
53 auto shifted = cb + shift;
54 CHECK(shifted.size() ==
v.size() *
sizeof(BT) - shift);
55 CHECK(shifted.data() ==
v.data() + shift /
sizeof(BT));
56 auto shifted2 = shift + cb;
57 CHECK(shifted.size() == shifted2.size());
58 CHECK(shifted.data() == shifted2.data());
61 CHECK(shifted.size() == cbinp.size());
62 CHECK(shifted.data() == cbinp.data());
65 TEST_CASE(
"mutable_buffer operator+",
"[buffer]")
67 std::vector<BT>
v(10);
68 zmq::mutable_buffer mb(
v.data(),
v.size() *
sizeof(BT));
69 const size_t shift = 4;
70 auto shifted = mb + shift;
71 CHECK(shifted.size() ==
v.size() *
sizeof(BT) - shift);
72 CHECK(shifted.data() ==
v.data() + shift /
sizeof(BT));
73 auto shifted2 = shift + mb;
74 CHECK(shifted.size() == shifted2.size());
75 CHECK(shifted.data() == shifted2.data());
78 CHECK(shifted.size() == mbinp.size());
79 CHECK(shifted.data() == mbinp.data());
82 TEST_CASE(
"mutable_buffer creation basic",
"[buffer]")
84 std::vector<BT>
v(10);
85 zmq::mutable_buffer mb(
v.data(),
v.size() *
sizeof(BT));
86 zmq::mutable_buffer mb2 =
zmq::buffer(
v.data(),
v.size() *
sizeof(BT));
87 CHECK(mb.data() == mb2.data());
88 CHECK(mb.size() == mb2.size());
90 CHECK(mb.data() == mb3.data());
91 CHECK(mb.size() == mb3.size());
92 zmq::mutable_buffer mb4 =
zmq::buffer(mb, 10 *
v.size() *
sizeof(BT));
93 CHECK(mb.data() == mb4.data());
94 CHECK(mb.size() == mb4.size());
96 CHECK(mb.data() == mb5.data());
97 CHECK(4 == mb5.size());
100 TEST_CASE(
"const_buffer creation basic",
"[buffer]")
102 const std::vector<BT>
v(10);
103 zmq::const_buffer cb(
v.data(),
v.size() *
sizeof(BT));
104 zmq::const_buffer cb2 =
zmq::buffer(
v.data(),
v.size() *
sizeof(BT));
105 CHECK(cb.data() == cb2.data());
106 CHECK(cb.size() == cb2.size());
108 CHECK(cb.data() == cb3.data());
109 CHECK(cb.size() == cb3.size());
110 zmq::const_buffer cb4 =
zmq::buffer(cb, 10 *
v.size() *
sizeof(BT));
111 CHECK(cb.data() == cb4.data());
112 CHECK(cb.size() == cb4.size());
114 CHECK(cb.data() == cb5.data());
115 CHECK(4 == cb5.size());
118 TEST_CASE(
"mutable_buffer creation C array",
"[buffer]")
122 CHECK(
b.size() == 10 *
sizeof(BT));
123 CHECK(
b.data() ==
static_cast<BT*
>(d));
125 CHECK(b2.size() == 4);
126 CHECK(b2.data() ==
static_cast<BT*
>(d));
129 TEST_CASE(
"const_buffer creation C array",
"[buffer]")
133 CHECK(
b.size() == 10 *
sizeof(BT));
134 CHECK(
b.data() ==
static_cast<const BT*
>(d));
136 CHECK(b2.size() == 4);
137 CHECK(b2.data() ==
static_cast<const BT*
>(d));
140 TEST_CASE(
"mutable_buffer creation array",
"[buffer]")
142 std::array<BT, 10>
d = {};
144 CHECK(
b.size() ==
d.size() *
sizeof(BT));
147 CHECK(b2.size() == 4);
148 CHECK(b2.data() ==
d.data());
151 TEST_CASE(
"const_buffer creation array",
"[buffer]")
153 const std::array<BT, 10>
d = {};
155 CHECK(
b.size() ==
d.size() *
sizeof(BT));
158 CHECK(b2.size() == 4);
159 CHECK(b2.data() ==
d.data());
162 TEST_CASE(
"const_buffer creation array 2",
"[buffer]")
164 std::array<const BT, 10>
d = {{}};
166 CHECK(
b.size() ==
d.size() *
sizeof(BT));
169 CHECK(b2.size() == 4);
170 CHECK(b2.data() ==
d.data());
173 TEST_CASE(
"mutable_buffer creation vector",
"[buffer]")
175 std::vector<BT>
d(10);
177 CHECK(
b.size() ==
d.size() *
sizeof(BT));
180 CHECK(b2.size() == 4);
181 CHECK(b2.data() ==
d.data());
185 CHECK(
b.data() ==
nullptr);
188 TEST_CASE(
"const_buffer creation vector",
"[buffer]")
190 std::vector<BT>
d(10);
191 zmq::const_buffer
b =
zmq::buffer(
static_cast<const std::vector<BT> &
>(d));
192 CHECK(
b.size() ==
d.size() *
sizeof(BT));
194 zmq::const_buffer b2 =
zmq::buffer(
static_cast<const std::vector<BT> &
>(d), 4);
195 CHECK(b2.size() == 4);
196 CHECK(b2.data() ==
d.data());
198 b =
zmq::buffer(
static_cast<const std::vector<BT> &
>(d));
200 CHECK(
b.data() ==
nullptr);
203 TEST_CASE(
"const_buffer creation string",
"[buffer]")
207 CHECK(
b.size() ==
d.size() *
sizeof(
wchar_t));
210 CHECK(b2.size() == 4);
211 CHECK(b2.data() ==
d.data());
214 TEST_CASE(
"mutable_buffer creation string",
"[buffer]")
218 CHECK(
b.size() ==
d.size() *
sizeof(
wchar_t));
221 CHECK(b2.size() == 4);
222 CHECK(b2.data() ==
d.data());
225 #if CPPZMQ_HAS_STRING_VIEW
226 TEST_CASE(
"const_buffer creation string_view",
"[buffer]")
229 std::wstring_view
d = dstr;
231 CHECK(
b.size() ==
d.size() *
sizeof(
wchar_t));
234 CHECK(b2.size() == 4);
235 CHECK(b2.data() ==
d.data());
239 TEST_CASE(
"const_buffer creation with str_buffer",
"[buffer]")
241 const wchar_t wd[10] = {};
242 zmq::const_buffer
b = zmq::str_buffer(wd);
243 CHECK(
b.size() == 9 *
sizeof(
wchar_t));
244 CHECK(
b.data() ==
static_cast<const wchar_t*
>(wd));
247 constexpr zmq::const_buffer b2 = zmq::str_buffer(
"hello");
248 CHECK(b2_null.size() == 6);
249 CHECK(b2.size() == 5);
250 CHECK(
std::string(
static_cast<const char*
>(b2.data()), b2.size()) ==
"hello");
253 TEST_CASE(
"const_buffer creation with zbuf string literal char",
"[buffer]")
255 using namespace zmq::literals;
256 constexpr zmq::const_buffer
b =
"hello"_zbuf;
258 CHECK(std::memcmp(
b.data(),
"hello",
b.size()) == 0);
261 TEST_CASE(
"const_buffer creation with zbuf string literal wchar_t",
"[buffer]")
263 using namespace zmq::literals;
264 constexpr zmq::const_buffer
b = L
"hello"_zbuf;
265 CHECK(
b.size() == 5 *
sizeof(
wchar_t));
266 CHECK(std::memcmp(
b.data(), L
"hello",
b.size()) == 0);
269 TEST_CASE(
"const_buffer creation with zbuf string literal char16_t",
"[buffer]")
271 using namespace zmq::literals;
272 constexpr zmq::const_buffer
b = u
"hello"_zbuf;
273 CHECK(
b.size() == 5 *
sizeof(char16_t));
274 CHECK(std::memcmp(
b.data(), u
"hello",
b.size()) == 0);
277 TEST_CASE(
"const_buffer creation with zbuf string literal char32_t",
"[buffer]")
279 using namespace zmq::literals;
280 constexpr zmq::const_buffer
b = U
"hello"_zbuf;
281 CHECK(
b.size() == 5 *
sizeof(char32_t));
282 CHECK(std::memcmp(
b.data(), U
"hello",
b.size()) == 0);
285 TEST_CASE(
"buffer of structs",
"[buffer]")
300 std::array<some_pod, 1>
d;
302 CHECK(
b.size() ==
d.size() *
sizeof(some_pod));