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