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#ifdef JSON_TEST_NO_GLOBAL_UDLS
14c5f01b2fSopenharmony_ci    using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
15c5f01b2fSopenharmony_ci#endif
16c5f01b2fSopenharmony_ci
17c5f01b2fSopenharmony_ciTEST_CASE("JSON Merge Patch")
18c5f01b2fSopenharmony_ci{
19c5f01b2fSopenharmony_ci    SECTION("examples from RFC 7396")
20c5f01b2fSopenharmony_ci    {
21c5f01b2fSopenharmony_ci        SECTION("Section 1")
22c5f01b2fSopenharmony_ci        {
23c5f01b2fSopenharmony_ci            json document = R"({
24c5f01b2fSopenharmony_ci                "a": "b",
25c5f01b2fSopenharmony_ci                "c": {
26c5f01b2fSopenharmony_ci                    "d": "e",
27c5f01b2fSopenharmony_ci                    "f": "g"
28c5f01b2fSopenharmony_ci                }
29c5f01b2fSopenharmony_ci            })"_json;
30c5f01b2fSopenharmony_ci
31c5f01b2fSopenharmony_ci            json patch = R"({
32c5f01b2fSopenharmony_ci                "a": "z",
33c5f01b2fSopenharmony_ci                "c": {
34c5f01b2fSopenharmony_ci                    "f": null
35c5f01b2fSopenharmony_ci                }
36c5f01b2fSopenharmony_ci            })"_json;
37c5f01b2fSopenharmony_ci
38c5f01b2fSopenharmony_ci            json expected = R"({
39c5f01b2fSopenharmony_ci                "a": "z",
40c5f01b2fSopenharmony_ci                "c": {
41c5f01b2fSopenharmony_ci                    "d": "e"
42c5f01b2fSopenharmony_ci                }
43c5f01b2fSopenharmony_ci            })"_json;
44c5f01b2fSopenharmony_ci
45c5f01b2fSopenharmony_ci            document.merge_patch(patch);
46c5f01b2fSopenharmony_ci            CHECK(document == expected);
47c5f01b2fSopenharmony_ci        }
48c5f01b2fSopenharmony_ci
49c5f01b2fSopenharmony_ci        SECTION("Section 3")
50c5f01b2fSopenharmony_ci        {
51c5f01b2fSopenharmony_ci            json document = R"({
52c5f01b2fSopenharmony_ci                "title": "Goodbye!",
53c5f01b2fSopenharmony_ci                "author": {
54c5f01b2fSopenharmony_ci                    "givenName": "John",
55c5f01b2fSopenharmony_ci                    "familyName": "Doe"
56c5f01b2fSopenharmony_ci                },
57c5f01b2fSopenharmony_ci                "tags": [
58c5f01b2fSopenharmony_ci                    "example",
59c5f01b2fSopenharmony_ci                    "sample"
60c5f01b2fSopenharmony_ci                ],
61c5f01b2fSopenharmony_ci                "content": "This will be unchanged"
62c5f01b2fSopenharmony_ci            })"_json;
63c5f01b2fSopenharmony_ci
64c5f01b2fSopenharmony_ci            json patch = R"({
65c5f01b2fSopenharmony_ci                "title": "Hello!",
66c5f01b2fSopenharmony_ci                "phoneNumber": "+01-123-456-7890",
67c5f01b2fSopenharmony_ci                "author": {
68c5f01b2fSopenharmony_ci                    "familyName": null
69c5f01b2fSopenharmony_ci                },
70c5f01b2fSopenharmony_ci                "tags": [
71c5f01b2fSopenharmony_ci                    "example"
72c5f01b2fSopenharmony_ci                ]
73c5f01b2fSopenharmony_ci            })"_json;
74c5f01b2fSopenharmony_ci
75c5f01b2fSopenharmony_ci            json expected = R"({
76c5f01b2fSopenharmony_ci                "title": "Hello!",
77c5f01b2fSopenharmony_ci                "author": {
78c5f01b2fSopenharmony_ci                    "givenName": "John"
79c5f01b2fSopenharmony_ci                },
80c5f01b2fSopenharmony_ci                "tags": [
81c5f01b2fSopenharmony_ci                    "example"
82c5f01b2fSopenharmony_ci                ],
83c5f01b2fSopenharmony_ci                "content": "This will be unchanged",
84c5f01b2fSopenharmony_ci                "phoneNumber": "+01-123-456-7890"
85c5f01b2fSopenharmony_ci            })"_json;
86c5f01b2fSopenharmony_ci
87c5f01b2fSopenharmony_ci            document.merge_patch(patch);
88c5f01b2fSopenharmony_ci            CHECK(document == expected);
89c5f01b2fSopenharmony_ci        }
90c5f01b2fSopenharmony_ci
91c5f01b2fSopenharmony_ci        SECTION("Appendix A")
92c5f01b2fSopenharmony_ci        {
93c5f01b2fSopenharmony_ci            SECTION("Example 1")
94c5f01b2fSopenharmony_ci            {
95c5f01b2fSopenharmony_ci                json original = R"({"a":"b"})"_json;
96c5f01b2fSopenharmony_ci                json patch = R"({"a":"c"})"_json;
97c5f01b2fSopenharmony_ci                json result = R"({"a":"c"})"_json;
98c5f01b2fSopenharmony_ci
99c5f01b2fSopenharmony_ci                original.merge_patch(patch);
100c5f01b2fSopenharmony_ci                CHECK(original == result);
101c5f01b2fSopenharmony_ci            }
102c5f01b2fSopenharmony_ci
103c5f01b2fSopenharmony_ci            SECTION("Example 2")
104c5f01b2fSopenharmony_ci            {
105c5f01b2fSopenharmony_ci                json original = R"({"a":"b"})"_json;
106c5f01b2fSopenharmony_ci                json patch = R"({"b":"c"})"_json;
107c5f01b2fSopenharmony_ci                json result = R"({"a":"b", "b":"c"})"_json;
108c5f01b2fSopenharmony_ci
109c5f01b2fSopenharmony_ci                original.merge_patch(patch);
110c5f01b2fSopenharmony_ci                CHECK(original == result);
111c5f01b2fSopenharmony_ci            }
112c5f01b2fSopenharmony_ci
113c5f01b2fSopenharmony_ci            SECTION("Example 3")
114c5f01b2fSopenharmony_ci            {
115c5f01b2fSopenharmony_ci                json original = R"({"a":"b"})"_json;
116c5f01b2fSopenharmony_ci                json patch = R"({"a":null})"_json;
117c5f01b2fSopenharmony_ci                json result = R"({})"_json;
118c5f01b2fSopenharmony_ci
119c5f01b2fSopenharmony_ci                original.merge_patch(patch);
120c5f01b2fSopenharmony_ci                CHECK(original == result);
121c5f01b2fSopenharmony_ci            }
122c5f01b2fSopenharmony_ci
123c5f01b2fSopenharmony_ci            SECTION("Example 4")
124c5f01b2fSopenharmony_ci            {
125c5f01b2fSopenharmony_ci                json original = R"({"a":"b","b":"c"})"_json;
126c5f01b2fSopenharmony_ci                json patch = R"({"a":null})"_json;
127c5f01b2fSopenharmony_ci                json result = R"({"b":"c"})"_json;
128c5f01b2fSopenharmony_ci
129c5f01b2fSopenharmony_ci                original.merge_patch(patch);
130c5f01b2fSopenharmony_ci                CHECK(original == result);
131c5f01b2fSopenharmony_ci            }
132c5f01b2fSopenharmony_ci
133c5f01b2fSopenharmony_ci            SECTION("Example 5")
134c5f01b2fSopenharmony_ci            {
135c5f01b2fSopenharmony_ci                json original = R"({"a":["b"]})"_json;
136c5f01b2fSopenharmony_ci                json patch = R"({"a":"c"})"_json;
137c5f01b2fSopenharmony_ci                json result = R"({"a":"c"})"_json;
138c5f01b2fSopenharmony_ci
139c5f01b2fSopenharmony_ci                original.merge_patch(patch);
140c5f01b2fSopenharmony_ci                CHECK(original == result);
141c5f01b2fSopenharmony_ci            }
142c5f01b2fSopenharmony_ci
143c5f01b2fSopenharmony_ci            SECTION("Example 6")
144c5f01b2fSopenharmony_ci            {
145c5f01b2fSopenharmony_ci                json original = R"({"a":"c"})"_json;
146c5f01b2fSopenharmony_ci                json patch = R"({"a":["b"]})"_json;
147c5f01b2fSopenharmony_ci                json result = R"({"a":["b"]})"_json;
148c5f01b2fSopenharmony_ci
149c5f01b2fSopenharmony_ci                original.merge_patch(patch);
150c5f01b2fSopenharmony_ci                CHECK(original == result);
151c5f01b2fSopenharmony_ci            }
152c5f01b2fSopenharmony_ci
153c5f01b2fSopenharmony_ci            SECTION("Example 7")
154c5f01b2fSopenharmony_ci            {
155c5f01b2fSopenharmony_ci                json original = R"({"a":{"b": "c"}})"_json;
156c5f01b2fSopenharmony_ci                json patch = R"({"a":{"b":"d","c":null}})"_json;
157c5f01b2fSopenharmony_ci                json result = R"({"a": {"b": "d"}})"_json;
158c5f01b2fSopenharmony_ci
159c5f01b2fSopenharmony_ci                original.merge_patch(patch);
160c5f01b2fSopenharmony_ci                CHECK(original == result);
161c5f01b2fSopenharmony_ci            }
162c5f01b2fSopenharmony_ci
163c5f01b2fSopenharmony_ci            SECTION("Example 8")
164c5f01b2fSopenharmony_ci            {
165c5f01b2fSopenharmony_ci                json original = R"({"a":[{"b":"c"}]})"_json;
166c5f01b2fSopenharmony_ci                json patch = R"({"a":[1]})"_json;
167c5f01b2fSopenharmony_ci                json result = R"({"a":[1]})"_json;
168c5f01b2fSopenharmony_ci
169c5f01b2fSopenharmony_ci                original.merge_patch(patch);
170c5f01b2fSopenharmony_ci                CHECK(original == result);
171c5f01b2fSopenharmony_ci            }
172c5f01b2fSopenharmony_ci
173c5f01b2fSopenharmony_ci            SECTION("Example 9")
174c5f01b2fSopenharmony_ci            {
175c5f01b2fSopenharmony_ci                json original = R"(["a","b"])"_json;
176c5f01b2fSopenharmony_ci                json patch = R"(["c","d"])"_json;
177c5f01b2fSopenharmony_ci                json result = R"(["c","d"])"_json;
178c5f01b2fSopenharmony_ci
179c5f01b2fSopenharmony_ci                original.merge_patch(patch);
180c5f01b2fSopenharmony_ci                CHECK(original == result);
181c5f01b2fSopenharmony_ci            }
182c5f01b2fSopenharmony_ci
183c5f01b2fSopenharmony_ci            SECTION("Example 10")
184c5f01b2fSopenharmony_ci            {
185c5f01b2fSopenharmony_ci                json original = R"({"a":"b"})"_json;
186c5f01b2fSopenharmony_ci                json patch = R"(["c"])"_json;
187c5f01b2fSopenharmony_ci                json result = R"(["c"])"_json;
188c5f01b2fSopenharmony_ci
189c5f01b2fSopenharmony_ci                original.merge_patch(patch);
190c5f01b2fSopenharmony_ci                CHECK(original == result);
191c5f01b2fSopenharmony_ci            }
192c5f01b2fSopenharmony_ci
193c5f01b2fSopenharmony_ci            SECTION("Example 11")
194c5f01b2fSopenharmony_ci            {
195c5f01b2fSopenharmony_ci                json original = R"({"a":"foo"})"_json;
196c5f01b2fSopenharmony_ci                json patch = R"(null)"_json;
197c5f01b2fSopenharmony_ci                json result = R"(null)"_json;
198c5f01b2fSopenharmony_ci
199c5f01b2fSopenharmony_ci                original.merge_patch(patch);
200c5f01b2fSopenharmony_ci                CHECK(original == result);
201c5f01b2fSopenharmony_ci            }
202c5f01b2fSopenharmony_ci
203c5f01b2fSopenharmony_ci            SECTION("Example 12")
204c5f01b2fSopenharmony_ci            {
205c5f01b2fSopenharmony_ci                json original = R"({"a":"foo"})"_json;
206c5f01b2fSopenharmony_ci                json patch = R"("bar")"_json;
207c5f01b2fSopenharmony_ci                json result = R"("bar")"_json;
208c5f01b2fSopenharmony_ci
209c5f01b2fSopenharmony_ci                original.merge_patch(patch);
210c5f01b2fSopenharmony_ci                CHECK(original == result);
211c5f01b2fSopenharmony_ci            }
212c5f01b2fSopenharmony_ci
213c5f01b2fSopenharmony_ci            SECTION("Example 13")
214c5f01b2fSopenharmony_ci            {
215c5f01b2fSopenharmony_ci                json original = R"({"e":null})"_json;
216c5f01b2fSopenharmony_ci                json patch = R"({"a":1})"_json;
217c5f01b2fSopenharmony_ci                json result = R"({"e":null,"a":1})"_json;
218c5f01b2fSopenharmony_ci
219c5f01b2fSopenharmony_ci                original.merge_patch(patch);
220c5f01b2fSopenharmony_ci                CHECK(original == result);
221c5f01b2fSopenharmony_ci            }
222c5f01b2fSopenharmony_ci
223c5f01b2fSopenharmony_ci            SECTION("Example 14")
224c5f01b2fSopenharmony_ci            {
225c5f01b2fSopenharmony_ci                json original = R"([1,2])"_json;
226c5f01b2fSopenharmony_ci                json patch = R"({"a":"b","c":null})"_json;
227c5f01b2fSopenharmony_ci                json result = R"({"a":"b"})"_json;
228c5f01b2fSopenharmony_ci
229c5f01b2fSopenharmony_ci                original.merge_patch(patch);
230c5f01b2fSopenharmony_ci                CHECK(original == result);
231c5f01b2fSopenharmony_ci            }
232c5f01b2fSopenharmony_ci
233c5f01b2fSopenharmony_ci            SECTION("Example 15")
234c5f01b2fSopenharmony_ci            {
235c5f01b2fSopenharmony_ci                json original = R"({})"_json;
236c5f01b2fSopenharmony_ci                json patch = R"({"a":{"bb":{"ccc":null}}})"_json;
237c5f01b2fSopenharmony_ci                json result = R"({"a":{"bb":{}}})"_json;
238c5f01b2fSopenharmony_ci
239c5f01b2fSopenharmony_ci                original.merge_patch(patch);
240c5f01b2fSopenharmony_ci                CHECK(original == result);
241c5f01b2fSopenharmony_ci            }
242c5f01b2fSopenharmony_ci        }
243c5f01b2fSopenharmony_ci    }
244c5f01b2fSopenharmony_ci}
245