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