2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.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)
7 // Official repository: https://github.com/boostorg/json
10 // Test that header file is self-contained.
11 #include <boost/json/value.hpp>
13 #include <boost/json/monotonic_resource.hpp>
20 #include "test_suite.hpp"
24 BOOST_STATIC_ASSERT( std::is_nothrow_destructible
<value
>::value
);
25 BOOST_STATIC_ASSERT( std::is_nothrow_move_constructible
<value
>::value
);
33 return (std::numeric_limits
<T
>::max
)();
40 return (std::numeric_limits
<T
>::min
)();
48 //BOOST_STATIC_ASSERT(has_value_from<short>::value);
50 string_view
const str_
;
54 "abcdefghijklmnopqrstuvwxyz")
56 // ensure this string does
57 // not fit in the SBO area.
58 BOOST_ASSERT(str_
.size() >
62 //------------------------------------------------------
67 auto dsp
= storage_ptr
{};
68 auto sp
= make_shared_resource
<unique_resource
>();
75 value(std::int64_t(0));
76 value(std::uint64_t(0));
85 BOOST_TEST(*jv
.storage() == *dsp
);
91 BOOST_TEST(*jv
.storage() == *sp
);
94 // value(pilfered<value>)
98 value
jv2(pilfer(jv1
));
99 BOOST_TEST(jv2
.is_object());
103 value
jv2(pilfer(jv1
));
104 BOOST_TEST(jv2
.is_array());
108 value
jv2(pilfer(jv1
));
109 BOOST_TEST(jv2
.is_string());
112 value
jv1(std::int64_t{});
113 value
jv2(pilfer(jv1
));
114 BOOST_TEST(jv2
.is_int64());
117 value
jv1(std::uint64_t{});
118 value
jv2(pilfer(jv1
));
119 BOOST_TEST(jv2
.is_uint64());
123 value
jv2(pilfer(jv1
));
124 BOOST_TEST(jv2
.is_double());
128 value
jv2(pilfer(jv1
));
129 BOOST_TEST(jv2
.is_bool());
133 value
jv2(pilfer(jv1
));
134 BOOST_TEST(jv2
.is_null());
137 // ensure pilfered-from objects
138 // are trivially destructible
140 value
v1(make_shared_resource
<
141 monotonic_resource
>());
142 value
v2(pilfer(v1
));
143 BOOST_TEST(v1
.storage().get() ==
144 storage_ptr().get());
148 // value(value const&)
153 BOOST_TEST(jv2
.is_object());
158 BOOST_TEST(jv2
.is_array());
163 BOOST_TEST(jv2
.is_string());
166 value
jv1(std::int64_t{});
168 BOOST_TEST(jv2
.is_int64());
171 value
jv1(std::uint64_t{});
173 BOOST_TEST(jv2
.is_uint64());
178 BOOST_TEST(jv2
.is_double());
183 BOOST_TEST(jv2
.is_bool());
188 BOOST_TEST(jv2
.is_null());
192 // value(value const&, storage_ptr)
197 BOOST_TEST(jv2
.is_object());
198 BOOST_TEST(*jv2
.storage() == *sp
);
203 BOOST_TEST(jv2
.is_array());
204 BOOST_TEST(*jv2
.storage() == *sp
);
209 BOOST_TEST(jv2
.is_string());
210 BOOST_TEST(*jv2
.storage() == *sp
);
213 value
jv1(std::int64_t{});
215 BOOST_TEST(jv2
.is_int64());
216 BOOST_TEST(*jv2
.storage() == *sp
);
219 value
jv1(std::uint64_t{});
221 BOOST_TEST(jv2
.is_uint64());
222 BOOST_TEST(*jv2
.storage() == *sp
);
227 BOOST_TEST(jv2
.is_double());
228 BOOST_TEST(*jv2
.storage() == *sp
);
233 BOOST_TEST(jv2
.is_bool());
234 BOOST_TEST(*jv2
.storage() == *sp
);
239 BOOST_TEST(jv2
.is_null());
240 BOOST_TEST(*jv2
.storage() == *sp
);
248 value
jv2(std::move(jv1
));
249 BOOST_TEST(jv2
.is_object());
253 value
jv2(std::move(jv1
));
254 BOOST_TEST(jv2
.is_array());
258 value
jv2(std::move(jv1
));
259 BOOST_TEST(jv2
.is_string());
262 value
jv1(std::int64_t{});
263 value
jv2(std::move(jv1
));
264 BOOST_TEST(jv2
.is_int64());
267 value
jv1(std::uint64_t{});
268 value
jv2(std::move(jv1
));
269 BOOST_TEST(jv2
.is_uint64());
273 value
jv2(std::move(jv1
));
274 BOOST_TEST(jv2
.is_double());
278 value
jv2(std::move(jv1
));
279 BOOST_TEST(jv2
.is_bool());
283 value
jv2(std::move(jv1
));
284 BOOST_TEST(jv2
.is_null());
288 // value(value&&, storage_ptr)
292 value
jv2(std::move(jv1
), sp
);
293 BOOST_TEST(jv2
.is_object());
297 value
jv2(std::move(jv1
), sp
);
298 BOOST_TEST(jv2
.is_array());
302 value
jv2(std::move(jv1
), sp
);
303 BOOST_TEST(jv2
.is_string());
306 value
jv1(std::int64_t{});
307 value
jv2(std::move(jv1
), sp
);
308 BOOST_TEST(jv2
.is_int64());
311 value
jv1(std::uint64_t{});
312 value
jv2(std::move(jv1
), sp
);
313 BOOST_TEST(jv2
.is_uint64());
317 value
jv2(std::move(jv1
), sp
);
318 BOOST_TEST(jv2
.is_double());
322 value
jv2(std::move(jv1
), sp
);
323 BOOST_TEST(jv2
.is_bool());
327 value
jv2(std::move(jv1
), sp
);
328 BOOST_TEST(jv2
.is_null());
336 auto dsp
= storage_ptr
{};
337 auto sp
= make_shared_resource
<unique_resource
>();
340 // value(object, storage_ptr)
341 // value(object_kind, storage_ptr)
344 auto jv
= value(object());
345 BOOST_TEST(jv
.is_object());
346 BOOST_TEST(*jv
.storage() == *dsp
);
349 auto jv
= value(object(sp
));
350 BOOST_TEST(jv
.is_object());
351 BOOST_TEST(*jv
.storage() == *sp
);
354 auto jv
= value(object(), sp
);
355 BOOST_TEST(jv
.is_object());
356 BOOST_TEST(*jv
.storage() == *sp
);
359 auto jv
= value(object_kind
);
360 BOOST_TEST(jv
.is_object());
361 BOOST_TEST(*jv
.storage() == *dsp
);
364 auto jv
= value(object_kind
, sp
);
365 BOOST_TEST(jv
.is_object());
366 BOOST_TEST(*jv
.storage() == *sp
);
370 object obj
{{"a", 1}, {"b", 2}};
371 BOOST_TEST(obj
.capacity() > 0);
372 value
jv(std::move(obj
), {});
373 BOOST_TEST(obj
.capacity() == 0);
378 // value(array, storage_ptr)
379 // value(object_kind, storage_ptr)
382 auto jv
= value(array());
383 BOOST_TEST(jv
.is_array());
384 BOOST_TEST(*jv
.storage() == *dsp
);
387 auto jv
= value(array(sp
));
388 BOOST_TEST(jv
.is_array());
389 BOOST_TEST(*jv
.storage() == *sp
);
392 auto jv
= value(array(), sp
);
393 BOOST_TEST(jv
.is_array());
394 BOOST_TEST(*jv
.storage() == *sp
);
397 auto jv
= value(array_kind
);
398 BOOST_TEST(jv
.is_array());
399 BOOST_TEST(*jv
.storage() == *dsp
);
402 auto jv
= value(array_kind
, sp
);
403 BOOST_TEST(jv
.is_array());
404 BOOST_TEST(*jv
.storage() == *sp
);
409 // value(string, storage_ptr)
412 auto jv
= value(string());
413 BOOST_TEST(jv
.is_string());
414 BOOST_TEST(*jv
.storage() == *dsp
);
417 auto jv
= value(string(sp
));
418 BOOST_TEST(jv
.is_string());
419 BOOST_TEST(*jv
.storage() == *sp
);
422 auto jv
= value(string(), sp
);
423 BOOST_TEST(jv
.is_string());
424 BOOST_TEST(*jv
.storage() == *sp
);
429 // value(int64, storage_ptr)
432 auto jv
= value(std::int64_t{-65536});
433 BOOST_TEST(jv
.is_int64());
434 BOOST_TEST(*jv
.storage() == *dsp
);
437 auto jv
= value(std::int64_t{-65536}, sp
);
438 BOOST_TEST(jv
.is_int64());
439 BOOST_TEST(*jv
.storage() == *sp
);
444 // value(uint64, storage_ptr)
447 auto jv
= value(std::uint64_t{65536});
448 BOOST_TEST(jv
.is_uint64());
449 BOOST_TEST(*jv
.storage() == *dsp
);
452 auto jv
= value(std::uint64_t{65536}, sp
);
453 BOOST_TEST(jv
.is_uint64());
454 BOOST_TEST(*jv
.storage() == *sp
);
459 // value(double, storage_ptr)
462 auto jv
= value(double{3.141});
463 BOOST_TEST(jv
.is_double());
464 BOOST_TEST(*jv
.storage() == *dsp
);
467 auto jv
= value(double{3.141}, sp
);
468 BOOST_TEST(jv
.is_double());
469 BOOST_TEST(*jv
.storage() == *sp
);
474 // value(bool, storage_ptr)
477 auto jv
= value(true);
478 BOOST_TEST(jv
.is_bool());
479 BOOST_TEST(*jv
.storage() == *dsp
);
482 auto jv
= value(true, sp
);
483 BOOST_TEST(jv
.is_bool());
484 BOOST_TEST(*jv
.storage() == *sp
);
489 // value(nullptr_t, storage_ptr)
492 auto jv
= value(nullptr);
493 BOOST_TEST(jv
.is_null());
494 BOOST_TEST(*jv
.storage() == *dsp
);
497 auto jv
= value(nullptr, sp
);
498 BOOST_TEST(jv
.is_null());
499 BOOST_TEST(*jv
.storage() == *sp
);
503 // value(initializer_list)
504 // value(initializer_list, storage_ptr)
508 BOOST_TEST(jv
.is_array());
509 BOOST_TEST(*jv
.storage() == *dsp
);
512 value
jv({1, 2, 3}, sp
);
513 BOOST_TEST(jv
.is_array());
514 BOOST_TEST(*jv
.storage() == *sp
);
517 value
jv({{"a",1},{"b",2},{"c",3}});
518 BOOST_TEST(jv
.is_object());
519 BOOST_TEST(*jv
.storage() == *dsp
);
522 value
jv({{"a",1},{"b",2},{"c",3}}, sp
);
523 BOOST_TEST(jv
.is_object());
524 BOOST_TEST(*jv
.storage() == *sp
);
532 auto dsp
= storage_ptr
{};
533 auto sp
= make_shared_resource
<unique_resource
>();
535 // operator=(value const&)
541 BOOST_TEST(jv2
.is_object());
547 BOOST_TEST(jv2
.is_array());
553 BOOST_TEST(jv2
.is_string());
556 value
jv1(std::int64_t{});
559 BOOST_TEST(jv2
.is_int64());
562 value
jv1(std::uint64_t{});
565 BOOST_TEST(jv2
.is_uint64());
571 BOOST_TEST(jv2
.is_double());
577 BOOST_TEST(jv2
.is_bool());
583 BOOST_TEST(jv2
.is_null());
586 fail_loop([&](storage_ptr
const sp
)
588 value
jv1({1, 2, 3, 4, 5});
591 BOOST_TEST(jv2
.as_array().size() == 5);
594 fail_loop([&](storage_ptr
const sp
)
597 {"a",1},{"b",2},{"c",3}});
600 BOOST_TEST(jv2
.as_object().size() == 3);
603 fail_loop([&](storage_ptr
const sp
)
608 BOOST_TEST(jv2
.as_string() == str_
);
613 value jv
= { 1, 2, 3 };
614 jv
= static_cast<value
const&>(jv
);
615 BOOST_TEST(jv
== value({1, 2, 3}));
620 value jv
= { 1, 2, 3 };
623 *jv
.if_int64() == 2);
627 // operator=(value&&)
631 jv
= value(object
{});
632 BOOST_TEST(jv
.is_object());
637 BOOST_TEST(jv
.is_array());
641 jv
= value(string
{});
642 BOOST_TEST(jv
.is_string());
646 jv
= value(std::int64_t{});
647 BOOST_TEST(jv
.is_int64());
651 jv
= value(std::uint64_t{});
652 BOOST_TEST(jv
.is_uint64());
656 jv
= value(double{});
657 BOOST_TEST(jv
.is_double());
662 BOOST_TEST(jv
.is_bool());
667 BOOST_TEST(jv
.is_null());
670 fail_loop([&](storage_ptr
const sp
)
674 { {"a",1}, {"b",2u} },
683 BOOST_TEST(jv
.as_array().size() == 8);
686 fail_loop([&](storage_ptr
const sp
)
690 { "aa", { {"a",1}, {"b",2u} } },
699 BOOST_TEST(jv
.as_object().size() == 8);
702 fail_loop([&](storage_ptr
const sp
)
706 BOOST_TEST(jv
.as_string() == str_
);
711 value jv
= { 1, 2, 3 };
714 BOOST_TEST(jv
== value({1, 2, 3}));
719 value jv
= { 1, 2, 3 };
720 jv
= std::move(jv
.at(1));
722 *jv
.if_int64() == 2);
726 // operator=(initializer_list)
730 BOOST_TEST(jv
.is_array());
731 BOOST_TEST(*jv
.storage() == *dsp
);
732 BOOST_TEST(jv
.at(0).as_int64() == 1);
733 BOOST_TEST(jv
.at(1).as_int64() == 2);
734 BOOST_TEST(jv
.at(2).as_int64() == 3);
737 // operator=(nullptr_t)
741 BOOST_TEST(! jv
.is_null());
743 BOOST_TEST(jv
.is_null());
747 BOOST_TEST(! jv
.is_null());
749 BOOST_TEST(jv
.is_null());
757 BOOST_TEST(! jv
.is_bool());
759 BOOST_TEST(jv
.is_bool());
763 BOOST_TEST(! jv
.is_bool());
765 BOOST_TEST(jv
.is_bool());
773 BOOST_TEST(! jv
.is_int64());
774 jv
= std::int64_t{-65536};
775 BOOST_TEST(jv
.is_int64());
779 BOOST_TEST(! jv
.is_int64());
780 jv
= std::int64_t{-65536};
781 BOOST_TEST(jv
.is_int64());
789 BOOST_TEST(! jv
.is_uint64());
790 jv
= std::uint64_t{65536};
791 BOOST_TEST(jv
.is_uint64());
795 BOOST_TEST(! jv
.is_uint64());
796 jv
= std::uint64_t{65536};
797 BOOST_TEST(jv
.is_uint64());
805 BOOST_TEST(! jv
.is_double());
807 BOOST_TEST(jv
.is_double());
811 BOOST_TEST(! jv
.is_double());
813 BOOST_TEST(jv
.is_double());
822 BOOST_TEST(jv
.is_string());
823 BOOST_TEST(*jv
.storage() == *dsp
);
828 BOOST_TEST(jv
.is_string());
829 BOOST_TEST(*jv
.storage() == *sp
);
838 BOOST_TEST(jv
.is_array());
839 BOOST_TEST(*jv
.storage() == *dsp
);
844 BOOST_TEST(jv
.is_array());
845 BOOST_TEST(*jv
.storage() == *sp
);
854 BOOST_TEST(*jv
.storage() == *dsp
);
855 BOOST_TEST(jv
.is_object());
860 BOOST_TEST(jv
.is_object());
861 BOOST_TEST(*jv
.storage() == *sp
);
871 BOOST_TEST(value().emplace_object().empty());
872 BOOST_TEST(value().emplace_array().empty());
873 BOOST_TEST(value().emplace_string().empty());
874 BOOST_TEST(value().emplace_int64() == 0);
875 BOOST_TEST(value().emplace_uint64() == 0);
876 BOOST_TEST(value().emplace_double() == 0);
877 BOOST_TEST(value().emplace_bool() = true);
879 value
jv(object_kind
);
881 BOOST_TEST(jv
.is_null());
884 value
jv(array_kind
);
886 BOOST_TEST(jv
.is_null());
889 value
jv(string_kind
);
891 BOOST_TEST(jv
.is_null());
896 BOOST_TEST(jv
.is_null());
901 BOOST_TEST(jv
.is_null());
906 BOOST_TEST(jv
.is_null());
911 BOOST_TEST(jv
.is_null());
916 BOOST_TEST(jv
.is_null());
931 *jv1
.storage() == *jv2
.storage());
933 BOOST_TEST(jv1
.as_string() == "abc");
934 BOOST_TEST(jv2
.as_int64() == 1);
938 fail_loop([&](storage_ptr
const& sp
)
941 value
jv2("abc", sp
);
943 *jv1
.storage() != *jv2
.storage());
945 BOOST_TEST(jv1
.as_string() == "abc");
946 BOOST_TEST(jv2
.as_int64() == 1);
959 BOOST_TEST(value("abc").is_string());
960 BOOST_TEST(value(std::string()).is_string());
961 BOOST_TEST(value(string_view()).is_string());
963 { value jv
; BOOST_TEST((jv
= "abc").is_string()); }
964 { value jv
; BOOST_TEST((jv
= std::string()).is_string()); }
965 { value jv
; BOOST_TEST((jv
= string_view()).is_string()); }
970 BOOST_TEST(value(tt
<signed char>{}).is_int64());
971 BOOST_TEST(value(tt
<short>{}).is_int64());
972 BOOST_TEST(value(tt
<int>{}).is_int64());
973 BOOST_TEST(value(tt
<long>{}).is_int64());
974 BOOST_TEST(value(tt
<long long>{}).is_int64());
975 BOOST_TEST(value(tt
<unsigned char>{}).is_uint64());
976 BOOST_TEST(value(tt
<unsigned short>{}).is_uint64());
977 BOOST_TEST(value(tt
<unsigned int>{}).is_uint64());
978 BOOST_TEST(value(tt
<unsigned long>{}).is_uint64());
979 BOOST_TEST(value(tt
<unsigned long long>{}).is_uint64());
980 BOOST_TEST(value(tt
<float>{}).is_double());
981 BOOST_TEST(value(tt
<double>{}).is_double());
983 { value jv
; BOOST_TEST((jv
= tt
<signed char>{}).is_int64()); }
984 { value jv
; BOOST_TEST((jv
= tt
<short>{}).is_int64()); }
985 { value jv
; BOOST_TEST((jv
= tt
<int>{}).is_int64()); }
986 { value jv
; BOOST_TEST((jv
= tt
<long>{}).is_int64()); }
987 { value jv
; BOOST_TEST((jv
= tt
<long long>{}).is_int64()); }
988 { value jv
; BOOST_TEST((jv
= tt
<unsigned char>{}).is_uint64()); }
989 { value jv
; BOOST_TEST((jv
= tt
<unsigned short>{}).is_uint64()); }
990 { value jv
; BOOST_TEST((jv
= tt
<unsigned int>{}).is_uint64()); }
991 { value jv
; BOOST_TEST((jv
= tt
<unsigned long>{}).is_uint64()); }
992 { value jv
; BOOST_TEST((jv
= tt
<unsigned long long>{}).is_uint64()); }
993 { value jv
; BOOST_TEST((jv
= tt
<float>{}).is_double()); }
994 { value jv
; BOOST_TEST((jv
= tt
<double>{}).is_double()); }
999 BOOST_TEST(value(true).is_bool());
1000 BOOST_TEST(value(false).is_bool());
1002 { value jv
; BOOST_TEST((jv
= true).is_bool()); }
1003 { value jv
; BOOST_TEST((jv
= false).is_bool()); }
1008 BOOST_TEST(value(nullptr).is_null());
1010 { value
jv("x"); BOOST_TEST((jv
= nullptr).is_null()); }
1013 // VFALCO TODO store()
1019 value
const obj(object
{});
1020 value
const arr(array
{});
1021 value
const str(string
{});
1022 value
const i64(std::int64_t{});
1023 value
const u64(std::uint64_t{});
1024 value
const dub(double{});
1025 value
const boo(true);
1026 value
const nul(nullptr);
1030 BOOST_TEST(obj
.kind() == kind::object
);
1031 BOOST_TEST(arr
.kind() == kind::array
);
1032 BOOST_TEST(str
.kind() == kind::string
);
1033 BOOST_TEST(i64
.kind() == kind::int64
);
1034 BOOST_TEST(u64
.kind() == kind::uint64
);
1035 BOOST_TEST(dub
.kind() == kind::double_
);
1036 BOOST_TEST(boo
.kind() == kind::bool_
);
1037 BOOST_TEST(nul
.kind() == kind::null
);
1042 BOOST_TEST( obj
.is_object());
1043 BOOST_TEST(! arr
.is_object());
1044 BOOST_TEST(! str
.is_object());
1045 BOOST_TEST(! i64
.is_object());
1046 BOOST_TEST(! u64
.is_object());
1047 BOOST_TEST(! dub
.is_object());
1048 BOOST_TEST(! boo
.is_object());
1049 BOOST_TEST(! nul
.is_object());
1054 BOOST_TEST(! obj
.is_array());
1055 BOOST_TEST( arr
.is_array());
1056 BOOST_TEST(! str
.is_array());
1057 BOOST_TEST(! i64
.is_array());
1058 BOOST_TEST(! u64
.is_array());
1059 BOOST_TEST(! dub
.is_array());
1060 BOOST_TEST(! boo
.is_array());
1061 BOOST_TEST(! nul
.is_array());
1066 BOOST_TEST(! obj
.is_string());
1067 BOOST_TEST(! arr
.is_string());
1068 BOOST_TEST( str
.is_string());
1069 BOOST_TEST(! i64
.is_string());
1070 BOOST_TEST(! u64
.is_string());
1071 BOOST_TEST(! dub
.is_string());
1072 BOOST_TEST(! boo
.is_string());
1073 BOOST_TEST(! nul
.is_string());
1078 BOOST_TEST(! obj
.is_int64());
1079 BOOST_TEST(! arr
.is_int64());
1080 BOOST_TEST(! str
.is_int64());
1081 BOOST_TEST( i64
.is_int64());
1082 BOOST_TEST(! u64
.is_int64());
1083 BOOST_TEST(! dub
.is_int64());
1084 BOOST_TEST(! boo
.is_int64());
1085 BOOST_TEST(! nul
.is_int64());
1090 BOOST_TEST(! obj
.is_uint64());
1091 BOOST_TEST(! arr
.is_uint64());
1092 BOOST_TEST(! str
.is_uint64());
1093 BOOST_TEST(! i64
.is_uint64());
1094 BOOST_TEST( u64
.is_uint64());
1095 BOOST_TEST(! dub
.is_uint64());
1096 BOOST_TEST(! boo
.is_uint64());
1097 BOOST_TEST(! nul
.is_uint64());
1102 BOOST_TEST(! obj
.is_double());
1103 BOOST_TEST(! arr
.is_double());
1104 BOOST_TEST(! str
.is_double());
1105 BOOST_TEST(! i64
.is_double());
1106 BOOST_TEST(! u64
.is_double());
1107 BOOST_TEST( dub
.is_double());
1108 BOOST_TEST(! boo
.is_double());
1109 BOOST_TEST(! nul
.is_double());
1114 BOOST_TEST(! obj
.is_bool());
1115 BOOST_TEST(! arr
.is_bool());
1116 BOOST_TEST(! str
.is_bool());
1117 BOOST_TEST(! i64
.is_bool());
1118 BOOST_TEST(! u64
.is_bool());
1119 BOOST_TEST(! dub
.is_bool());
1120 BOOST_TEST( boo
.is_bool());
1121 BOOST_TEST(! nul
.is_bool());
1126 BOOST_TEST(! obj
.is_null());
1127 BOOST_TEST(! arr
.is_null());
1128 BOOST_TEST(! str
.is_null());
1129 BOOST_TEST(! i64
.is_null());
1130 BOOST_TEST(! u64
.is_null());
1131 BOOST_TEST(! dub
.is_null());
1132 BOOST_TEST(! boo
.is_null());
1133 BOOST_TEST( nul
.is_null());
1138 BOOST_TEST(! obj
.is_number());
1139 BOOST_TEST(! arr
.is_number());
1140 BOOST_TEST(! str
.is_number());
1141 BOOST_TEST( i64
.is_number());
1142 BOOST_TEST( u64
.is_number());
1143 BOOST_TEST( dub
.is_number());
1144 BOOST_TEST(! boo
.is_number());
1145 BOOST_TEST(! nul
.is_number());
1150 BOOST_TEST(! obj
.is_primitive());
1151 BOOST_TEST(! arr
.is_primitive());
1152 BOOST_TEST( str
.is_primitive());
1153 BOOST_TEST( i64
.is_primitive());
1154 BOOST_TEST( u64
.is_primitive());
1155 BOOST_TEST( dub
.is_primitive());
1156 BOOST_TEST( boo
.is_primitive());
1157 BOOST_TEST( nul
.is_primitive());
1162 BOOST_TEST( obj
.is_structured());
1163 BOOST_TEST( arr
.is_structured());
1164 BOOST_TEST(! str
.is_structured());
1165 BOOST_TEST(! i64
.is_structured());
1166 BOOST_TEST(! u64
.is_structured());
1167 BOOST_TEST(! dub
.is_structured());
1168 BOOST_TEST(! boo
.is_structured());
1169 BOOST_TEST(! nul
.is_structured());
1173 //------------------------------------------------------
1177 //------------------------------------------------------
1183 make_shared_resource
<unique_resource
>();
1185 value
obj(object
{}, sp
);
1186 value
arr(array
{}, sp
);
1187 value
str(string
{}, sp
);
1188 value
i64(std::int64_t{}, sp
);
1189 value
u64(std::uint64_t{}, sp
);
1190 value
dub(double{}, sp
);
1191 value
boo(true, sp
);
1192 value
nul(nullptr, sp
);
1196 BOOST_TEST(*obj
.storage() == *sp
);
1197 BOOST_TEST(*arr
.storage() == *sp
);
1198 BOOST_TEST(*str
.storage() == *sp
);
1199 BOOST_TEST(*i64
.storage() == *sp
);
1200 BOOST_TEST(*u64
.storage() == *sp
);
1201 BOOST_TEST(*dub
.storage() == *sp
);
1202 BOOST_TEST(*boo
.storage() == *sp
);
1203 BOOST_TEST(*nul
.storage() == *sp
);
1210 value
obj(object
{});
1212 value
str(string
{});
1213 value
i64(std::int64_t{});
1214 value
u64(std::uint64_t{});
1215 value
dub(double{});
1219 auto const& cobj(obj
);
1220 auto const& carr(arr
);
1221 auto const& cstr(str
);
1222 auto const& ci64(i64
);
1223 auto const& cu64(u64
);
1224 auto const& cdub(dub
);
1225 auto const& cboo(boo
);
1226 auto const& cnul(nul
);
1230 BOOST_TEST(obj
.if_object() != nullptr);
1231 BOOST_TEST(arr
.if_object() == nullptr);
1232 BOOST_TEST(str
.if_object() == nullptr);
1233 BOOST_TEST(i64
.if_object() == nullptr);
1234 BOOST_TEST(u64
.if_object() == nullptr);
1235 BOOST_TEST(dub
.if_object() == nullptr);
1236 BOOST_TEST(boo
.if_object() == nullptr);
1237 BOOST_TEST(nul
.if_object() == nullptr);
1240 // if_object() const
1242 BOOST_TEST(cobj
.if_object() != nullptr);
1243 BOOST_TEST(carr
.if_object() == nullptr);
1244 BOOST_TEST(cstr
.if_object() == nullptr);
1245 BOOST_TEST(ci64
.if_object() == nullptr);
1246 BOOST_TEST(cu64
.if_object() == nullptr);
1247 BOOST_TEST(cdub
.if_object() == nullptr);
1248 BOOST_TEST(cboo
.if_object() == nullptr);
1249 BOOST_TEST(cnul
.if_object() == nullptr);
1254 BOOST_TEST(obj
.if_array() == nullptr);
1255 BOOST_TEST(arr
.if_array() != nullptr);
1256 BOOST_TEST(str
.if_array() == nullptr);
1257 BOOST_TEST(i64
.if_array() == nullptr);
1258 BOOST_TEST(u64
.if_array() == nullptr);
1259 BOOST_TEST(dub
.if_array() == nullptr);
1260 BOOST_TEST(boo
.if_array() == nullptr);
1261 BOOST_TEST(nul
.if_array() == nullptr);
1266 BOOST_TEST(cobj
.if_array() == nullptr);
1267 BOOST_TEST(carr
.if_array() != nullptr);
1268 BOOST_TEST(cstr
.if_array() == nullptr);
1269 BOOST_TEST(ci64
.if_array() == nullptr);
1270 BOOST_TEST(cu64
.if_array() == nullptr);
1271 BOOST_TEST(cdub
.if_array() == nullptr);
1272 BOOST_TEST(cboo
.if_array() == nullptr);
1273 BOOST_TEST(cnul
.if_array() == nullptr);
1278 BOOST_TEST(obj
.if_string() == nullptr);
1279 BOOST_TEST(arr
.if_string() == nullptr);
1280 BOOST_TEST(str
.if_string() != nullptr);
1281 BOOST_TEST(i64
.if_string() == nullptr);
1282 BOOST_TEST(u64
.if_string() == nullptr);
1283 BOOST_TEST(dub
.if_string() == nullptr);
1284 BOOST_TEST(boo
.if_string() == nullptr);
1285 BOOST_TEST(nul
.if_string() == nullptr);
1288 // if_string() const
1290 BOOST_TEST(cobj
.if_string() == nullptr);
1291 BOOST_TEST(carr
.if_string() == nullptr);
1292 BOOST_TEST(cstr
.if_string() != nullptr);
1293 BOOST_TEST(ci64
.if_string() == nullptr);
1294 BOOST_TEST(cu64
.if_string() == nullptr);
1295 BOOST_TEST(cdub
.if_string() == nullptr);
1296 BOOST_TEST(cboo
.if_string() == nullptr);
1297 BOOST_TEST(cnul
.if_string() == nullptr);
1302 BOOST_TEST(obj
.if_int64() == nullptr);
1303 BOOST_TEST(arr
.if_int64() == nullptr);
1304 BOOST_TEST(str
.if_int64() == nullptr);
1305 BOOST_TEST(i64
.if_int64() != nullptr);
1306 BOOST_TEST(u64
.if_int64() == nullptr);
1307 BOOST_TEST(dub
.if_int64() == nullptr);
1308 BOOST_TEST(boo
.if_int64() == nullptr);
1309 BOOST_TEST(nul
.if_int64() == nullptr);
1314 BOOST_TEST(cobj
.if_int64() == nullptr);
1315 BOOST_TEST(carr
.if_int64() == nullptr);
1316 BOOST_TEST(cstr
.if_int64() == nullptr);
1317 BOOST_TEST(ci64
.if_int64() != nullptr);
1318 BOOST_TEST(cu64
.if_int64() == nullptr);
1319 BOOST_TEST(cdub
.if_int64() == nullptr);
1320 BOOST_TEST(cboo
.if_int64() == nullptr);
1321 BOOST_TEST(cnul
.if_int64() == nullptr);
1326 BOOST_TEST(obj
.if_uint64() == nullptr);
1327 BOOST_TEST(arr
.if_uint64() == nullptr);
1328 BOOST_TEST(str
.if_uint64() == nullptr);
1329 BOOST_TEST(i64
.if_uint64() == nullptr);
1330 BOOST_TEST(u64
.if_uint64() != nullptr);
1331 BOOST_TEST(dub
.if_uint64() == nullptr);
1332 BOOST_TEST(boo
.if_uint64() == nullptr);
1333 BOOST_TEST(nul
.if_uint64() == nullptr);
1336 // if_uint64() const
1338 BOOST_TEST(cobj
.if_uint64() == nullptr);
1339 BOOST_TEST(carr
.if_uint64() == nullptr);
1340 BOOST_TEST(cstr
.if_uint64() == nullptr);
1341 BOOST_TEST(ci64
.if_uint64() == nullptr);
1342 BOOST_TEST(cu64
.if_uint64() != nullptr);
1343 BOOST_TEST(cdub
.if_uint64() == nullptr);
1344 BOOST_TEST(cboo
.if_uint64() == nullptr);
1345 BOOST_TEST(cnul
.if_uint64() == nullptr);
1350 BOOST_TEST(obj
.if_double() == nullptr);
1351 BOOST_TEST(arr
.if_double() == nullptr);
1352 BOOST_TEST(str
.if_double() == nullptr);
1353 BOOST_TEST(i64
.if_double() == nullptr);
1354 BOOST_TEST(u64
.if_double() == nullptr);
1355 BOOST_TEST(dub
.if_double() != nullptr);
1356 BOOST_TEST(boo
.if_double() == nullptr);
1357 BOOST_TEST(nul
.if_double() == nullptr);
1360 // if_double() const
1362 BOOST_TEST(cobj
.if_double() == nullptr);
1363 BOOST_TEST(carr
.if_double() == nullptr);
1364 BOOST_TEST(cstr
.if_double() == nullptr);
1365 BOOST_TEST(ci64
.if_double() == nullptr);
1366 BOOST_TEST(cu64
.if_double() == nullptr);
1367 BOOST_TEST(cdub
.if_double() != nullptr);
1368 BOOST_TEST(cboo
.if_double() == nullptr);
1369 BOOST_TEST(cnul
.if_double() == nullptr);
1374 BOOST_TEST(obj
.if_bool() == nullptr);
1375 BOOST_TEST(arr
.if_bool() == nullptr);
1376 BOOST_TEST(str
.if_bool() == nullptr);
1377 BOOST_TEST(i64
.if_bool() == nullptr);
1378 BOOST_TEST(u64
.if_bool() == nullptr);
1379 BOOST_TEST(dub
.if_bool() == nullptr);
1380 BOOST_TEST(boo
.if_bool() != nullptr);
1381 BOOST_TEST(nul
.if_bool() == nullptr);
1386 BOOST_TEST(cobj
.if_bool() == nullptr);
1387 BOOST_TEST(carr
.if_bool() == nullptr);
1388 BOOST_TEST(cstr
.if_bool() == nullptr);
1389 BOOST_TEST(ci64
.if_bool() == nullptr);
1390 BOOST_TEST(cu64
.if_bool() == nullptr);
1391 BOOST_TEST(cdub
.if_bool() == nullptr);
1392 BOOST_TEST(cboo
.if_bool() != nullptr);
1393 BOOST_TEST(cnul
.if_bool() == nullptr);
1400 #define EQAL(T) BOOST_TEST(jv.to_number<T>() == V)
1401 #define EQUS(T) BOOST_TEST((V >= 0) && jv.to_number<T>() == static_cast<std::uint64_t>(V))
1402 #define EQUF(T) BOOST_TEST(static_cast<float>(V) == static_cast<float>(jv.to_number<T>()))
1403 #define THRO(T) BOOST_TEST_THROWS(jv.to_number<T>(), system_error)
1405 BOOST_TEST_THROWS(value(nullptr).to_number
<int>(), system_error
);
1406 BOOST_TEST_THROWS(value(false).to_number
<int>(), system_error
);
1407 BOOST_TEST_THROWS(value(string_kind
).to_number
<int>(), system_error
);
1408 BOOST_TEST_THROWS(value(array_kind
).to_number
<int>(), system_error
);
1409 BOOST_TEST_THROWS(value(object_kind
).to_number
<int>(), system_error
);
1411 BOOST_TEST_THROWS(value(nullptr).to_number
<unsigned>(), system_error
);
1412 BOOST_TEST_THROWS(value(false).to_number
<unsigned>(), system_error
);
1413 BOOST_TEST_THROWS(value(string_kind
).to_number
<unsigned>(), system_error
);
1414 BOOST_TEST_THROWS(value(array_kind
).to_number
<unsigned>(), system_error
);
1415 BOOST_TEST_THROWS(value(object_kind
).to_number
<unsigned>(), system_error
);
1417 BOOST_TEST_THROWS(value(nullptr).to_number
<double>(), system_error
);
1418 BOOST_TEST_THROWS(value(false).to_number
<double>(), system_error
);
1419 BOOST_TEST_THROWS(value(string_kind
).to_number
<double>(), system_error
);
1420 BOOST_TEST_THROWS(value(array_kind
).to_number
<double>(), system_error
);
1421 BOOST_TEST_THROWS(value(object_kind
).to_number
<double>(), system_error
);
1424 unsigned char V
= 0;
1431 EQAL(std::uint16_t);
1432 EQAL(std::uint32_t);
1433 EQAL(std::uint64_t);
1438 auto V
= max_of
<std::int8_t>();
1445 EQAL(std::uint16_t);
1446 EQUS(std::uint32_t);
1447 EQUS(std::uint64_t);
1452 auto V
= max_of
<std::int16_t>();
1459 EQAL(std::uint16_t);
1460 EQUS(std::uint32_t);
1461 EQUS(std::uint64_t);
1466 auto V
= max_of
<std::int32_t>();
1473 THRO(std::uint16_t);
1474 EQUS(std::uint32_t);
1475 EQUS(std::uint64_t);
1480 auto V
= max_of
<std::int64_t>();
1487 THRO(std::uint16_t);
1488 THRO(std::uint32_t);
1489 EQUS(std::uint64_t);
1495 auto V
= max_of
<std::uint8_t>();
1502 EQAL(std::uint16_t);
1503 EQAL(std::uint32_t);
1504 EQAL(std::uint64_t);
1509 auto V
= max_of
<std::uint16_t>();
1516 EQAL(std::uint16_t);
1517 EQAL(std::uint32_t);
1518 EQAL(std::uint64_t);
1523 auto V
= max_of
<std::uint32_t>();
1530 THRO(std::uint16_t);
1531 EQAL(std::uint32_t);
1532 EQAL(std::uint64_t);
1537 auto V
= max_of
<std::uint64_t>();
1544 THRO(std::uint16_t);
1545 THRO(std::uint32_t);
1546 EQAL(std::uint64_t);
1552 auto V
= min_of
<std::int8_t>();
1559 THRO(std::uint16_t);
1560 THRO(std::uint32_t);
1561 THRO(std::uint64_t);
1566 auto V
= min_of
<std::int16_t>();
1573 THRO(std::uint16_t);
1574 THRO(std::uint32_t);
1575 THRO(std::uint64_t);
1580 auto V
= min_of
<std::int32_t>();
1587 THRO(std::uint16_t);
1588 THRO(std::uint32_t);
1589 THRO(std::uint64_t);
1594 auto V
= min_of
<std::int64_t>();
1601 THRO(std::uint16_t);
1602 THRO(std::uint32_t);
1603 THRO(std::uint64_t);
1609 auto V
= double(1.5);
1616 THRO(std::uint16_t);
1617 THRO(std::uint32_t);
1618 THRO(std::uint64_t);
1623 auto V
= double(2.0);
1630 EQAL(std::uint16_t);
1631 EQAL(std::uint32_t);
1632 EQAL(std::uint64_t);
1637 auto V
= double(-4.0);
1644 THRO(std::uint16_t);
1645 THRO(std::uint32_t);
1646 THRO(std::uint64_t);
1655 value
obj(object
{});
1657 value
str(string
{});
1658 value
i64(std::int64_t{});
1659 value
u64(std::uint64_t{});
1660 value
dub(double{});
1664 auto const& cobj(obj
);
1665 auto const& carr(arr
);
1666 auto const& cstr(str
);
1667 auto const& ci64(i64
);
1668 auto const& cu64(u64
);
1669 auto const& cdub(dub
);
1670 auto const& cboo(boo
);
1671 auto const& cnul(nul
);
1675 object
& x
= obj
.as_object();
1676 BOOST_TEST_THROWS(arr
.as_object(), std::invalid_argument
);
1677 BOOST_TEST_THROWS(str
.as_object(), std::invalid_argument
);
1678 BOOST_TEST_THROWS(i64
.as_object(), std::invalid_argument
);
1679 BOOST_TEST_THROWS(u64
.as_object(), std::invalid_argument
);
1680 BOOST_TEST_THROWS(dub
.as_object(), std::invalid_argument
);
1681 BOOST_TEST_THROWS(boo
.as_object(), std::invalid_argument
);
1682 BOOST_TEST_THROWS(nul
.as_object(), std::invalid_argument
);
1686 // as_object() const
1688 object
const& x
= cobj
.as_object();
1689 BOOST_TEST_THROWS(carr
.as_object(), std::invalid_argument
);
1690 BOOST_TEST_THROWS(cstr
.as_object(), std::invalid_argument
);
1691 BOOST_TEST_THROWS(ci64
.as_object(), std::invalid_argument
);
1692 BOOST_TEST_THROWS(cu64
.as_object(), std::invalid_argument
);
1693 BOOST_TEST_THROWS(cdub
.as_object(), std::invalid_argument
);
1694 BOOST_TEST_THROWS(cboo
.as_object(), std::invalid_argument
);
1695 BOOST_TEST_THROWS(cnul
.as_object(), std::invalid_argument
);
1701 BOOST_TEST_THROWS(obj
.as_array(), std::invalid_argument
);
1702 array
& x
= arr
.as_array();
1703 BOOST_TEST_THROWS(str
.as_array(), std::invalid_argument
);
1704 BOOST_TEST_THROWS(i64
.as_array(), std::invalid_argument
);
1705 BOOST_TEST_THROWS(u64
.as_array(), std::invalid_argument
);
1706 BOOST_TEST_THROWS(dub
.as_array(), std::invalid_argument
);
1707 BOOST_TEST_THROWS(boo
.as_array(), std::invalid_argument
);
1708 BOOST_TEST_THROWS(nul
.as_array(), std::invalid_argument
);
1714 BOOST_TEST_THROWS(cobj
.as_array(), std::invalid_argument
);
1715 array
const& x
= carr
.as_array();
1716 BOOST_TEST_THROWS(cstr
.as_array(), std::invalid_argument
);
1717 BOOST_TEST_THROWS(ci64
.as_array(), std::invalid_argument
);
1718 BOOST_TEST_THROWS(cu64
.as_array(), std::invalid_argument
);
1719 BOOST_TEST_THROWS(cdub
.as_array(), std::invalid_argument
);
1720 BOOST_TEST_THROWS(cboo
.as_array(), std::invalid_argument
);
1721 BOOST_TEST_THROWS(cnul
.as_array(), std::invalid_argument
);
1727 BOOST_TEST_THROWS(obj
.as_string(), std::invalid_argument
);
1728 BOOST_TEST_THROWS(arr
.as_string(), std::invalid_argument
);
1729 string
& x
= str
.as_string();
1730 BOOST_TEST_THROWS(i64
.as_string(), std::invalid_argument
);
1731 BOOST_TEST_THROWS(u64
.as_string(), std::invalid_argument
);
1732 BOOST_TEST_THROWS(dub
.as_string(), std::invalid_argument
);
1733 BOOST_TEST_THROWS(boo
.as_string(), std::invalid_argument
);
1734 BOOST_TEST_THROWS(nul
.as_string(), std::invalid_argument
);
1738 // as_string() const
1740 BOOST_TEST_THROWS(cobj
.as_string(), std::invalid_argument
);
1741 BOOST_TEST_THROWS(carr
.as_string(), std::invalid_argument
);
1742 string
const& x
= cstr
.as_string();
1743 BOOST_TEST_THROWS(ci64
.as_string(), std::invalid_argument
);
1744 BOOST_TEST_THROWS(cu64
.as_string(), std::invalid_argument
);
1745 BOOST_TEST_THROWS(cdub
.as_string(), std::invalid_argument
);
1746 BOOST_TEST_THROWS(cboo
.as_string(), std::invalid_argument
);
1747 BOOST_TEST_THROWS(cnul
.as_string(), std::invalid_argument
);
1753 BOOST_TEST_THROWS(obj
.as_int64(), std::invalid_argument
);
1754 BOOST_TEST_THROWS(arr
.as_int64(), std::invalid_argument
);
1755 BOOST_TEST_THROWS(str
.as_int64(), std::invalid_argument
);
1756 std::int64_t& x
= i64
.as_int64();
1757 BOOST_TEST_THROWS(u64
.as_int64(), std::invalid_argument
);
1758 BOOST_TEST_THROWS(dub
.as_int64(), std::invalid_argument
);
1759 BOOST_TEST_THROWS(boo
.as_int64(), std::invalid_argument
);
1760 BOOST_TEST_THROWS(nul
.as_int64(), std::invalid_argument
);
1766 BOOST_TEST_THROWS(cobj
.as_int64(), std::invalid_argument
);
1767 BOOST_TEST_THROWS(carr
.as_int64(), std::invalid_argument
);
1768 BOOST_TEST_THROWS(cstr
.as_int64(), std::invalid_argument
);
1769 std::int64_t const& x
= ci64
.as_int64();
1770 BOOST_TEST_THROWS(cu64
.as_int64(), std::invalid_argument
);
1771 BOOST_TEST_THROWS(cdub
.as_int64(), std::invalid_argument
);
1772 BOOST_TEST_THROWS(cboo
.as_int64(), std::invalid_argument
);
1773 BOOST_TEST_THROWS(cnul
.as_int64(), std::invalid_argument
);
1779 BOOST_TEST_THROWS(obj
.as_uint64(), std::invalid_argument
);
1780 BOOST_TEST_THROWS(arr
.as_uint64(), std::invalid_argument
);
1781 BOOST_TEST_THROWS(str
.as_uint64(), std::invalid_argument
);
1782 BOOST_TEST_THROWS(i64
.as_uint64(), std::invalid_argument
);
1783 std::uint64_t& x
= u64
.as_uint64();
1784 BOOST_TEST_THROWS(dub
.as_uint64(), std::invalid_argument
);
1785 BOOST_TEST_THROWS(boo
.as_uint64(), std::invalid_argument
);
1786 BOOST_TEST_THROWS(nul
.as_uint64(), std::invalid_argument
);
1790 // as_uint64() const
1792 BOOST_TEST_THROWS(cobj
.as_uint64(), std::invalid_argument
);
1793 BOOST_TEST_THROWS(carr
.as_uint64(), std::invalid_argument
);
1794 BOOST_TEST_THROWS(cstr
.as_uint64(), std::invalid_argument
);
1795 BOOST_TEST_THROWS(ci64
.as_uint64(), std::invalid_argument
);
1796 std::uint64_t const& x
= cu64
.as_uint64();
1797 BOOST_TEST_THROWS(cdub
.as_uint64(), std::invalid_argument
);
1798 BOOST_TEST_THROWS(cboo
.as_uint64(), std::invalid_argument
);
1799 BOOST_TEST_THROWS(cnul
.as_uint64(), std::invalid_argument
);
1805 BOOST_TEST_THROWS(obj
.as_double(), std::invalid_argument
);
1806 BOOST_TEST_THROWS(arr
.as_double(), std::invalid_argument
);
1807 BOOST_TEST_THROWS(str
.as_double(), std::invalid_argument
);
1808 BOOST_TEST_THROWS(i64
.as_double(), std::invalid_argument
);
1809 BOOST_TEST_THROWS(u64
.as_double(), std::invalid_argument
);
1810 double& x
= dub
.as_double();
1811 BOOST_TEST_THROWS(boo
.as_double(), std::invalid_argument
);
1812 BOOST_TEST_THROWS(nul
.as_double(), std::invalid_argument
);
1816 // as_double() const
1818 BOOST_TEST_THROWS(cobj
.as_double(), std::invalid_argument
);
1819 BOOST_TEST_THROWS(carr
.as_double(), std::invalid_argument
);
1820 BOOST_TEST_THROWS(cstr
.as_double(), std::invalid_argument
);
1821 BOOST_TEST_THROWS(ci64
.as_double(), std::invalid_argument
);
1822 BOOST_TEST_THROWS(cu64
.as_double(), std::invalid_argument
);
1823 double const& x
= cdub
.as_double();
1824 BOOST_TEST_THROWS(cboo
.as_double(), std::invalid_argument
);
1825 BOOST_TEST_THROWS(cnul
.as_double(), std::invalid_argument
);
1831 BOOST_TEST_THROWS(obj
.as_bool(), std::invalid_argument
);
1832 BOOST_TEST_THROWS(arr
.as_bool(), std::invalid_argument
);
1833 BOOST_TEST_THROWS(str
.as_bool(), std::invalid_argument
);
1834 BOOST_TEST_THROWS(i64
.as_bool(), std::invalid_argument
);
1835 BOOST_TEST_THROWS(u64
.as_bool(), std::invalid_argument
);
1836 BOOST_TEST_THROWS(dub
.as_bool(), std::invalid_argument
);
1837 bool& x
= boo
.as_bool();
1838 BOOST_TEST_THROWS(nul
.as_bool(), std::invalid_argument
);
1844 BOOST_TEST_THROWS(cobj
.as_bool(), std::invalid_argument
);
1845 BOOST_TEST_THROWS(carr
.as_bool(), std::invalid_argument
);
1846 BOOST_TEST_THROWS(cstr
.as_bool(), std::invalid_argument
);
1847 BOOST_TEST_THROWS(ci64
.as_bool(), std::invalid_argument
);
1848 BOOST_TEST_THROWS(cu64
.as_bool(), std::invalid_argument
);
1849 BOOST_TEST_THROWS(cdub
.as_bool(), std::invalid_argument
);
1850 bool const&x
= cboo
.as_bool();
1851 BOOST_TEST_THROWS(cnul
.as_bool(), std::invalid_argument
);
1859 value
obj(object
{});
1861 value
str(string
{});
1862 value
i64(std::int64_t{});
1863 value
u64(std::uint64_t{});
1864 value
dub(double{});
1867 auto const& cobj(obj
);
1868 auto const& carr(arr
);
1869 auto const& cstr(str
);
1870 auto const& ci64(i64
);
1871 auto const& cu64(u64
);
1872 auto const& cdub(dub
);
1873 auto const& cboo(boo
);
1883 object
& xobj
= obj
.get_object();
1884 array
& xarr
= arr
.get_array();
1885 string
& xstr
= str
.get_string();
1886 std::int64_t& xi64
= i64
.get_int64();
1887 std::uint64_t& xu64
= u64
.get_uint64();
1888 double& xdub
= dub
.get_double();
1889 bool& xboo
= boo
.get_bool();
1900 // get_object() const
1901 // get_array() const
1902 // get_string() const
1903 // get_int64() const
1904 // get_uint64() const
1905 // get_double() const
1908 object
const& xobj
= cobj
.get_object();
1909 array
const& xarr
= carr
.get_array();
1910 string
const& xstr
= cstr
.get_string();
1912 const& xi64
= ci64
.get_int64();
1914 const& xu64
= cu64
.get_uint64();
1915 double const& xdub
= cdub
.get_double();
1916 bool const& xboo
= cboo
.get_bool();
1933 {{"k1", "value"}, {"k2", nullptr}}
1934 ).at("k1").as_string() == "value");
1935 BOOST_TEST_THROWS(value(
1936 {{"k1", "value"}, {"k2", nullptr}}
1942 value({true,2,"3"}).at(1).as_int64() == 2);
1944 BOOST_TEST_THROWS( value({false,2,false}).at(4), std::out_of_range
);
1945 BOOST_TEST_THROWS( value({false,2,"3"}).at(4), std::out_of_range
);
1946 BOOST_TEST_THROWS( value({false,false}).at(4), std::out_of_range
);
1947 BOOST_TEST_THROWS( value({false,2}).at(4), std::out_of_range
);
1948 BOOST_TEST_THROWS( value({false,2,"3",nullptr}).at(4), std::out_of_range
);
1949 BOOST_TEST_THROWS( value({2,false,"3"}).at(4), std::out_of_range
);
1950 BOOST_TEST_THROWS( value({true,2,"3"}).at(4), std::out_of_range
);
1953 //------------------------------------------------------
1958 using kvp
= key_value_pair
;
1960 kvp
v1("key", "value");
1962 BOOST_TEST(v2
.key() == "key");
1964 v2
.value().get_string() == "value");
1965 kvp
v3(std::move(v2
));
1966 BOOST_TEST(v3
.key() == "key");
1968 v3
.value().get_string() == "value");
1969 BOOST_TEST(std::memcmp(
1970 v3
.key_c_str(), "key\0", 4) == 0);
1972 BOOST_STATIC_ASSERT(std::tuple_size
<key_value_pair
>::value
== 2);
1973 BOOST_TEST(get
<0>(v3
) == "key");
1975 get
<1>(v3
).get_string() == "value");
1977 BOOST_STATIC_ASSERT(std::is_same
<
1978 decltype(get
<1>(std::declval
<kvp
>())), json::value
&&>::value
);
1980 #if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
1981 auto const [kc
, vc
] = v1
;
1982 static_assert(std::is_same
<decltype(kc
), string_view
const>::value
);
1983 static_assert(std::is_same
<decltype(vc
), value
const&>::value
);
1984 BOOST_TEST(kc
== "key");
1985 BOOST_TEST(&vc
!= &v1
.value());
1987 auto& [kr
, vr
] = v1
;
1988 static_assert(std::is_same
<decltype(kr
), string_view
const>::value
);
1989 static_assert(std::is_same
<decltype(vr
), value
&>::value
);
1990 BOOST_TEST(kr
== "key");
1991 BOOST_TEST(&vr
== &v1
.value());
1993 auto const& [kcr
, vcr
] = v1
;
1994 static_assert(std::is_same
<decltype(kcr
), string_view
const>::value
);
1995 static_assert(std::is_same
<decltype(vcr
), value
const&>::value
);
1996 BOOST_TEST(kcr
== "key");
1997 BOOST_TEST(&vcr
== &v1
.value());
1999 const kvp
v4("const key", "const value");
2000 auto& [ckr
, cvr
] = v4
;
2001 static_assert(std::is_same
<decltype(ckr
), string_view
const>::value
);
2002 static_assert(std::is_same
<decltype(cvr
), value
const&>::value
);
2003 BOOST_TEST(ckr
== "const key");
2004 BOOST_TEST(&cvr
== &v4
.value());
2008 //------------------------------------------------------
2011 testStdConstruction()
2014 value
jv(std::string("test"));
2021 check_array(value
{0,0,0}, 0, 0, 0);
2022 check_array(value
{false,false,false}, false, false, false);
2023 check_array(value
{false,2,false}, false, 2, false);
2024 check_array(value
{false,2,"3"}, false, 2, "3");
2025 check_array(value
{false,false}, false, false);
2026 check_array(value
{false,2}, false, 2);
2027 check_array(value
{false,2,"3",nullptr}, false, 2, "3", nullptr);
2028 check_array(value
{2,false,"3"}, 2, false, "3");
2029 check_array(value
{true,2,"3"}, true, 2, "3");
2032 //------------------------------------------------------
2037 BOOST_TEST(value(nullptr) == value(nullptr));
2038 BOOST_TEST(value(nullptr) != value(true));
2040 BOOST_TEST(value(false) == value(false));
2041 BOOST_TEST(value(true) != value(false));
2042 BOOST_TEST(value(true) != value(nullptr));
2044 BOOST_TEST(value( 1) == value( 1));
2045 BOOST_TEST(value( 1) != value( 2));
2046 BOOST_TEST(value(-1) == value(-1));
2047 BOOST_TEST(value(-1) != value(-2));
2048 BOOST_TEST(value(-1) != value( 2));
2049 BOOST_TEST(value( 1) == value( 1UL));
2050 BOOST_TEST(value( 1) != value( 2UL));
2051 BOOST_TEST(value(-1) != value( 1UL));
2052 BOOST_TEST(value(-1) != value(nullptr));
2054 BOOST_TEST(value(1UL) == value( 1UL));
2055 BOOST_TEST(value(1UL) != value( 2UL));
2056 BOOST_TEST(value(1UL) == value( 1));
2057 BOOST_TEST(value(1UL) != value(-1));
2058 BOOST_TEST(value(1UL) != value(nullptr));
2060 BOOST_TEST(value(1.5) == value(1.5));
2061 BOOST_TEST(value(1.5) != value(2.5));
2062 BOOST_TEST(value(1.5) != value(false));
2063 BOOST_TEST(value(2.0) != value(2));
2065 BOOST_TEST(value("abc") == value("abc"));
2066 BOOST_TEST(value("abc") != value("xyz"));
2067 BOOST_TEST(value("abc") != value("x"));
2068 BOOST_TEST(value("abc") != value(nullptr));
2070 BOOST_TEST(value({1,2,3}) == value({1,2,3}));
2071 BOOST_TEST(value({1,2,3}) != value({2,3,1}));
2072 BOOST_TEST(value({1,2,3}) != value({2,3,4}));
2073 BOOST_TEST(value({1,2,3}) != value(nullptr));
2075 {"a",1}, {"b",2}, {"c",3} }) == value({
2076 {"a",1}, {"b",2}, {"c",3} }));
2078 {"a",1}, {"b",2}, {"c",3} }) == value({
2079 {"c",3}, {"a",1}, {"b",2} }));
2081 {"a",1}, {"b",2}, {"c",3} }) != value({
2082 {"b",1}, {"c",2}, {"d",3} }));
2084 {"a",1}, {"b",2}, {"c",3} }) != value({
2085 {"a",2}, {"b",3}, {"c",4} }));
2087 {"a",1}, {"b",2}, {"c",3} }) != value(nullptr));
2090 //------------------------------------------------------
2108 testStdConstruction();
2114 TEST_SUITE(value_test
, "boost.json.value");