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 14 TEST_CASE("other constructors and destructor") 15 { 16 SECTION("copy constructor") 17 { 18 SECTION("object") 19 { 20 json j {{"foo", 1}, {"bar", false}}; 21 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 22 CHECK(j == k); 23 } 24 25 SECTION("array") 26 { 27 json j {"foo", 1, 42.23, false}; 28 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 29 CHECK(j == k); 30 } 31 32 SECTION("null") 33 { 34 json j(nullptr); 35 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 36 CHECK(j == k); 37 } 38 39 SECTION("boolean") 40 { 41 json j(true); 42 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 43 CHECK(j == k); 44 } 45 46 SECTION("string") 47 { 48 json j("Hello world"); 49 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 50 CHECK(j == k); 51 } 52 53 SECTION("number (integer)") 54 { 55 json j(42); 56 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 57 CHECK(j == k); 58 } 59 60 SECTION("number (unsigned)") 61 { 62 json j(42u); 63 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 64 CHECK(j == k); 65 } 66 67 SECTION("number (floating-point)") 68 { 69 json j(42.23); 70 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 71 CHECK(j == k); 72 } 73 74 SECTION("binary") 75 { 76 json j = json::binary({1, 2, 3}); 77 json k(j); // NOLINT(performance-unnecessary-copy-initialization) 78 CHECK(j == k); 79 } 80 } 81 82 SECTION("move constructor") 83 { 84 json j {{"foo", "bar"}, {"baz", {1, 2, 3, 4}}, {"a", 42u}, {"b", 42.23}, {"c", nullptr}}; 85 CHECK(j.type() == json::value_t::object); 86 json k(std::move(j)); 87 CHECK(k.type() == json::value_t::object); 88 CHECK(j.type() == json::value_t::null); // NOLINT: access after move is OK here 89 } 90 91 SECTION("copy assignment") 92 { 93 SECTION("object") 94 { 95 json j {{"foo", 1}, {"bar", false}}; 96 json k; 97 k = j; 98 CHECK(j == k); 99 } 100 101 SECTION("array") 102 { 103 json j {"foo", 1, 42.23, false}; 104 json k; 105 k = j; 106 CHECK(j == k); 107 } 108 109 SECTION("null") 110 { 111 json j(nullptr); 112 json k; 113 k = j; 114 CHECK(j == k); 115 } 116 117 SECTION("boolean") 118 { 119 json j(true); 120 json k; 121 k = j; 122 CHECK(j == k); 123 } 124 125 SECTION("string") 126 { 127 json j("Hello world"); 128 json k; 129 k = j; 130 CHECK(j == k); 131 } 132 133 SECTION("number (integer)") 134 { 135 json j(42); 136 json k; 137 k = j; 138 CHECK(j == k); 139 } 140 141 SECTION("number (unsigned)") 142 { 143 json j(42u); 144 json k; 145 k = j; 146 CHECK(j == k); 147 } 148 149 SECTION("number (floating-point)") 150 { 151 json j(42.23); 152 json k; 153 k = j; 154 CHECK(j == k); 155 } 156 157 SECTION("binary") 158 { 159 json j = json::binary({1, 2, 3}); 160 json k; 161 k = j; 162 CHECK(j == k); 163 } 164 } 165 166 SECTION("destructor") 167 { 168 SECTION("object") 169 { 170 auto* j = new json {{"foo", 1}, {"bar", false}}; // NOLINT(cppcoreguidelines-owning-memory) 171 delete j; // NOLINT(cppcoreguidelines-owning-memory) 172 } 173 174 SECTION("array") 175 { 176 auto* j = new json {"foo", 1, 1u, false, 23.42}; // NOLINT(cppcoreguidelines-owning-memory) 177 delete j; // NOLINT(cppcoreguidelines-owning-memory) 178 } 179 180 SECTION("string") 181 { 182 auto* j = new json("Hello world"); // NOLINT(cppcoreguidelines-owning-memory) 183 delete j; // NOLINT(cppcoreguidelines-owning-memory) 184 } 185 } 186 } 187