| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572 |
- // __ _____ _____ _____
- // __| | __| | | | JSON for Modern C++ (supporting code)
- // | | |__ | | | | | | version 3.11.2
- // |_____|_____|_____|_|___| https://github.com/nlohmann/json
- //
- // Copyright (c) 2013-2022 Niels Lohmann <http://nlohmann.me>.
- // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
- // SPDX-License-Identifier: MIT
- // cmake/test.cmake selects the C++ standard versions with which to build a
- // unit test based on the presence of JSON_HAS_CPP_<VERSION> macros.
- // When using macros that are only defined for particular versions of the standard
- // (e.g., JSON_HAS_FILESYSTEM for C++17 and up), please mention the corresponding
- // version macro in a comment close by, like this:
- // JSON_HAS_CPP_<VERSION> (do not remove; see note at top of file)
- #include "doctest_compatibility.h"
- #define JSON_TESTS_PRIVATE
- #include <nlohmann/json.hpp>
- using nlohmann::json;
- #include <deque>
- #include <forward_list>
- #include <list>
- #include <set>
- #include <unordered_map>
- #include <unordered_set>
- #include <valarray>
- // NLOHMANN_JSON_SERIALIZE_ENUM uses a static std::pair
- DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
- DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
- TEST_CASE("value conversion")
- {
- SECTION("get an object (explicit)")
- {
- const json::object_t o_reference = {{"object", json::object()},
- {"array", {1, 2, 3, 4}},
- {"number", 42},
- {"boolean", false},
- {"null", nullptr},
- {"string", "Hello world"}
- };
- json j(o_reference);
- SECTION("json::object_t")
- {
- json::object_t const o = j.get<json::object_t>();
- CHECK(json(o) == j);
- }
- SECTION("std::map<json::string_t, json>")
- {
- const std::map<json::string_t, json> o =
- j.get<std::map<json::string_t, json>>();
- CHECK(json(o) == j);
- }
- SECTION("std::multimap<json::string_t, json>")
- {
- const std::multimap<json::string_t, json> o =
- j.get<std::multimap<json::string_t, json>>();
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_map<json::string_t, json>")
- {
- const std::unordered_map<json::string_t, json> o =
- j.get<std::unordered_map<json::string_t, json>>();
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_multimap<json::string_t, json>")
- {
- const std::unordered_multimap<json::string_t, json> o =
- j.get<std::unordered_multimap<json::string_t, json>>();
- CHECK(json(o) == j);
- }
- SECTION("exception in case of a non-object type")
- {
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::array).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::string).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::boolean).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, "
- "but is boolean", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_integer).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_unsigned).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_float).get<json::object_t>(),
- "[json.exception.type_error.302] type must be object, but is number", json::type_error&);
- }
- }
- SECTION("get an object (explicit, get_to)")
- {
- const json::object_t o_reference = {{"object", json::object()},
- {"array", {1, 2, 3, 4}},
- {"number", 42},
- {"boolean", false},
- {"null", nullptr},
- {"string", "Hello world"}
- };
- json j(o_reference);
- SECTION("json::object_t")
- {
- json::object_t o = {{"previous", "value"}};
- j.get_to(o);
- CHECK(json(o) == j);
- }
- SECTION("std::map<json::string_t, json>")
- {
- std::map<json::string_t, json> o{{"previous", "value"}};
- j.get_to(o);
- CHECK(json(o) == j);
- }
- SECTION("std::multimap<json::string_t, json>")
- {
- std::multimap<json::string_t, json> o{{"previous", "value"}};
- j.get_to(o);
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_map<json::string_t, json>")
- {
- std::unordered_map<json::string_t, json> o{{"previous", "value"}};
- j.get_to(o);
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_multimap<json::string_t, json>")
- {
- std::unordered_multimap<json::string_t, json> o{{"previous", "value"}};
- j.get_to(o);
- CHECK(json(o) == j);
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get an object (implicit)")
- {
- const json::object_t o_reference = {{"object", json::object()},
- {"array", {1, 2, 3, 4}},
- {"number", 42},
- {"boolean", false},
- {"null", nullptr},
- {"string", "Hello world"}
- };
- json j(o_reference);
- SECTION("json::object_t")
- {
- const json::object_t o = j;
- CHECK(json(o) == j);
- }
- SECTION("std::map<json::string_t, json>")
- {
- const std::map<json::string_t, json> o = j;
- CHECK(json(o) == j);
- }
- SECTION("std::multimap<json::string_t, json>")
- {
- const std::multimap<json::string_t, json> o = j;
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_map<json::string_t, json>")
- {
- const std::unordered_map<json::string_t, json> o = j;
- CHECK(json(o) == j);
- }
- SECTION("std::unordered_multimap<json::string_t, json>")
- {
- const std::unordered_multimap<json::string_t, json> o = j;
- CHECK(json(o) == j);
- }
- }
- #endif
- SECTION("get an array (explicit)")
- {
- const json::array_t a_reference{json(1), json(1u), json(2.2),
- json(false), json("string"), json()};
- json j(a_reference);
- SECTION("json::array_t")
- {
- const json::array_t a = j.get<json::array_t>();
- CHECK(json(a) == j);
- }
- SECTION("std::list<json>")
- {
- const std::list<json> a = j.get<std::list<json>>();
- CHECK(json(a) == j);
- }
- SECTION("std::forward_list<json>")
- {
- const std::forward_list<json> a = j.get<std::forward_list<json>>();
- CHECK(json(a) == j);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<std::forward_list<json>>(),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- }
- SECTION("std::vector<json>")
- {
- const std::vector<json> a = j.get<std::vector<json>>();
- CHECK(json(a) == j);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<std::vector<json>>(),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- #if !defined(JSON_NOEXCEPTION)
- SECTION("reserve is called on containers that supports it")
- {
- // make sure all values are properly copied
- const json j2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
- auto v2 = j2.get<std::vector<int>>();
- CHECK(v2.size() == 10);
- }
- #endif
- }
- SECTION("built-in arrays")
- {
- const char str[] = "a string"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
- const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
- const json j2 = nbs;
- const json j3 = str;
- auto v = j2.get<std::vector<int>>();
- auto s = j3.get<std::string>();
- CHECK(std::equal(v.begin(), v.end(), std::begin(nbs)));
- CHECK(s == str);
- }
- SECTION("std::deque<json>")
- {
- const std::deque<json> a = j.get<std::deque<json>>();
- CHECK(json(a) == j);
- }
- SECTION("exception in case of a non-array type")
- {
- CHECK_THROWS_WITH_AS(
- json(json::value_t::object).get<std::vector<int>>(),
- "[json.exception.type_error.302] type must be array, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::object).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::string).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::boolean).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is boolean", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_integer).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_unsigned).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_float).get<json::array_t>(),
- "[json.exception.type_error.302] type must be array, but is number", json::type_error&);
- }
- }
- SECTION("get an array (explicit, get_to)")
- {
- const json::array_t a_reference{json(1), json(1u), json(2.2),
- json(false), json("string"), json()};
- json j(a_reference);
- SECTION("json::array_t")
- {
- json::array_t a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- SECTION("std::valarray<json>")
- {
- std::valarray<json> a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- SECTION("std::list<json>")
- {
- std::list<json> a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- SECTION("std::forward_list<json>")
- {
- std::forward_list<json> a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- SECTION("std::vector<json>")
- {
- std::vector<json> a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- SECTION("built-in arrays")
- {
- const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
- int nbs2[] = {0, 0, 0}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
- const json j2 = nbs;
- j2.get_to(nbs2);
- CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
- }
- SECTION("std::deque<json>")
- {
- std::deque<json> a{"previous", "value"};
- j.get_to(a);
- CHECK(json(a) == j);
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get an array (implicit)")
- {
- const json::array_t a_reference{json(1), json(1u), json(2.2),
- json(false), json("string"), json()};
- json j(a_reference);
- SECTION("json::array_t")
- {
- const json::array_t a = j;
- CHECK(json(a) == j);
- }
- SECTION("std::list<json>")
- {
- const std::list<json> a = j;
- CHECK(json(a) == j);
- }
- SECTION("std::forward_list<json>")
- {
- const std::forward_list<json> a = j;
- CHECK(json(a) == j);
- }
- SECTION("std::vector<json>")
- {
- const std::vector<json> a = j;
- CHECK(json(a) == j);
- }
- SECTION("std::deque<json>")
- {
- const std::deque<json> a = j;
- CHECK(json(a) == j);
- }
- }
- #endif
- SECTION("get a string (explicit)")
- {
- const json::string_t s_reference{"Hello world"};
- json j(s_reference);
- SECTION("string_t")
- {
- const json::string_t s = j.get<json::string_t>();
- CHECK(json(s) == j);
- }
- SECTION("std::string")
- {
- const std::string s = j.get<std::string>();
- CHECK(json(s) == j);
- }
- #if defined(JSON_HAS_CPP_17)
- SECTION("std::string_view")
- {
- std::string_view const s = j.get<std::string_view>();
- CHECK(json(s) == j);
- }
- #endif
- SECTION("exception in case of a non-string type")
- {
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::object).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::array).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::boolean).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, "
- "but is boolean", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_integer).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_unsigned).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_float).get<json::string_t>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- }
- #if defined(JSON_HAS_CPP_17)
- SECTION("exception in case of a non-string type using string_view")
- {
- CHECK_THROWS_WITH_AS(json(json::value_t::null).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::object).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::array).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::boolean).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is boolean", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_integer).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_unsigned).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_float).get<std::string_view>(),
- "[json.exception.type_error.302] type must be string, but is number", json::type_error&);
- }
- #endif
- }
- SECTION("get a string (explicit, get_to)")
- {
- const json::string_t s_reference{"Hello world"};
- json j(s_reference);
- SECTION("string_t")
- {
- json::string_t s = "previous value";
- j.get_to(s);
- CHECK(json(s) == j);
- }
- SECTION("std::string")
- {
- std::string s = "previous value";
- j.get_to(s);
- CHECK(json(s) == j);
- }
- #if defined(JSON_HAS_CPP_17)
- SECTION("std::string_view")
- {
- std::string const s = "previous value";
- std::string_view sv = s;
- j.get_to(sv);
- CHECK(json(sv) == j);
- }
- #endif
- }
- SECTION("get null (explicit)")
- {
- std::nullptr_t n = nullptr;
- const json j(n);
- auto n2 = j.get<std::nullptr_t>();
- CHECK(n2 == n);
- CHECK_THROWS_WITH_AS(json(json::value_t::string).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::object).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::array).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::boolean).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is boolean", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_integer).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_unsigned).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is number", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::number_float).get<std::nullptr_t>(),
- "[json.exception.type_error.302] type must be null, but is number", json::type_error&);
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get a string (implicit)")
- {
- const json::string_t s_reference{"Hello world"};
- json j(s_reference);
- SECTION("string_t")
- {
- const json::string_t s = j;
- CHECK(json(s) == j);
- }
- #if defined(JSON_HAS_CPP_17)
- SECTION("std::string_view")
- {
- std::string_view const s = j.get<std::string_view>();
- CHECK(json(s) == j);
- }
- #endif
- SECTION("std::string")
- {
- const std::string s = j;
- CHECK(json(s) == j);
- }
- }
- #endif
- SECTION("get a boolean (explicit)")
- {
- const json::boolean_t b_reference{true};
- json j(b_reference);
- SECTION("boolean_t")
- {
- auto b = j.get<json::boolean_t>();
- CHECK(json(b) == j);
- }
- SECTION("uint8_t")
- {
- auto n = j.get<uint8_t>();
- CHECK(n == 1);
- }
- SECTION("bool")
- {
- const bool b = j.get<bool>();
- CHECK(json(b) == j);
- }
- SECTION("exception in case of a non-number type")
- {
- CHECK_THROWS_AS(json(json::value_t::string).get<uint8_t>(),
- json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::object).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, "
- "but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::array).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(json(json::value_t::string).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, "
- "but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_integer).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, but is "
- "number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_unsigned).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, but is "
- "number", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::number_float).get<json::boolean_t>(),
- "[json.exception.type_error.302] type must be boolean, but is "
- "number", json::type_error&);
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get a boolean (implicit)")
- {
- const json::boolean_t b_reference{true};
- json j(b_reference);
- SECTION("boolean_t")
- {
- const json::boolean_t b = j;
- CHECK(json(b) == j);
- }
- SECTION("bool")
- {
- const bool b = j;
- CHECK(json(b) == j);
- }
- }
- #endif
- SECTION("get an integer number (explicit)")
- {
- const json::number_integer_t n_reference{42};
- json j(n_reference);
- const json::number_unsigned_t n_unsigned_reference{42u};
- json j_unsigned(n_unsigned_reference);
- SECTION("number_integer_t")
- {
- auto n = j.get<json::number_integer_t>();
- CHECK(json(n) == j);
- }
- SECTION("number_unsigned_t")
- {
- auto n = j_unsigned.get<json::number_unsigned_t>();
- CHECK(json(n) == j_unsigned);
- }
- SECTION("short")
- {
- auto n = j.get<short>();
- CHECK(json(n) == j);
- }
- SECTION("unsigned short")
- {
- auto n = j.get<unsigned short>();
- CHECK(json(n) == j);
- }
- SECTION("int")
- {
- const int n = j.get<int>();
- CHECK(json(n) == j);
- }
- SECTION("unsigned int")
- {
- auto n = j.get<unsigned int>();
- CHECK(json(n) == j);
- }
- SECTION("long")
- {
- const long n = j.get<long>();
- CHECK(json(n) == j);
- }
- SECTION("unsigned long")
- {
- auto n = j.get<unsigned long>();
- CHECK(json(n) == j);
- }
- SECTION("long long")
- {
- auto n = j.get<long long>();
- CHECK(json(n) == j);
- }
- SECTION("unsigned long long")
- {
- auto n = j.get<unsigned long long>();
- CHECK(json(n) == j);
- }
- SECTION("int8_t")
- {
- auto n = j.get<int8_t>();
- CHECK(json(n) == j);
- }
- SECTION("int16_t")
- {
- auto n = j.get<int16_t>();
- CHECK(json(n) == j);
- }
- SECTION("int32_t")
- {
- auto n = j.get<int32_t>();
- CHECK(json(n) == j);
- }
- SECTION("int64_t")
- {
- auto n = j.get<int64_t>();
- CHECK(json(n) == j);
- }
- SECTION("int8_fast_t")
- {
- auto n = j.get<int_fast8_t>();
- CHECK(json(n) == j);
- }
- SECTION("int16_fast_t")
- {
- auto n = j.get<int_fast16_t>();
- CHECK(json(n) == j);
- }
- SECTION("int32_fast_t")
- {
- auto n = j.get<int_fast32_t>();
- CHECK(json(n) == j);
- }
- SECTION("int64_fast_t")
- {
- auto n = j.get<int_fast64_t>();
- CHECK(json(n) == j);
- }
- SECTION("int8_least_t")
- {
- auto n = j.get<int_least8_t>();
- CHECK(json(n) == j);
- }
- SECTION("int16_least_t")
- {
- auto n = j.get<int_least16_t>();
- CHECK(json(n) == j);
- }
- SECTION("int32_least_t")
- {
- auto n = j.get<int_least32_t>();
- CHECK(json(n) == j);
- }
- SECTION("int64_least_t")
- {
- auto n = j.get<int_least64_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint8_t")
- {
- auto n = j.get<uint8_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint16_t")
- {
- auto n = j.get<uint16_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint32_t")
- {
- auto n = j.get<uint32_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint64_t")
- {
- auto n = j.get<uint64_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint8_fast_t")
- {
- auto n = j.get<uint_fast8_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint16_fast_t")
- {
- auto n = j.get<uint_fast16_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint32_fast_t")
- {
- auto n = j.get<uint_fast32_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint64_fast_t")
- {
- auto n = j.get<uint_fast64_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint8_least_t")
- {
- auto n = j.get<uint_least8_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint16_least_t")
- {
- auto n = j.get<uint_least16_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint32_least_t")
- {
- auto n = j.get<uint_least32_t>();
- CHECK(json(n) == j);
- }
- SECTION("uint64_least_t")
- {
- auto n = j.get<uint_least64_t>();
- CHECK(json(n) == j);
- }
- SECTION("exception in case of a non-number type")
- {
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::number_integer_t>(),
- "[json.exception.type_error.302] type must be number, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::object).get<json::number_integer_t>(),
- "[json.exception.type_error.302] type must be number, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::array).get<json::number_integer_t>(),
- "[json.exception.type_error.302] type must be number, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::string).get<json::number_integer_t>(),
- "[json.exception.type_error.302] type must be number, but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::boolean).get<json::number_integer_t>(),
- "[json.exception.type_error.302] type must be number, but is "
- "boolean", json::type_error&);
- CHECK_NOTHROW(
- json(json::value_t::number_float).get<json::number_integer_t>());
- CHECK_NOTHROW(
- json(json::value_t::number_float).get<json::number_unsigned_t>());
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get an integer number (implicit)")
- {
- json::number_integer_t const n_reference{42};
- json j(n_reference);
- json::number_unsigned_t const n_unsigned_reference{42u};
- json j_unsigned(n_unsigned_reference);
- SECTION("number_integer_t")
- {
- auto n = j.get<json::number_integer_t>();
- CHECK(json(n) == j);
- }
- SECTION("number_unsigned_t")
- {
- auto n = j_unsigned.get<json::number_unsigned_t>();
- CHECK(json(n) == j_unsigned);
- }
- SECTION("short")
- {
- short const n = j;
- CHECK(json(n) == j);
- }
- SECTION("unsigned short")
- {
- unsigned short const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("int")
- {
- int const n = j;
- CHECK(json(n) == j);
- }
- SECTION("unsigned int")
- {
- unsigned int const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("long")
- {
- long const n = j;
- CHECK(json(n) == j);
- }
- SECTION("unsigned long")
- {
- unsigned long const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("long long")
- {
- long long const n = j;
- CHECK(json(n) == j);
- }
- SECTION("unsigned long long")
- {
- unsigned long long const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("int8_t")
- {
- int8_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int16_t")
- {
- int16_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int32_t")
- {
- int32_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int64_t")
- {
- int64_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int8_fast_t")
- {
- int_fast8_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int16_fast_t")
- {
- int_fast16_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int32_fast_t")
- {
- int_fast32_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int64_fast_t")
- {
- int_fast64_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int8_least_t")
- {
- int_least8_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int16_least_t")
- {
- int_least16_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int32_least_t")
- {
- int_least32_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("int64_least_t")
- {
- int_least64_t const n = j;
- CHECK(json(n) == j);
- }
- SECTION("uint8_t")
- {
- uint8_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint16_t")
- {
- uint16_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint32_t")
- {
- uint32_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint64_t")
- {
- uint64_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint8_fast_t")
- {
- uint_fast8_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint16_fast_t")
- {
- uint_fast16_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint32_fast_t")
- {
- uint_fast32_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint64_fast_t")
- {
- uint_fast64_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint8_least_t")
- {
- uint_least8_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint16_least_t")
- {
- uint_least16_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint32_least_t")
- {
- uint_least32_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- SECTION("uint64_least_t")
- {
- uint_least64_t const n = j_unsigned;
- CHECK(json(n) == j_unsigned);
- }
- }
- #endif
- SECTION("get a floating-point number (explicit)")
- {
- json::number_float_t const n_reference{42.23};
- json const j(n_reference);
- SECTION("number_float_t")
- {
- auto n = j.get<json::number_float_t>();
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- SECTION("float")
- {
- auto n = j.get<float>();
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- SECTION("double")
- {
- auto n = j.get<double>();
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- SECTION("exception in case of a non-string type")
- {
- CHECK_THROWS_WITH_AS(
- json(json::value_t::null).get<json::number_float_t>(),
- "[json.exception.type_error.302] type must be number, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::object).get<json::number_float_t>(),
- "[json.exception.type_error.302] type must be number, but is object", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::array).get<json::number_float_t>(),
- "[json.exception.type_error.302] type must be number, but is array", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::string).get<json::number_float_t>(),
- "[json.exception.type_error.302] type must be number, but is string", json::type_error&);
- CHECK_THROWS_WITH_AS(
- json(json::value_t::boolean).get<json::number_float_t>(),
- "[json.exception.type_error.302] type must be number, but is "
- "boolean", json::type_error&);
- CHECK_NOTHROW(
- json(json::value_t::number_integer).get<json::number_float_t>());
- CHECK_NOTHROW(
- json(json::value_t::number_unsigned).get<json::number_float_t>());
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get a floating-point number (implicit)")
- {
- json::number_float_t const n_reference{42.23};
- json const j(n_reference);
- SECTION("number_float_t")
- {
- json::number_float_t const n = j;
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- SECTION("float")
- {
- float const n = j;
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- SECTION("double")
- {
- double const n = j;
- CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
- }
- }
- #endif
- SECTION("get a binary value (explicit)")
- {
- json::binary_t const n_reference{{1, 2, 3}};
- json j(n_reference);
- SECTION("binary_t")
- {
- json::binary_t const b = j.get<json::binary_t>();
- CHECK(*json(b).m_value.binary == *j.m_value.binary);
- }
- SECTION("get_binary()")
- {
- SECTION("non-const")
- {
- auto& b = j.get_binary();
- CHECK(*json(b).m_value.binary == *j.m_value.binary);
- }
- SECTION("non-const")
- {
- const json j_const = j;
- const auto& b = j_const.get_binary();
- CHECK(*json(b).m_value.binary == *j.m_value.binary);
- }
- }
- SECTION("exception in case of a non-string type")
- {
- json j_null(json::value_t::null);
- json j_object(json::value_t::object);
- json j_array(json::value_t::array);
- json j_string(json::value_t::string);
- json j_boolean(json::value_t::boolean);
- const json j_null_const(json::value_t::null);
- const json j_object_const(json::value_t::object);
- const json j_array_const(json::value_t::array);
- const json j_string_const(json::value_t::string);
- const json j_boolean_const(json::value_t::boolean);
- CHECK_THROWS_WITH_AS(j_null.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is null",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_object.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is object",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_array.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is array",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_string.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is string",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_boolean.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is boolean",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_null_const.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is null",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_object_const.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is object",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_array_const.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is array",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_string_const.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is string",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_boolean_const.get<json::binary_t>(),
- "[json.exception.type_error.302] type must be binary, but is boolean",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_null.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is null",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_object.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is object",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_array.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is array",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_string.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is string",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_boolean.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is boolean",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_null_const.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is null",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_object_const.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is object",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_array_const.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is array",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_string_const.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is string",
- json::type_error&);
- CHECK_THROWS_WITH_AS(j_boolean_const.get_binary(),
- "[json.exception.type_error.302] type must be binary, but is boolean",
- json::type_error&);
- }
- }
- #if JSON_USE_IMPLICIT_CONVERSIONS
- SECTION("get a binary value (implicit)")
- {
- json::binary_t const n_reference{{1, 2, 3}};
- json const j(n_reference);
- SECTION("binary_t")
- {
- json::binary_t const b = j;
- CHECK(*json(b).m_value.binary == *j.m_value.binary);
- }
- }
- #endif
- SECTION("get an enum")
- {
- enum c_enum { value_1, value_2 };
- enum class cpp_enum { value_1, value_2 };
- CHECK(json(value_1).get<c_enum>() == value_1);
- CHECK(json(cpp_enum::value_1).get<cpp_enum>() == cpp_enum::value_1);
- }
- SECTION("more involved conversions")
- {
- SECTION("object-like STL containers")
- {
- json const j1 = {{"one", 1}, {"two", 2}, {"three", 3}};
- json const j2 = {{"one", 1u}, {"two", 2u}, {"three", 3u}};
- json const j3 = {{"one", 1.1}, {"two", 2.2}, {"three", 3.3}};
- json const j4 = {{"one", true}, {"two", false}, {"three", true}};
- json const j5 = {{"one", "eins"}, {"two", "zwei"}, {"three", "drei"}};
- SECTION("std::map")
- {
- j1.get<std::map<std::string, int>>();
- j2.get<std::map<std::string, unsigned int>>();
- j3.get<std::map<std::string, double>>();
- j4.get<std::map<std::string, bool>>();
- j5.get<std::map<std::string, std::string>>();
- }
- SECTION("std::unordered_map")
- {
- j1.get<std::unordered_map<std::string, int>>();
- j2.get<std::unordered_map<std::string, unsigned int>>();
- j3.get<std::unordered_map<std::string, double>>();
- j4.get<std::unordered_map<std::string, bool>>();
- j5.get<std::unordered_map<std::string, std::string>>();
- // CHECK(m5["one"] == "eins");
- }
- SECTION("std::multimap")
- {
- j1.get<std::multimap<std::string, int>>();
- j2.get<std::multimap<std::string, unsigned int>>();
- j3.get<std::multimap<std::string, double>>();
- j4.get<std::multimap<std::string, bool>>();
- j5.get<std::multimap<std::string, std::string>>();
- // CHECK(m5["one"] == "eins");
- }
- SECTION("std::unordered_multimap")
- {
- j1.get<std::unordered_multimap<std::string, int>>();
- j2.get<std::unordered_multimap<std::string, unsigned int>>();
- j3.get<std::unordered_multimap<std::string, double>>();
- j4.get<std::unordered_multimap<std::string, bool>>();
- j5.get<std::unordered_multimap<std::string, std::string>>();
- // CHECK(m5["one"] == "eins");
- }
- SECTION("exception in case of a non-object type")
- {
- CHECK_THROWS_WITH_AS(
- (json().get<std::map<std::string, int>>()),
- "[json.exception.type_error.302] type must be object, but is null", json::type_error&);
- }
- }
- SECTION("array-like STL containers")
- {
- json const j1 = {1, 2, 3, 4};
- json const j2 = {1u, 2u, 3u, 4u};
- json const j3 = {1.2, 2.3, 3.4, 4.5};
- json const j4 = {true, false, true};
- json const j5 = {"one", "two", "three"};
- SECTION("std::list")
- {
- j1.get<std::list<int>>();
- j2.get<std::list<unsigned int>>();
- j3.get<std::list<double>>();
- j4.get<std::list<bool>>();
- j5.get<std::list<std::string>>();
- }
- SECTION("std::forward_list")
- {
- j1.get<std::forward_list<int>>();
- j2.get<std::forward_list<unsigned int>>();
- j3.get<std::forward_list<double>>();
- j4.get<std::forward_list<bool>>();
- j5.get<std::forward_list<std::string>>();
- }
- SECTION("std::array")
- {
- j1.get<std::array<int, 4>>();
- j2.get<std::array<unsigned int, 3>>();
- j3.get<std::array<double, 4>>();
- j4.get<std::array<bool, 3>>();
- j5.get<std::array<std::string, 3>>();
- SECTION("std::array is larger than JSON")
- {
- std::array<int, 6> arr6 = {{1, 2, 3, 4, 5, 6}};
- CHECK_THROWS_WITH_AS(j1.get_to(arr6), "[json.exception.out_of_range.401] "
- "array index 4 is out of range", json::out_of_range&);
- }
- SECTION("std::array is smaller than JSON")
- {
- std::array<int, 2> arr2 = {{8, 9}};
- j1.get_to(arr2);
- CHECK(arr2[0] == 1);
- CHECK(arr2[1] == 2);
- }
- }
- SECTION("std::valarray")
- {
- j1.get<std::valarray<int>>();
- j2.get<std::valarray<unsigned int>>();
- j3.get<std::valarray<double>>();
- j4.get<std::valarray<bool>>();
- j5.get<std::valarray<std::string>>();
- }
- SECTION("std::vector")
- {
- j1.get<std::vector<int>>();
- j2.get<std::vector<unsigned int>>();
- j3.get<std::vector<double>>();
- j4.get<std::vector<bool>>();
- j5.get<std::vector<std::string>>();
- }
- SECTION("std::deque")
- {
- j1.get<std::deque<int>>();
- j2.get<std::deque<unsigned int>>();
- j2.get<std::deque<double>>();
- j4.get<std::deque<bool>>();
- j5.get<std::deque<std::string>>();
- }
- SECTION("std::set")
- {
- j1.get<std::set<int>>();
- j2.get<std::set<unsigned int>>();
- j3.get<std::set<double>>();
- j4.get<std::set<bool>>();
- j5.get<std::set<std::string>>();
- }
- SECTION("std::unordered_set")
- {
- j1.get<std::unordered_set<int>>();
- j2.get<std::unordered_set<unsigned int>>();
- j3.get<std::unordered_set<double>>();
- j4.get<std::unordered_set<bool>>();
- j5.get<std::unordered_set<std::string>>();
- }
- SECTION("std::map (array of pairs)")
- {
- std::map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
- json const j6 = m;
- auto m2 = j6.get<std::map<int, int>>();
- CHECK(m == m2);
- json const j7 = {0, 1, 2, 3};
- json const j8 = 2;
- CHECK_THROWS_WITH_AS((j7.get<std::map<int, int>>()),
- "[json.exception.type_error.302] type must be array, "
- "but is number", json::type_error&);
- CHECK_THROWS_WITH_AS((j8.get<std::map<int, int>>()),
- "[json.exception.type_error.302] type must be array, "
- "but is number", json::type_error&);
- SECTION("superfluous entries")
- {
- json const j9 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
- m2 = j9.get<std::map<int, int>>();
- CHECK(m == m2);
- }
- }
- SECTION("std::unordered_map (array of pairs)")
- {
- std::unordered_map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
- json const j6 = m;
- auto m2 = j6.get<std::unordered_map<int, int>>();
- CHECK(m == m2);
- json const j7 = {0, 1, 2, 3};
- json const j8 = 2;
- CHECK_THROWS_WITH_AS((j7.get<std::unordered_map<int, int>>()),
- "[json.exception.type_error.302] type must be array, "
- "but is number", json::type_error&);
- CHECK_THROWS_WITH_AS((j8.get<std::unordered_map<int, int>>()),
- "[json.exception.type_error.302] type must be array, "
- "but is number", json::type_error&);
- SECTION("superfluous entries")
- {
- json const j9{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
- m2 = j9.get<std::unordered_map<int, int>>();
- CHECK(m == m2);
- }
- }
- SECTION("exception in case of a non-object type")
- {
- // does type really must be an array? or it rather must not be null?
- // that's what I thought when other test like this one broke
- CHECK_THROWS_WITH_AS(
- (json().get<std::list<int>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- (json().get<std::vector<int>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- (json().get<std::vector<json>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- (json().get<std::list<json>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- (json().get<std::valarray<int>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- CHECK_THROWS_WITH_AS(
- (json().get<std::map<int, int>>()),
- "[json.exception.type_error.302] type must be array, but is null", json::type_error&);
- }
- }
- }
- }
- enum class cards {kreuz, pik, herz, karo};
- // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) - false positive
- NLOHMANN_JSON_SERIALIZE_ENUM(cards,
- {
- {cards::kreuz, "kreuz"},
- {cards::pik, "pik"},
- {cards::pik, "puk"}, // second entry for cards::puk; will not be used
- {cards::herz, "herz"},
- {cards::karo, "karo"}
- })
- enum TaskState
- {
- TS_STOPPED,
- TS_RUNNING,
- TS_COMPLETED,
- TS_INVALID = -1,
- };
- // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) - false positive
- NLOHMANN_JSON_SERIALIZE_ENUM(TaskState,
- {
- {TS_INVALID, nullptr},
- {TS_STOPPED, "stopped"},
- {TS_RUNNING, "running"},
- {TS_COMPLETED, "completed"},
- })
- TEST_CASE("JSON to enum mapping")
- {
- SECTION("enum class")
- {
- // enum -> json
- CHECK(json(cards::kreuz) == "kreuz");
- CHECK(json(cards::pik) == "pik");
- CHECK(json(cards::herz) == "herz");
- CHECK(json(cards::karo) == "karo");
- // json -> enum
- CHECK(cards::kreuz == json("kreuz"));
- CHECK(cards::pik == json("pik"));
- CHECK(cards::herz == json("herz"));
- CHECK(cards::karo == json("karo"));
- // invalid json -> first enum
- CHECK(cards::kreuz == json("what?").get<cards>());
- }
- SECTION("traditional enum")
- {
- // enum -> json
- CHECK(json(TS_STOPPED) == "stopped");
- CHECK(json(TS_RUNNING) == "running");
- CHECK(json(TS_COMPLETED) == "completed");
- CHECK(json(TS_INVALID) == json());
- // json -> enum
- CHECK(TS_STOPPED == json("stopped"));
- CHECK(TS_RUNNING == json("running"));
- CHECK(TS_COMPLETED == json("completed"));
- CHECK(TS_INVALID == json());
- // invalid json -> first enum
- CHECK(TS_INVALID == json("what?").get<TaskState>());
- }
- }
- DOCTEST_CLANG_SUPPRESS_WARNING_POP
|