1c5f01b2fSopenharmony_ci// __ _____ _____ _____ 2c5f01b2fSopenharmony_ci// __| | __| | | | JSON for Modern C++ (supporting code) 3c5f01b2fSopenharmony_ci// | | |__ | | | | | | version 3.11.2 4c5f01b2fSopenharmony_ci// |_____|_____|_____|_|___| https://github.com/nlohmann/json 5c5f01b2fSopenharmony_ci// 6c5f01b2fSopenharmony_ci// Copyright (c) 2013-2022 Niels Lohmann <http://nlohmann.me>. 7c5f01b2fSopenharmony_ci// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me> 8c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT 9c5f01b2fSopenharmony_ci 10c5f01b2fSopenharmony_ci#include "doctest_compatibility.h" 11c5f01b2fSopenharmony_ci 12c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp> 13c5f01b2fSopenharmony_ciusing nlohmann::json; 14c5f01b2fSopenharmony_ci 15c5f01b2fSopenharmony_ciTEST_CASE("modifiers") 16c5f01b2fSopenharmony_ci{ 17c5f01b2fSopenharmony_ci SECTION("clear()") 18c5f01b2fSopenharmony_ci { 19c5f01b2fSopenharmony_ci SECTION("boolean") 20c5f01b2fSopenharmony_ci { 21c5f01b2fSopenharmony_ci json j = true; 22c5f01b2fSopenharmony_ci json k = j; 23c5f01b2fSopenharmony_ci 24c5f01b2fSopenharmony_ci j.clear(); 25c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::boolean)); 26c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 27c5f01b2fSopenharmony_ci } 28c5f01b2fSopenharmony_ci 29c5f01b2fSopenharmony_ci SECTION("string") 30c5f01b2fSopenharmony_ci { 31c5f01b2fSopenharmony_ci json j = "hello world"; 32c5f01b2fSopenharmony_ci json k = j; 33c5f01b2fSopenharmony_ci 34c5f01b2fSopenharmony_ci j.clear(); 35c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::string)); 36c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 37c5f01b2fSopenharmony_ci } 38c5f01b2fSopenharmony_ci 39c5f01b2fSopenharmony_ci SECTION("array") 40c5f01b2fSopenharmony_ci { 41c5f01b2fSopenharmony_ci SECTION("empty array") 42c5f01b2fSopenharmony_ci { 43c5f01b2fSopenharmony_ci json j = json::array(); 44c5f01b2fSopenharmony_ci json k = j; 45c5f01b2fSopenharmony_ci 46c5f01b2fSopenharmony_ci j.clear(); 47c5f01b2fSopenharmony_ci CHECK(j.empty()); 48c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::array)); 49c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 50c5f01b2fSopenharmony_ci } 51c5f01b2fSopenharmony_ci 52c5f01b2fSopenharmony_ci SECTION("filled array") 53c5f01b2fSopenharmony_ci { 54c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 55c5f01b2fSopenharmony_ci json k = j; 56c5f01b2fSopenharmony_ci 57c5f01b2fSopenharmony_ci j.clear(); 58c5f01b2fSopenharmony_ci CHECK(j.empty()); 59c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::array)); 60c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 61c5f01b2fSopenharmony_ci } 62c5f01b2fSopenharmony_ci } 63c5f01b2fSopenharmony_ci 64c5f01b2fSopenharmony_ci SECTION("object") 65c5f01b2fSopenharmony_ci { 66c5f01b2fSopenharmony_ci SECTION("empty object") 67c5f01b2fSopenharmony_ci { 68c5f01b2fSopenharmony_ci json j = json::object(); 69c5f01b2fSopenharmony_ci json k = j; 70c5f01b2fSopenharmony_ci 71c5f01b2fSopenharmony_ci j.clear(); 72c5f01b2fSopenharmony_ci CHECK(j.empty()); 73c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::object)); 74c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 75c5f01b2fSopenharmony_ci } 76c5f01b2fSopenharmony_ci 77c5f01b2fSopenharmony_ci SECTION("filled object") 78c5f01b2fSopenharmony_ci { 79c5f01b2fSopenharmony_ci json j = {{"one", 1}, {"two", 2}, {"three", 3}}; 80c5f01b2fSopenharmony_ci json k = j; 81c5f01b2fSopenharmony_ci 82c5f01b2fSopenharmony_ci j.clear(); 83c5f01b2fSopenharmony_ci CHECK(j.empty()); 84c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::object)); 85c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 86c5f01b2fSopenharmony_ci } 87c5f01b2fSopenharmony_ci } 88c5f01b2fSopenharmony_ci 89c5f01b2fSopenharmony_ci SECTION("binary") 90c5f01b2fSopenharmony_ci { 91c5f01b2fSopenharmony_ci SECTION("empty binary") 92c5f01b2fSopenharmony_ci { 93c5f01b2fSopenharmony_ci json j = json::binary({}); 94c5f01b2fSopenharmony_ci json k = j; 95c5f01b2fSopenharmony_ci 96c5f01b2fSopenharmony_ci j.clear(); 97c5f01b2fSopenharmony_ci CHECK(!j.empty()); 98c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::binary)); 99c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 100c5f01b2fSopenharmony_ci } 101c5f01b2fSopenharmony_ci 102c5f01b2fSopenharmony_ci SECTION("filled binary") 103c5f01b2fSopenharmony_ci { 104c5f01b2fSopenharmony_ci json j = json::binary({1, 2, 3, 4, 5}); 105c5f01b2fSopenharmony_ci json k = j; 106c5f01b2fSopenharmony_ci 107c5f01b2fSopenharmony_ci j.clear(); 108c5f01b2fSopenharmony_ci CHECK(!j.empty()); 109c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::binary)); 110c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 111c5f01b2fSopenharmony_ci } 112c5f01b2fSopenharmony_ci } 113c5f01b2fSopenharmony_ci 114c5f01b2fSopenharmony_ci SECTION("number (integer)") 115c5f01b2fSopenharmony_ci { 116c5f01b2fSopenharmony_ci json j = 23; 117c5f01b2fSopenharmony_ci json k = j; 118c5f01b2fSopenharmony_ci 119c5f01b2fSopenharmony_ci j.clear(); 120c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::number_integer)); 121c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 122c5f01b2fSopenharmony_ci } 123c5f01b2fSopenharmony_ci 124c5f01b2fSopenharmony_ci SECTION("number (unsigned)") 125c5f01b2fSopenharmony_ci { 126c5f01b2fSopenharmony_ci json j = 23u; 127c5f01b2fSopenharmony_ci json k = j; 128c5f01b2fSopenharmony_ci 129c5f01b2fSopenharmony_ci j.clear(); 130c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::number_integer)); 131c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 132c5f01b2fSopenharmony_ci } 133c5f01b2fSopenharmony_ci 134c5f01b2fSopenharmony_ci SECTION("number (float)") 135c5f01b2fSopenharmony_ci { 136c5f01b2fSopenharmony_ci json j = 23.42; 137c5f01b2fSopenharmony_ci json k = j; 138c5f01b2fSopenharmony_ci 139c5f01b2fSopenharmony_ci j.clear(); 140c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::number_float)); 141c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 142c5f01b2fSopenharmony_ci } 143c5f01b2fSopenharmony_ci 144c5f01b2fSopenharmony_ci SECTION("null") 145c5f01b2fSopenharmony_ci { 146c5f01b2fSopenharmony_ci json j = nullptr; 147c5f01b2fSopenharmony_ci json k = j; 148c5f01b2fSopenharmony_ci 149c5f01b2fSopenharmony_ci j.clear(); 150c5f01b2fSopenharmony_ci CHECK(j == json(json::value_t::null)); 151c5f01b2fSopenharmony_ci CHECK(j == json(k.type())); 152c5f01b2fSopenharmony_ci } 153c5f01b2fSopenharmony_ci } 154c5f01b2fSopenharmony_ci 155c5f01b2fSopenharmony_ci SECTION("push_back()") 156c5f01b2fSopenharmony_ci { 157c5f01b2fSopenharmony_ci SECTION("to array") 158c5f01b2fSopenharmony_ci { 159c5f01b2fSopenharmony_ci SECTION("json&&") 160c5f01b2fSopenharmony_ci { 161c5f01b2fSopenharmony_ci SECTION("null") 162c5f01b2fSopenharmony_ci { 163c5f01b2fSopenharmony_ci json j; 164c5f01b2fSopenharmony_ci j.push_back(1); 165c5f01b2fSopenharmony_ci j.push_back(2); 166c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 167c5f01b2fSopenharmony_ci CHECK(j == json({1, 2})); 168c5f01b2fSopenharmony_ci } 169c5f01b2fSopenharmony_ci 170c5f01b2fSopenharmony_ci SECTION("array") 171c5f01b2fSopenharmony_ci { 172c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 173c5f01b2fSopenharmony_ci j.push_back("Hello"); 174c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 175c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, "Hello"})); 176c5f01b2fSopenharmony_ci } 177c5f01b2fSopenharmony_ci 178c5f01b2fSopenharmony_ci SECTION("other type") 179c5f01b2fSopenharmony_ci { 180c5f01b2fSopenharmony_ci json j = 1; 181c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back("Hello"), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 182c5f01b2fSopenharmony_ci } 183c5f01b2fSopenharmony_ci } 184c5f01b2fSopenharmony_ci 185c5f01b2fSopenharmony_ci SECTION("const json&") 186c5f01b2fSopenharmony_ci { 187c5f01b2fSopenharmony_ci SECTION("null") 188c5f01b2fSopenharmony_ci { 189c5f01b2fSopenharmony_ci json j; 190c5f01b2fSopenharmony_ci json k(1); 191c5f01b2fSopenharmony_ci j.push_back(k); 192c5f01b2fSopenharmony_ci j.push_back(k); 193c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 194c5f01b2fSopenharmony_ci CHECK(j == json({1, 1})); 195c5f01b2fSopenharmony_ci } 196c5f01b2fSopenharmony_ci 197c5f01b2fSopenharmony_ci SECTION("array") 198c5f01b2fSopenharmony_ci { 199c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 200c5f01b2fSopenharmony_ci json k("Hello"); 201c5f01b2fSopenharmony_ci j.push_back(k); 202c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 203c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, "Hello"})); 204c5f01b2fSopenharmony_ci } 205c5f01b2fSopenharmony_ci 206c5f01b2fSopenharmony_ci SECTION("other type") 207c5f01b2fSopenharmony_ci { 208c5f01b2fSopenharmony_ci json j = 1; 209c5f01b2fSopenharmony_ci json k("Hello"); 210c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back(k), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 211c5f01b2fSopenharmony_ci } 212c5f01b2fSopenharmony_ci } 213c5f01b2fSopenharmony_ci } 214c5f01b2fSopenharmony_ci 215c5f01b2fSopenharmony_ci SECTION("to object") 216c5f01b2fSopenharmony_ci { 217c5f01b2fSopenharmony_ci SECTION("null") 218c5f01b2fSopenharmony_ci { 219c5f01b2fSopenharmony_ci json j; 220c5f01b2fSopenharmony_ci j.push_back(json::object_t::value_type({"one", 1})); 221c5f01b2fSopenharmony_ci j.push_back(json::object_t::value_type({"two", 2})); 222c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 223c5f01b2fSopenharmony_ci CHECK(j.size() == 2); 224c5f01b2fSopenharmony_ci CHECK(j["one"] == json(1)); 225c5f01b2fSopenharmony_ci CHECK(j["two"] == json(2)); 226c5f01b2fSopenharmony_ci } 227c5f01b2fSopenharmony_ci 228c5f01b2fSopenharmony_ci SECTION("object") 229c5f01b2fSopenharmony_ci { 230c5f01b2fSopenharmony_ci json j(json::value_t::object); 231c5f01b2fSopenharmony_ci j.push_back(json::object_t::value_type({"one", 1})); 232c5f01b2fSopenharmony_ci j.push_back(json::object_t::value_type({"two", 2})); 233c5f01b2fSopenharmony_ci CHECK(j.size() == 2); 234c5f01b2fSopenharmony_ci CHECK(j["one"] == json(1)); 235c5f01b2fSopenharmony_ci CHECK(j["two"] == json(2)); 236c5f01b2fSopenharmony_ci } 237c5f01b2fSopenharmony_ci 238c5f01b2fSopenharmony_ci SECTION("other type") 239c5f01b2fSopenharmony_ci { 240c5f01b2fSopenharmony_ci json j = 1; 241c5f01b2fSopenharmony_ci json k("Hello"); 242c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back(json::object_t::value_type({"one", 1})), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 243c5f01b2fSopenharmony_ci } 244c5f01b2fSopenharmony_ci } 245c5f01b2fSopenharmony_ci 246c5f01b2fSopenharmony_ci SECTION("with initializer_list") 247c5f01b2fSopenharmony_ci { 248c5f01b2fSopenharmony_ci SECTION("null") 249c5f01b2fSopenharmony_ci { 250c5f01b2fSopenharmony_ci json j; 251c5f01b2fSopenharmony_ci j.push_back({"foo", "bar"}); 252c5f01b2fSopenharmony_ci CHECK(j == json::array({{"foo", "bar"}})); 253c5f01b2fSopenharmony_ci 254c5f01b2fSopenharmony_ci json k; 255c5f01b2fSopenharmony_ci k.push_back({1, 2, 3}); 256c5f01b2fSopenharmony_ci CHECK(k == json::array({{1, 2, 3}})); 257c5f01b2fSopenharmony_ci } 258c5f01b2fSopenharmony_ci 259c5f01b2fSopenharmony_ci SECTION("array") 260c5f01b2fSopenharmony_ci { 261c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 262c5f01b2fSopenharmony_ci j.push_back({"foo", "bar"}); 263c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, {"foo", "bar"}})); 264c5f01b2fSopenharmony_ci 265c5f01b2fSopenharmony_ci json k = {1, 2, 3}; 266c5f01b2fSopenharmony_ci k.push_back({1, 2, 3}); 267c5f01b2fSopenharmony_ci CHECK(k == json({1, 2, 3, {1, 2, 3}})); 268c5f01b2fSopenharmony_ci } 269c5f01b2fSopenharmony_ci 270c5f01b2fSopenharmony_ci SECTION("object") 271c5f01b2fSopenharmony_ci { 272c5f01b2fSopenharmony_ci json j = {{"key1", 1}}; 273c5f01b2fSopenharmony_ci j.push_back({"key2", "bar"}); 274c5f01b2fSopenharmony_ci CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); 275c5f01b2fSopenharmony_ci 276c5f01b2fSopenharmony_ci // invalid values (no string/val pair) 277c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back({1}), "[json.exception.type_error.308] cannot use push_back() with object", json::type_error&); 278c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back({1, 2}), "[json.exception.type_error.308] cannot use push_back() with object", json::type_error&); 279c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.push_back({1, 2, 3, 4}), "[json.exception.type_error.308] cannot use push_back() with object", json::type_error&); 280c5f01b2fSopenharmony_ci } 281c5f01b2fSopenharmony_ci } 282c5f01b2fSopenharmony_ci } 283c5f01b2fSopenharmony_ci 284c5f01b2fSopenharmony_ci SECTION("emplace_back()") 285c5f01b2fSopenharmony_ci { 286c5f01b2fSopenharmony_ci SECTION("to array") 287c5f01b2fSopenharmony_ci { 288c5f01b2fSopenharmony_ci SECTION("null") 289c5f01b2fSopenharmony_ci { 290c5f01b2fSopenharmony_ci json j; 291c5f01b2fSopenharmony_ci auto& x1 = j.emplace_back(1); 292c5f01b2fSopenharmony_ci CHECK(x1 == 1); 293c5f01b2fSopenharmony_ci auto& x2 = j.emplace_back(2); 294c5f01b2fSopenharmony_ci CHECK(x2 == 2); 295c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 296c5f01b2fSopenharmony_ci CHECK(j == json({1, 2})); 297c5f01b2fSopenharmony_ci } 298c5f01b2fSopenharmony_ci 299c5f01b2fSopenharmony_ci SECTION("array") 300c5f01b2fSopenharmony_ci { 301c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 302c5f01b2fSopenharmony_ci auto& x = j.emplace_back("Hello"); 303c5f01b2fSopenharmony_ci CHECK(x == "Hello"); 304c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 305c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, "Hello"})); 306c5f01b2fSopenharmony_ci } 307c5f01b2fSopenharmony_ci 308c5f01b2fSopenharmony_ci SECTION("multiple values") 309c5f01b2fSopenharmony_ci { 310c5f01b2fSopenharmony_ci json j; 311c5f01b2fSopenharmony_ci auto& x = j.emplace_back(3, "foo"); 312c5f01b2fSopenharmony_ci CHECK(x == json({"foo", "foo", "foo"})); 313c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 314c5f01b2fSopenharmony_ci CHECK(j == json({{"foo", "foo", "foo"}})); 315c5f01b2fSopenharmony_ci } 316c5f01b2fSopenharmony_ci } 317c5f01b2fSopenharmony_ci 318c5f01b2fSopenharmony_ci SECTION("other type") 319c5f01b2fSopenharmony_ci { 320c5f01b2fSopenharmony_ci json j = 1; 321c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.emplace_back("Hello"), "[json.exception.type_error.311] cannot use emplace_back() with number", json::type_error&); 322c5f01b2fSopenharmony_ci } 323c5f01b2fSopenharmony_ci } 324c5f01b2fSopenharmony_ci 325c5f01b2fSopenharmony_ci SECTION("emplace()") 326c5f01b2fSopenharmony_ci { 327c5f01b2fSopenharmony_ci SECTION("to object") 328c5f01b2fSopenharmony_ci { 329c5f01b2fSopenharmony_ci SECTION("null") 330c5f01b2fSopenharmony_ci { 331c5f01b2fSopenharmony_ci // start with a null value 332c5f01b2fSopenharmony_ci json j; 333c5f01b2fSopenharmony_ci 334c5f01b2fSopenharmony_ci // add a new key 335c5f01b2fSopenharmony_ci auto res1 = j.emplace("foo", "bar"); 336c5f01b2fSopenharmony_ci CHECK(res1.second == true); 337c5f01b2fSopenharmony_ci CHECK(*res1.first == "bar"); 338c5f01b2fSopenharmony_ci 339c5f01b2fSopenharmony_ci // the null value is changed to an object 340c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 341c5f01b2fSopenharmony_ci 342c5f01b2fSopenharmony_ci // add a new key 343c5f01b2fSopenharmony_ci auto res2 = j.emplace("baz", "bam"); 344c5f01b2fSopenharmony_ci CHECK(res2.second == true); 345c5f01b2fSopenharmony_ci CHECK(*res2.first == "bam"); 346c5f01b2fSopenharmony_ci 347c5f01b2fSopenharmony_ci // we try to insert at given key - no change 348c5f01b2fSopenharmony_ci auto res3 = j.emplace("baz", "bad"); 349c5f01b2fSopenharmony_ci CHECK(res3.second == false); 350c5f01b2fSopenharmony_ci CHECK(*res3.first == "bam"); 351c5f01b2fSopenharmony_ci 352c5f01b2fSopenharmony_ci // the final object 353c5f01b2fSopenharmony_ci CHECK(j == json({{"baz", "bam"}, {"foo", "bar"}})); 354c5f01b2fSopenharmony_ci } 355c5f01b2fSopenharmony_ci 356c5f01b2fSopenharmony_ci SECTION("object") 357c5f01b2fSopenharmony_ci { 358c5f01b2fSopenharmony_ci // start with an object 359c5f01b2fSopenharmony_ci json j = {{"foo", "bar"}}; 360c5f01b2fSopenharmony_ci 361c5f01b2fSopenharmony_ci // add a new key 362c5f01b2fSopenharmony_ci auto res1 = j.emplace("baz", "bam"); 363c5f01b2fSopenharmony_ci CHECK(res1.second == true); 364c5f01b2fSopenharmony_ci CHECK(*res1.first == "bam"); 365c5f01b2fSopenharmony_ci 366c5f01b2fSopenharmony_ci // add an existing key 367c5f01b2fSopenharmony_ci auto res2 = j.emplace("foo", "bad"); 368c5f01b2fSopenharmony_ci CHECK(res2.second == false); 369c5f01b2fSopenharmony_ci CHECK(*res2.first == "bar"); 370c5f01b2fSopenharmony_ci 371c5f01b2fSopenharmony_ci // check final object 372c5f01b2fSopenharmony_ci CHECK(j == json({{"baz", "bam"}, {"foo", "bar"}})); 373c5f01b2fSopenharmony_ci } 374c5f01b2fSopenharmony_ci } 375c5f01b2fSopenharmony_ci 376c5f01b2fSopenharmony_ci SECTION("other type") 377c5f01b2fSopenharmony_ci { 378c5f01b2fSopenharmony_ci json j = 1; 379c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.emplace("foo", "bar"), "[json.exception.type_error.311] cannot use emplace() with number", json::type_error&); 380c5f01b2fSopenharmony_ci } 381c5f01b2fSopenharmony_ci } 382c5f01b2fSopenharmony_ci 383c5f01b2fSopenharmony_ci SECTION("operator+=") 384c5f01b2fSopenharmony_ci { 385c5f01b2fSopenharmony_ci SECTION("to array") 386c5f01b2fSopenharmony_ci { 387c5f01b2fSopenharmony_ci SECTION("json&&") 388c5f01b2fSopenharmony_ci { 389c5f01b2fSopenharmony_ci SECTION("null") 390c5f01b2fSopenharmony_ci { 391c5f01b2fSopenharmony_ci json j; 392c5f01b2fSopenharmony_ci j += 1; 393c5f01b2fSopenharmony_ci j += 2; 394c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 395c5f01b2fSopenharmony_ci CHECK(j == json({1, 2})); 396c5f01b2fSopenharmony_ci } 397c5f01b2fSopenharmony_ci 398c5f01b2fSopenharmony_ci SECTION("array") 399c5f01b2fSopenharmony_ci { 400c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 401c5f01b2fSopenharmony_ci j += "Hello"; 402c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 403c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, "Hello"})); 404c5f01b2fSopenharmony_ci } 405c5f01b2fSopenharmony_ci 406c5f01b2fSopenharmony_ci SECTION("other type") 407c5f01b2fSopenharmony_ci { 408c5f01b2fSopenharmony_ci json j = 1; 409c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j += "Hello", "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 410c5f01b2fSopenharmony_ci } 411c5f01b2fSopenharmony_ci } 412c5f01b2fSopenharmony_ci 413c5f01b2fSopenharmony_ci SECTION("const json&") 414c5f01b2fSopenharmony_ci { 415c5f01b2fSopenharmony_ci SECTION("null") 416c5f01b2fSopenharmony_ci { 417c5f01b2fSopenharmony_ci json j; 418c5f01b2fSopenharmony_ci json k(1); 419c5f01b2fSopenharmony_ci j += k; 420c5f01b2fSopenharmony_ci j += k; 421c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 422c5f01b2fSopenharmony_ci CHECK(j == json({1, 1})); 423c5f01b2fSopenharmony_ci } 424c5f01b2fSopenharmony_ci 425c5f01b2fSopenharmony_ci SECTION("array") 426c5f01b2fSopenharmony_ci { 427c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 428c5f01b2fSopenharmony_ci json k("Hello"); 429c5f01b2fSopenharmony_ci j += k; 430c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 431c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, "Hello"})); 432c5f01b2fSopenharmony_ci } 433c5f01b2fSopenharmony_ci 434c5f01b2fSopenharmony_ci SECTION("other type") 435c5f01b2fSopenharmony_ci { 436c5f01b2fSopenharmony_ci json j = 1; 437c5f01b2fSopenharmony_ci json k("Hello"); 438c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j += k, "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 439c5f01b2fSopenharmony_ci } 440c5f01b2fSopenharmony_ci } 441c5f01b2fSopenharmony_ci } 442c5f01b2fSopenharmony_ci 443c5f01b2fSopenharmony_ci SECTION("to object") 444c5f01b2fSopenharmony_ci { 445c5f01b2fSopenharmony_ci SECTION("null") 446c5f01b2fSopenharmony_ci { 447c5f01b2fSopenharmony_ci json j; 448c5f01b2fSopenharmony_ci j += json::object_t::value_type({"one", 1}); 449c5f01b2fSopenharmony_ci j += json::object_t::value_type({"two", 2}); 450c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 451c5f01b2fSopenharmony_ci CHECK(j.size() == 2); 452c5f01b2fSopenharmony_ci CHECK(j["one"] == json(1)); 453c5f01b2fSopenharmony_ci CHECK(j["two"] == json(2)); 454c5f01b2fSopenharmony_ci } 455c5f01b2fSopenharmony_ci 456c5f01b2fSopenharmony_ci SECTION("object") 457c5f01b2fSopenharmony_ci { 458c5f01b2fSopenharmony_ci json j(json::value_t::object); 459c5f01b2fSopenharmony_ci j += json::object_t::value_type({"one", 1}); 460c5f01b2fSopenharmony_ci j += json::object_t::value_type({"two", 2}); 461c5f01b2fSopenharmony_ci CHECK(j.size() == 2); 462c5f01b2fSopenharmony_ci CHECK(j["one"] == json(1)); 463c5f01b2fSopenharmony_ci CHECK(j["two"] == json(2)); 464c5f01b2fSopenharmony_ci } 465c5f01b2fSopenharmony_ci 466c5f01b2fSopenharmony_ci SECTION("other type") 467c5f01b2fSopenharmony_ci { 468c5f01b2fSopenharmony_ci json j = 1; 469c5f01b2fSopenharmony_ci json k("Hello"); 470c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j += json::object_t::value_type({"one", 1}), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&); 471c5f01b2fSopenharmony_ci } 472c5f01b2fSopenharmony_ci } 473c5f01b2fSopenharmony_ci 474c5f01b2fSopenharmony_ci SECTION("with initializer_list") 475c5f01b2fSopenharmony_ci { 476c5f01b2fSopenharmony_ci SECTION("null") 477c5f01b2fSopenharmony_ci { 478c5f01b2fSopenharmony_ci json j; 479c5f01b2fSopenharmony_ci j += {"foo", "bar"}; 480c5f01b2fSopenharmony_ci CHECK(j == json::array({{"foo", "bar"}})); 481c5f01b2fSopenharmony_ci 482c5f01b2fSopenharmony_ci json k; 483c5f01b2fSopenharmony_ci k += {1, 2, 3}; 484c5f01b2fSopenharmony_ci CHECK(k == json::array({{1, 2, 3}})); 485c5f01b2fSopenharmony_ci } 486c5f01b2fSopenharmony_ci 487c5f01b2fSopenharmony_ci SECTION("array") 488c5f01b2fSopenharmony_ci { 489c5f01b2fSopenharmony_ci json j = {1, 2, 3}; 490c5f01b2fSopenharmony_ci j += {"foo", "bar"}; 491c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, {"foo", "bar"}})); 492c5f01b2fSopenharmony_ci 493c5f01b2fSopenharmony_ci json k = {1, 2, 3}; 494c5f01b2fSopenharmony_ci k += {1, 2, 3}; 495c5f01b2fSopenharmony_ci CHECK(k == json({1, 2, 3, {1, 2, 3}})); 496c5f01b2fSopenharmony_ci } 497c5f01b2fSopenharmony_ci 498c5f01b2fSopenharmony_ci SECTION("object") 499c5f01b2fSopenharmony_ci { 500c5f01b2fSopenharmony_ci json j = {{"key1", 1}}; 501c5f01b2fSopenharmony_ci j += {"key2", "bar"}; 502c5f01b2fSopenharmony_ci CHECK(j == json({{"key1", 1}, {"key2", "bar"}})); 503c5f01b2fSopenharmony_ci 504c5f01b2fSopenharmony_ci json k = {{"key1", 1}}; 505c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS((k += {1, 2, 3, 4}), "[json.exception.type_error.308] cannot use push_back() with object", json::type_error&); 506c5f01b2fSopenharmony_ci } 507c5f01b2fSopenharmony_ci } 508c5f01b2fSopenharmony_ci } 509c5f01b2fSopenharmony_ci 510c5f01b2fSopenharmony_ci SECTION("insert()") 511c5f01b2fSopenharmony_ci { 512c5f01b2fSopenharmony_ci json j_array = {1, 2, 3, 4}; 513c5f01b2fSopenharmony_ci json j_value = 5; 514c5f01b2fSopenharmony_ci 515c5f01b2fSopenharmony_ci SECTION("value at position") 516c5f01b2fSopenharmony_ci { 517c5f01b2fSopenharmony_ci SECTION("insert before begin()") 518c5f01b2fSopenharmony_ci { 519c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin(), j_value); 520c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 521c5f01b2fSopenharmony_ci CHECK(*it == j_value); 522c5f01b2fSopenharmony_ci CHECK(j_array.begin() == it); 523c5f01b2fSopenharmony_ci CHECK(j_array == json({5, 1, 2, 3, 4})); 524c5f01b2fSopenharmony_ci } 525c5f01b2fSopenharmony_ci 526c5f01b2fSopenharmony_ci SECTION("insert in the middle") 527c5f01b2fSopenharmony_ci { 528c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin() + 2, j_value); 529c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 530c5f01b2fSopenharmony_ci CHECK(*it == j_value); 531c5f01b2fSopenharmony_ci CHECK((it - j_array.begin()) == 2); 532c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 5, 3, 4})); 533c5f01b2fSopenharmony_ci } 534c5f01b2fSopenharmony_ci 535c5f01b2fSopenharmony_ci SECTION("insert before end()") 536c5f01b2fSopenharmony_ci { 537c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), j_value); 538c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 539c5f01b2fSopenharmony_ci CHECK(*it == j_value); 540c5f01b2fSopenharmony_ci CHECK((j_array.end() - it) == 1); 541c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4, 5})); 542c5f01b2fSopenharmony_ci } 543c5f01b2fSopenharmony_ci } 544c5f01b2fSopenharmony_ci 545c5f01b2fSopenharmony_ci SECTION("rvalue at position") 546c5f01b2fSopenharmony_ci { 547c5f01b2fSopenharmony_ci SECTION("insert before begin()") 548c5f01b2fSopenharmony_ci { 549c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin(), 5); 550c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 551c5f01b2fSopenharmony_ci CHECK(*it == j_value); 552c5f01b2fSopenharmony_ci CHECK(j_array.begin() == it); 553c5f01b2fSopenharmony_ci CHECK(j_array == json({5, 1, 2, 3, 4})); 554c5f01b2fSopenharmony_ci } 555c5f01b2fSopenharmony_ci 556c5f01b2fSopenharmony_ci SECTION("insert in the middle") 557c5f01b2fSopenharmony_ci { 558c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin() + 2, 5); 559c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 560c5f01b2fSopenharmony_ci CHECK(*it == j_value); 561c5f01b2fSopenharmony_ci CHECK((it - j_array.begin()) == 2); 562c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 5, 3, 4})); 563c5f01b2fSopenharmony_ci } 564c5f01b2fSopenharmony_ci 565c5f01b2fSopenharmony_ci SECTION("insert before end()") 566c5f01b2fSopenharmony_ci { 567c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), 5); 568c5f01b2fSopenharmony_ci CHECK(j_array.size() == 5); 569c5f01b2fSopenharmony_ci CHECK(*it == j_value); 570c5f01b2fSopenharmony_ci CHECK((j_array.end() - it) == 1); 571c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4, 5})); 572c5f01b2fSopenharmony_ci } 573c5f01b2fSopenharmony_ci } 574c5f01b2fSopenharmony_ci 575c5f01b2fSopenharmony_ci SECTION("copies at position") 576c5f01b2fSopenharmony_ci { 577c5f01b2fSopenharmony_ci SECTION("insert before begin()") 578c5f01b2fSopenharmony_ci { 579c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin(), 3, 5); 580c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 581c5f01b2fSopenharmony_ci CHECK(*it == j_value); 582c5f01b2fSopenharmony_ci CHECK(j_array.begin() == it); 583c5f01b2fSopenharmony_ci CHECK(j_array == json({5, 5, 5, 1, 2, 3, 4})); 584c5f01b2fSopenharmony_ci } 585c5f01b2fSopenharmony_ci 586c5f01b2fSopenharmony_ci SECTION("insert in the middle") 587c5f01b2fSopenharmony_ci { 588c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin() + 2, 3, 5); 589c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 590c5f01b2fSopenharmony_ci CHECK(*it == j_value); 591c5f01b2fSopenharmony_ci CHECK((it - j_array.begin()) == 2); 592c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 5, 5, 5, 3, 4})); 593c5f01b2fSopenharmony_ci } 594c5f01b2fSopenharmony_ci 595c5f01b2fSopenharmony_ci SECTION("insert before end()") 596c5f01b2fSopenharmony_ci { 597c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), 3, 5); 598c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 599c5f01b2fSopenharmony_ci CHECK(*it == j_value); 600c5f01b2fSopenharmony_ci CHECK((j_array.end() - it) == 3); 601c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4, 5, 5, 5})); 602c5f01b2fSopenharmony_ci } 603c5f01b2fSopenharmony_ci 604c5f01b2fSopenharmony_ci SECTION("insert nothing (count = 0)") 605c5f01b2fSopenharmony_ci { 606c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), 0, 5); 607c5f01b2fSopenharmony_ci CHECK(j_array.size() == 4); 608c5f01b2fSopenharmony_ci // the returned iterator points to the first inserted element; 609c5f01b2fSopenharmony_ci // there were 4 elements, so it should point to the 5th 610c5f01b2fSopenharmony_ci CHECK(it == j_array.begin() + 4); 611c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4})); 612c5f01b2fSopenharmony_ci } 613c5f01b2fSopenharmony_ci } 614c5f01b2fSopenharmony_ci 615c5f01b2fSopenharmony_ci SECTION("range for array") 616c5f01b2fSopenharmony_ci { 617c5f01b2fSopenharmony_ci json j_other_array = {"first", "second"}; 618c5f01b2fSopenharmony_ci 619c5f01b2fSopenharmony_ci SECTION("proper usage") 620c5f01b2fSopenharmony_ci { 621c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), j_other_array.begin(), j_other_array.end()); 622c5f01b2fSopenharmony_ci CHECK(j_array.size() == 6); 623c5f01b2fSopenharmony_ci CHECK(*it == *j_other_array.begin()); 624c5f01b2fSopenharmony_ci CHECK((j_array.end() - it) == 2); 625c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4, "first", "second"})); 626c5f01b2fSopenharmony_ci } 627c5f01b2fSopenharmony_ci 628c5f01b2fSopenharmony_ci SECTION("empty range") 629c5f01b2fSopenharmony_ci { 630c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), j_other_array.begin(), j_other_array.begin()); 631c5f01b2fSopenharmony_ci CHECK(j_array.size() == 4); 632c5f01b2fSopenharmony_ci CHECK(it == j_array.end()); 633c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4})); 634c5f01b2fSopenharmony_ci } 635c5f01b2fSopenharmony_ci 636c5f01b2fSopenharmony_ci SECTION("invalid iterators") 637c5f01b2fSopenharmony_ci { 638c5f01b2fSopenharmony_ci json j_other_array2 = {"first", "second"}; 639c5f01b2fSopenharmony_ci 640c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_array.end(), j_array.begin(), j_array.end()), "[json.exception.invalid_iterator.211] passed iterators may not belong to container", 641c5f01b2fSopenharmony_ci json::invalid_iterator&); 642c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_array.end(), j_other_array.begin(), j_other_array2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", 643c5f01b2fSopenharmony_ci json::invalid_iterator&); 644c5f01b2fSopenharmony_ci } 645c5f01b2fSopenharmony_ci } 646c5f01b2fSopenharmony_ci 647c5f01b2fSopenharmony_ci SECTION("range for object") 648c5f01b2fSopenharmony_ci { 649c5f01b2fSopenharmony_ci json j_object1 = {{"one", "eins"}, {"two", "zwei"}}; 650c5f01b2fSopenharmony_ci json j_object2 = {{"eleven", "elf"}, {"seventeen", "siebzehn"}}; 651c5f01b2fSopenharmony_ci 652c5f01b2fSopenharmony_ci SECTION("proper usage") 653c5f01b2fSopenharmony_ci { 654c5f01b2fSopenharmony_ci j_object1.insert(j_object2.begin(), j_object2.end()); 655c5f01b2fSopenharmony_ci CHECK(j_object1.size() == 4); 656c5f01b2fSopenharmony_ci } 657c5f01b2fSopenharmony_ci 658c5f01b2fSopenharmony_ci SECTION("empty range") 659c5f01b2fSopenharmony_ci { 660c5f01b2fSopenharmony_ci j_object1.insert(j_object2.begin(), j_object2.begin()); 661c5f01b2fSopenharmony_ci CHECK(j_object1.size() == 2); 662c5f01b2fSopenharmony_ci } 663c5f01b2fSopenharmony_ci 664c5f01b2fSopenharmony_ci SECTION("invalid iterators") 665c5f01b2fSopenharmony_ci { 666c5f01b2fSopenharmony_ci json j_other_array2 = {"first", "second"}; 667c5f01b2fSopenharmony_ci 668c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_object2.begin(), j_object2.end()), "[json.exception.type_error.309] cannot use insert() with array", json::type_error&); 669c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_object1.insert(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&); 670c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_object1.insert(j_array.begin(), j_array.end()), "[json.exception.invalid_iterator.202] iterators first and last must point to objects", json::invalid_iterator&); 671c5f01b2fSopenharmony_ci } 672c5f01b2fSopenharmony_ci } 673c5f01b2fSopenharmony_ci 674c5f01b2fSopenharmony_ci SECTION("initializer list at position") 675c5f01b2fSopenharmony_ci { 676c5f01b2fSopenharmony_ci SECTION("insert before begin()") 677c5f01b2fSopenharmony_ci { 678c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin(), {7, 8, 9}); 679c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 680c5f01b2fSopenharmony_ci CHECK(*it == json(7)); 681c5f01b2fSopenharmony_ci CHECK(j_array.begin() == it); 682c5f01b2fSopenharmony_ci CHECK(j_array == json({7, 8, 9, 1, 2, 3, 4})); 683c5f01b2fSopenharmony_ci } 684c5f01b2fSopenharmony_ci 685c5f01b2fSopenharmony_ci SECTION("insert in the middle") 686c5f01b2fSopenharmony_ci { 687c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.begin() + 2, {7, 8, 9}); 688c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 689c5f01b2fSopenharmony_ci CHECK(*it == json(7)); 690c5f01b2fSopenharmony_ci CHECK((it - j_array.begin()) == 2); 691c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 7, 8, 9, 3, 4})); 692c5f01b2fSopenharmony_ci } 693c5f01b2fSopenharmony_ci 694c5f01b2fSopenharmony_ci SECTION("insert before end()") 695c5f01b2fSopenharmony_ci { 696c5f01b2fSopenharmony_ci auto it = j_array.insert(j_array.end(), {7, 8, 9}); 697c5f01b2fSopenharmony_ci CHECK(j_array.size() == 7); 698c5f01b2fSopenharmony_ci CHECK(*it == json(7)); 699c5f01b2fSopenharmony_ci CHECK((j_array.end() - it) == 3); 700c5f01b2fSopenharmony_ci CHECK(j_array == json({1, 2, 3, 4, 7, 8, 9})); 701c5f01b2fSopenharmony_ci } 702c5f01b2fSopenharmony_ci } 703c5f01b2fSopenharmony_ci 704c5f01b2fSopenharmony_ci SECTION("invalid iterator") 705c5f01b2fSopenharmony_ci { 706c5f01b2fSopenharmony_ci // pass iterator to a different array 707c5f01b2fSopenharmony_ci json j_another_array = {1, 2}; 708c5f01b2fSopenharmony_ci json j_yet_another_array = {"first", "second"}; 709c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_another_array.end(), 10), "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&); 710c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_another_array.end(), j_value), "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&); 711c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_another_array.end(), 10, 11), "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&); 712c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_another_array.end(), j_yet_another_array.begin(), j_yet_another_array.end()), "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&); 713c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.insert(j_another_array.end(), {1, 2, 3, 4}), "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&); 714c5f01b2fSopenharmony_ci } 715c5f01b2fSopenharmony_ci 716c5f01b2fSopenharmony_ci SECTION("non-array type") 717c5f01b2fSopenharmony_ci { 718c5f01b2fSopenharmony_ci // call insert on a non-array type 719c5f01b2fSopenharmony_ci json j_nonarray = 3; 720c5f01b2fSopenharmony_ci json j_yet_another_array = {"first", "second"}; 721c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_nonarray.insert(j_nonarray.end(), 10), "[json.exception.type_error.309] cannot use insert() with number", json::type_error&); 722c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_nonarray.insert(j_nonarray.end(), j_value), "[json.exception.type_error.309] cannot use insert() with number", json::type_error&); 723c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_nonarray.insert(j_nonarray.end(), 10, 11), "[json.exception.type_error.309] cannot use insert() with number", json::type_error&); 724c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_nonarray.insert(j_nonarray.end(), j_yet_another_array.begin(), j_yet_another_array.end()), "[json.exception.type_error.309] cannot use insert() with number", json::type_error&); 725c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_nonarray.insert(j_nonarray.end(), {1, 2, 3, 4}), "[json.exception.type_error.309] cannot use insert() with number", json::type_error&); 726c5f01b2fSopenharmony_ci } 727c5f01b2fSopenharmony_ci } 728c5f01b2fSopenharmony_ci 729c5f01b2fSopenharmony_ci SECTION("update()") 730c5f01b2fSopenharmony_ci { 731c5f01b2fSopenharmony_ci SECTION("non-recursive (default)") 732c5f01b2fSopenharmony_ci { 733c5f01b2fSopenharmony_ci json j_object1 = {{"one", "eins"}, {"two", "zwei"}}; 734c5f01b2fSopenharmony_ci json j_object2 = {{"three", "drei"}, {"two", "zwo"}}; 735c5f01b2fSopenharmony_ci json j_array = {1, 2, 3, 4}; 736c5f01b2fSopenharmony_ci 737c5f01b2fSopenharmony_ci SECTION("const reference") 738c5f01b2fSopenharmony_ci { 739c5f01b2fSopenharmony_ci SECTION("proper usage") 740c5f01b2fSopenharmony_ci { 741c5f01b2fSopenharmony_ci j_object1.update(j_object2); 742c5f01b2fSopenharmony_ci CHECK(j_object1 == json({{"one", "eins"}, {"two", "zwo"}, {"three", "drei"}})); 743c5f01b2fSopenharmony_ci 744c5f01b2fSopenharmony_ci json j_null; 745c5f01b2fSopenharmony_ci j_null.update(j_object2); 746c5f01b2fSopenharmony_ci CHECK(j_null == j_object2); 747c5f01b2fSopenharmony_ci } 748c5f01b2fSopenharmony_ci 749c5f01b2fSopenharmony_ci SECTION("wrong types") 750c5f01b2fSopenharmony_ci { 751c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.update(j_object1), "[json.exception.type_error.312] cannot use update() with array", json::type_error&); 752c5f01b2fSopenharmony_ci 753c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_object1.update(j_array), "[json.exception.type_error.312] cannot use update() with array", json::type_error&); 754c5f01b2fSopenharmony_ci } 755c5f01b2fSopenharmony_ci } 756c5f01b2fSopenharmony_ci 757c5f01b2fSopenharmony_ci SECTION("iterator range") 758c5f01b2fSopenharmony_ci { 759c5f01b2fSopenharmony_ci SECTION("proper usage") 760c5f01b2fSopenharmony_ci { 761c5f01b2fSopenharmony_ci j_object1.update(j_object2.begin(), j_object2.end()); 762c5f01b2fSopenharmony_ci CHECK(j_object1 == json({{"one", "eins"}, {"two", "zwo"}, {"three", "drei"}})); 763c5f01b2fSopenharmony_ci 764c5f01b2fSopenharmony_ci json j_null; 765c5f01b2fSopenharmony_ci j_null.update(j_object2.begin(), j_object2.end()); 766c5f01b2fSopenharmony_ci CHECK(j_null == j_object2); 767c5f01b2fSopenharmony_ci } 768c5f01b2fSopenharmony_ci 769c5f01b2fSopenharmony_ci SECTION("empty range") 770c5f01b2fSopenharmony_ci { 771c5f01b2fSopenharmony_ci j_object1.update(j_object2.begin(), j_object2.begin()); 772c5f01b2fSopenharmony_ci CHECK(j_object1 == json({{"one", "eins"}, {"two", "zwei"}})); 773c5f01b2fSopenharmony_ci } 774c5f01b2fSopenharmony_ci 775c5f01b2fSopenharmony_ci SECTION("invalid iterators") 776c5f01b2fSopenharmony_ci { 777c5f01b2fSopenharmony_ci json j_other_array2 = {"first", "second"}; 778c5f01b2fSopenharmony_ci 779c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_array.update(j_object2.begin(), j_object2.end()), "[json.exception.type_error.312] cannot use update() with array", json::type_error&); 780c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_object1.update(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&); 781c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j_object1.update(j_array.begin(), j_array.end()), "[json.exception.type_error.312] cannot use update() with array", json::type_error&); 782c5f01b2fSopenharmony_ci } 783c5f01b2fSopenharmony_ci } 784c5f01b2fSopenharmony_ci } 785c5f01b2fSopenharmony_ci 786c5f01b2fSopenharmony_ci SECTION("recursive") 787c5f01b2fSopenharmony_ci { 788c5f01b2fSopenharmony_ci SECTION("const reference") 789c5f01b2fSopenharmony_ci { 790c5f01b2fSopenharmony_ci SECTION("extend object") 791c5f01b2fSopenharmony_ci { 792c5f01b2fSopenharmony_ci json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}}; 793c5f01b2fSopenharmony_ci json j2 = {{"string", "t"}, {"numbers", {{"two", 2}}}}; 794c5f01b2fSopenharmony_ci j1.update(j2, true); 795c5f01b2fSopenharmony_ci CHECK(j1 == json({{"string", "t"}, {"numbers", {{"one", 1}, {"two", 2}}}})); 796c5f01b2fSopenharmony_ci } 797c5f01b2fSopenharmony_ci 798c5f01b2fSopenharmony_ci SECTION("replace object") 799c5f01b2fSopenharmony_ci { 800c5f01b2fSopenharmony_ci json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}}; 801c5f01b2fSopenharmony_ci json j2 = {{"string", "t"}, {"numbers", 1}}; 802c5f01b2fSopenharmony_ci j1.update(j2, true); 803c5f01b2fSopenharmony_ci CHECK(j1 == json({{"string", "t"}, {"numbers", 1}})); 804c5f01b2fSopenharmony_ci } 805c5f01b2fSopenharmony_ci } 806c5f01b2fSopenharmony_ci } 807c5f01b2fSopenharmony_ci } 808c5f01b2fSopenharmony_ci 809c5f01b2fSopenharmony_ci SECTION("swap()") 810c5f01b2fSopenharmony_ci { 811c5f01b2fSopenharmony_ci SECTION("json") 812c5f01b2fSopenharmony_ci { 813c5f01b2fSopenharmony_ci SECTION("member swap") 814c5f01b2fSopenharmony_ci { 815c5f01b2fSopenharmony_ci json j("hello world"); 816c5f01b2fSopenharmony_ci json k(42.23); 817c5f01b2fSopenharmony_ci 818c5f01b2fSopenharmony_ci j.swap(k); 819c5f01b2fSopenharmony_ci 820c5f01b2fSopenharmony_ci CHECK(j == json(42.23)); 821c5f01b2fSopenharmony_ci CHECK(k == json("hello world")); 822c5f01b2fSopenharmony_ci } 823c5f01b2fSopenharmony_ci 824c5f01b2fSopenharmony_ci SECTION("nonmember swap") 825c5f01b2fSopenharmony_ci { 826c5f01b2fSopenharmony_ci json j("hello world"); 827c5f01b2fSopenharmony_ci json k(42.23); 828c5f01b2fSopenharmony_ci 829c5f01b2fSopenharmony_ci using std::swap; 830c5f01b2fSopenharmony_ci swap(j, k); 831c5f01b2fSopenharmony_ci 832c5f01b2fSopenharmony_ci CHECK(j == json(42.23)); 833c5f01b2fSopenharmony_ci CHECK(k == json("hello world")); 834c5f01b2fSopenharmony_ci } 835c5f01b2fSopenharmony_ci } 836c5f01b2fSopenharmony_ci 837c5f01b2fSopenharmony_ci SECTION("array_t") 838c5f01b2fSopenharmony_ci { 839c5f01b2fSopenharmony_ci SECTION("array_t type") 840c5f01b2fSopenharmony_ci { 841c5f01b2fSopenharmony_ci json j = {1, 2, 3, 4}; 842c5f01b2fSopenharmony_ci json::array_t a = {"foo", "bar", "baz"}; 843c5f01b2fSopenharmony_ci 844c5f01b2fSopenharmony_ci j.swap(a); 845c5f01b2fSopenharmony_ci 846c5f01b2fSopenharmony_ci CHECK(j == json({"foo", "bar", "baz"})); 847c5f01b2fSopenharmony_ci 848c5f01b2fSopenharmony_ci j.swap(a); 849c5f01b2fSopenharmony_ci 850c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, 4})); 851c5f01b2fSopenharmony_ci } 852c5f01b2fSopenharmony_ci 853c5f01b2fSopenharmony_ci SECTION("non-array_t type") 854c5f01b2fSopenharmony_ci { 855c5f01b2fSopenharmony_ci json j = 17; 856c5f01b2fSopenharmony_ci json::array_t a = {"foo", "bar", "baz"}; 857c5f01b2fSopenharmony_ci 858c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.swap(a), "[json.exception.type_error.310] cannot use swap(array_t&) with number", json::type_error&); 859c5f01b2fSopenharmony_ci } 860c5f01b2fSopenharmony_ci } 861c5f01b2fSopenharmony_ci 862c5f01b2fSopenharmony_ci SECTION("object_t") 863c5f01b2fSopenharmony_ci { 864c5f01b2fSopenharmony_ci SECTION("object_t type") 865c5f01b2fSopenharmony_ci { 866c5f01b2fSopenharmony_ci json j = {{"one", 1}, {"two", 2}}; 867c5f01b2fSopenharmony_ci json::object_t o = {{"cow", "Kuh"}, {"chicken", "Huhn"}}; 868c5f01b2fSopenharmony_ci 869c5f01b2fSopenharmony_ci j.swap(o); 870c5f01b2fSopenharmony_ci 871c5f01b2fSopenharmony_ci CHECK(j == json({{"cow", "Kuh"}, {"chicken", "Huhn"}})); 872c5f01b2fSopenharmony_ci 873c5f01b2fSopenharmony_ci j.swap(o); 874c5f01b2fSopenharmony_ci 875c5f01b2fSopenharmony_ci CHECK(j == json({{"one", 1}, {"two", 2}})); 876c5f01b2fSopenharmony_ci } 877c5f01b2fSopenharmony_ci 878c5f01b2fSopenharmony_ci SECTION("non-object_t type") 879c5f01b2fSopenharmony_ci { 880c5f01b2fSopenharmony_ci json j = 17; 881c5f01b2fSopenharmony_ci json::object_t o = {{"cow", "Kuh"}, {"chicken", "Huhn"}}; 882c5f01b2fSopenharmony_ci 883c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.swap(o), "[json.exception.type_error.310] cannot use swap(object_t&) with number", json::type_error&); 884c5f01b2fSopenharmony_ci } 885c5f01b2fSopenharmony_ci } 886c5f01b2fSopenharmony_ci 887c5f01b2fSopenharmony_ci SECTION("string_t") 888c5f01b2fSopenharmony_ci { 889c5f01b2fSopenharmony_ci SECTION("string_t type") 890c5f01b2fSopenharmony_ci { 891c5f01b2fSopenharmony_ci json j = "Hello world"; 892c5f01b2fSopenharmony_ci json::string_t s = "Hallo Welt"; 893c5f01b2fSopenharmony_ci 894c5f01b2fSopenharmony_ci j.swap(s); 895c5f01b2fSopenharmony_ci 896c5f01b2fSopenharmony_ci CHECK(j == json("Hallo Welt")); 897c5f01b2fSopenharmony_ci 898c5f01b2fSopenharmony_ci j.swap(s); 899c5f01b2fSopenharmony_ci 900c5f01b2fSopenharmony_ci CHECK(j == json("Hello world")); 901c5f01b2fSopenharmony_ci } 902c5f01b2fSopenharmony_ci 903c5f01b2fSopenharmony_ci SECTION("non-string_t type") 904c5f01b2fSopenharmony_ci { 905c5f01b2fSopenharmony_ci json j = 17; 906c5f01b2fSopenharmony_ci json::string_t s = "Hallo Welt"; 907c5f01b2fSopenharmony_ci 908c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.swap(s), "[json.exception.type_error.310] cannot use swap(string_t&) with number", json::type_error&); 909c5f01b2fSopenharmony_ci } 910c5f01b2fSopenharmony_ci } 911c5f01b2fSopenharmony_ci 912c5f01b2fSopenharmony_ci SECTION("binary_t") 913c5f01b2fSopenharmony_ci { 914c5f01b2fSopenharmony_ci SECTION("binary_t type") 915c5f01b2fSopenharmony_ci { 916c5f01b2fSopenharmony_ci json j = json::binary({1, 2, 3, 4}); 917c5f01b2fSopenharmony_ci json::binary_t s = {{5, 6, 7, 8}}; 918c5f01b2fSopenharmony_ci 919c5f01b2fSopenharmony_ci j.swap(s); 920c5f01b2fSopenharmony_ci 921c5f01b2fSopenharmony_ci CHECK(j == json::binary({5, 6, 7, 8})); 922c5f01b2fSopenharmony_ci 923c5f01b2fSopenharmony_ci j.swap(s); 924c5f01b2fSopenharmony_ci 925c5f01b2fSopenharmony_ci CHECK(j == json::binary({1, 2, 3, 4})); 926c5f01b2fSopenharmony_ci } 927c5f01b2fSopenharmony_ci 928c5f01b2fSopenharmony_ci SECTION("binary_t::container_type type") 929c5f01b2fSopenharmony_ci { 930c5f01b2fSopenharmony_ci json j = json::binary({1, 2, 3, 4}); 931c5f01b2fSopenharmony_ci std::vector<std::uint8_t> s = {{5, 6, 7, 8}}; 932c5f01b2fSopenharmony_ci 933c5f01b2fSopenharmony_ci j.swap(s); 934c5f01b2fSopenharmony_ci 935c5f01b2fSopenharmony_ci CHECK(j == json::binary({5, 6, 7, 8})); 936c5f01b2fSopenharmony_ci 937c5f01b2fSopenharmony_ci j.swap(s); 938c5f01b2fSopenharmony_ci 939c5f01b2fSopenharmony_ci CHECK(j == json::binary({1, 2, 3, 4})); 940c5f01b2fSopenharmony_ci } 941c5f01b2fSopenharmony_ci 942c5f01b2fSopenharmony_ci SECTION("non-binary_t type") 943c5f01b2fSopenharmony_ci { 944c5f01b2fSopenharmony_ci json j = 17; 945c5f01b2fSopenharmony_ci json::binary_t s1 = {{1, 2, 3, 4}}; 946c5f01b2fSopenharmony_ci std::vector<std::uint8_t> s2 = {{5, 6, 7, 8}}; 947c5f01b2fSopenharmony_ci 948c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.swap(s1), "[json.exception.type_error.310] cannot use swap(binary_t&) with number", json::type_error); 949c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(j.swap(s2), "[json.exception.type_error.310] cannot use swap(binary_t::container_type&) with number", json::type_error); 950c5f01b2fSopenharmony_ci } 951c5f01b2fSopenharmony_ci } 952c5f01b2fSopenharmony_ci } 953c5f01b2fSopenharmony_ci} 954