1 // __ _____ _____ _____ 2 // __| | __| | | | JSON for Modern C++ (supporting code) 3 // | | |__ | | | | | | version 3.11.3 4 // |_____|_____|_____|_|___| https://github.com/nlohmann/json 5 // 6 // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> 7 // SPDX-License-Identifier: MIT 8 9 #include "doctest_compatibility.h" 10 11 #include <nlohmann/json.hpp> 12 using nlohmann::json; 13 using nlohmann::ordered_json; 14 15 TEST_CASE("ordered_json") 16 { 17 json j; 18 ordered_json oj; 19 20 j["element3"] = 3; 21 j["element1"] = 1; 22 j["element2"] = 2; 23 24 oj["element3"] = 3; 25 oj["element1"] = 1; 26 oj["element2"] = 2; 27 28 CHECK(j.dump() == "{\"element1\":1,\"element2\":2,\"element3\":3}"); 29 CHECK(oj.dump() == "{\"element3\":3,\"element1\":1,\"element2\":2}"); 30 31 CHECK(j == json(oj)); 32 CHECK(ordered_json(json(oj)) == ordered_json(j)); 33 34 j.erase("element1"); 35 oj.erase("element1"); 36 37 CHECK(j.dump() == "{\"element2\":2,\"element3\":3}"); 38 CHECK(oj.dump() == "{\"element3\":3,\"element2\":2}"); 39 40 // remove again and nothing changes 41 j.erase("element1"); 42 oj.erase("element1"); 43 44 CHECK(j.dump() == "{\"element2\":2,\"element3\":3}"); 45 CHECK(oj.dump() == "{\"element3\":3,\"element2\":2}"); 46 47 // There are no dup keys cause constructor calls emplace... 48 json const multi {{"z", 1}, {"m", 2}, {"m", 3}, {"y", 4}, {"m", 5}}; 49 CHECK(multi.size() == 3); 50 CHECK(multi.dump() == "{\"m\":2,\"y\":4,\"z\":1}"); 51 52 ordered_json multi_ordered {{"z", 1}, {"m", 2}, {"m", 3}, {"y", 4}, {"m", 5}}; 53 CHECK(multi_ordered.size() == 3); 54 CHECK(multi_ordered.dump() == "{\"z\":1,\"m\":2,\"y\":4}"); 55 CHECK(multi_ordered.erase("m") == 1); 56 CHECK(multi_ordered.dump() == "{\"z\":1,\"y\":4}"); 57 58 // Ranged insert test. 59 // It seems that values shouldn't be overwritten. Only new values are added 60 json j1 {{"c", 1}, {"b", 2}, {"a", 3}}; 61 const json j2 {{"c", 77}, {"d", 42}, {"a", 4}}; 62 j1.insert( j2.cbegin(), j2.cend() ); 63 CHECK(j1.size() == 4); 64 CHECK(j1.dump() == "{\"a\":3,\"b\":2,\"c\":1,\"d\":42}"); 65 66 ordered_json oj1 {{"c", 1}, {"b", 2}, {"a", 3}}; 67 const ordered_json oj2 {{"c", 77}, {"d", 42}, {"a", 4}}; 68 oj1.insert( oj2.cbegin(), oj2.cend() ); 69 CHECK(oj1.size() == 4); 70 CHECK(oj1.dump() == "{\"c\":1,\"b\":2,\"a\":3,\"d\":42}"); 71 } 72