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#include <nlohmann/json.hpp>
12c5f01b2fSopenharmony_ciusing nlohmann::json;
13c5f01b2fSopenharmony_ci
14c5f01b2fSopenharmony_ci#include <fstream>
15c5f01b2fSopenharmony_ci#include <sstream>
16c5f01b2fSopenharmony_ci#include "make_test_data_available.hpp"
17c5f01b2fSopenharmony_ci
18c5f01b2fSopenharmony_ciTEST_CASE("object inspection")
19c5f01b2fSopenharmony_ci{
20c5f01b2fSopenharmony_ci    SECTION("convenience type checker")
21c5f01b2fSopenharmony_ci    {
22c5f01b2fSopenharmony_ci        SECTION("object")
23c5f01b2fSopenharmony_ci        {
24c5f01b2fSopenharmony_ci            json j {{"foo", 1}, {"bar", false}};
25c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
26c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
27c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
28c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
29c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
30c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
31c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
32c5f01b2fSopenharmony_ci            CHECK(j.is_object());
33c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
34c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
35c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
36c5f01b2fSopenharmony_ci            CHECK(!j.is_primitive());
37c5f01b2fSopenharmony_ci            CHECK(j.is_structured());
38c5f01b2fSopenharmony_ci        }
39c5f01b2fSopenharmony_ci
40c5f01b2fSopenharmony_ci        SECTION("array")
41c5f01b2fSopenharmony_ci        {
42c5f01b2fSopenharmony_ci            json j {"foo", 1, 1u, 42.23, false};
43c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
44c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
45c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
46c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
47c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
48c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
49c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
50c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
51c5f01b2fSopenharmony_ci            CHECK(j.is_array());
52c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
53c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
54c5f01b2fSopenharmony_ci            CHECK(!j.is_primitive());
55c5f01b2fSopenharmony_ci            CHECK(j.is_structured());
56c5f01b2fSopenharmony_ci        }
57c5f01b2fSopenharmony_ci
58c5f01b2fSopenharmony_ci        SECTION("null")
59c5f01b2fSopenharmony_ci        {
60c5f01b2fSopenharmony_ci            json j(nullptr);
61c5f01b2fSopenharmony_ci            CHECK(j.is_null());
62c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
63c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
64c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
65c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
66c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
67c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
68c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
69c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
70c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
71c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
72c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
73c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
74c5f01b2fSopenharmony_ci        }
75c5f01b2fSopenharmony_ci
76c5f01b2fSopenharmony_ci        SECTION("boolean")
77c5f01b2fSopenharmony_ci        {
78c5f01b2fSopenharmony_ci            json j(true);
79c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
80c5f01b2fSopenharmony_ci            CHECK(j.is_boolean());
81c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
82c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
83c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
84c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
85c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
86c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
87c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
88c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
89c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
90c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
91c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
92c5f01b2fSopenharmony_ci        }
93c5f01b2fSopenharmony_ci
94c5f01b2fSopenharmony_ci        SECTION("string")
95c5f01b2fSopenharmony_ci        {
96c5f01b2fSopenharmony_ci            json j("Hello world");
97c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
98c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
99c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
100c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
101c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
102c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
103c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
104c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
105c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
106c5f01b2fSopenharmony_ci            CHECK(j.is_string());
107c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
108c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
109c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
110c5f01b2fSopenharmony_ci        }
111c5f01b2fSopenharmony_ci
112c5f01b2fSopenharmony_ci        SECTION("number (integer)")
113c5f01b2fSopenharmony_ci        {
114c5f01b2fSopenharmony_ci            json j(42);
115c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
116c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
117c5f01b2fSopenharmony_ci            CHECK(j.is_number());
118c5f01b2fSopenharmony_ci            CHECK(j.is_number_integer());
119c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
120c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
121c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
122c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
123c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
124c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
125c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
126c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
127c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
128c5f01b2fSopenharmony_ci        }
129c5f01b2fSopenharmony_ci
130c5f01b2fSopenharmony_ci        SECTION("number (unsigned)")
131c5f01b2fSopenharmony_ci        {
132c5f01b2fSopenharmony_ci            json j(42u);
133c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
134c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
135c5f01b2fSopenharmony_ci            CHECK(j.is_number());
136c5f01b2fSopenharmony_ci            CHECK(j.is_number_integer());
137c5f01b2fSopenharmony_ci            CHECK(j.is_number_unsigned());
138c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
139c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
140c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
141c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
142c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
143c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
144c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
145c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
146c5f01b2fSopenharmony_ci        }
147c5f01b2fSopenharmony_ci
148c5f01b2fSopenharmony_ci        SECTION("number (floating-point)")
149c5f01b2fSopenharmony_ci        {
150c5f01b2fSopenharmony_ci            json j(42.23);
151c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
152c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
153c5f01b2fSopenharmony_ci            CHECK(j.is_number());
154c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
155c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
156c5f01b2fSopenharmony_ci            CHECK(j.is_number_float());
157c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
158c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
159c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
160c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
161c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
162c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
163c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
164c5f01b2fSopenharmony_ci        }
165c5f01b2fSopenharmony_ci
166c5f01b2fSopenharmony_ci        SECTION("binary")
167c5f01b2fSopenharmony_ci        {
168c5f01b2fSopenharmony_ci            json j(json::value_t::binary);
169c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
170c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
171c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
172c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
173c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
174c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
175c5f01b2fSopenharmony_ci            CHECK(j.is_binary());
176c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
177c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
178c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
179c5f01b2fSopenharmony_ci            CHECK(!j.is_discarded());
180c5f01b2fSopenharmony_ci            CHECK(j.is_primitive());
181c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
182c5f01b2fSopenharmony_ci        }
183c5f01b2fSopenharmony_ci
184c5f01b2fSopenharmony_ci        SECTION("discarded")
185c5f01b2fSopenharmony_ci        {
186c5f01b2fSopenharmony_ci            json j(json::value_t::discarded);
187c5f01b2fSopenharmony_ci            CHECK(!j.is_null());
188c5f01b2fSopenharmony_ci            CHECK(!j.is_boolean());
189c5f01b2fSopenharmony_ci            CHECK(!j.is_number());
190c5f01b2fSopenharmony_ci            CHECK(!j.is_number_integer());
191c5f01b2fSopenharmony_ci            CHECK(!j.is_number_unsigned());
192c5f01b2fSopenharmony_ci            CHECK(!j.is_number_float());
193c5f01b2fSopenharmony_ci            CHECK(!j.is_binary());
194c5f01b2fSopenharmony_ci            CHECK(!j.is_object());
195c5f01b2fSopenharmony_ci            CHECK(!j.is_array());
196c5f01b2fSopenharmony_ci            CHECK(!j.is_string());
197c5f01b2fSopenharmony_ci            CHECK(j.is_discarded());
198c5f01b2fSopenharmony_ci            CHECK(!j.is_primitive());
199c5f01b2fSopenharmony_ci            CHECK(!j.is_structured());
200c5f01b2fSopenharmony_ci        }
201c5f01b2fSopenharmony_ci    }
202c5f01b2fSopenharmony_ci
203c5f01b2fSopenharmony_ci    SECTION("serialization")
204c5f01b2fSopenharmony_ci    {
205c5f01b2fSopenharmony_ci        json j {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} };
206c5f01b2fSopenharmony_ci
207c5f01b2fSopenharmony_ci        SECTION("no indent / indent=-1")
208c5f01b2fSopenharmony_ci        {
209c5f01b2fSopenharmony_ci            CHECK(j.dump() ==
210c5f01b2fSopenharmony_ci                  "{\"array\":[1,2,3,4],\"boolean\":false,\"null\":null,\"number\":42,\"object\":{},\"string\":\"Hello world\"}");
211c5f01b2fSopenharmony_ci
212c5f01b2fSopenharmony_ci            CHECK(j.dump() == j.dump(-1));
213c5f01b2fSopenharmony_ci        }
214c5f01b2fSopenharmony_ci
215c5f01b2fSopenharmony_ci        SECTION("indent=0")
216c5f01b2fSopenharmony_ci        {
217c5f01b2fSopenharmony_ci            CHECK(j.dump(0) ==
218c5f01b2fSopenharmony_ci                  "{\n\"array\": [\n1,\n2,\n3,\n4\n],\n\"boolean\": false,\n\"null\": null,\n\"number\": 42,\n\"object\": {},\n\"string\": \"Hello world\"\n}");
219c5f01b2fSopenharmony_ci        }
220c5f01b2fSopenharmony_ci
221c5f01b2fSopenharmony_ci        SECTION("indent=1, space='\t'")
222c5f01b2fSopenharmony_ci        {
223c5f01b2fSopenharmony_ci            CHECK(j.dump(1, '\t') ==
224c5f01b2fSopenharmony_ci                  "{\n\t\"array\": [\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4\n\t],\n\t\"boolean\": false,\n\t\"null\": null,\n\t\"number\": 42,\n\t\"object\": {},\n\t\"string\": \"Hello world\"\n}");
225c5f01b2fSopenharmony_ci        }
226c5f01b2fSopenharmony_ci
227c5f01b2fSopenharmony_ci        SECTION("indent=4")
228c5f01b2fSopenharmony_ci        {
229c5f01b2fSopenharmony_ci            CHECK(j.dump(4) ==
230c5f01b2fSopenharmony_ci                  "{\n    \"array\": [\n        1,\n        2,\n        3,\n        4\n    ],\n    \"boolean\": false,\n    \"null\": null,\n    \"number\": 42,\n    \"object\": {},\n    \"string\": \"Hello world\"\n}");
231c5f01b2fSopenharmony_ci        }
232c5f01b2fSopenharmony_ci
233c5f01b2fSopenharmony_ci        SECTION("indent=x")
234c5f01b2fSopenharmony_ci        {
235c5f01b2fSopenharmony_ci            CHECK(j.dump().size() == 94);
236c5f01b2fSopenharmony_ci            CHECK(j.dump(1).size() == 127);
237c5f01b2fSopenharmony_ci            CHECK(j.dump(2).size() == 142);
238c5f01b2fSopenharmony_ci            CHECK(j.dump(512).size() == 7792);
239c5f01b2fSopenharmony_ci
240c5f01b2fSopenharmony_ci            // important test, because it yields a resize of the indent_string
241c5f01b2fSopenharmony_ci            // inside the dump() function
242c5f01b2fSopenharmony_ci            CHECK(j.dump(1024).size() == 15472);
243c5f01b2fSopenharmony_ci
244c5f01b2fSopenharmony_ci            const auto binary = json::binary({1, 2, 3}, 128);
245c5f01b2fSopenharmony_ci            CHECK(binary.dump(1024).size() == 2086);
246c5f01b2fSopenharmony_ci        }
247c5f01b2fSopenharmony_ci
248c5f01b2fSopenharmony_ci        SECTION("dump and floating-point numbers")
249c5f01b2fSopenharmony_ci        {
250c5f01b2fSopenharmony_ci            auto s = json(42.23).dump();
251c5f01b2fSopenharmony_ci            CHECK(s.find("42.23") != std::string::npos);
252c5f01b2fSopenharmony_ci        }
253c5f01b2fSopenharmony_ci
254c5f01b2fSopenharmony_ci        SECTION("dump and small floating-point numbers")
255c5f01b2fSopenharmony_ci        {
256c5f01b2fSopenharmony_ci            auto s = json(1.23456e-78).dump();
257c5f01b2fSopenharmony_ci            CHECK(s.find("1.23456e-78") != std::string::npos);
258c5f01b2fSopenharmony_ci        }
259c5f01b2fSopenharmony_ci
260c5f01b2fSopenharmony_ci        SECTION("dump and non-ASCII characters")
261c5f01b2fSopenharmony_ci        {
262c5f01b2fSopenharmony_ci            CHECK(json("ä").dump() == "\"ä\"");
263c5f01b2fSopenharmony_ci            CHECK(json("Ö").dump() == "\"Ö\"");
264c5f01b2fSopenharmony_ci            CHECK(json("❤️").dump() == "\"❤️\"");
265c5f01b2fSopenharmony_ci        }
266c5f01b2fSopenharmony_ci
267c5f01b2fSopenharmony_ci        SECTION("dump with ensure_ascii and non-ASCII characters")
268c5f01b2fSopenharmony_ci        {
269c5f01b2fSopenharmony_ci            CHECK(json("ä").dump(-1, ' ', true) == "\"\\u00e4\"");
270c5f01b2fSopenharmony_ci            CHECK(json("Ö").dump(-1, ' ', true) == "\"\\u00d6\"");
271c5f01b2fSopenharmony_ci            CHECK(json("❤️").dump(-1, ' ', true) == "\"\\u2764\\ufe0f\"");
272c5f01b2fSopenharmony_ci        }
273c5f01b2fSopenharmony_ci
274c5f01b2fSopenharmony_ci        SECTION("full Unicode escaping to ASCII")
275c5f01b2fSopenharmony_ci        {
276c5f01b2fSopenharmony_ci            SECTION("parsing yields the same JSON value")
277c5f01b2fSopenharmony_ci            {
278c5f01b2fSopenharmony_ci                std::ifstream f_escaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode_ascii.json");
279c5f01b2fSopenharmony_ci                std::ifstream f_unescaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode.json");
280c5f01b2fSopenharmony_ci
281c5f01b2fSopenharmony_ci                json j1 = json::parse(f_escaped);
282c5f01b2fSopenharmony_ci                json j2 = json::parse(f_unescaped);
283c5f01b2fSopenharmony_ci                CHECK(j1 == j2);
284c5f01b2fSopenharmony_ci            }
285c5f01b2fSopenharmony_ci
286c5f01b2fSopenharmony_ci            SECTION("dumping yields the same JSON text")
287c5f01b2fSopenharmony_ci            {
288c5f01b2fSopenharmony_ci                std::ifstream f_escaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode_ascii.json");
289c5f01b2fSopenharmony_ci                std::ifstream f_unescaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode.json");
290c5f01b2fSopenharmony_ci
291c5f01b2fSopenharmony_ci                json value = json::parse(f_unescaped);
292c5f01b2fSopenharmony_ci                std::string text = value.dump(4, ' ', true);
293c5f01b2fSopenharmony_ci
294c5f01b2fSopenharmony_ci                std::string expected((std::istreambuf_iterator<char>(f_escaped)),
295c5f01b2fSopenharmony_ci                                     std::istreambuf_iterator<char>());
296c5f01b2fSopenharmony_ci                CHECK(text == expected);
297c5f01b2fSopenharmony_ci            }
298c5f01b2fSopenharmony_ci        }
299c5f01b2fSopenharmony_ci
300c5f01b2fSopenharmony_ci        SECTION("serialization of discarded element")
301c5f01b2fSopenharmony_ci        {
302c5f01b2fSopenharmony_ci            json j_discarded(json::value_t::discarded);
303c5f01b2fSopenharmony_ci            CHECK(j_discarded.dump() == "<discarded>");
304c5f01b2fSopenharmony_ci        }
305c5f01b2fSopenharmony_ci
306c5f01b2fSopenharmony_ci        SECTION("check that precision is reset after serialization")
307c5f01b2fSopenharmony_ci        {
308c5f01b2fSopenharmony_ci            // create stringstream and set precision
309c5f01b2fSopenharmony_ci            std::stringstream ss;
310c5f01b2fSopenharmony_ci            ss.precision(3);
311c5f01b2fSopenharmony_ci            ss << 3.141592653589793 << std::fixed;
312c5f01b2fSopenharmony_ci            CHECK(ss.str() == "3.14");
313c5f01b2fSopenharmony_ci
314c5f01b2fSopenharmony_ci            // reset stringstream
315c5f01b2fSopenharmony_ci            ss.str(std::string());
316c5f01b2fSopenharmony_ci
317c5f01b2fSopenharmony_ci            // use stringstream for JSON serialization
318c5f01b2fSopenharmony_ci            json j_number = 3.14159265358979;
319c5f01b2fSopenharmony_ci            ss << j_number;
320c5f01b2fSopenharmony_ci
321c5f01b2fSopenharmony_ci            // check that precision has been overridden during serialization
322c5f01b2fSopenharmony_ci            CHECK(ss.str() == "3.14159265358979");
323c5f01b2fSopenharmony_ci
324c5f01b2fSopenharmony_ci            // check that precision has been restored
325c5f01b2fSopenharmony_ci            CHECK(ss.precision() == 3);
326c5f01b2fSopenharmony_ci        }
327c5f01b2fSopenharmony_ci    }
328c5f01b2fSopenharmony_ci
329c5f01b2fSopenharmony_ci    SECTION("round trips")
330c5f01b2fSopenharmony_ci    {
331c5f01b2fSopenharmony_ci        for (const auto& s :
332c5f01b2fSopenharmony_ci                {"3.141592653589793", "1000000000000000010E5"
333c5f01b2fSopenharmony_ci                })
334c5f01b2fSopenharmony_ci        {
335c5f01b2fSopenharmony_ci            json j1 = json::parse(s);
336c5f01b2fSopenharmony_ci            std::string s1 = j1.dump();
337c5f01b2fSopenharmony_ci            json j2 = json::parse(s1);
338c5f01b2fSopenharmony_ci            std::string s2 = j2.dump();
339c5f01b2fSopenharmony_ci            CHECK(s1 == s2);
340c5f01b2fSopenharmony_ci        }
341c5f01b2fSopenharmony_ci    }
342c5f01b2fSopenharmony_ci
343c5f01b2fSopenharmony_ci    SECTION("return the type of the object (explicit)")
344c5f01b2fSopenharmony_ci    {
345c5f01b2fSopenharmony_ci        SECTION("null")
346c5f01b2fSopenharmony_ci        {
347c5f01b2fSopenharmony_ci            json j = nullptr;
348c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::null);
349c5f01b2fSopenharmony_ci        }
350c5f01b2fSopenharmony_ci
351c5f01b2fSopenharmony_ci        SECTION("object")
352c5f01b2fSopenharmony_ci        {
353c5f01b2fSopenharmony_ci            json j = {{"foo", "bar"}};
354c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::object);
355c5f01b2fSopenharmony_ci        }
356c5f01b2fSopenharmony_ci
357c5f01b2fSopenharmony_ci        SECTION("array")
358c5f01b2fSopenharmony_ci        {
359c5f01b2fSopenharmony_ci            json j = {1, 2, 3, 4};
360c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::array);
361c5f01b2fSopenharmony_ci        }
362c5f01b2fSopenharmony_ci
363c5f01b2fSopenharmony_ci        SECTION("boolean")
364c5f01b2fSopenharmony_ci        {
365c5f01b2fSopenharmony_ci            json j = true;
366c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::boolean);
367c5f01b2fSopenharmony_ci        }
368c5f01b2fSopenharmony_ci
369c5f01b2fSopenharmony_ci        SECTION("string")
370c5f01b2fSopenharmony_ci        {
371c5f01b2fSopenharmony_ci            json j = "Hello world";
372c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::string);
373c5f01b2fSopenharmony_ci        }
374c5f01b2fSopenharmony_ci
375c5f01b2fSopenharmony_ci        SECTION("number (integer)")
376c5f01b2fSopenharmony_ci        {
377c5f01b2fSopenharmony_ci            json j = 23;
378c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::number_integer);
379c5f01b2fSopenharmony_ci        }
380c5f01b2fSopenharmony_ci
381c5f01b2fSopenharmony_ci        SECTION("number (unsigned)")
382c5f01b2fSopenharmony_ci        {
383c5f01b2fSopenharmony_ci            json j = 23u;
384c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::number_unsigned);
385c5f01b2fSopenharmony_ci        }
386c5f01b2fSopenharmony_ci
387c5f01b2fSopenharmony_ci        SECTION("number (floating-point)")
388c5f01b2fSopenharmony_ci        {
389c5f01b2fSopenharmony_ci            json j = 42.23;
390c5f01b2fSopenharmony_ci            CHECK(j.type() == json::value_t::number_float);
391c5f01b2fSopenharmony_ci        }
392c5f01b2fSopenharmony_ci    }
393c5f01b2fSopenharmony_ci
394c5f01b2fSopenharmony_ci    SECTION("return the type of the object (implicit)")
395c5f01b2fSopenharmony_ci    {
396c5f01b2fSopenharmony_ci        SECTION("null")
397c5f01b2fSopenharmony_ci        {
398c5f01b2fSopenharmony_ci            json j = nullptr;
399c5f01b2fSopenharmony_ci            json::value_t t = j;
400c5f01b2fSopenharmony_ci            CHECK(t == j.type());
401c5f01b2fSopenharmony_ci        }
402c5f01b2fSopenharmony_ci
403c5f01b2fSopenharmony_ci        SECTION("object")
404c5f01b2fSopenharmony_ci        {
405c5f01b2fSopenharmony_ci            json j = {{"foo", "bar"}};
406c5f01b2fSopenharmony_ci            json::value_t t = j;
407c5f01b2fSopenharmony_ci            CHECK(t == j.type());
408c5f01b2fSopenharmony_ci        }
409c5f01b2fSopenharmony_ci
410c5f01b2fSopenharmony_ci        SECTION("array")
411c5f01b2fSopenharmony_ci        {
412c5f01b2fSopenharmony_ci            json j = {1, 2, 3, 4};
413c5f01b2fSopenharmony_ci            json::value_t t = j;
414c5f01b2fSopenharmony_ci            CHECK(t == j.type());
415c5f01b2fSopenharmony_ci        }
416c5f01b2fSopenharmony_ci
417c5f01b2fSopenharmony_ci        SECTION("boolean")
418c5f01b2fSopenharmony_ci        {
419c5f01b2fSopenharmony_ci            json j = true;
420c5f01b2fSopenharmony_ci            json::value_t t = j;
421c5f01b2fSopenharmony_ci            CHECK(t == j.type());
422c5f01b2fSopenharmony_ci        }
423c5f01b2fSopenharmony_ci
424c5f01b2fSopenharmony_ci        SECTION("string")
425c5f01b2fSopenharmony_ci        {
426c5f01b2fSopenharmony_ci            json j = "Hello world";
427c5f01b2fSopenharmony_ci            json::value_t t = j;
428c5f01b2fSopenharmony_ci            CHECK(t == j.type());
429c5f01b2fSopenharmony_ci        }
430c5f01b2fSopenharmony_ci
431c5f01b2fSopenharmony_ci        SECTION("number (integer)")
432c5f01b2fSopenharmony_ci        {
433c5f01b2fSopenharmony_ci            json j = 23;
434c5f01b2fSopenharmony_ci            json::value_t t = j;
435c5f01b2fSopenharmony_ci            CHECK(t == j.type());
436c5f01b2fSopenharmony_ci        }
437c5f01b2fSopenharmony_ci
438c5f01b2fSopenharmony_ci        SECTION("number (unsigned)")
439c5f01b2fSopenharmony_ci        {
440c5f01b2fSopenharmony_ci            json j = 23u;
441c5f01b2fSopenharmony_ci            json::value_t t = j;
442c5f01b2fSopenharmony_ci            CHECK(t == j.type());
443c5f01b2fSopenharmony_ci        }
444c5f01b2fSopenharmony_ci
445c5f01b2fSopenharmony_ci        SECTION("number (floating-point)")
446c5f01b2fSopenharmony_ci        {
447c5f01b2fSopenharmony_ci            json j = 42.23;
448c5f01b2fSopenharmony_ci            json::value_t t = j;
449c5f01b2fSopenharmony_ci            CHECK(t == j.type());
450c5f01b2fSopenharmony_ci        }
451c5f01b2fSopenharmony_ci
452c5f01b2fSopenharmony_ci        SECTION("binary")
453c5f01b2fSopenharmony_ci        {
454c5f01b2fSopenharmony_ci            json j = json::binary({});
455c5f01b2fSopenharmony_ci            json::value_t t = j;
456c5f01b2fSopenharmony_ci            CHECK(t == j.type());
457c5f01b2fSopenharmony_ci        }
458c5f01b2fSopenharmony_ci    }
459c5f01b2fSopenharmony_ci}
460