]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/beast/core/detail/variant.cpp
2 // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 // Test that header file is self-contained.
9 #include <boost/beast/core/detail/variant.hpp>
11 #include <boost/beast/unit_test/suite.hpp>
19 class variant_test
: public beast::unit_test::suite
22 template<unsigned char I
>
29 static unsigned char n
= 0;
37 Q
& operator=(Q
&& q
) = delete;
38 Q
& operator=(Q
const& q
) = delete;
53 throw std::exception
{};
61 throw std::exception
{};
66 explicit Q(int value_
)
76 // Default Constructor
80 BEAST_EXPECT(v
.index() == 0);
85 BEAST_EXPECT(v
.index() == 0);
87 BEAST_EXPECT(v
.index() == 1);
88 BEAST_EXPECT(v
.get
<1>() == 10);
90 BEAST_EXPECT(v
.index() == 1);
91 BEAST_EXPECT(v
.get
<1>() == 20);
94 variant
<std::string
> v
;
95 v
.emplace
<1>("Hello, world!");
96 BEAST_EXPECT(v
.index() == 1);
97 BEAST_EXPECT(v
.get
<1>() == "Hello, world!");
101 BEAST_EXPECT(Q
<1>::count() == 0);
103 BEAST_EXPECT(Q
<1>::count() == 1);
104 BEAST_EXPECT(v
.get
<1>().value
== 0);
106 BEAST_EXPECT(Q
<1>::count() == 1);
107 BEAST_EXPECT(v
.get
<1>().value
== 42);
109 BEAST_EXPECT(Q
<1>::count() == 0);
111 BEAST_EXPECT(Q
<1>::count() == 0);
113 variant
<Q
<1>, Q
<2>, Q
<3>> v
;
114 BEAST_EXPECT(Q
<1>::count() == 0);
115 BEAST_EXPECT(Q
<2>::count() == 0);
116 BEAST_EXPECT(Q
<3>::count() == 0);
118 BEAST_EXPECT(Q
<1>::count() == 1);
119 BEAST_EXPECT(Q
<2>::count() == 0);
120 BEAST_EXPECT(Q
<3>::count() == 0);
122 BEAST_EXPECT(Q
<1>::count() == 0);
123 BEAST_EXPECT(Q
<2>::count() == 1);
124 BEAST_EXPECT(Q
<3>::count() == 0);
126 BEAST_EXPECT(Q
<1>::count() == 0);
127 BEAST_EXPECT(Q
<2>::count() == 0);
128 BEAST_EXPECT(Q
<3>::count() == 1);
130 BEAST_EXPECT(Q
<1>::count() == 0);
131 BEAST_EXPECT(Q
<2>::count() == 0);
132 BEAST_EXPECT(Q
<3>::count() == 0);
134 BEAST_EXPECT(Q
<1>::count() == 0);
135 BEAST_EXPECT(Q
<2>::count() == 0);
136 BEAST_EXPECT(Q
<3>::count() == 0);
139 variant
<std::string
> v1
;
140 BEAST_EXPECT(v1
.index() == 0);
141 variant
<std::string
> v2
{std::move(v1
)};
142 BEAST_EXPECT(v1
.index() == 0);
143 BEAST_EXPECT(v2
.index() == 0);
144 v2
.emplace
<1>("Hello");
145 BEAST_EXPECT(v2
.get
<1>() == "Hello");
146 variant
<std::string
> v3
{std::move(v2
)};
147 BEAST_EXPECT(v2
.index() == 0);
148 BEAST_EXPECT(v3
.get
<1>() == "Hello");
152 BEAST_EXPECT(Q
<1>::count() == 0);
154 BEAST_EXPECT(Q
<1>::count() == 1);
155 BEAST_EXPECT(! v1
.get
<1>().move
);
156 variant
<Q
<1>> v2
{std::move(v1
)};
157 BEAST_EXPECT(v1
.index() == 0);
158 BEAST_EXPECT(Q
<1>::count() == 1);
159 BEAST_EXPECT(v2
.get
<1>().move
);
161 BEAST_EXPECT(Q
<1>::count() == 0);
163 variant
<Q
<1>, Q
<2>, Q
<3>> v1
;
164 BEAST_EXPECT(Q
<1>::count() == 0);
165 BEAST_EXPECT(Q
<2>::count() == 0);
166 BEAST_EXPECT(Q
<3>::count() == 0);
168 BEAST_EXPECT(Q
<1>::count() == 0);
169 BEAST_EXPECT(Q
<2>::count() == 1);
170 BEAST_EXPECT(Q
<3>::count() == 0);
171 variant
<Q
<1>, Q
<2>, Q
<3>> v2
{std::move(v1
)};
172 BEAST_EXPECT(Q
<1>::count() == 0);
173 BEAST_EXPECT(Q
<2>::count() == 1);
174 BEAST_EXPECT(Q
<3>::count() == 0);
175 BEAST_EXPECT(v2
.get
<2>().move
);
177 BEAST_EXPECT(Q
<1>::count() == 0);
178 BEAST_EXPECT(Q
<2>::count() == 0);
179 BEAST_EXPECT(Q
<3>::count() == 0);
182 variant
<std::string
> v1
;
183 BEAST_EXPECT(v1
.index() == 0);
184 variant
<std::string
> v2
{v1
};
185 BEAST_EXPECT(v1
.index() == 0);
186 BEAST_EXPECT(v2
.index() == 0);
187 v2
.emplace
<1>("Hello");
188 BEAST_EXPECT(v2
.get
<1>() == "Hello");
189 variant
<std::string
> v3
{v2
};
190 BEAST_EXPECT(v2
.get
<1>() == "Hello");
191 BEAST_EXPECT(v3
.get
<1>() == "Hello");
195 BEAST_EXPECT(Q
<1>::count() == 0);
197 BEAST_EXPECT(Q
<1>::count() == 1);
198 BEAST_EXPECT(! v1
.get
<1>().copy
);
199 variant
<Q
<1>> v2
{v1
};
200 BEAST_EXPECT(v1
.index() == 1);
201 BEAST_EXPECT(Q
<1>::count() == 2);
202 BEAST_EXPECT(v2
.get
<1>().copy
);
204 BEAST_EXPECT(Q
<1>::count() == 0);
206 variant
<Q
<1>, Q
<2>, Q
<3>> v1
;
207 BEAST_EXPECT(Q
<1>::count() == 0);
208 BEAST_EXPECT(Q
<2>::count() == 0);
209 BEAST_EXPECT(Q
<3>::count() == 0);
211 BEAST_EXPECT(Q
<1>::count() == 0);
212 BEAST_EXPECT(Q
<2>::count() == 1);
213 BEAST_EXPECT(Q
<3>::count() == 0);
214 variant
<Q
<1>, Q
<2>, Q
<3>> v2
{v1
};
215 BEAST_EXPECT(Q
<1>::count() == 0);
216 BEAST_EXPECT(Q
<2>::count() == 2);
217 BEAST_EXPECT(Q
<3>::count() == 0);
218 BEAST_EXPECT(v2
.get
<2>().copy
);
220 BEAST_EXPECT(Q
<1>::count() == 0);
221 BEAST_EXPECT(Q
<2>::count() == 0);
222 BEAST_EXPECT(Q
<3>::count() == 0);
225 variant
<std::string
> v1
;
226 BEAST_EXPECT(v1
.index() == 0);
227 variant
<std::string
> v2
;
229 BEAST_EXPECT(v1
.index() == 0);
230 BEAST_EXPECT(v2
.index() == 0);
231 v2
.emplace
<1>("Hello");
232 BEAST_EXPECT(v2
.get
<1>() == "Hello");
233 variant
<std::string
> v3
;
235 BEAST_EXPECT(v2
.index() == 0);
236 BEAST_EXPECT(v3
.get
<1>() == "Hello");
239 variant
<Q
<1>, Q
<2>> v1
;
240 variant
<Q
<1>, Q
<2>> v2
;
242 BEAST_EXPECT(v1
.index() == 1);
243 BEAST_EXPECT(Q
<1>::count() == 1);
245 BEAST_EXPECT(v2
.index() == 2);
246 BEAST_EXPECT(Q
<2>::count() == 1);
248 BEAST_EXPECT(v1
.index() == 0);
249 BEAST_EXPECT(v2
.index() == 1);
250 BEAST_EXPECT(Q
<1>::count() == 1);
251 BEAST_EXPECT(Q
<2>::count() == 0);
253 BEAST_EXPECT(Q
<1>::count() == 0);
254 BEAST_EXPECT(Q
<2>::count() == 0);
258 BEAST_EXPECT(Q
<1>::count() == 1);
261 BEAST_EXPECT(Q
<1>::count() == 2);
263 BEAST_EXPECT(v1
.index() == 0);
264 BEAST_EXPECT(v2
.index() == 1);
265 BEAST_EXPECT(v2
.get
<1>().move
);
266 BEAST_EXPECT(Q
<1>::count() == 1);
268 BEAST_EXPECT(Q
<1>::count() == 0);
270 variant
<Q
<1>, Q
<2>, Q
<3>> v1
;
272 BEAST_EXPECT(Q
<1>::count() == 0);
273 BEAST_EXPECT(Q
<2>::count() == 1);
274 BEAST_EXPECT(Q
<3>::count() == 0);
275 variant
<Q
<1>, Q
<2>, Q
<3>> v2
;
277 BEAST_EXPECT(Q
<1>::count() == 0);
278 BEAST_EXPECT(Q
<2>::count() == 2);
279 BEAST_EXPECT(Q
<3>::count() == 0);
281 BEAST_EXPECT(v1
.index() == 0);
282 BEAST_EXPECT(v2
.index() == 2);
283 BEAST_EXPECT(v2
.get
<2>().move
);
284 BEAST_EXPECT(Q
<1>::count() == 0);
285 BEAST_EXPECT(Q
<2>::count() == 1);
286 BEAST_EXPECT(Q
<3>::count() == 0);
288 BEAST_EXPECT(Q
<1>::count() == 0);
289 BEAST_EXPECT(Q
<2>::count() == 0);
290 BEAST_EXPECT(Q
<3>::count() == 0);
293 variant
<std::string
> v1
;
294 BEAST_EXPECT(v1
.index() == 0);
295 variant
<std::string
> v2
;
297 BEAST_EXPECT(v1
.index() == 0);
298 BEAST_EXPECT(v2
.index() == 0);
299 v2
.emplace
<1>("Hello");
300 BEAST_EXPECT(v2
.get
<1>() == "Hello");
301 variant
<std::string
> v3
;
303 BEAST_EXPECT(v2
.get
<1>() == "Hello");
304 BEAST_EXPECT(v3
.get
<1>() == "Hello");
307 variant
<Q
<1>, Q
<2>> v1
;
308 variant
<Q
<1>, Q
<2>> v2
;
310 BEAST_EXPECT(v1
.index() == 1);
311 BEAST_EXPECT(Q
<1>::count() == 1);
313 BEAST_EXPECT(v2
.index() == 2);
314 BEAST_EXPECT(Q
<2>::count() == 1);
316 BEAST_EXPECT(v1
.index() == 1);
317 BEAST_EXPECT(v2
.index() == 1);
318 BEAST_EXPECT(Q
<1>::count() == 2);
319 BEAST_EXPECT(Q
<2>::count() == 0);
324 BEAST_EXPECT(Q
<1>::count() == 1);
327 BEAST_EXPECT(Q
<1>::count() == 2);
329 BEAST_EXPECT(v1
.index() == 1);
330 BEAST_EXPECT(v2
.index() == 1);
331 BEAST_EXPECT(v2
.get
<1>().copy
);
332 BEAST_EXPECT(Q
<1>::count() == 2);
334 BEAST_EXPECT(Q
<1>::count() == 0);
336 variant
<Q
<1>, Q
<2>, Q
<3>> v1
;
338 BEAST_EXPECT(Q
<1>::count() == 0);
339 BEAST_EXPECT(Q
<2>::count() == 1);
340 BEAST_EXPECT(Q
<3>::count() == 0);
341 variant
<Q
<1>, Q
<2>, Q
<3>> v2
;
343 BEAST_EXPECT(Q
<1>::count() == 0);
344 BEAST_EXPECT(Q
<2>::count() == 2);
345 BEAST_EXPECT(Q
<3>::count() == 0);
347 BEAST_EXPECT(v1
.index() == 2);
348 BEAST_EXPECT(v2
.index() == 2);
349 BEAST_EXPECT(v2
.get
<2>().copy
);
350 BEAST_EXPECT(Q
<1>::count() == 0);
351 BEAST_EXPECT(Q
<2>::count() == 2);
352 BEAST_EXPECT(Q
<3>::count() == 0);
354 BEAST_EXPECT(Q
<1>::count() == 0);
355 BEAST_EXPECT(Q
<2>::count() == 0);
356 BEAST_EXPECT(Q
<3>::count() == 0);
359 variant
<std::string
> v
;
360 v
.emplace
<1>("Hello");
361 v
.get
<1>() = "World!";
362 BEAST_EXPECT(v
.get
<1>() == "World!");
366 variant
<std::string
> v
;
367 v
.emplace
<1>("Hello");
369 BEAST_EXPECT(v
.index() == 0);
373 BEAST_EXPECT(Q
<1>::count() == 0);
375 BEAST_EXPECT(Q
<1>::count() == 1);
377 BEAST_EXPECT(Q
<1>::count() == 0);
378 BEAST_EXPECT(v
.index() == 0);
381 variant
<Q
<1>, Q
<2>, Q
<3>> v
;
382 BEAST_EXPECT(Q
<1>::count() == 0);
383 BEAST_EXPECT(Q
<2>::count() == 0);
384 BEAST_EXPECT(Q
<3>::count() == 0);
386 BEAST_EXPECT(Q
<1>::count() == 0);
387 BEAST_EXPECT(Q
<2>::count() == 1);
388 BEAST_EXPECT(Q
<3>::count() == 0);
390 BEAST_EXPECT(Q
<1>::count() == 0);
391 BEAST_EXPECT(Q
<2>::count() == 0);
392 BEAST_EXPECT(Q
<3>::count() == 0);
393 BEAST_EXPECT(v
.index() == 0);
395 BEAST_EXPECT(Q
<1>::count() == 0);
396 BEAST_EXPECT(Q
<2>::count() == 0);
397 BEAST_EXPECT(Q
<3>::count() == 0);
404 BEAST_EXPECT(Q
<1>::count() == 1);
407 BEAST_EXPECT(Q
<1>::count() == 2);
413 catch(std::exception
const&)
415 BEAST_EXPECT(v1
.index() == 0);
416 BEAST_EXPECT(Q
<1>::count() == 1);
419 BEAST_EXPECT(Q
<1>::count() == 0);
424 BEAST_EXPECT(Q
<1>::count() == 1);
427 BEAST_EXPECT(Q
<1>::count() == 2);
433 catch(std::exception
const&)
435 BEAST_EXPECT(v1
.index() == 0);
436 BEAST_EXPECT(Q
<1>::count() == 1);
439 BEAST_EXPECT(Q
<1>::count() == 0);
449 BEAST_DEFINE_TESTSUITE(beast
,core
,variant
);