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