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// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me> 7c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT 8c5f01b2fSopenharmony_ci 9c5f01b2fSopenharmony_ci#include "doctest_compatibility.h" 10c5f01b2fSopenharmony_ci 11c5f01b2fSopenharmony_ci#define JSON_TESTS_PRIVATE 12c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp> 13c5f01b2fSopenharmony_ciusing nlohmann::json; 14c5f01b2fSopenharmony_ci 15c5f01b2fSopenharmony_ci#include <deque> 16c5f01b2fSopenharmony_ci#include <forward_list> 17c5f01b2fSopenharmony_ci#include <fstream> 18c5f01b2fSopenharmony_ci#include <list> 19c5f01b2fSopenharmony_ci#include <set> 20c5f01b2fSopenharmony_ci#include <unordered_map> 21c5f01b2fSopenharmony_ci#include <unordered_set> 22c5f01b2fSopenharmony_ci#include <valarray> 23c5f01b2fSopenharmony_ci 24c5f01b2fSopenharmony_ciTEST_CASE("constructors") 25c5f01b2fSopenharmony_ci{ 26c5f01b2fSopenharmony_ci SECTION("create an empty value with a given type") 27c5f01b2fSopenharmony_ci { 28c5f01b2fSopenharmony_ci SECTION("null") 29c5f01b2fSopenharmony_ci { 30c5f01b2fSopenharmony_ci auto t = json::value_t::null; 31c5f01b2fSopenharmony_ci json j(t); 32c5f01b2fSopenharmony_ci CHECK(j.type() == t); 33c5f01b2fSopenharmony_ci } 34c5f01b2fSopenharmony_ci 35c5f01b2fSopenharmony_ci SECTION("discarded") 36c5f01b2fSopenharmony_ci { 37c5f01b2fSopenharmony_ci auto t = json::value_t::discarded; 38c5f01b2fSopenharmony_ci json j(t); 39c5f01b2fSopenharmony_ci CHECK(j.type() == t); 40c5f01b2fSopenharmony_ci } 41c5f01b2fSopenharmony_ci 42c5f01b2fSopenharmony_ci SECTION("object") 43c5f01b2fSopenharmony_ci { 44c5f01b2fSopenharmony_ci auto t = json::value_t::object; 45c5f01b2fSopenharmony_ci json j(t); 46c5f01b2fSopenharmony_ci CHECK(j.type() == t); 47c5f01b2fSopenharmony_ci } 48c5f01b2fSopenharmony_ci 49c5f01b2fSopenharmony_ci SECTION("array") 50c5f01b2fSopenharmony_ci { 51c5f01b2fSopenharmony_ci auto t = json::value_t::array; 52c5f01b2fSopenharmony_ci json j(t); 53c5f01b2fSopenharmony_ci CHECK(j.type() == t); 54c5f01b2fSopenharmony_ci } 55c5f01b2fSopenharmony_ci 56c5f01b2fSopenharmony_ci SECTION("boolean") 57c5f01b2fSopenharmony_ci { 58c5f01b2fSopenharmony_ci auto t = json::value_t::boolean; 59c5f01b2fSopenharmony_ci json j(t); 60c5f01b2fSopenharmony_ci CHECK(j.type() == t); 61c5f01b2fSopenharmony_ci CHECK(j == false); 62c5f01b2fSopenharmony_ci } 63c5f01b2fSopenharmony_ci 64c5f01b2fSopenharmony_ci SECTION("string") 65c5f01b2fSopenharmony_ci { 66c5f01b2fSopenharmony_ci auto t = json::value_t::string; 67c5f01b2fSopenharmony_ci json j(t); 68c5f01b2fSopenharmony_ci CHECK(j.type() == t); 69c5f01b2fSopenharmony_ci CHECK(j == ""); 70c5f01b2fSopenharmony_ci } 71c5f01b2fSopenharmony_ci 72c5f01b2fSopenharmony_ci SECTION("number_integer") 73c5f01b2fSopenharmony_ci { 74c5f01b2fSopenharmony_ci auto t = json::value_t::number_integer; 75c5f01b2fSopenharmony_ci json j(t); 76c5f01b2fSopenharmony_ci CHECK(j.type() == t); 77c5f01b2fSopenharmony_ci CHECK(j == 0); 78c5f01b2fSopenharmony_ci } 79c5f01b2fSopenharmony_ci 80c5f01b2fSopenharmony_ci SECTION("number_unsigned") 81c5f01b2fSopenharmony_ci { 82c5f01b2fSopenharmony_ci auto t = json::value_t::number_unsigned; 83c5f01b2fSopenharmony_ci json j(t); 84c5f01b2fSopenharmony_ci CHECK(j.type() == t); 85c5f01b2fSopenharmony_ci CHECK(j == 0); 86c5f01b2fSopenharmony_ci } 87c5f01b2fSopenharmony_ci 88c5f01b2fSopenharmony_ci SECTION("number_float") 89c5f01b2fSopenharmony_ci { 90c5f01b2fSopenharmony_ci auto t = json::value_t::number_float; 91c5f01b2fSopenharmony_ci json j(t); 92c5f01b2fSopenharmony_ci CHECK(j.type() == t); 93c5f01b2fSopenharmony_ci CHECK(j == 0.0); 94c5f01b2fSopenharmony_ci } 95c5f01b2fSopenharmony_ci 96c5f01b2fSopenharmony_ci SECTION("binary") 97c5f01b2fSopenharmony_ci { 98c5f01b2fSopenharmony_ci auto t = json::value_t::binary; 99c5f01b2fSopenharmony_ci json j(t); 100c5f01b2fSopenharmony_ci CHECK(j.type() == t); 101c5f01b2fSopenharmony_ci CHECK(j == json::binary({})); 102c5f01b2fSopenharmony_ci } 103c5f01b2fSopenharmony_ci } 104c5f01b2fSopenharmony_ci 105c5f01b2fSopenharmony_ci SECTION("create a null object (implicitly)") 106c5f01b2fSopenharmony_ci { 107c5f01b2fSopenharmony_ci SECTION("no parameter") 108c5f01b2fSopenharmony_ci { 109c5f01b2fSopenharmony_ci json j{}; 110c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::null); 111c5f01b2fSopenharmony_ci } 112c5f01b2fSopenharmony_ci } 113c5f01b2fSopenharmony_ci 114c5f01b2fSopenharmony_ci SECTION("create a null object (explicitly)") 115c5f01b2fSopenharmony_ci { 116c5f01b2fSopenharmony_ci SECTION("parameter") 117c5f01b2fSopenharmony_ci { 118c5f01b2fSopenharmony_ci json j(nullptr); 119c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::null); 120c5f01b2fSopenharmony_ci } 121c5f01b2fSopenharmony_ci } 122c5f01b2fSopenharmony_ci 123c5f01b2fSopenharmony_ci SECTION("create an object (explicit)") 124c5f01b2fSopenharmony_ci { 125c5f01b2fSopenharmony_ci SECTION("empty object") 126c5f01b2fSopenharmony_ci { 127c5f01b2fSopenharmony_ci json::object_t o; 128c5f01b2fSopenharmony_ci json j(o); 129c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 130c5f01b2fSopenharmony_ci } 131c5f01b2fSopenharmony_ci 132c5f01b2fSopenharmony_ci SECTION("filled object") 133c5f01b2fSopenharmony_ci { 134c5f01b2fSopenharmony_ci json::object_t o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 135c5f01b2fSopenharmony_ci json j(o); 136c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 137c5f01b2fSopenharmony_ci } 138c5f01b2fSopenharmony_ci } 139c5f01b2fSopenharmony_ci 140c5f01b2fSopenharmony_ci SECTION("create an object (implicit)") 141c5f01b2fSopenharmony_ci { 142c5f01b2fSopenharmony_ci // reference object 143c5f01b2fSopenharmony_ci json::object_t o_reference {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 144c5f01b2fSopenharmony_ci json j_reference(o_reference); 145c5f01b2fSopenharmony_ci 146c5f01b2fSopenharmony_ci SECTION("std::map<json::string_t, json>") 147c5f01b2fSopenharmony_ci { 148c5f01b2fSopenharmony_ci std::map<json::string_t, json> o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 149c5f01b2fSopenharmony_ci json j(o); 150c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 151c5f01b2fSopenharmony_ci CHECK(j == j_reference); 152c5f01b2fSopenharmony_ci } 153c5f01b2fSopenharmony_ci 154c5f01b2fSopenharmony_ci SECTION("std::map<std::string, std::string> #600") 155c5f01b2fSopenharmony_ci { 156c5f01b2fSopenharmony_ci std::map<std::string, std::string> m; 157c5f01b2fSopenharmony_ci m["a"] = "b"; 158c5f01b2fSopenharmony_ci m["c"] = "d"; 159c5f01b2fSopenharmony_ci m["e"] = "f"; 160c5f01b2fSopenharmony_ci 161c5f01b2fSopenharmony_ci json j(m); 162c5f01b2fSopenharmony_ci CHECK((j.get<decltype(m)>() == m)); 163c5f01b2fSopenharmony_ci } 164c5f01b2fSopenharmony_ci 165c5f01b2fSopenharmony_ci SECTION("std::map<const char*, json>") 166c5f01b2fSopenharmony_ci { 167c5f01b2fSopenharmony_ci std::map<const char*, json> o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 168c5f01b2fSopenharmony_ci json j(o); 169c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 170c5f01b2fSopenharmony_ci CHECK(j == j_reference); 171c5f01b2fSopenharmony_ci } 172c5f01b2fSopenharmony_ci 173c5f01b2fSopenharmony_ci 174c5f01b2fSopenharmony_ci SECTION("std::multimap<json::string_t, json>") 175c5f01b2fSopenharmony_ci { 176c5f01b2fSopenharmony_ci std::multimap<json::string_t, json> o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 177c5f01b2fSopenharmony_ci json j(o); 178c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 179c5f01b2fSopenharmony_ci CHECK(j == j_reference); 180c5f01b2fSopenharmony_ci } 181c5f01b2fSopenharmony_ci 182c5f01b2fSopenharmony_ci SECTION("std::unordered_map<json::string_t, json>") 183c5f01b2fSopenharmony_ci { 184c5f01b2fSopenharmony_ci std::unordered_map<json::string_t, json> o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 185c5f01b2fSopenharmony_ci json j(o); 186c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 187c5f01b2fSopenharmony_ci CHECK(j == j_reference); 188c5f01b2fSopenharmony_ci } 189c5f01b2fSopenharmony_ci 190c5f01b2fSopenharmony_ci SECTION("std::unordered_multimap<json::string_t, json>") 191c5f01b2fSopenharmony_ci { 192c5f01b2fSopenharmony_ci std::unordered_multimap<json::string_t, json> o {{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}; 193c5f01b2fSopenharmony_ci json j(o); 194c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 195c5f01b2fSopenharmony_ci CHECK(j == j_reference); 196c5f01b2fSopenharmony_ci } 197c5f01b2fSopenharmony_ci 198c5f01b2fSopenharmony_ci SECTION("associative container literal") 199c5f01b2fSopenharmony_ci { 200c5f01b2fSopenharmony_ci json j({{"a", json(1)}, {"b", json(1u)}, {"c", json(2.2)}, {"d", json(false)}, {"e", json("string")}, {"f", json()}}); 201c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 202c5f01b2fSopenharmony_ci CHECK(j == j_reference); 203c5f01b2fSopenharmony_ci } 204c5f01b2fSopenharmony_ci } 205c5f01b2fSopenharmony_ci 206c5f01b2fSopenharmony_ci SECTION("create an array (explicit)") 207c5f01b2fSopenharmony_ci { 208c5f01b2fSopenharmony_ci SECTION("empty array") 209c5f01b2fSopenharmony_ci { 210c5f01b2fSopenharmony_ci json::array_t a; 211c5f01b2fSopenharmony_ci json j(a); 212c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 213c5f01b2fSopenharmony_ci } 214c5f01b2fSopenharmony_ci 215c5f01b2fSopenharmony_ci SECTION("filled array") 216c5f01b2fSopenharmony_ci { 217c5f01b2fSopenharmony_ci json::array_t a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 218c5f01b2fSopenharmony_ci json j(a); 219c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 220c5f01b2fSopenharmony_ci } 221c5f01b2fSopenharmony_ci } 222c5f01b2fSopenharmony_ci 223c5f01b2fSopenharmony_ci SECTION("create an array (implicit)") 224c5f01b2fSopenharmony_ci { 225c5f01b2fSopenharmony_ci // reference array 226c5f01b2fSopenharmony_ci json::array_t a_reference {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 227c5f01b2fSopenharmony_ci json j_reference(a_reference); 228c5f01b2fSopenharmony_ci 229c5f01b2fSopenharmony_ci SECTION("std::list<json>") 230c5f01b2fSopenharmony_ci { 231c5f01b2fSopenharmony_ci std::list<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 232c5f01b2fSopenharmony_ci json j(a); 233c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 234c5f01b2fSopenharmony_ci CHECK(j == j_reference); 235c5f01b2fSopenharmony_ci } 236c5f01b2fSopenharmony_ci 237c5f01b2fSopenharmony_ci SECTION("std::pair") 238c5f01b2fSopenharmony_ci { 239c5f01b2fSopenharmony_ci std::pair<float, std::string> p{1.0f, "string"}; 240c5f01b2fSopenharmony_ci json j(p); 241c5f01b2fSopenharmony_ci 242c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 243c5f01b2fSopenharmony_ci CHECK(j.get<decltype(p)>() == p); 244c5f01b2fSopenharmony_ci REQUIRE(j.size() == 2); 245c5f01b2fSopenharmony_ci CHECK(j[0] == std::get<0>(p)); 246c5f01b2fSopenharmony_ci CHECK(j[1] == std::get<1>(p)); 247c5f01b2fSopenharmony_ci } 248c5f01b2fSopenharmony_ci 249c5f01b2fSopenharmony_ci SECTION("std::pair with discarded values") 250c5f01b2fSopenharmony_ci { 251c5f01b2fSopenharmony_ci json j{1, 2.0, "string"}; 252c5f01b2fSopenharmony_ci 253c5f01b2fSopenharmony_ci const auto p = j.get<std::pair<int, float>>(); 254c5f01b2fSopenharmony_ci CHECK(p.first == j[0]); 255c5f01b2fSopenharmony_ci CHECK(p.second == j[1]); 256c5f01b2fSopenharmony_ci } 257c5f01b2fSopenharmony_ci 258c5f01b2fSopenharmony_ci SECTION("std::tuple") 259c5f01b2fSopenharmony_ci { 260c5f01b2fSopenharmony_ci const auto t = std::make_tuple(1.0, std::string{"string"}, 42, std::vector<int> {0, 1}); 261c5f01b2fSopenharmony_ci json j(t); 262c5f01b2fSopenharmony_ci 263c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 264c5f01b2fSopenharmony_ci REQUIRE(j.size() == 4); 265c5f01b2fSopenharmony_ci CHECK(j.get<decltype(t)>() == t); 266c5f01b2fSopenharmony_ci CHECK(j[0] == std::get<0>(t)); 267c5f01b2fSopenharmony_ci CHECK(j[1] == std::get<1>(t)); 268c5f01b2fSopenharmony_ci CHECK(j[2] == std::get<2>(t)); 269c5f01b2fSopenharmony_ci CHECK(j[3][0] == 0); 270c5f01b2fSopenharmony_ci CHECK(j[3][1] == 1); 271c5f01b2fSopenharmony_ci } 272c5f01b2fSopenharmony_ci 273c5f01b2fSopenharmony_ci SECTION("std::tuple with discarded values") 274c5f01b2fSopenharmony_ci { 275c5f01b2fSopenharmony_ci json j{1, 2.0, "string", 42}; 276c5f01b2fSopenharmony_ci 277c5f01b2fSopenharmony_ci const auto t = j.get<std::tuple<int, float, std::string>>(); 278c5f01b2fSopenharmony_ci CHECK(std::get<0>(t) == j[0]); 279c5f01b2fSopenharmony_ci CHECK(std::get<1>(t) == j[1]); 280c5f01b2fSopenharmony_ci CHECK(std::get<2>(t) == j[2]); 281c5f01b2fSopenharmony_ci } 282c5f01b2fSopenharmony_ci 283c5f01b2fSopenharmony_ci SECTION("std::pair/tuple/array failures") 284c5f01b2fSopenharmony_ci { 285c5f01b2fSopenharmony_ci json j{1}; 286c5f01b2fSopenharmony_ci 287c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS((j.get<std::pair<int, int>>()), "[json.exception.out_of_range.401] array index 1 is out of range", json::out_of_range&); 288c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS((j.get<std::tuple<int, int>>()), "[json.exception.out_of_range.401] array index 1 is out of range", json::out_of_range&); 289c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS((j.get<std::array<int, 3>>()), "[json.exception.out_of_range.401] array index 1 is out of range", json::out_of_range&); 290c5f01b2fSopenharmony_ci } 291c5f01b2fSopenharmony_ci 292c5f01b2fSopenharmony_ci SECTION("std::forward_list<json>") 293c5f01b2fSopenharmony_ci { 294c5f01b2fSopenharmony_ci std::forward_list<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 295c5f01b2fSopenharmony_ci json j(a); 296c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 297c5f01b2fSopenharmony_ci CHECK(j == j_reference); 298c5f01b2fSopenharmony_ci } 299c5f01b2fSopenharmony_ci 300c5f01b2fSopenharmony_ci SECTION("std::array<json, 6>") 301c5f01b2fSopenharmony_ci { 302c5f01b2fSopenharmony_ci std::array<json, 6> a {{json(1), json(1u), json(2.2), json(false), json("string"), json()}}; 303c5f01b2fSopenharmony_ci json j(a); 304c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 305c5f01b2fSopenharmony_ci CHECK(j == j_reference); 306c5f01b2fSopenharmony_ci 307c5f01b2fSopenharmony_ci const auto a2 = j.get<std::array<json, 6>>(); 308c5f01b2fSopenharmony_ci CHECK(a2 == a); 309c5f01b2fSopenharmony_ci } 310c5f01b2fSopenharmony_ci 311c5f01b2fSopenharmony_ci SECTION("std::valarray<int>") 312c5f01b2fSopenharmony_ci { 313c5f01b2fSopenharmony_ci std::valarray<int> va = {1, 2, 3, 4, 5}; 314c5f01b2fSopenharmony_ci json j(va); 315c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 316c5f01b2fSopenharmony_ci CHECK(j == json({1, 2, 3, 4, 5})); 317c5f01b2fSopenharmony_ci 318c5f01b2fSopenharmony_ci auto jva = j.get<std::valarray<int>>(); 319c5f01b2fSopenharmony_ci CHECK(jva.size() == va.size()); 320c5f01b2fSopenharmony_ci for (size_t i = 0; i < jva.size(); ++i) 321c5f01b2fSopenharmony_ci { 322c5f01b2fSopenharmony_ci CHECK(va[i] == jva[i]); 323c5f01b2fSopenharmony_ci } 324c5f01b2fSopenharmony_ci } 325c5f01b2fSopenharmony_ci 326c5f01b2fSopenharmony_ci SECTION("std::valarray<double>") 327c5f01b2fSopenharmony_ci { 328c5f01b2fSopenharmony_ci std::valarray<double> va = {1.2, 2.3, 3.4, 4.5, 5.6}; 329c5f01b2fSopenharmony_ci json j(va); 330c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 331c5f01b2fSopenharmony_ci CHECK(j == json({1.2, 2.3, 3.4, 4.5, 5.6})); 332c5f01b2fSopenharmony_ci 333c5f01b2fSopenharmony_ci auto jva = j.get<std::valarray<double>>(); 334c5f01b2fSopenharmony_ci CHECK(jva.size() == va.size()); 335c5f01b2fSopenharmony_ci for (size_t i = 0; i < jva.size(); ++i) 336c5f01b2fSopenharmony_ci { 337c5f01b2fSopenharmony_ci CHECK(va[i] == jva[i]); 338c5f01b2fSopenharmony_ci } 339c5f01b2fSopenharmony_ci } 340c5f01b2fSopenharmony_ci 341c5f01b2fSopenharmony_ci SECTION("std::vector<json>") 342c5f01b2fSopenharmony_ci { 343c5f01b2fSopenharmony_ci std::vector<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 344c5f01b2fSopenharmony_ci json j(a); 345c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 346c5f01b2fSopenharmony_ci CHECK(j == j_reference); 347c5f01b2fSopenharmony_ci } 348c5f01b2fSopenharmony_ci 349c5f01b2fSopenharmony_ci SECTION("std::deque<json>") 350c5f01b2fSopenharmony_ci { 351c5f01b2fSopenharmony_ci std::deque<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 352c5f01b2fSopenharmony_ci json j(a); 353c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 354c5f01b2fSopenharmony_ci CHECK(j == j_reference); 355c5f01b2fSopenharmony_ci } 356c5f01b2fSopenharmony_ci 357c5f01b2fSopenharmony_ci SECTION("std::set<json>") 358c5f01b2fSopenharmony_ci { 359c5f01b2fSopenharmony_ci std::set<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 360c5f01b2fSopenharmony_ci json j(a); 361c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 362c5f01b2fSopenharmony_ci // we cannot really check for equality here 363c5f01b2fSopenharmony_ci } 364c5f01b2fSopenharmony_ci 365c5f01b2fSopenharmony_ci SECTION("std::unordered_set<json>") 366c5f01b2fSopenharmony_ci { 367c5f01b2fSopenharmony_ci std::unordered_set<json> a {json(1), json(1u), json(2.2), json(false), json("string"), json()}; 368c5f01b2fSopenharmony_ci json j(a); 369c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 370c5f01b2fSopenharmony_ci // we cannot really check for equality here 371c5f01b2fSopenharmony_ci } 372c5f01b2fSopenharmony_ci 373c5f01b2fSopenharmony_ci SECTION("sequence container literal") 374c5f01b2fSopenharmony_ci { 375c5f01b2fSopenharmony_ci json j({json(1), json(1u), json(2.2), json(false), json("string"), json()}); 376c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 377c5f01b2fSopenharmony_ci CHECK(j == j_reference); 378c5f01b2fSopenharmony_ci } 379c5f01b2fSopenharmony_ci } 380c5f01b2fSopenharmony_ci 381c5f01b2fSopenharmony_ci SECTION("create a string (explicit)") 382c5f01b2fSopenharmony_ci { 383c5f01b2fSopenharmony_ci SECTION("empty string") 384c5f01b2fSopenharmony_ci { 385c5f01b2fSopenharmony_ci json::string_t s; 386c5f01b2fSopenharmony_ci json j(s); 387c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 388c5f01b2fSopenharmony_ci } 389c5f01b2fSopenharmony_ci 390c5f01b2fSopenharmony_ci SECTION("filled string") 391c5f01b2fSopenharmony_ci { 392c5f01b2fSopenharmony_ci json::string_t s {"Hello world"}; 393c5f01b2fSopenharmony_ci json j(s); 394c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 395c5f01b2fSopenharmony_ci } 396c5f01b2fSopenharmony_ci } 397c5f01b2fSopenharmony_ci 398c5f01b2fSopenharmony_ci SECTION("create a string (implicit)") 399c5f01b2fSopenharmony_ci { 400c5f01b2fSopenharmony_ci // reference string 401c5f01b2fSopenharmony_ci json::string_t s_reference {"Hello world"}; 402c5f01b2fSopenharmony_ci json j_reference(s_reference); 403c5f01b2fSopenharmony_ci 404c5f01b2fSopenharmony_ci SECTION("std::string") 405c5f01b2fSopenharmony_ci { 406c5f01b2fSopenharmony_ci std::string s {"Hello world"}; 407c5f01b2fSopenharmony_ci json j(s); 408c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 409c5f01b2fSopenharmony_ci CHECK(j == j_reference); 410c5f01b2fSopenharmony_ci } 411c5f01b2fSopenharmony_ci 412c5f01b2fSopenharmony_ci SECTION("char[]") 413c5f01b2fSopenharmony_ci { 414c5f01b2fSopenharmony_ci char s[] {"Hello world"}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) 415c5f01b2fSopenharmony_ci json j(s); 416c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 417c5f01b2fSopenharmony_ci CHECK(j == j_reference); 418c5f01b2fSopenharmony_ci } 419c5f01b2fSopenharmony_ci 420c5f01b2fSopenharmony_ci SECTION("const char*") 421c5f01b2fSopenharmony_ci { 422c5f01b2fSopenharmony_ci const char* s {"Hello world"}; 423c5f01b2fSopenharmony_ci json j(s); 424c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 425c5f01b2fSopenharmony_ci CHECK(j == j_reference); 426c5f01b2fSopenharmony_ci } 427c5f01b2fSopenharmony_ci 428c5f01b2fSopenharmony_ci SECTION("string literal") 429c5f01b2fSopenharmony_ci { 430c5f01b2fSopenharmony_ci json j("Hello world"); 431c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::string); 432c5f01b2fSopenharmony_ci CHECK(j == j_reference); 433c5f01b2fSopenharmony_ci } 434c5f01b2fSopenharmony_ci } 435c5f01b2fSopenharmony_ci 436c5f01b2fSopenharmony_ci SECTION("create a boolean (explicit)") 437c5f01b2fSopenharmony_ci { 438c5f01b2fSopenharmony_ci SECTION("empty boolean") 439c5f01b2fSopenharmony_ci { 440c5f01b2fSopenharmony_ci json::boolean_t b{}; 441c5f01b2fSopenharmony_ci json j(b); 442c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::boolean); 443c5f01b2fSopenharmony_ci } 444c5f01b2fSopenharmony_ci 445c5f01b2fSopenharmony_ci SECTION("filled boolean (true)") 446c5f01b2fSopenharmony_ci { 447c5f01b2fSopenharmony_ci json j(true); 448c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::boolean); 449c5f01b2fSopenharmony_ci } 450c5f01b2fSopenharmony_ci 451c5f01b2fSopenharmony_ci SECTION("filled boolean (false)") 452c5f01b2fSopenharmony_ci { 453c5f01b2fSopenharmony_ci json j(false); 454c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::boolean); 455c5f01b2fSopenharmony_ci } 456c5f01b2fSopenharmony_ci 457c5f01b2fSopenharmony_ci SECTION("from std::vector<bool>::reference") 458c5f01b2fSopenharmony_ci { 459c5f01b2fSopenharmony_ci std::vector<bool> v{true}; 460c5f01b2fSopenharmony_ci json j(v[0]); 461c5f01b2fSopenharmony_ci CHECK(std::is_same<decltype(v[0]), std::vector<bool>::reference>::value); 462c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::boolean); 463c5f01b2fSopenharmony_ci } 464c5f01b2fSopenharmony_ci 465c5f01b2fSopenharmony_ci SECTION("from std::vector<bool>::const_reference") 466c5f01b2fSopenharmony_ci { 467c5f01b2fSopenharmony_ci const std::vector<bool> v{true}; 468c5f01b2fSopenharmony_ci json j(v[0]); 469c5f01b2fSopenharmony_ci CHECK(std::is_same<decltype(v[0]), std::vector<bool>::const_reference>::value); 470c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::boolean); 471c5f01b2fSopenharmony_ci } 472c5f01b2fSopenharmony_ci } 473c5f01b2fSopenharmony_ci 474c5f01b2fSopenharmony_ci SECTION("create a binary (explicit)") 475c5f01b2fSopenharmony_ci { 476c5f01b2fSopenharmony_ci SECTION("empty binary") 477c5f01b2fSopenharmony_ci { 478c5f01b2fSopenharmony_ci json::binary_t b{}; 479c5f01b2fSopenharmony_ci json j(b); 480c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::binary); 481c5f01b2fSopenharmony_ci } 482c5f01b2fSopenharmony_ci 483c5f01b2fSopenharmony_ci SECTION("filled binary") 484c5f01b2fSopenharmony_ci { 485c5f01b2fSopenharmony_ci json::binary_t b({1, 2, 3}); 486c5f01b2fSopenharmony_ci json j(b); 487c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::binary); 488c5f01b2fSopenharmony_ci } 489c5f01b2fSopenharmony_ci } 490c5f01b2fSopenharmony_ci 491c5f01b2fSopenharmony_ci SECTION("create an integer number (explicit)") 492c5f01b2fSopenharmony_ci { 493c5f01b2fSopenharmony_ci SECTION("uninitialized value") 494c5f01b2fSopenharmony_ci { 495c5f01b2fSopenharmony_ci json::number_integer_t n{}; 496c5f01b2fSopenharmony_ci json j(n); 497c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 498c5f01b2fSopenharmony_ci } 499c5f01b2fSopenharmony_ci 500c5f01b2fSopenharmony_ci SECTION("initialized value") 501c5f01b2fSopenharmony_ci { 502c5f01b2fSopenharmony_ci json::number_integer_t n(42); 503c5f01b2fSopenharmony_ci json j(n); 504c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 505c5f01b2fSopenharmony_ci } 506c5f01b2fSopenharmony_ci } 507c5f01b2fSopenharmony_ci 508c5f01b2fSopenharmony_ci SECTION("create an integer number (implicit)") 509c5f01b2fSopenharmony_ci { 510c5f01b2fSopenharmony_ci // reference objects 511c5f01b2fSopenharmony_ci json::number_integer_t n_reference = 42; 512c5f01b2fSopenharmony_ci json j_reference(n_reference); 513c5f01b2fSopenharmony_ci json::number_unsigned_t n_unsigned_reference = 42; 514c5f01b2fSopenharmony_ci json j_unsigned_reference(n_unsigned_reference); 515c5f01b2fSopenharmony_ci 516c5f01b2fSopenharmony_ci SECTION("short") 517c5f01b2fSopenharmony_ci { 518c5f01b2fSopenharmony_ci short n = 42; 519c5f01b2fSopenharmony_ci json j(n); 520c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 521c5f01b2fSopenharmony_ci CHECK(j == j_reference); 522c5f01b2fSopenharmony_ci } 523c5f01b2fSopenharmony_ci 524c5f01b2fSopenharmony_ci SECTION("unsigned short") 525c5f01b2fSopenharmony_ci { 526c5f01b2fSopenharmony_ci unsigned short n = 42; 527c5f01b2fSopenharmony_ci json j(n); 528c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 529c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 530c5f01b2fSopenharmony_ci } 531c5f01b2fSopenharmony_ci 532c5f01b2fSopenharmony_ci SECTION("int") 533c5f01b2fSopenharmony_ci { 534c5f01b2fSopenharmony_ci int n = 42; 535c5f01b2fSopenharmony_ci json j(n); 536c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 537c5f01b2fSopenharmony_ci CHECK(j == j_reference); 538c5f01b2fSopenharmony_ci } 539c5f01b2fSopenharmony_ci 540c5f01b2fSopenharmony_ci SECTION("unsigned int") 541c5f01b2fSopenharmony_ci { 542c5f01b2fSopenharmony_ci unsigned int n = 42; 543c5f01b2fSopenharmony_ci json j(n); 544c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 545c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 546c5f01b2fSopenharmony_ci } 547c5f01b2fSopenharmony_ci 548c5f01b2fSopenharmony_ci SECTION("long") 549c5f01b2fSopenharmony_ci { 550c5f01b2fSopenharmony_ci long n = 42; 551c5f01b2fSopenharmony_ci json j(n); 552c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 553c5f01b2fSopenharmony_ci CHECK(j == j_reference); 554c5f01b2fSopenharmony_ci } 555c5f01b2fSopenharmony_ci 556c5f01b2fSopenharmony_ci SECTION("unsigned long") 557c5f01b2fSopenharmony_ci { 558c5f01b2fSopenharmony_ci unsigned long n = 42; 559c5f01b2fSopenharmony_ci json j(n); 560c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 561c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 562c5f01b2fSopenharmony_ci } 563c5f01b2fSopenharmony_ci 564c5f01b2fSopenharmony_ci SECTION("long long") 565c5f01b2fSopenharmony_ci { 566c5f01b2fSopenharmony_ci long long n = 42; 567c5f01b2fSopenharmony_ci json j(n); 568c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 569c5f01b2fSopenharmony_ci CHECK(j == j_reference); 570c5f01b2fSopenharmony_ci } 571c5f01b2fSopenharmony_ci 572c5f01b2fSopenharmony_ci SECTION("unsigned long long") 573c5f01b2fSopenharmony_ci { 574c5f01b2fSopenharmony_ci unsigned long long n = 42; 575c5f01b2fSopenharmony_ci json j(n); 576c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 577c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 578c5f01b2fSopenharmony_ci } 579c5f01b2fSopenharmony_ci 580c5f01b2fSopenharmony_ci SECTION("int8_t") 581c5f01b2fSopenharmony_ci { 582c5f01b2fSopenharmony_ci int8_t n = 42; 583c5f01b2fSopenharmony_ci json j(n); 584c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 585c5f01b2fSopenharmony_ci CHECK(j == j_reference); 586c5f01b2fSopenharmony_ci } 587c5f01b2fSopenharmony_ci 588c5f01b2fSopenharmony_ci SECTION("int16_t") 589c5f01b2fSopenharmony_ci { 590c5f01b2fSopenharmony_ci int16_t n = 42; 591c5f01b2fSopenharmony_ci json j(n); 592c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 593c5f01b2fSopenharmony_ci CHECK(j == j_reference); 594c5f01b2fSopenharmony_ci } 595c5f01b2fSopenharmony_ci 596c5f01b2fSopenharmony_ci SECTION("int32_t") 597c5f01b2fSopenharmony_ci { 598c5f01b2fSopenharmony_ci int32_t n = 42; 599c5f01b2fSopenharmony_ci json j(n); 600c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 601c5f01b2fSopenharmony_ci CHECK(j == j_reference); 602c5f01b2fSopenharmony_ci } 603c5f01b2fSopenharmony_ci 604c5f01b2fSopenharmony_ci SECTION("int64_t") 605c5f01b2fSopenharmony_ci { 606c5f01b2fSopenharmony_ci int64_t n = 42; 607c5f01b2fSopenharmony_ci json j(n); 608c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 609c5f01b2fSopenharmony_ci CHECK(j == j_reference); 610c5f01b2fSopenharmony_ci } 611c5f01b2fSopenharmony_ci 612c5f01b2fSopenharmony_ci SECTION("int_fast8_t") 613c5f01b2fSopenharmony_ci { 614c5f01b2fSopenharmony_ci int_fast8_t n = 42; 615c5f01b2fSopenharmony_ci json j(n); 616c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 617c5f01b2fSopenharmony_ci CHECK(j == j_reference); 618c5f01b2fSopenharmony_ci } 619c5f01b2fSopenharmony_ci 620c5f01b2fSopenharmony_ci SECTION("int_fast16_t") 621c5f01b2fSopenharmony_ci { 622c5f01b2fSopenharmony_ci int_fast16_t n = 42; 623c5f01b2fSopenharmony_ci json j(n); 624c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 625c5f01b2fSopenharmony_ci CHECK(j == j_reference); 626c5f01b2fSopenharmony_ci } 627c5f01b2fSopenharmony_ci 628c5f01b2fSopenharmony_ci SECTION("int_fast32_t") 629c5f01b2fSopenharmony_ci { 630c5f01b2fSopenharmony_ci int_fast32_t n = 42; 631c5f01b2fSopenharmony_ci json j(n); 632c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 633c5f01b2fSopenharmony_ci CHECK(j == j_reference); 634c5f01b2fSopenharmony_ci } 635c5f01b2fSopenharmony_ci 636c5f01b2fSopenharmony_ci SECTION("int_fast64_t") 637c5f01b2fSopenharmony_ci { 638c5f01b2fSopenharmony_ci int_fast64_t n = 42; 639c5f01b2fSopenharmony_ci json j(n); 640c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 641c5f01b2fSopenharmony_ci CHECK(j == j_reference); 642c5f01b2fSopenharmony_ci } 643c5f01b2fSopenharmony_ci 644c5f01b2fSopenharmony_ci SECTION("int_least8_t") 645c5f01b2fSopenharmony_ci { 646c5f01b2fSopenharmony_ci int_least8_t n = 42; 647c5f01b2fSopenharmony_ci json j(n); 648c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 649c5f01b2fSopenharmony_ci CHECK(j == j_reference); 650c5f01b2fSopenharmony_ci } 651c5f01b2fSopenharmony_ci 652c5f01b2fSopenharmony_ci SECTION("int_least16_t") 653c5f01b2fSopenharmony_ci { 654c5f01b2fSopenharmony_ci int_least16_t n = 42; 655c5f01b2fSopenharmony_ci json j(n); 656c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 657c5f01b2fSopenharmony_ci CHECK(j == j_reference); 658c5f01b2fSopenharmony_ci } 659c5f01b2fSopenharmony_ci 660c5f01b2fSopenharmony_ci SECTION("int_least32_t") 661c5f01b2fSopenharmony_ci { 662c5f01b2fSopenharmony_ci int_least32_t n = 42; 663c5f01b2fSopenharmony_ci json j(n); 664c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 665c5f01b2fSopenharmony_ci CHECK(j == j_reference); 666c5f01b2fSopenharmony_ci } 667c5f01b2fSopenharmony_ci 668c5f01b2fSopenharmony_ci SECTION("int_least64_t") 669c5f01b2fSopenharmony_ci { 670c5f01b2fSopenharmony_ci int_least64_t n = 42; 671c5f01b2fSopenharmony_ci json j(n); 672c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 673c5f01b2fSopenharmony_ci CHECK(j == j_reference); 674c5f01b2fSopenharmony_ci } 675c5f01b2fSopenharmony_ci 676c5f01b2fSopenharmony_ci SECTION("uint8_t") 677c5f01b2fSopenharmony_ci { 678c5f01b2fSopenharmony_ci uint8_t n = 42; 679c5f01b2fSopenharmony_ci json j(n); 680c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 681c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 682c5f01b2fSopenharmony_ci } 683c5f01b2fSopenharmony_ci 684c5f01b2fSopenharmony_ci SECTION("uint16_t") 685c5f01b2fSopenharmony_ci { 686c5f01b2fSopenharmony_ci uint16_t n = 42; 687c5f01b2fSopenharmony_ci json j(n); 688c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 689c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 690c5f01b2fSopenharmony_ci } 691c5f01b2fSopenharmony_ci 692c5f01b2fSopenharmony_ci SECTION("uint32_t") 693c5f01b2fSopenharmony_ci { 694c5f01b2fSopenharmony_ci uint32_t n = 42; 695c5f01b2fSopenharmony_ci json j(n); 696c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 697c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 698c5f01b2fSopenharmony_ci } 699c5f01b2fSopenharmony_ci 700c5f01b2fSopenharmony_ci SECTION("uint64_t") 701c5f01b2fSopenharmony_ci { 702c5f01b2fSopenharmony_ci uint64_t n = 42; 703c5f01b2fSopenharmony_ci json j(n); 704c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 705c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 706c5f01b2fSopenharmony_ci } 707c5f01b2fSopenharmony_ci 708c5f01b2fSopenharmony_ci SECTION("uint_fast8_t") 709c5f01b2fSopenharmony_ci { 710c5f01b2fSopenharmony_ci uint_fast8_t n = 42; 711c5f01b2fSopenharmony_ci json j(n); 712c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 713c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 714c5f01b2fSopenharmony_ci } 715c5f01b2fSopenharmony_ci 716c5f01b2fSopenharmony_ci SECTION("uint_fast16_t") 717c5f01b2fSopenharmony_ci { 718c5f01b2fSopenharmony_ci uint_fast16_t n = 42; 719c5f01b2fSopenharmony_ci json j(n); 720c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 721c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 722c5f01b2fSopenharmony_ci } 723c5f01b2fSopenharmony_ci 724c5f01b2fSopenharmony_ci SECTION("uint_fast32_t") 725c5f01b2fSopenharmony_ci { 726c5f01b2fSopenharmony_ci uint_fast32_t n = 42; 727c5f01b2fSopenharmony_ci json j(n); 728c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 729c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 730c5f01b2fSopenharmony_ci } 731c5f01b2fSopenharmony_ci 732c5f01b2fSopenharmony_ci SECTION("uint_fast64_t") 733c5f01b2fSopenharmony_ci { 734c5f01b2fSopenharmony_ci uint_fast64_t n = 42; 735c5f01b2fSopenharmony_ci json j(n); 736c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 737c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 738c5f01b2fSopenharmony_ci } 739c5f01b2fSopenharmony_ci 740c5f01b2fSopenharmony_ci SECTION("uint_least8_t") 741c5f01b2fSopenharmony_ci { 742c5f01b2fSopenharmony_ci uint_least8_t n = 42; 743c5f01b2fSopenharmony_ci json j(n); 744c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 745c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 746c5f01b2fSopenharmony_ci } 747c5f01b2fSopenharmony_ci 748c5f01b2fSopenharmony_ci SECTION("uint_least16_t") 749c5f01b2fSopenharmony_ci { 750c5f01b2fSopenharmony_ci uint_least16_t n = 42; 751c5f01b2fSopenharmony_ci json j(n); 752c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 753c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 754c5f01b2fSopenharmony_ci } 755c5f01b2fSopenharmony_ci 756c5f01b2fSopenharmony_ci SECTION("uint_least32_t") 757c5f01b2fSopenharmony_ci { 758c5f01b2fSopenharmony_ci uint_least32_t n = 42; 759c5f01b2fSopenharmony_ci json j(n); 760c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 761c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 762c5f01b2fSopenharmony_ci } 763c5f01b2fSopenharmony_ci 764c5f01b2fSopenharmony_ci SECTION("uint_least64_t") 765c5f01b2fSopenharmony_ci { 766c5f01b2fSopenharmony_ci uint_least64_t n = 42; 767c5f01b2fSopenharmony_ci json j(n); 768c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 769c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 770c5f01b2fSopenharmony_ci } 771c5f01b2fSopenharmony_ci 772c5f01b2fSopenharmony_ci SECTION("integer literal without suffix") 773c5f01b2fSopenharmony_ci { 774c5f01b2fSopenharmony_ci json j(42); 775c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 776c5f01b2fSopenharmony_ci CHECK(j == j_reference); 777c5f01b2fSopenharmony_ci } 778c5f01b2fSopenharmony_ci 779c5f01b2fSopenharmony_ci SECTION("integer literal with u suffix") 780c5f01b2fSopenharmony_ci { 781c5f01b2fSopenharmony_ci json j(42u); 782c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 783c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 784c5f01b2fSopenharmony_ci } 785c5f01b2fSopenharmony_ci 786c5f01b2fSopenharmony_ci SECTION("integer literal with l suffix") 787c5f01b2fSopenharmony_ci { 788c5f01b2fSopenharmony_ci json j(42L); 789c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 790c5f01b2fSopenharmony_ci CHECK(j == j_reference); 791c5f01b2fSopenharmony_ci } 792c5f01b2fSopenharmony_ci 793c5f01b2fSopenharmony_ci SECTION("integer literal with ul suffix") 794c5f01b2fSopenharmony_ci { 795c5f01b2fSopenharmony_ci json j(42ul); 796c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 797c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 798c5f01b2fSopenharmony_ci } 799c5f01b2fSopenharmony_ci 800c5f01b2fSopenharmony_ci SECTION("integer literal with ll suffix") 801c5f01b2fSopenharmony_ci { 802c5f01b2fSopenharmony_ci json j(42LL); 803c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_integer); 804c5f01b2fSopenharmony_ci CHECK(j == j_reference); 805c5f01b2fSopenharmony_ci } 806c5f01b2fSopenharmony_ci 807c5f01b2fSopenharmony_ci SECTION("integer literal with ull suffix") 808c5f01b2fSopenharmony_ci { 809c5f01b2fSopenharmony_ci json j(42ull); 810c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_unsigned); 811c5f01b2fSopenharmony_ci CHECK(j == j_unsigned_reference); 812c5f01b2fSopenharmony_ci } 813c5f01b2fSopenharmony_ci } 814c5f01b2fSopenharmony_ci 815c5f01b2fSopenharmony_ci SECTION("create a floating-point number (explicit)") 816c5f01b2fSopenharmony_ci { 817c5f01b2fSopenharmony_ci SECTION("uninitialized value") 818c5f01b2fSopenharmony_ci { 819c5f01b2fSopenharmony_ci json::number_float_t n{}; 820c5f01b2fSopenharmony_ci json j(n); 821c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 822c5f01b2fSopenharmony_ci } 823c5f01b2fSopenharmony_ci 824c5f01b2fSopenharmony_ci SECTION("initialized value") 825c5f01b2fSopenharmony_ci { 826c5f01b2fSopenharmony_ci json::number_float_t n(42.23); 827c5f01b2fSopenharmony_ci json j(n); 828c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 829c5f01b2fSopenharmony_ci } 830c5f01b2fSopenharmony_ci 831c5f01b2fSopenharmony_ci SECTION("NaN") 832c5f01b2fSopenharmony_ci { 833c5f01b2fSopenharmony_ci // NaN is stored properly, but serialized to null 834c5f01b2fSopenharmony_ci json::number_float_t n(std::numeric_limits<json::number_float_t>::quiet_NaN()); 835c5f01b2fSopenharmony_ci json j(n); 836c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 837c5f01b2fSopenharmony_ci 838c5f01b2fSopenharmony_ci // check round trip of NaN 839c5f01b2fSopenharmony_ci json::number_float_t d{j}; 840c5f01b2fSopenharmony_ci CHECK((std::isnan(d) && std::isnan(n)) == true); 841c5f01b2fSopenharmony_ci 842c5f01b2fSopenharmony_ci // check that NaN is serialized to null 843c5f01b2fSopenharmony_ci CHECK(j.dump() == "null"); 844c5f01b2fSopenharmony_ci } 845c5f01b2fSopenharmony_ci 846c5f01b2fSopenharmony_ci SECTION("infinity") 847c5f01b2fSopenharmony_ci { 848c5f01b2fSopenharmony_ci // infinity is stored properly, but serialized to null 849c5f01b2fSopenharmony_ci json::number_float_t n(std::numeric_limits<json::number_float_t>::infinity()); 850c5f01b2fSopenharmony_ci json j(n); 851c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 852c5f01b2fSopenharmony_ci 853c5f01b2fSopenharmony_ci // check round trip of infinity 854c5f01b2fSopenharmony_ci json::number_float_t d{j}; 855c5f01b2fSopenharmony_ci CHECK(d == n); 856c5f01b2fSopenharmony_ci 857c5f01b2fSopenharmony_ci // check that inf is serialized to null 858c5f01b2fSopenharmony_ci CHECK(j.dump() == "null"); 859c5f01b2fSopenharmony_ci } 860c5f01b2fSopenharmony_ci } 861c5f01b2fSopenharmony_ci 862c5f01b2fSopenharmony_ci SECTION("create a floating-point number (implicit)") 863c5f01b2fSopenharmony_ci { 864c5f01b2fSopenharmony_ci // reference object 865c5f01b2fSopenharmony_ci json::number_float_t n_reference = 42.23; 866c5f01b2fSopenharmony_ci json j_reference(n_reference); 867c5f01b2fSopenharmony_ci 868c5f01b2fSopenharmony_ci SECTION("float") 869c5f01b2fSopenharmony_ci { 870c5f01b2fSopenharmony_ci float n = 42.23f; 871c5f01b2fSopenharmony_ci json j(n); 872c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 873c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 874c5f01b2fSopenharmony_ci } 875c5f01b2fSopenharmony_ci 876c5f01b2fSopenharmony_ci SECTION("double") 877c5f01b2fSopenharmony_ci { 878c5f01b2fSopenharmony_ci double n = 42.23; 879c5f01b2fSopenharmony_ci json j(n); 880c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 881c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 882c5f01b2fSopenharmony_ci } 883c5f01b2fSopenharmony_ci 884c5f01b2fSopenharmony_ci SECTION("long double") 885c5f01b2fSopenharmony_ci { 886c5f01b2fSopenharmony_ci long double n = 42.23L; 887c5f01b2fSopenharmony_ci json j(n); 888c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 889c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 890c5f01b2fSopenharmony_ci } 891c5f01b2fSopenharmony_ci 892c5f01b2fSopenharmony_ci SECTION("floating-point literal without suffix") 893c5f01b2fSopenharmony_ci { 894c5f01b2fSopenharmony_ci json j(42.23); 895c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 896c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 897c5f01b2fSopenharmony_ci } 898c5f01b2fSopenharmony_ci 899c5f01b2fSopenharmony_ci SECTION("integer literal with f suffix") 900c5f01b2fSopenharmony_ci { 901c5f01b2fSopenharmony_ci json j(42.23f); 902c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 903c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 904c5f01b2fSopenharmony_ci } 905c5f01b2fSopenharmony_ci 906c5f01b2fSopenharmony_ci SECTION("integer literal with l suffix") 907c5f01b2fSopenharmony_ci { 908c5f01b2fSopenharmony_ci json j(42.23L); 909c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::number_float); 910c5f01b2fSopenharmony_ci CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); 911c5f01b2fSopenharmony_ci } 912c5f01b2fSopenharmony_ci } 913c5f01b2fSopenharmony_ci 914c5f01b2fSopenharmony_ci SECTION("create a container (array or object) from an initializer list") 915c5f01b2fSopenharmony_ci { 916c5f01b2fSopenharmony_ci SECTION("empty initializer list") 917c5f01b2fSopenharmony_ci { 918c5f01b2fSopenharmony_ci SECTION("explicit") 919c5f01b2fSopenharmony_ci { 920c5f01b2fSopenharmony_ci json j(json::initializer_list_t {}); 921c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 922c5f01b2fSopenharmony_ci } 923c5f01b2fSopenharmony_ci 924c5f01b2fSopenharmony_ci SECTION("implicit") 925c5f01b2fSopenharmony_ci { 926c5f01b2fSopenharmony_ci json j {}; 927c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::null); 928c5f01b2fSopenharmony_ci } 929c5f01b2fSopenharmony_ci } 930c5f01b2fSopenharmony_ci 931c5f01b2fSopenharmony_ci SECTION("one element") 932c5f01b2fSopenharmony_ci { 933c5f01b2fSopenharmony_ci SECTION("array") 934c5f01b2fSopenharmony_ci { 935c5f01b2fSopenharmony_ci SECTION("explicit") 936c5f01b2fSopenharmony_ci { 937c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(json::array_t())}); 938c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 939c5f01b2fSopenharmony_ci } 940c5f01b2fSopenharmony_ci 941c5f01b2fSopenharmony_ci SECTION("implicit") 942c5f01b2fSopenharmony_ci { 943c5f01b2fSopenharmony_ci json j {json::array_t()}; 944c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 945c5f01b2fSopenharmony_ci } 946c5f01b2fSopenharmony_ci } 947c5f01b2fSopenharmony_ci 948c5f01b2fSopenharmony_ci SECTION("object") 949c5f01b2fSopenharmony_ci { 950c5f01b2fSopenharmony_ci SECTION("explicit") 951c5f01b2fSopenharmony_ci { 952c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(json::object_t())}); 953c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 954c5f01b2fSopenharmony_ci } 955c5f01b2fSopenharmony_ci 956c5f01b2fSopenharmony_ci SECTION("implicit") 957c5f01b2fSopenharmony_ci { 958c5f01b2fSopenharmony_ci json j {json::object_t()}; 959c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 960c5f01b2fSopenharmony_ci } 961c5f01b2fSopenharmony_ci } 962c5f01b2fSopenharmony_ci 963c5f01b2fSopenharmony_ci SECTION("string") 964c5f01b2fSopenharmony_ci { 965c5f01b2fSopenharmony_ci SECTION("explicit") 966c5f01b2fSopenharmony_ci { 967c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json("Hello world")}); 968c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 969c5f01b2fSopenharmony_ci } 970c5f01b2fSopenharmony_ci 971c5f01b2fSopenharmony_ci SECTION("implicit") 972c5f01b2fSopenharmony_ci { 973c5f01b2fSopenharmony_ci json j {"Hello world"}; 974c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 975c5f01b2fSopenharmony_ci } 976c5f01b2fSopenharmony_ci } 977c5f01b2fSopenharmony_ci 978c5f01b2fSopenharmony_ci SECTION("boolean") 979c5f01b2fSopenharmony_ci { 980c5f01b2fSopenharmony_ci SECTION("explicit") 981c5f01b2fSopenharmony_ci { 982c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(true)}); 983c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 984c5f01b2fSopenharmony_ci } 985c5f01b2fSopenharmony_ci 986c5f01b2fSopenharmony_ci SECTION("implicit") 987c5f01b2fSopenharmony_ci { 988c5f01b2fSopenharmony_ci json j {true}; 989c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 990c5f01b2fSopenharmony_ci } 991c5f01b2fSopenharmony_ci } 992c5f01b2fSopenharmony_ci 993c5f01b2fSopenharmony_ci SECTION("number (integer)") 994c5f01b2fSopenharmony_ci { 995c5f01b2fSopenharmony_ci SECTION("explicit") 996c5f01b2fSopenharmony_ci { 997c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(1)}); 998c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 999c5f01b2fSopenharmony_ci } 1000c5f01b2fSopenharmony_ci 1001c5f01b2fSopenharmony_ci SECTION("implicit") 1002c5f01b2fSopenharmony_ci { 1003c5f01b2fSopenharmony_ci json j {1}; 1004c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1005c5f01b2fSopenharmony_ci } 1006c5f01b2fSopenharmony_ci } 1007c5f01b2fSopenharmony_ci 1008c5f01b2fSopenharmony_ci SECTION("number (unsigned)") 1009c5f01b2fSopenharmony_ci { 1010c5f01b2fSopenharmony_ci SECTION("explicit") 1011c5f01b2fSopenharmony_ci { 1012c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(1u)}); 1013c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1014c5f01b2fSopenharmony_ci } 1015c5f01b2fSopenharmony_ci 1016c5f01b2fSopenharmony_ci SECTION("implicit") 1017c5f01b2fSopenharmony_ci { 1018c5f01b2fSopenharmony_ci json j {1u}; 1019c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1020c5f01b2fSopenharmony_ci } 1021c5f01b2fSopenharmony_ci } 1022c5f01b2fSopenharmony_ci 1023c5f01b2fSopenharmony_ci SECTION("number (floating-point)") 1024c5f01b2fSopenharmony_ci { 1025c5f01b2fSopenharmony_ci SECTION("explicit") 1026c5f01b2fSopenharmony_ci { 1027c5f01b2fSopenharmony_ci json j(json::initializer_list_t {json(42.23)}); 1028c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1029c5f01b2fSopenharmony_ci } 1030c5f01b2fSopenharmony_ci 1031c5f01b2fSopenharmony_ci SECTION("implicit") 1032c5f01b2fSopenharmony_ci { 1033c5f01b2fSopenharmony_ci json j {42.23}; 1034c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1035c5f01b2fSopenharmony_ci } 1036c5f01b2fSopenharmony_ci } 1037c5f01b2fSopenharmony_ci } 1038c5f01b2fSopenharmony_ci 1039c5f01b2fSopenharmony_ci SECTION("more elements") 1040c5f01b2fSopenharmony_ci { 1041c5f01b2fSopenharmony_ci SECTION("explicit") 1042c5f01b2fSopenharmony_ci { 1043c5f01b2fSopenharmony_ci json j(json::initializer_list_t {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()}); 1044c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1045c5f01b2fSopenharmony_ci } 1046c5f01b2fSopenharmony_ci 1047c5f01b2fSopenharmony_ci SECTION("implicit") 1048c5f01b2fSopenharmony_ci { 1049c5f01b2fSopenharmony_ci json j {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()}; 1050c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1051c5f01b2fSopenharmony_ci } 1052c5f01b2fSopenharmony_ci } 1053c5f01b2fSopenharmony_ci 1054c5f01b2fSopenharmony_ci SECTION("implicit type deduction") 1055c5f01b2fSopenharmony_ci { 1056c5f01b2fSopenharmony_ci SECTION("object") 1057c5f01b2fSopenharmony_ci { 1058c5f01b2fSopenharmony_ci json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }; 1059c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 1060c5f01b2fSopenharmony_ci } 1061c5f01b2fSopenharmony_ci 1062c5f01b2fSopenharmony_ci SECTION("array") 1063c5f01b2fSopenharmony_ci { 1064c5f01b2fSopenharmony_ci json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false}, 13 }; 1065c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1066c5f01b2fSopenharmony_ci } 1067c5f01b2fSopenharmony_ci } 1068c5f01b2fSopenharmony_ci 1069c5f01b2fSopenharmony_ci SECTION("explicit type deduction") 1070c5f01b2fSopenharmony_ci { 1071c5f01b2fSopenharmony_ci SECTION("empty object") 1072c5f01b2fSopenharmony_ci { 1073c5f01b2fSopenharmony_ci json j = json::object(); 1074c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 1075c5f01b2fSopenharmony_ci } 1076c5f01b2fSopenharmony_ci 1077c5f01b2fSopenharmony_ci SECTION("object") 1078c5f01b2fSopenharmony_ci { 1079c5f01b2fSopenharmony_ci json j = json::object({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }); 1080c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::object); 1081c5f01b2fSopenharmony_ci } 1082c5f01b2fSopenharmony_ci 1083c5f01b2fSopenharmony_ci SECTION("object with error") 1084c5f01b2fSopenharmony_ci { 1085c5f01b2fSopenharmony_ci json _; 1086c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(_ = json::object({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false}, 13 }), "[json.exception.type_error.301] cannot create object from initializer list", json::type_error&); 1087c5f01b2fSopenharmony_ci } 1088c5f01b2fSopenharmony_ci 1089c5f01b2fSopenharmony_ci SECTION("empty array") 1090c5f01b2fSopenharmony_ci { 1091c5f01b2fSopenharmony_ci json j = json::array(); 1092c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1093c5f01b2fSopenharmony_ci } 1094c5f01b2fSopenharmony_ci 1095c5f01b2fSopenharmony_ci SECTION("array") 1096c5f01b2fSopenharmony_ci { 1097c5f01b2fSopenharmony_ci json j = json::array({ {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} }); 1098c5f01b2fSopenharmony_ci CHECK(j.type() == json::value_t::array); 1099c5f01b2fSopenharmony_ci } 1100c5f01b2fSopenharmony_ci } 1101c5f01b2fSopenharmony_ci 1102c5f01b2fSopenharmony_ci SECTION("move from initializer_list") 1103c5f01b2fSopenharmony_ci { 1104c5f01b2fSopenharmony_ci SECTION("string") 1105c5f01b2fSopenharmony_ci { 1106c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (array)") 1107c5f01b2fSopenharmony_ci { 1108c5f01b2fSopenharmony_ci // This should break through any short string optimization in std::string 1109c5f01b2fSopenharmony_ci std::string source(1024, '!'); 1110c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1111c5f01b2fSopenharmony_ci json j = {std::move(source)}; 1112c5f01b2fSopenharmony_ci const auto* target_addr = j[0].get_ref<std::string const&>().data(); 1113c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1114c5f01b2fSopenharmony_ci CHECK(success); 1115c5f01b2fSopenharmony_ci } 1116c5f01b2fSopenharmony_ci 1117c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (object)") 1118c5f01b2fSopenharmony_ci { 1119c5f01b2fSopenharmony_ci // This should break through any short string optimization in std::string 1120c5f01b2fSopenharmony_ci std::string source(1024, '!'); 1121c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1122c5f01b2fSopenharmony_ci json j = {{"key", std::move(source)}}; 1123c5f01b2fSopenharmony_ci const auto* target_addr = j["key"].get_ref<std::string const&>().data(); 1124c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1125c5f01b2fSopenharmony_ci CHECK(success); 1126c5f01b2fSopenharmony_ci } 1127c5f01b2fSopenharmony_ci 1128c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (object key)") 1129c5f01b2fSopenharmony_ci { 1130c5f01b2fSopenharmony_ci // This should break through any short string optimization in std::string 1131c5f01b2fSopenharmony_ci std::string source(1024, '!'); 1132c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1133c5f01b2fSopenharmony_ci json j = {{std::move(source), 42}}; 1134c5f01b2fSopenharmony_ci const auto* target_addr = j.get_ref<json::object_t&>().begin()->first.data(); 1135c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1136c5f01b2fSopenharmony_ci CHECK(success); 1137c5f01b2fSopenharmony_ci } 1138c5f01b2fSopenharmony_ci } 1139c5f01b2fSopenharmony_ci 1140c5f01b2fSopenharmony_ci SECTION("array") 1141c5f01b2fSopenharmony_ci { 1142c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (array)") 1143c5f01b2fSopenharmony_ci { 1144c5f01b2fSopenharmony_ci json::array_t source = {1, 2, 3}; 1145c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1146c5f01b2fSopenharmony_ci json j {std::move(source)}; 1147c5f01b2fSopenharmony_ci const auto* target_addr = j[0].get_ref<json::array_t const&>().data(); 1148c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1149c5f01b2fSopenharmony_ci CHECK(success); 1150c5f01b2fSopenharmony_ci } 1151c5f01b2fSopenharmony_ci 1152c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (object)") 1153c5f01b2fSopenharmony_ci { 1154c5f01b2fSopenharmony_ci json::array_t source = {1, 2, 3}; 1155c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1156c5f01b2fSopenharmony_ci json j {{"key", std::move(source)}}; 1157c5f01b2fSopenharmony_ci const auto* target_addr = j["key"].get_ref<json::array_t const&>().data(); 1158c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1159c5f01b2fSopenharmony_ci CHECK(success); 1160c5f01b2fSopenharmony_ci } 1161c5f01b2fSopenharmony_ci 1162c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (array)") 1163c5f01b2fSopenharmony_ci { 1164c5f01b2fSopenharmony_ci json::array_t source = {1, 2, 3}; 1165c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1166c5f01b2fSopenharmony_ci json j = {std::move(source)}; 1167c5f01b2fSopenharmony_ci const auto* target_addr = j[0].get_ref<json::array_t const&>().data(); 1168c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1169c5f01b2fSopenharmony_ci CHECK(success); 1170c5f01b2fSopenharmony_ci } 1171c5f01b2fSopenharmony_ci 1172c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (object)") 1173c5f01b2fSopenharmony_ci { 1174c5f01b2fSopenharmony_ci json::array_t source = {1, 2, 3}; 1175c5f01b2fSopenharmony_ci const auto* source_addr = source.data(); 1176c5f01b2fSopenharmony_ci json j = {{"key", std::move(source)}}; 1177c5f01b2fSopenharmony_ci const auto* target_addr = j["key"].get_ref<json::array_t const&>().data(); 1178c5f01b2fSopenharmony_ci const bool success = (target_addr == source_addr); 1179c5f01b2fSopenharmony_ci CHECK(success); 1180c5f01b2fSopenharmony_ci } 1181c5f01b2fSopenharmony_ci } 1182c5f01b2fSopenharmony_ci 1183c5f01b2fSopenharmony_ci SECTION("object") 1184c5f01b2fSopenharmony_ci { 1185c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (array)") 1186c5f01b2fSopenharmony_ci { 1187c5f01b2fSopenharmony_ci json::object_t source = {{"hello", "world"}}; 1188c5f01b2fSopenharmony_ci const json* source_addr = &source.at("hello"); 1189c5f01b2fSopenharmony_ci json j {std::move(source)}; 1190c5f01b2fSopenharmony_ci CHECK(&(j[0].get_ref<json::object_t const&>().at("hello")) == source_addr); 1191c5f01b2fSopenharmony_ci } 1192c5f01b2fSopenharmony_ci 1193c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (object)") 1194c5f01b2fSopenharmony_ci { 1195c5f01b2fSopenharmony_ci json::object_t source = {{"hello", "world"}}; 1196c5f01b2fSopenharmony_ci const json* source_addr = &source.at("hello"); 1197c5f01b2fSopenharmony_ci json j {{"key", std::move(source)}}; 1198c5f01b2fSopenharmony_ci CHECK(&(j["key"].get_ref<json::object_t const&>().at("hello")) == source_addr); 1199c5f01b2fSopenharmony_ci } 1200c5f01b2fSopenharmony_ci 1201c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (array)") 1202c5f01b2fSopenharmony_ci { 1203c5f01b2fSopenharmony_ci json::object_t source = {{"hello", "world"}}; 1204c5f01b2fSopenharmony_ci const json* source_addr = &source.at("hello"); 1205c5f01b2fSopenharmony_ci json j = {std::move(source)}; 1206c5f01b2fSopenharmony_ci CHECK(&(j[0].get_ref<json::object_t const&>().at("hello")) == source_addr); 1207c5f01b2fSopenharmony_ci } 1208c5f01b2fSopenharmony_ci 1209c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (object)") 1210c5f01b2fSopenharmony_ci { 1211c5f01b2fSopenharmony_ci json::object_t source = {{"hello", "world"}}; 1212c5f01b2fSopenharmony_ci const json* source_addr = &source.at("hello"); 1213c5f01b2fSopenharmony_ci json j = {{"key", std::move(source)}}; 1214c5f01b2fSopenharmony_ci CHECK(&(j["key"].get_ref<json::object_t const&>().at("hello")) == source_addr); 1215c5f01b2fSopenharmony_ci } 1216c5f01b2fSopenharmony_ci } 1217c5f01b2fSopenharmony_ci 1218c5f01b2fSopenharmony_ci SECTION("json") 1219c5f01b2fSopenharmony_ci { 1220c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (array)") 1221c5f01b2fSopenharmony_ci { 1222c5f01b2fSopenharmony_ci json source {1, 2, 3}; 1223c5f01b2fSopenharmony_ci const json* source_addr = &source[0]; 1224c5f01b2fSopenharmony_ci json j {std::move(source), {}}; 1225c5f01b2fSopenharmony_ci CHECK(&j[0][0] == source_addr); 1226c5f01b2fSopenharmony_ci } 1227c5f01b2fSopenharmony_ci 1228c5f01b2fSopenharmony_ci SECTION("constructor with implicit types (object)") 1229c5f01b2fSopenharmony_ci { 1230c5f01b2fSopenharmony_ci json source {1, 2, 3}; 1231c5f01b2fSopenharmony_ci const json* source_addr = &source[0]; 1232c5f01b2fSopenharmony_ci json j {{"key", std::move(source)}}; 1233c5f01b2fSopenharmony_ci CHECK(&j["key"][0] == source_addr); 1234c5f01b2fSopenharmony_ci } 1235c5f01b2fSopenharmony_ci 1236c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (array)") 1237c5f01b2fSopenharmony_ci { 1238c5f01b2fSopenharmony_ci json source {1, 2, 3}; 1239c5f01b2fSopenharmony_ci const json* source_addr = &source[0]; 1240c5f01b2fSopenharmony_ci json j = {std::move(source), {}}; 1241c5f01b2fSopenharmony_ci CHECK(&j[0][0] == source_addr); 1242c5f01b2fSopenharmony_ci } 1243c5f01b2fSopenharmony_ci 1244c5f01b2fSopenharmony_ci SECTION("assignment with implicit types (object)") 1245c5f01b2fSopenharmony_ci { 1246c5f01b2fSopenharmony_ci json source {1, 2, 3}; 1247c5f01b2fSopenharmony_ci const json* source_addr = &source[0]; 1248c5f01b2fSopenharmony_ci json j = {{"key", std::move(source)}}; 1249c5f01b2fSopenharmony_ci CHECK(&j["key"][0] == source_addr); 1250c5f01b2fSopenharmony_ci } 1251c5f01b2fSopenharmony_ci } 1252c5f01b2fSopenharmony_ci 1253c5f01b2fSopenharmony_ci } 1254c5f01b2fSopenharmony_ci } 1255c5f01b2fSopenharmony_ci 1256c5f01b2fSopenharmony_ci SECTION("create an array of n copies of a given value") 1257c5f01b2fSopenharmony_ci { 1258c5f01b2fSopenharmony_ci SECTION("cnt = 0") 1259c5f01b2fSopenharmony_ci { 1260c5f01b2fSopenharmony_ci json v = {1, "foo", 34.23, {1, 2, 3}, {{"A", 1}, {"B", 2u}}}; 1261c5f01b2fSopenharmony_ci json arr(0, v); 1262c5f01b2fSopenharmony_ci CHECK(arr.size() == 0); 1263c5f01b2fSopenharmony_ci } 1264c5f01b2fSopenharmony_ci 1265c5f01b2fSopenharmony_ci SECTION("cnt = 1") 1266c5f01b2fSopenharmony_ci { 1267c5f01b2fSopenharmony_ci json v = {1, "foo", 34.23, {1, 2, 3}, {{"A", 1}, {"B", 2u}}}; 1268c5f01b2fSopenharmony_ci json arr(1, v); 1269c5f01b2fSopenharmony_ci CHECK(arr.size() == 1); 1270c5f01b2fSopenharmony_ci for (auto& x : arr) 1271c5f01b2fSopenharmony_ci { 1272c5f01b2fSopenharmony_ci CHECK(x == v); 1273c5f01b2fSopenharmony_ci } 1274c5f01b2fSopenharmony_ci } 1275c5f01b2fSopenharmony_ci 1276c5f01b2fSopenharmony_ci SECTION("cnt = 3") 1277c5f01b2fSopenharmony_ci { 1278c5f01b2fSopenharmony_ci json v = {1, "foo", 34.23, {1, 2, 3}, {{"A", 1}, {"B", 2u}}}; 1279c5f01b2fSopenharmony_ci json arr(3, v); 1280c5f01b2fSopenharmony_ci CHECK(arr.size() == 3); 1281c5f01b2fSopenharmony_ci for (auto& x : arr) 1282c5f01b2fSopenharmony_ci { 1283c5f01b2fSopenharmony_ci CHECK(x == v); 1284c5f01b2fSopenharmony_ci } 1285c5f01b2fSopenharmony_ci } 1286c5f01b2fSopenharmony_ci } 1287c5f01b2fSopenharmony_ci 1288c5f01b2fSopenharmony_ci SECTION("create a JSON container from an iterator range") 1289c5f01b2fSopenharmony_ci { 1290c5f01b2fSopenharmony_ci SECTION("object") 1291c5f01b2fSopenharmony_ci { 1292c5f01b2fSopenharmony_ci SECTION("json(begin(), end())") 1293c5f01b2fSopenharmony_ci { 1294c5f01b2fSopenharmony_ci { 1295c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1296c5f01b2fSopenharmony_ci json j_new(jobject.begin(), jobject.end()); 1297c5f01b2fSopenharmony_ci CHECK(j_new == jobject); 1298c5f01b2fSopenharmony_ci } 1299c5f01b2fSopenharmony_ci { 1300c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1301c5f01b2fSopenharmony_ci json j_new(jobject.cbegin(), jobject.cend()); 1302c5f01b2fSopenharmony_ci CHECK(j_new == jobject); 1303c5f01b2fSopenharmony_ci } 1304c5f01b2fSopenharmony_ci } 1305c5f01b2fSopenharmony_ci 1306c5f01b2fSopenharmony_ci SECTION("json(begin(), begin())") 1307c5f01b2fSopenharmony_ci { 1308c5f01b2fSopenharmony_ci { 1309c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1310c5f01b2fSopenharmony_ci json j_new(jobject.begin(), jobject.begin()); 1311c5f01b2fSopenharmony_ci CHECK(j_new == json::object()); 1312c5f01b2fSopenharmony_ci } 1313c5f01b2fSopenharmony_ci { 1314c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1315c5f01b2fSopenharmony_ci json j_new(jobject.cbegin(), jobject.cbegin()); 1316c5f01b2fSopenharmony_ci CHECK(j_new == json::object()); 1317c5f01b2fSopenharmony_ci } 1318c5f01b2fSopenharmony_ci } 1319c5f01b2fSopenharmony_ci 1320c5f01b2fSopenharmony_ci SECTION("construct from subrange") 1321c5f01b2fSopenharmony_ci { 1322c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; 1323c5f01b2fSopenharmony_ci json j_new(jobject.find("b"), jobject.find("e")); 1324c5f01b2fSopenharmony_ci CHECK(j_new == json({{"b", 1}, {"c", 17u}, {"d", false}})); 1325c5f01b2fSopenharmony_ci } 1326c5f01b2fSopenharmony_ci 1327c5f01b2fSopenharmony_ci SECTION("incompatible iterators") 1328c5f01b2fSopenharmony_ci { 1329c5f01b2fSopenharmony_ci { 1330c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; 1331c5f01b2fSopenharmony_ci json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1332c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jobject.begin(), jobject2.end()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1333c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jobject2.begin(), jobject.end()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1334c5f01b2fSopenharmony_ci } 1335c5f01b2fSopenharmony_ci { 1336c5f01b2fSopenharmony_ci json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}}; 1337c5f01b2fSopenharmony_ci json jobject2 = {{"a", "a"}, {"b", 1}, {"c", 17u}}; 1338c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jobject.cbegin(), jobject2.cend()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1339c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jobject2.cbegin(), jobject.cend()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1340c5f01b2fSopenharmony_ci } 1341c5f01b2fSopenharmony_ci } 1342c5f01b2fSopenharmony_ci } 1343c5f01b2fSopenharmony_ci 1344c5f01b2fSopenharmony_ci SECTION("array") 1345c5f01b2fSopenharmony_ci { 1346c5f01b2fSopenharmony_ci SECTION("json(begin(), end())") 1347c5f01b2fSopenharmony_ci { 1348c5f01b2fSopenharmony_ci { 1349c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1350c5f01b2fSopenharmony_ci json j_new(jarray.begin(), jarray.end()); 1351c5f01b2fSopenharmony_ci CHECK(j_new == jarray); 1352c5f01b2fSopenharmony_ci } 1353c5f01b2fSopenharmony_ci { 1354c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1355c5f01b2fSopenharmony_ci json j_new(jarray.cbegin(), jarray.cend()); 1356c5f01b2fSopenharmony_ci CHECK(j_new == jarray); 1357c5f01b2fSopenharmony_ci } 1358c5f01b2fSopenharmony_ci } 1359c5f01b2fSopenharmony_ci 1360c5f01b2fSopenharmony_ci SECTION("json(begin(), begin())") 1361c5f01b2fSopenharmony_ci { 1362c5f01b2fSopenharmony_ci { 1363c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1364c5f01b2fSopenharmony_ci json j_new(jarray.begin(), jarray.begin()); 1365c5f01b2fSopenharmony_ci CHECK(j_new == json::array()); 1366c5f01b2fSopenharmony_ci } 1367c5f01b2fSopenharmony_ci { 1368c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1369c5f01b2fSopenharmony_ci json j_new(jarray.cbegin(), jarray.cbegin()); 1370c5f01b2fSopenharmony_ci CHECK(j_new == json::array()); 1371c5f01b2fSopenharmony_ci } 1372c5f01b2fSopenharmony_ci } 1373c5f01b2fSopenharmony_ci 1374c5f01b2fSopenharmony_ci SECTION("construct from subrange") 1375c5f01b2fSopenharmony_ci { 1376c5f01b2fSopenharmony_ci { 1377c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1378c5f01b2fSopenharmony_ci json j_new(jarray.begin() + 1, jarray.begin() + 3); 1379c5f01b2fSopenharmony_ci CHECK(j_new == json({2, 3})); 1380c5f01b2fSopenharmony_ci } 1381c5f01b2fSopenharmony_ci { 1382c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4, 5}; 1383c5f01b2fSopenharmony_ci json j_new(jarray.cbegin() + 1, jarray.cbegin() + 3); 1384c5f01b2fSopenharmony_ci CHECK(j_new == json({2, 3})); 1385c5f01b2fSopenharmony_ci } 1386c5f01b2fSopenharmony_ci } 1387c5f01b2fSopenharmony_ci 1388c5f01b2fSopenharmony_ci SECTION("incompatible iterators") 1389c5f01b2fSopenharmony_ci { 1390c5f01b2fSopenharmony_ci { 1391c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4}; 1392c5f01b2fSopenharmony_ci json jarray2 = {2, 3, 4, 5}; 1393c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jarray.begin(), jarray2.end()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1394c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jarray2.begin(), jarray.end()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1395c5f01b2fSopenharmony_ci } 1396c5f01b2fSopenharmony_ci { 1397c5f01b2fSopenharmony_ci json jarray = {1, 2, 3, 4}; 1398c5f01b2fSopenharmony_ci json jarray2 = {2, 3, 4, 5}; 1399c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jarray.cbegin(), jarray2.cend()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1400c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(jarray2.cbegin(), jarray.cend()), "[json.exception.invalid_iterator.201] iterators are not compatible", json::invalid_iterator&); 1401c5f01b2fSopenharmony_ci } 1402c5f01b2fSopenharmony_ci } 1403c5f01b2fSopenharmony_ci } 1404c5f01b2fSopenharmony_ci 1405c5f01b2fSopenharmony_ci SECTION("other values") 1406c5f01b2fSopenharmony_ci { 1407c5f01b2fSopenharmony_ci SECTION("construct with two valid iterators") 1408c5f01b2fSopenharmony_ci { 1409c5f01b2fSopenharmony_ci SECTION("null") 1410c5f01b2fSopenharmony_ci { 1411c5f01b2fSopenharmony_ci { 1412c5f01b2fSopenharmony_ci json j; 1413c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.end()), "[json.exception.invalid_iterator.206] cannot construct with iterators from null", json::invalid_iterator&); 1414c5f01b2fSopenharmony_ci } 1415c5f01b2fSopenharmony_ci { 1416c5f01b2fSopenharmony_ci json j; 1417c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cend()), "[json.exception.invalid_iterator.206] cannot construct with iterators from null", json::invalid_iterator&); 1418c5f01b2fSopenharmony_ci } 1419c5f01b2fSopenharmony_ci } 1420c5f01b2fSopenharmony_ci 1421c5f01b2fSopenharmony_ci SECTION("string") 1422c5f01b2fSopenharmony_ci { 1423c5f01b2fSopenharmony_ci { 1424c5f01b2fSopenharmony_ci json j = "foo"; 1425c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1426c5f01b2fSopenharmony_ci CHECK(j == j_new); 1427c5f01b2fSopenharmony_ci } 1428c5f01b2fSopenharmony_ci { 1429c5f01b2fSopenharmony_ci json j = "bar"; 1430c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1431c5f01b2fSopenharmony_ci CHECK(j == j_new); 1432c5f01b2fSopenharmony_ci } 1433c5f01b2fSopenharmony_ci } 1434c5f01b2fSopenharmony_ci 1435c5f01b2fSopenharmony_ci SECTION("number (boolean)") 1436c5f01b2fSopenharmony_ci { 1437c5f01b2fSopenharmony_ci { 1438c5f01b2fSopenharmony_ci json j = false; 1439c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1440c5f01b2fSopenharmony_ci CHECK(j == j_new); 1441c5f01b2fSopenharmony_ci } 1442c5f01b2fSopenharmony_ci { 1443c5f01b2fSopenharmony_ci json j = true; 1444c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1445c5f01b2fSopenharmony_ci CHECK(j == j_new); 1446c5f01b2fSopenharmony_ci } 1447c5f01b2fSopenharmony_ci } 1448c5f01b2fSopenharmony_ci 1449c5f01b2fSopenharmony_ci SECTION("number (integer)") 1450c5f01b2fSopenharmony_ci { 1451c5f01b2fSopenharmony_ci { 1452c5f01b2fSopenharmony_ci json j = 17; 1453c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1454c5f01b2fSopenharmony_ci CHECK(j == j_new); 1455c5f01b2fSopenharmony_ci } 1456c5f01b2fSopenharmony_ci { 1457c5f01b2fSopenharmony_ci json j = 17; 1458c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1459c5f01b2fSopenharmony_ci CHECK(j == j_new); 1460c5f01b2fSopenharmony_ci } 1461c5f01b2fSopenharmony_ci } 1462c5f01b2fSopenharmony_ci 1463c5f01b2fSopenharmony_ci SECTION("number (unsigned)") 1464c5f01b2fSopenharmony_ci { 1465c5f01b2fSopenharmony_ci { 1466c5f01b2fSopenharmony_ci json j = 17u; 1467c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1468c5f01b2fSopenharmony_ci CHECK(j == j_new); 1469c5f01b2fSopenharmony_ci } 1470c5f01b2fSopenharmony_ci { 1471c5f01b2fSopenharmony_ci json j = 17u; 1472c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1473c5f01b2fSopenharmony_ci CHECK(j == j_new); 1474c5f01b2fSopenharmony_ci } 1475c5f01b2fSopenharmony_ci } 1476c5f01b2fSopenharmony_ci 1477c5f01b2fSopenharmony_ci SECTION("number (floating point)") 1478c5f01b2fSopenharmony_ci { 1479c5f01b2fSopenharmony_ci { 1480c5f01b2fSopenharmony_ci json j = 23.42; 1481c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1482c5f01b2fSopenharmony_ci CHECK(j == j_new); 1483c5f01b2fSopenharmony_ci } 1484c5f01b2fSopenharmony_ci { 1485c5f01b2fSopenharmony_ci json j = 23.42; 1486c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1487c5f01b2fSopenharmony_ci CHECK(j == j_new); 1488c5f01b2fSopenharmony_ci } 1489c5f01b2fSopenharmony_ci } 1490c5f01b2fSopenharmony_ci 1491c5f01b2fSopenharmony_ci SECTION("binary") 1492c5f01b2fSopenharmony_ci { 1493c5f01b2fSopenharmony_ci { 1494c5f01b2fSopenharmony_ci json j = json::binary({1, 2, 3}); 1495c5f01b2fSopenharmony_ci json j_new(j.begin(), j.end()); 1496c5f01b2fSopenharmony_ci CHECK((j == j_new)); 1497c5f01b2fSopenharmony_ci } 1498c5f01b2fSopenharmony_ci { 1499c5f01b2fSopenharmony_ci json j = json::binary({1, 2, 3}); 1500c5f01b2fSopenharmony_ci json j_new(j.cbegin(), j.cend()); 1501c5f01b2fSopenharmony_ci CHECK((j == j_new)); 1502c5f01b2fSopenharmony_ci } 1503c5f01b2fSopenharmony_ci } 1504c5f01b2fSopenharmony_ci } 1505c5f01b2fSopenharmony_ci 1506c5f01b2fSopenharmony_ci SECTION("construct with two invalid iterators") 1507c5f01b2fSopenharmony_ci { 1508c5f01b2fSopenharmony_ci SECTION("string") 1509c5f01b2fSopenharmony_ci { 1510c5f01b2fSopenharmony_ci { 1511c5f01b2fSopenharmony_ci json j = "foo"; 1512c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1513c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1514c5f01b2fSopenharmony_ci } 1515c5f01b2fSopenharmony_ci { 1516c5f01b2fSopenharmony_ci json j = "bar"; 1517c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1518c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1519c5f01b2fSopenharmony_ci } 1520c5f01b2fSopenharmony_ci } 1521c5f01b2fSopenharmony_ci 1522c5f01b2fSopenharmony_ci SECTION("number (boolean)") 1523c5f01b2fSopenharmony_ci { 1524c5f01b2fSopenharmony_ci { 1525c5f01b2fSopenharmony_ci json j = false; 1526c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1527c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1528c5f01b2fSopenharmony_ci } 1529c5f01b2fSopenharmony_ci { 1530c5f01b2fSopenharmony_ci json j = true; 1531c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1532c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1533c5f01b2fSopenharmony_ci } 1534c5f01b2fSopenharmony_ci } 1535c5f01b2fSopenharmony_ci 1536c5f01b2fSopenharmony_ci SECTION("number (integer)") 1537c5f01b2fSopenharmony_ci { 1538c5f01b2fSopenharmony_ci { 1539c5f01b2fSopenharmony_ci json j = 17; 1540c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1541c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1542c5f01b2fSopenharmony_ci } 1543c5f01b2fSopenharmony_ci { 1544c5f01b2fSopenharmony_ci json j = 17; 1545c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1546c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1547c5f01b2fSopenharmony_ci } 1548c5f01b2fSopenharmony_ci } 1549c5f01b2fSopenharmony_ci 1550c5f01b2fSopenharmony_ci SECTION("number (integer)") 1551c5f01b2fSopenharmony_ci { 1552c5f01b2fSopenharmony_ci { 1553c5f01b2fSopenharmony_ci json j = 17u; 1554c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1555c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1556c5f01b2fSopenharmony_ci } 1557c5f01b2fSopenharmony_ci { 1558c5f01b2fSopenharmony_ci json j = 17u; 1559c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1560c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1561c5f01b2fSopenharmony_ci } 1562c5f01b2fSopenharmony_ci } 1563c5f01b2fSopenharmony_ci 1564c5f01b2fSopenharmony_ci SECTION("number (floating point)") 1565c5f01b2fSopenharmony_ci { 1566c5f01b2fSopenharmony_ci { 1567c5f01b2fSopenharmony_ci json j = 23.42; 1568c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1569c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1570c5f01b2fSopenharmony_ci } 1571c5f01b2fSopenharmony_ci { 1572c5f01b2fSopenharmony_ci json j = 23.42; 1573c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1574c5f01b2fSopenharmony_ci CHECK_THROWS_WITH_AS(json(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&); 1575c5f01b2fSopenharmony_ci } 1576c5f01b2fSopenharmony_ci } 1577c5f01b2fSopenharmony_ci } 1578c5f01b2fSopenharmony_ci } 1579c5f01b2fSopenharmony_ci } 1580c5f01b2fSopenharmony_ci} 1581