]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/json/test/value_from.cpp
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 // Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 // Official repository: https://github.com/boostorg/json
11 // Test that header file is self-contained.
12 #include <boost/json/value_from.hpp>
14 #include <boost/json/value.hpp> // prevent intellisense bugs
15 #include <boost/json/serialize.hpp>
17 #include "test_suite.hpp"
24 #include <unordered_map>
26 //----------------------------------------------------------
28 namespace value_from_test_ns
{
30 //----------------------------------------------------------
39 ::boost::json::value_from_tag
,
40 ::boost::json::value
& jv
,
46 //----------------------------------------------------------
49 // uses generic algorithms
64 ::boost::json::value_from_tag
,
65 ::boost::json::value
& jv
,
75 BOOST_STATIC_ASSERT(! ::boost::json::has_value_from
<T3
>::value
);
79 operator ::boost::json::value()
85 BOOST_STATIC_ASSERT(! ::boost::json::has_value_from
<T4
>::value
);
87 //----------------------------------------------------------
89 struct T5
: std::vector
<int>
91 using std::vector
<int>::vector
;
96 ::boost::json::value_from_tag
,
97 ::boost::json::value
& jv
,
104 //----------------------------------------------------------
106 } // value_from_test_ns
112 ::boost::json::string_view s
,
116 auto const jv
= value_from(t
,
117 ::boost::json::storage_ptr
{});
119 ::boost::json::serialize(jv
);
124 ::boost::json::value_from(t
);
126 ::boost::json::serialize(jv
);
138 testValueCtor(T
const& t
)
140 BOOST_TEST( serialize(value_from(t
)) == serialize(value(t
)) );
154 BOOST_STATIC_ASSERT(has_value_from
<int>::value
);
155 BOOST_STATIC_ASSERT(has_value_from
<int&>::value
);
156 BOOST_STATIC_ASSERT(has_value_from
<int&&>::value
);
158 BOOST_STATIC_ASSERT(has_value_from
<int[4]>::value
);
159 BOOST_STATIC_ASSERT(has_value_from
<int(&)[4]>::value
);
160 BOOST_STATIC_ASSERT(has_value_from
<int(&&)[4]>::value
);
162 BOOST_STATIC_ASSERT(has_value_from
<std::vector
<int>>::value
);
163 BOOST_STATIC_ASSERT(has_value_from
<std::vector
<int>&>::value
);
164 BOOST_STATIC_ASSERT(has_value_from
<std::vector
<int>&&>::value
);
166 BOOST_STATIC_ASSERT(has_value_from
<std::tuple
<int, int>>::value
);
167 BOOST_STATIC_ASSERT(has_value_from
<std::tuple
<int, int>&>::value
);
168 BOOST_STATIC_ASSERT(has_value_from
<std::tuple
<int, int>&&>::value
);
169 BOOST_STATIC_ASSERT(has_value_from
<key_value_pair
>::value
);
170 BOOST_STATIC_ASSERT(has_value_from
<key_value_pair
&>::value
);
171 BOOST_STATIC_ASSERT(has_value_from
<key_value_pair
&&>::value
);
174 BOOST_STATIC_ASSERT(has_value_from
<std::map
<string_view
, int>>::value
);
176 class value_from_test
183 // value_from supports every value constructor
185 testValueCtor
<value
>();
196 int a
[4] = {1, 2, 3, 4};
198 value c
= value_from(a
);
199 BOOST_TEST(c
.is_array());
200 BOOST_TEST(serialize(c
) == serialize(b
));
203 std::tuple
<int, string
, int, bool> a
{1, "2", 42, true};
204 value b
{1, "2", 42, true};
205 value c
= value_from(a
);
206 BOOST_TEST(c
.is_array());
207 BOOST_TEST(serialize(c
) == serialize(b
));
210 std::array
<int, 1000> a
;
214 array
& b_arr
= b
.emplace_array();
215 b_arr
.insert(b_arr
.end(), a
.begin(), a
.end());
217 BOOST_TEST(value_from(a
) == b
);
220 std::pair
<int, string
> a
{1, string("2")};
222 value c
= value_from(a
);
223 BOOST_TEST(c
.is_array());
224 BOOST_TEST(serialize(c
) == serialize(b
));
227 // ensures that this isn't parsed as a key value pair
228 std::pair
<string_view
, int> a
{"2", 1};
230 value c
= value_from(a
);
231 BOOST_TEST(c
.is_array());
232 BOOST_TEST(serialize(c
) == serialize(b
));
235 key_value_pair a
{"2", 1};
237 value c
= value_from(a
);
238 BOOST_TEST(c
.is_array());
239 BOOST_TEST(serialize(c
) == serialize(b
));
248 std::map
<string_view
, int> a
=
249 {{"a", 1}, {"b", 2}, {"c", 3}};
250 value b
= {{"a", 1}, {"b", 2}, {"c", 3}};
251 value c
= value_from(a
);
252 BOOST_TEST(c
.is_object());
253 BOOST_TEST(a
.size() == c
.as_object().size());
254 BOOST_TEST(b
.as_object().size() == c
.as_object().size());
257 std::unordered_map
<std::string
, int> a
=
258 {{"a", 1}, {"b", 2}, {"c", 3}};
259 value b
= {{"a", 1}, {"b", 2}, {"c", 3}};
260 value c
= value_from(a
);
261 BOOST_TEST(c
.is_object());
262 BOOST_TEST(a
.size() == c
.as_object().size());
263 BOOST_TEST(b
.as_object().size() == c
.as_object().size());
266 std::map
<int, int> a
=
267 {{1, 1}, {2, 2}, {3, 3}};
268 value b
= {{1, 1}, {2, 2}, {3, 3}};
269 value c
= value_from(a
);
270 BOOST_TEST(!c
.is_object());
271 BOOST_TEST(a
.size() == c
.as_array().size());
272 BOOST_TEST(b
.as_array().size() == c
.as_array().size());
275 std::unordered_map
<int, int> a
=
276 {{1, 1}, {2, 2}, {3, 3}};
277 value b
= {{1, 1}, {2, 2}, {3, 3}};
278 value c
= value_from(a
);
279 BOOST_TEST(!c
.is_object());
280 BOOST_TEST(a
.size() == c
.as_array().size());
281 BOOST_TEST(b
.as_array().size() == c
.as_array().size());
287 testPreferUserCustomizations()
289 value_from_test_ns::T5 t5
;
290 BOOST_TEST((::boost::json::value_from(t5
) == "T5"));
296 check("42", ::value_from_test_ns::T1
{});
297 check("[[1,2,3,4],\"test\"]", ::value_from_test_ns::T2
{});
302 testPreferUserCustomizations();
306 TEST_SUITE(value_from_test
, "boost.json.value_from");