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("element access 1")
16c5f01b2fSopenharmony_ci{
17c5f01b2fSopenharmony_ci    SECTION("array")
18c5f01b2fSopenharmony_ci    {
19c5f01b2fSopenharmony_ci        json j = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
20c5f01b2fSopenharmony_ci        const json j_const = j;
21c5f01b2fSopenharmony_ci
22c5f01b2fSopenharmony_ci        SECTION("access specified element with bounds checking")
23c5f01b2fSopenharmony_ci        {
24c5f01b2fSopenharmony_ci            SECTION("access within bounds")
25c5f01b2fSopenharmony_ci            {
26c5f01b2fSopenharmony_ci                CHECK(j.at(0) == json(1));
27c5f01b2fSopenharmony_ci                CHECK(j.at(1) == json(1u));
28c5f01b2fSopenharmony_ci                CHECK(j.at(2) == json(true));
29c5f01b2fSopenharmony_ci                CHECK(j.at(3) == json(nullptr));
30c5f01b2fSopenharmony_ci                CHECK(j.at(4) == json("string"));
31c5f01b2fSopenharmony_ci                CHECK(j.at(5) == json(42.23));
32c5f01b2fSopenharmony_ci                CHECK(j.at(6) == json::object());
33c5f01b2fSopenharmony_ci                CHECK(j.at(7) == json({1, 2, 3}));
34c5f01b2fSopenharmony_ci
35c5f01b2fSopenharmony_ci                CHECK(j_const.at(0) == json(1));
36c5f01b2fSopenharmony_ci                CHECK(j_const.at(1) == json(1u));
37c5f01b2fSopenharmony_ci                CHECK(j_const.at(2) == json(true));
38c5f01b2fSopenharmony_ci                CHECK(j_const.at(3) == json(nullptr));
39c5f01b2fSopenharmony_ci                CHECK(j_const.at(4) == json("string"));
40c5f01b2fSopenharmony_ci                CHECK(j_const.at(5) == json(42.23));
41c5f01b2fSopenharmony_ci                CHECK(j_const.at(6) == json::object());
42c5f01b2fSopenharmony_ci                CHECK(j_const.at(7) == json({1, 2, 3}));
43c5f01b2fSopenharmony_ci            }
44c5f01b2fSopenharmony_ci
45c5f01b2fSopenharmony_ci            SECTION("access outside bounds")
46c5f01b2fSopenharmony_ci            {
47c5f01b2fSopenharmony_ci                CHECK_THROWS_WITH_AS(j.at(8),
48c5f01b2fSopenharmony_ci                                     "[json.exception.out_of_range.401] array index 8 is out of range", json::out_of_range&);
49c5f01b2fSopenharmony_ci                CHECK_THROWS_WITH_AS(j_const.at(8),
50c5f01b2fSopenharmony_ci                                     "[json.exception.out_of_range.401] array index 8 is out of range", json::out_of_range&);
51c5f01b2fSopenharmony_ci            }
52c5f01b2fSopenharmony_ci
53c5f01b2fSopenharmony_ci            SECTION("access on non-array type")
54c5f01b2fSopenharmony_ci            {
55c5f01b2fSopenharmony_ci                SECTION("null")
56c5f01b2fSopenharmony_ci                {
57c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::null);
58c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
59c5f01b2fSopenharmony_ci
60c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with null", json::type_error&);
61c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with null", json::type_error&);
62c5f01b2fSopenharmony_ci                }
63c5f01b2fSopenharmony_ci
64c5f01b2fSopenharmony_ci                SECTION("boolean")
65c5f01b2fSopenharmony_ci                {
66c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::boolean);
67c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
68c5f01b2fSopenharmony_ci
69c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with boolean", json::type_error&);
70c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with boolean", json::type_error&);
71c5f01b2fSopenharmony_ci                }
72c5f01b2fSopenharmony_ci
73c5f01b2fSopenharmony_ci                SECTION("string")
74c5f01b2fSopenharmony_ci                {
75c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::string);
76c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
77c5f01b2fSopenharmony_ci
78c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with string", json::type_error&);
79c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with string", json::type_error&);
80c5f01b2fSopenharmony_ci                }
81c5f01b2fSopenharmony_ci
82c5f01b2fSopenharmony_ci                SECTION("object")
83c5f01b2fSopenharmony_ci                {
84c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::object);
85c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
86c5f01b2fSopenharmony_ci
87c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with object", json::type_error&);
88c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with object", json::type_error&);
89c5f01b2fSopenharmony_ci                }
90c5f01b2fSopenharmony_ci
91c5f01b2fSopenharmony_ci                SECTION("number (integer)")
92c5f01b2fSopenharmony_ci                {
93c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_integer);
94c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
95c5f01b2fSopenharmony_ci
96c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
97c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
98c5f01b2fSopenharmony_ci                }
99c5f01b2fSopenharmony_ci
100c5f01b2fSopenharmony_ci                SECTION("number (unsigned)")
101c5f01b2fSopenharmony_ci                {
102c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_unsigned);
103c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
104c5f01b2fSopenharmony_ci
105c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
106c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
107c5f01b2fSopenharmony_ci                }
108c5f01b2fSopenharmony_ci
109c5f01b2fSopenharmony_ci                SECTION("number (floating-point)")
110c5f01b2fSopenharmony_ci                {
111c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_float);
112c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
113c5f01b2fSopenharmony_ci
114c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
115c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number", json::type_error&);
116c5f01b2fSopenharmony_ci                }
117c5f01b2fSopenharmony_ci            }
118c5f01b2fSopenharmony_ci        }
119c5f01b2fSopenharmony_ci
120c5f01b2fSopenharmony_ci        SECTION("front and back")
121c5f01b2fSopenharmony_ci        {
122c5f01b2fSopenharmony_ci            CHECK(j.front() == json(1));
123c5f01b2fSopenharmony_ci            CHECK(j_const.front() == json(1));
124c5f01b2fSopenharmony_ci            CHECK(j.back() == json({1, 2, 3}));
125c5f01b2fSopenharmony_ci            CHECK(j_const.back() == json({1, 2, 3}));
126c5f01b2fSopenharmony_ci        }
127c5f01b2fSopenharmony_ci
128c5f01b2fSopenharmony_ci        SECTION("access specified element")
129c5f01b2fSopenharmony_ci        {
130c5f01b2fSopenharmony_ci            SECTION("access within bounds")
131c5f01b2fSopenharmony_ci            {
132c5f01b2fSopenharmony_ci                CHECK(j[0] == json(1));
133c5f01b2fSopenharmony_ci                CHECK(j[1] == json(1u));
134c5f01b2fSopenharmony_ci                CHECK(j[2] == json(true));
135c5f01b2fSopenharmony_ci                CHECK(j[3] == json(nullptr));
136c5f01b2fSopenharmony_ci                CHECK(j[4] == json("string"));
137c5f01b2fSopenharmony_ci                CHECK(j[5] == json(42.23));
138c5f01b2fSopenharmony_ci                CHECK(j[6] == json::object());
139c5f01b2fSopenharmony_ci                CHECK(j[7] == json({1, 2, 3}));
140c5f01b2fSopenharmony_ci
141c5f01b2fSopenharmony_ci                CHECK(j_const[0] == json(1));
142c5f01b2fSopenharmony_ci                CHECK(j_const[1] == json(1u));
143c5f01b2fSopenharmony_ci                CHECK(j_const[2] == json(true));
144c5f01b2fSopenharmony_ci                CHECK(j_const[3] == json(nullptr));
145c5f01b2fSopenharmony_ci                CHECK(j_const[4] == json("string"));
146c5f01b2fSopenharmony_ci                CHECK(j_const[5] == json(42.23));
147c5f01b2fSopenharmony_ci                CHECK(j_const[6] == json::object());
148c5f01b2fSopenharmony_ci                CHECK(j_const[7] == json({1, 2, 3}));
149c5f01b2fSopenharmony_ci            }
150c5f01b2fSopenharmony_ci
151c5f01b2fSopenharmony_ci            SECTION("access on non-array type")
152c5f01b2fSopenharmony_ci            {
153c5f01b2fSopenharmony_ci                SECTION("null")
154c5f01b2fSopenharmony_ci                {
155c5f01b2fSopenharmony_ci                    SECTION("standard tests")
156c5f01b2fSopenharmony_ci                    {
157c5f01b2fSopenharmony_ci                        json j_nonarray(json::value_t::null);
158c5f01b2fSopenharmony_ci                        const json j_nonarray_const(j_nonarray);
159c5f01b2fSopenharmony_ci                        CHECK_NOTHROW(j_nonarray[0]);
160c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with null", json::type_error&);
161c5f01b2fSopenharmony_ci                    }
162c5f01b2fSopenharmony_ci
163c5f01b2fSopenharmony_ci                    SECTION("implicit transformation to properly filled array")
164c5f01b2fSopenharmony_ci                    {
165c5f01b2fSopenharmony_ci                        json j_nonarray;
166c5f01b2fSopenharmony_ci                        j_nonarray[3] = 42;
167c5f01b2fSopenharmony_ci                        CHECK(j_nonarray == json({nullptr, nullptr, nullptr, 42}));
168c5f01b2fSopenharmony_ci                    }
169c5f01b2fSopenharmony_ci                }
170c5f01b2fSopenharmony_ci
171c5f01b2fSopenharmony_ci                SECTION("boolean")
172c5f01b2fSopenharmony_ci                {
173c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::boolean);
174c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
175c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with boolean", json::type_error&);
176c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with boolean", json::type_error&);
177c5f01b2fSopenharmony_ci                }
178c5f01b2fSopenharmony_ci
179c5f01b2fSopenharmony_ci                SECTION("string")
180c5f01b2fSopenharmony_ci                {
181c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::string);
182c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
183c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with string", json::type_error&);
184c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with string", json::type_error&);
185c5f01b2fSopenharmony_ci                }
186c5f01b2fSopenharmony_ci
187c5f01b2fSopenharmony_ci                SECTION("object")
188c5f01b2fSopenharmony_ci                {
189c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::object);
190c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
191c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with object", json::type_error&);
192c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with object", json::type_error&);
193c5f01b2fSopenharmony_ci                }
194c5f01b2fSopenharmony_ci
195c5f01b2fSopenharmony_ci                SECTION("number (integer)")
196c5f01b2fSopenharmony_ci                {
197c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_integer);
198c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
199c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
200c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
201c5f01b2fSopenharmony_ci                }
202c5f01b2fSopenharmony_ci
203c5f01b2fSopenharmony_ci                SECTION("number (unsigned)")
204c5f01b2fSopenharmony_ci                {
205c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_unsigned);
206c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
207c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
208c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
209c5f01b2fSopenharmony_ci                }
210c5f01b2fSopenharmony_ci
211c5f01b2fSopenharmony_ci                SECTION("number (floating-point)")
212c5f01b2fSopenharmony_ci                {
213c5f01b2fSopenharmony_ci                    json j_nonarray(json::value_t::number_float);
214c5f01b2fSopenharmony_ci                    const json j_nonarray_const(j_nonarray);
215c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
216c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonarray_const[0], "[json.exception.type_error.305] cannot use operator[] with a numeric argument with number", json::type_error&);
217c5f01b2fSopenharmony_ci                }
218c5f01b2fSopenharmony_ci            }
219c5f01b2fSopenharmony_ci        }
220c5f01b2fSopenharmony_ci
221c5f01b2fSopenharmony_ci        SECTION("remove specified element")
222c5f01b2fSopenharmony_ci        {
223c5f01b2fSopenharmony_ci            SECTION("remove element by index")
224c5f01b2fSopenharmony_ci            {
225c5f01b2fSopenharmony_ci                {
226c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
227c5f01b2fSopenharmony_ci                    jarray.erase(0);
228c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
229c5f01b2fSopenharmony_ci                }
230c5f01b2fSopenharmony_ci                {
231c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
232c5f01b2fSopenharmony_ci                    jarray.erase(1);
233c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
234c5f01b2fSopenharmony_ci                }
235c5f01b2fSopenharmony_ci                {
236c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
237c5f01b2fSopenharmony_ci                    jarray.erase(2);
238c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
239c5f01b2fSopenharmony_ci                }
240c5f01b2fSopenharmony_ci                {
241c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
242c5f01b2fSopenharmony_ci                    jarray.erase(3);
243c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, true, "string", 42.23, json::object(), {1, 2, 3}}));
244c5f01b2fSopenharmony_ci                }
245c5f01b2fSopenharmony_ci                {
246c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
247c5f01b2fSopenharmony_ci                    jarray.erase(4);
248c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
249c5f01b2fSopenharmony_ci                }
250c5f01b2fSopenharmony_ci                {
251c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
252c5f01b2fSopenharmony_ci                    jarray.erase(5);
253c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, true, nullptr, "string", json::object(), {1, 2, 3}}));
254c5f01b2fSopenharmony_ci                }
255c5f01b2fSopenharmony_ci                {
256c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
257c5f01b2fSopenharmony_ci                    jarray.erase(6);
258c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, {1, 2, 3}}));
259c5f01b2fSopenharmony_ci                }
260c5f01b2fSopenharmony_ci                {
261c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
262c5f01b2fSopenharmony_ci                    jarray.erase(7);
263c5f01b2fSopenharmony_ci                    CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object()}));
264c5f01b2fSopenharmony_ci                }
265c5f01b2fSopenharmony_ci                {
266c5f01b2fSopenharmony_ci                    json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
267c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(jarray.erase(8), "[json.exception.out_of_range.401] array index 8 is out of range", json::out_of_range&);
268c5f01b2fSopenharmony_ci                }
269c5f01b2fSopenharmony_ci            }
270c5f01b2fSopenharmony_ci
271c5f01b2fSopenharmony_ci            SECTION("remove element by iterator")
272c5f01b2fSopenharmony_ci            {
273c5f01b2fSopenharmony_ci                SECTION("erase(begin())")
274c5f01b2fSopenharmony_ci                {
275c5f01b2fSopenharmony_ci                    {
276c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
277c5f01b2fSopenharmony_ci                        json::iterator it2 = jarray.erase(jarray.begin());
278c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
279c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(1u));
280c5f01b2fSopenharmony_ci                    }
281c5f01b2fSopenharmony_ci                    {
282c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
283c5f01b2fSopenharmony_ci                        json::const_iterator it2 = jarray.erase(jarray.cbegin());
284c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
285c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(1u));
286c5f01b2fSopenharmony_ci                    }
287c5f01b2fSopenharmony_ci                }
288c5f01b2fSopenharmony_ci
289c5f01b2fSopenharmony_ci                SECTION("erase(begin(), end())")
290c5f01b2fSopenharmony_ci                {
291c5f01b2fSopenharmony_ci                    {
292c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
293c5f01b2fSopenharmony_ci                        json::iterator it2 = jarray.erase(jarray.begin(), jarray.end());
294c5f01b2fSopenharmony_ci                        CHECK(jarray == json::array());
295c5f01b2fSopenharmony_ci                        CHECK(it2 == jarray.end());
296c5f01b2fSopenharmony_ci                    }
297c5f01b2fSopenharmony_ci                    {
298c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
299c5f01b2fSopenharmony_ci                        json::const_iterator it2 = jarray.erase(jarray.cbegin(), jarray.cend());
300c5f01b2fSopenharmony_ci                        CHECK(jarray == json::array());
301c5f01b2fSopenharmony_ci                        CHECK(it2 == jarray.cend());
302c5f01b2fSopenharmony_ci                    }
303c5f01b2fSopenharmony_ci                }
304c5f01b2fSopenharmony_ci
305c5f01b2fSopenharmony_ci                SECTION("erase(begin(), begin())")
306c5f01b2fSopenharmony_ci                {
307c5f01b2fSopenharmony_ci                    {
308c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
309c5f01b2fSopenharmony_ci                        json::iterator it2 = jarray.erase(jarray.begin(), jarray.begin());
310c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
311c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(1));
312c5f01b2fSopenharmony_ci                    }
313c5f01b2fSopenharmony_ci                    {
314c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
315c5f01b2fSopenharmony_ci                        json::const_iterator it2 = jarray.erase(jarray.cbegin(), jarray.cbegin());
316c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
317c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(1));
318c5f01b2fSopenharmony_ci                    }
319c5f01b2fSopenharmony_ci                }
320c5f01b2fSopenharmony_ci
321c5f01b2fSopenharmony_ci                SECTION("erase at offset")
322c5f01b2fSopenharmony_ci                {
323c5f01b2fSopenharmony_ci                    {
324c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
325c5f01b2fSopenharmony_ci                        json::iterator it = jarray.begin() + 4;
326c5f01b2fSopenharmony_ci                        json::iterator it2 = jarray.erase(it);
327c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
328c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(42.23));
329c5f01b2fSopenharmony_ci                    }
330c5f01b2fSopenharmony_ci                    {
331c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
332c5f01b2fSopenharmony_ci                        json::const_iterator it = jarray.cbegin() + 4;
333c5f01b2fSopenharmony_ci                        json::const_iterator it2 = jarray.erase(it);
334c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
335c5f01b2fSopenharmony_ci                        CHECK(*it2 == json(42.23));
336c5f01b2fSopenharmony_ci                    }
337c5f01b2fSopenharmony_ci                }
338c5f01b2fSopenharmony_ci
339c5f01b2fSopenharmony_ci                SECTION("erase subrange")
340c5f01b2fSopenharmony_ci                {
341c5f01b2fSopenharmony_ci                    {
342c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
343c5f01b2fSopenharmony_ci                        json::iterator it2 = jarray.erase(jarray.begin() + 3, jarray.begin() + 6);
344c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
345c5f01b2fSopenharmony_ci                        CHECK(*it2 == json::object());
346c5f01b2fSopenharmony_ci                    }
347c5f01b2fSopenharmony_ci                    {
348c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
349c5f01b2fSopenharmony_ci                        json::const_iterator it2 = jarray.erase(jarray.cbegin() + 3, jarray.cbegin() + 6);
350c5f01b2fSopenharmony_ci                        CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
351c5f01b2fSopenharmony_ci                        CHECK(*it2 == json::object());
352c5f01b2fSopenharmony_ci                    }
353c5f01b2fSopenharmony_ci                }
354c5f01b2fSopenharmony_ci
355c5f01b2fSopenharmony_ci                SECTION("different arrays")
356c5f01b2fSopenharmony_ci                {
357c5f01b2fSopenharmony_ci                    {
358c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
359c5f01b2fSopenharmony_ci                        json jarray2 = {"foo", "bar"};
360c5f01b2fSopenharmony_ci
361c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.begin()),
362c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&);
363c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray.begin(), jarray2.end()),
364c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
365c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.begin(), jarray.end()),
366c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
367c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.begin(), jarray2.end()),
368c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
369c5f01b2fSopenharmony_ci                    }
370c5f01b2fSopenharmony_ci                    {
371c5f01b2fSopenharmony_ci                        json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
372c5f01b2fSopenharmony_ci                        json jarray2 = {"foo", "bar"};
373c5f01b2fSopenharmony_ci
374c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.cbegin()),
375c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&);
376c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray.cbegin(), jarray2.cend()),
377c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
378c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.cbegin(), jarray.cend()),
379c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
380c5f01b2fSopenharmony_ci                        CHECK_THROWS_WITH_AS(jarray.erase(jarray2.cbegin(), jarray2.cend()),
381c5f01b2fSopenharmony_ci                                             "[json.exception.invalid_iterator.203] iterators do not fit current value", json::invalid_iterator&);
382c5f01b2fSopenharmony_ci                    }
383c5f01b2fSopenharmony_ci                }
384c5f01b2fSopenharmony_ci            }
385c5f01b2fSopenharmony_ci
386c5f01b2fSopenharmony_ci            SECTION("remove element by index in non-array type")
387c5f01b2fSopenharmony_ci            {
388c5f01b2fSopenharmony_ci                SECTION("null")
389c5f01b2fSopenharmony_ci                {
390c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::null);
391c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with null", json::type_error&);
392c5f01b2fSopenharmony_ci                }
393c5f01b2fSopenharmony_ci
394c5f01b2fSopenharmony_ci                SECTION("boolean")
395c5f01b2fSopenharmony_ci                {
396c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::boolean);
397c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with boolean", json::type_error&);
398c5f01b2fSopenharmony_ci                }
399c5f01b2fSopenharmony_ci
400c5f01b2fSopenharmony_ci                SECTION("string")
401c5f01b2fSopenharmony_ci                {
402c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::string);
403c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with string", json::type_error&);
404c5f01b2fSopenharmony_ci                }
405c5f01b2fSopenharmony_ci
406c5f01b2fSopenharmony_ci                SECTION("object")
407c5f01b2fSopenharmony_ci                {
408c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::object);
409c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with object", json::type_error&);
410c5f01b2fSopenharmony_ci                }
411c5f01b2fSopenharmony_ci
412c5f01b2fSopenharmony_ci                SECTION("number (integer)")
413c5f01b2fSopenharmony_ci                {
414c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::number_integer);
415c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with number", json::type_error&);
416c5f01b2fSopenharmony_ci                }
417c5f01b2fSopenharmony_ci
418c5f01b2fSopenharmony_ci                SECTION("number (unsigned)")
419c5f01b2fSopenharmony_ci                {
420c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::number_unsigned);
421c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with number", json::type_error&);
422c5f01b2fSopenharmony_ci                }
423c5f01b2fSopenharmony_ci
424c5f01b2fSopenharmony_ci                SECTION("number (floating-point)")
425c5f01b2fSopenharmony_ci                {
426c5f01b2fSopenharmony_ci                    json j_nonobject(json::value_t::number_float);
427c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j_nonobject.erase(0), "[json.exception.type_error.307] cannot use erase() with number", json::type_error&);
428c5f01b2fSopenharmony_ci                }
429c5f01b2fSopenharmony_ci            }
430c5f01b2fSopenharmony_ci        }
431c5f01b2fSopenharmony_ci    }
432c5f01b2fSopenharmony_ci
433c5f01b2fSopenharmony_ci    SECTION("other values")
434c5f01b2fSopenharmony_ci    {
435c5f01b2fSopenharmony_ci        SECTION("front and back")
436c5f01b2fSopenharmony_ci        {
437c5f01b2fSopenharmony_ci            SECTION("null")
438c5f01b2fSopenharmony_ci            {
439c5f01b2fSopenharmony_ci                {
440c5f01b2fSopenharmony_ci                    json j;
441c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.front(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
442c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.back(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
443c5f01b2fSopenharmony_ci                }
444c5f01b2fSopenharmony_ci                {
445c5f01b2fSopenharmony_ci                    const json j{};
446c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.front(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
447c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.back(), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
448c5f01b2fSopenharmony_ci                }
449c5f01b2fSopenharmony_ci            }
450c5f01b2fSopenharmony_ci
451c5f01b2fSopenharmony_ci            SECTION("string")
452c5f01b2fSopenharmony_ci            {
453c5f01b2fSopenharmony_ci                {
454c5f01b2fSopenharmony_ci                    json j = "foo";
455c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
456c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
457c5f01b2fSopenharmony_ci                }
458c5f01b2fSopenharmony_ci                {
459c5f01b2fSopenharmony_ci                    const json j = "bar";
460c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
461c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
462c5f01b2fSopenharmony_ci                }
463c5f01b2fSopenharmony_ci            }
464c5f01b2fSopenharmony_ci
465c5f01b2fSopenharmony_ci            SECTION("number (boolean)")
466c5f01b2fSopenharmony_ci            {
467c5f01b2fSopenharmony_ci                {
468c5f01b2fSopenharmony_ci                    json j = false;
469c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
470c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
471c5f01b2fSopenharmony_ci                }
472c5f01b2fSopenharmony_ci                {
473c5f01b2fSopenharmony_ci                    const json j = true;
474c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
475c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
476c5f01b2fSopenharmony_ci                }
477c5f01b2fSopenharmony_ci            }
478c5f01b2fSopenharmony_ci
479c5f01b2fSopenharmony_ci            SECTION("number (integer)")
480c5f01b2fSopenharmony_ci            {
481c5f01b2fSopenharmony_ci                {
482c5f01b2fSopenharmony_ci                    json j = 17;
483c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
484c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
485c5f01b2fSopenharmony_ci                }
486c5f01b2fSopenharmony_ci                {
487c5f01b2fSopenharmony_ci                    const json j = 17;
488c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
489c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
490c5f01b2fSopenharmony_ci                }
491c5f01b2fSopenharmony_ci            }
492c5f01b2fSopenharmony_ci
493c5f01b2fSopenharmony_ci            SECTION("number (unsigned)")
494c5f01b2fSopenharmony_ci            {
495c5f01b2fSopenharmony_ci                {
496c5f01b2fSopenharmony_ci                    json j = 17u;
497c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
498c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
499c5f01b2fSopenharmony_ci                }
500c5f01b2fSopenharmony_ci                {
501c5f01b2fSopenharmony_ci                    const json j = 17u;
502c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
503c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
504c5f01b2fSopenharmony_ci                }
505c5f01b2fSopenharmony_ci            }
506c5f01b2fSopenharmony_ci
507c5f01b2fSopenharmony_ci            SECTION("number (floating point)")
508c5f01b2fSopenharmony_ci            {
509c5f01b2fSopenharmony_ci                {
510c5f01b2fSopenharmony_ci                    json j = 23.42;
511c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
512c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
513c5f01b2fSopenharmony_ci                }
514c5f01b2fSopenharmony_ci                {
515c5f01b2fSopenharmony_ci                    const json j = 23.42;
516c5f01b2fSopenharmony_ci                    CHECK(j.front() == j);
517c5f01b2fSopenharmony_ci                    CHECK(j.back() == j);
518c5f01b2fSopenharmony_ci                }
519c5f01b2fSopenharmony_ci            }
520c5f01b2fSopenharmony_ci        }
521c5f01b2fSopenharmony_ci
522c5f01b2fSopenharmony_ci        SECTION("erase with one valid iterator")
523c5f01b2fSopenharmony_ci        {
524c5f01b2fSopenharmony_ci            SECTION("null")
525c5f01b2fSopenharmony_ci            {
526c5f01b2fSopenharmony_ci                {
527c5f01b2fSopenharmony_ci                    json j;
528c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin()), "[json.exception.type_error.307] cannot use erase() with null", json::type_error&);
529c5f01b2fSopenharmony_ci                }
530c5f01b2fSopenharmony_ci                {
531c5f01b2fSopenharmony_ci                    json j;
532c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin()),
533c5f01b2fSopenharmony_ci                                         "[json.exception.type_error.307] cannot use erase() with null", json::type_error&);
534c5f01b2fSopenharmony_ci                }
535c5f01b2fSopenharmony_ci            }
536c5f01b2fSopenharmony_ci
537c5f01b2fSopenharmony_ci            SECTION("string")
538c5f01b2fSopenharmony_ci            {
539c5f01b2fSopenharmony_ci                {
540c5f01b2fSopenharmony_ci                    json j = "foo";
541c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
542c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
543c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
544c5f01b2fSopenharmony_ci                }
545c5f01b2fSopenharmony_ci                {
546c5f01b2fSopenharmony_ci                    json j = "bar";
547c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
548c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
549c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
550c5f01b2fSopenharmony_ci                }
551c5f01b2fSopenharmony_ci            }
552c5f01b2fSopenharmony_ci
553c5f01b2fSopenharmony_ci            SECTION("number (boolean)")
554c5f01b2fSopenharmony_ci            {
555c5f01b2fSopenharmony_ci                {
556c5f01b2fSopenharmony_ci                    json j = false;
557c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
558c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
559c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
560c5f01b2fSopenharmony_ci                }
561c5f01b2fSopenharmony_ci                {
562c5f01b2fSopenharmony_ci                    json j = true;
563c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
564c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
565c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
566c5f01b2fSopenharmony_ci                }
567c5f01b2fSopenharmony_ci            }
568c5f01b2fSopenharmony_ci
569c5f01b2fSopenharmony_ci            SECTION("number (integer)")
570c5f01b2fSopenharmony_ci            {
571c5f01b2fSopenharmony_ci                {
572c5f01b2fSopenharmony_ci                    json j = 17;
573c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
574c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
575c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
576c5f01b2fSopenharmony_ci                }
577c5f01b2fSopenharmony_ci                {
578c5f01b2fSopenharmony_ci                    json j = 17;
579c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
580c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
581c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
582c5f01b2fSopenharmony_ci                }
583c5f01b2fSopenharmony_ci            }
584c5f01b2fSopenharmony_ci
585c5f01b2fSopenharmony_ci            SECTION("number (unsigned)")
586c5f01b2fSopenharmony_ci            {
587c5f01b2fSopenharmony_ci                {
588c5f01b2fSopenharmony_ci                    json j = 17u;
589c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
590c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
591c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
592c5f01b2fSopenharmony_ci                }
593c5f01b2fSopenharmony_ci                {
594c5f01b2fSopenharmony_ci                    json j = 17u;
595c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
596c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
597c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
598c5f01b2fSopenharmony_ci                }
599c5f01b2fSopenharmony_ci            }
600c5f01b2fSopenharmony_ci
601c5f01b2fSopenharmony_ci            SECTION("number (floating point)")
602c5f01b2fSopenharmony_ci            {
603c5f01b2fSopenharmony_ci                {
604c5f01b2fSopenharmony_ci                    json j = 23.42;
605c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
606c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
607c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
608c5f01b2fSopenharmony_ci                }
609c5f01b2fSopenharmony_ci                {
610c5f01b2fSopenharmony_ci                    json j = 23.42;
611c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
612c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
613c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
614c5f01b2fSopenharmony_ci                }
615c5f01b2fSopenharmony_ci            }
616c5f01b2fSopenharmony_ci
617c5f01b2fSopenharmony_ci            SECTION("binary")
618c5f01b2fSopenharmony_ci            {
619c5f01b2fSopenharmony_ci                {
620c5f01b2fSopenharmony_ci                    json j = json::binary({1, 2, 3});
621c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin());
622c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
623c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
624c5f01b2fSopenharmony_ci                }
625c5f01b2fSopenharmony_ci                {
626c5f01b2fSopenharmony_ci                    json j = json::binary({1, 2, 3});
627c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin());
628c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
629c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
630c5f01b2fSopenharmony_ci                }
631c5f01b2fSopenharmony_ci            }
632c5f01b2fSopenharmony_ci        }
633c5f01b2fSopenharmony_ci
634c5f01b2fSopenharmony_ci        SECTION("erase with one invalid iterator")
635c5f01b2fSopenharmony_ci        {
636c5f01b2fSopenharmony_ci            SECTION("string")
637c5f01b2fSopenharmony_ci            {
638c5f01b2fSopenharmony_ci                {
639c5f01b2fSopenharmony_ci                    json j = "foo";
640c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
641c5f01b2fSopenharmony_ci                }
642c5f01b2fSopenharmony_ci                {
643c5f01b2fSopenharmony_ci                    json j = "bar";
644c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
645c5f01b2fSopenharmony_ci                }
646c5f01b2fSopenharmony_ci            }
647c5f01b2fSopenharmony_ci
648c5f01b2fSopenharmony_ci            SECTION("number (boolean)")
649c5f01b2fSopenharmony_ci            {
650c5f01b2fSopenharmony_ci                {
651c5f01b2fSopenharmony_ci                    json j = false;
652c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
653c5f01b2fSopenharmony_ci                }
654c5f01b2fSopenharmony_ci                {
655c5f01b2fSopenharmony_ci                    json j = true;
656c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
657c5f01b2fSopenharmony_ci                }
658c5f01b2fSopenharmony_ci            }
659c5f01b2fSopenharmony_ci
660c5f01b2fSopenharmony_ci            SECTION("number (integer)")
661c5f01b2fSopenharmony_ci            {
662c5f01b2fSopenharmony_ci                {
663c5f01b2fSopenharmony_ci                    json j = 17;
664c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
665c5f01b2fSopenharmony_ci                }
666c5f01b2fSopenharmony_ci                {
667c5f01b2fSopenharmony_ci                    json j = 17;
668c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
669c5f01b2fSopenharmony_ci                }
670c5f01b2fSopenharmony_ci            }
671c5f01b2fSopenharmony_ci
672c5f01b2fSopenharmony_ci            SECTION("number (unsigned)")
673c5f01b2fSopenharmony_ci            {
674c5f01b2fSopenharmony_ci                {
675c5f01b2fSopenharmony_ci                    json j = 17u;
676c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
677c5f01b2fSopenharmony_ci                }
678c5f01b2fSopenharmony_ci                {
679c5f01b2fSopenharmony_ci                    json j = 17u;
680c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
681c5f01b2fSopenharmony_ci                }
682c5f01b2fSopenharmony_ci            }
683c5f01b2fSopenharmony_ci
684c5f01b2fSopenharmony_ci            SECTION("number (floating point)")
685c5f01b2fSopenharmony_ci            {
686c5f01b2fSopenharmony_ci                {
687c5f01b2fSopenharmony_ci                    json j = 23.42;
688c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
689c5f01b2fSopenharmony_ci                }
690c5f01b2fSopenharmony_ci                {
691c5f01b2fSopenharmony_ci                    json j = 23.42;
692c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend()), "[json.exception.invalid_iterator.205] iterator out of range", json::invalid_iterator&);
693c5f01b2fSopenharmony_ci                }
694c5f01b2fSopenharmony_ci            }
695c5f01b2fSopenharmony_ci        }
696c5f01b2fSopenharmony_ci
697c5f01b2fSopenharmony_ci        SECTION("erase with two valid iterators")
698c5f01b2fSopenharmony_ci        {
699c5f01b2fSopenharmony_ci            SECTION("null")
700c5f01b2fSopenharmony_ci            {
701c5f01b2fSopenharmony_ci                {
702c5f01b2fSopenharmony_ci                    json j;
703c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.end()), "[json.exception.type_error.307] cannot use erase() with null", json::type_error&);
704c5f01b2fSopenharmony_ci                }
705c5f01b2fSopenharmony_ci                {
706c5f01b2fSopenharmony_ci                    json j;
707c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cend()), "[json.exception.type_error.307] cannot use erase() with null", json::type_error&);
708c5f01b2fSopenharmony_ci                }
709c5f01b2fSopenharmony_ci            }
710c5f01b2fSopenharmony_ci
711c5f01b2fSopenharmony_ci            SECTION("string")
712c5f01b2fSopenharmony_ci            {
713c5f01b2fSopenharmony_ci                {
714c5f01b2fSopenharmony_ci                    json j = "foo";
715c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
716c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
717c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
718c5f01b2fSopenharmony_ci                }
719c5f01b2fSopenharmony_ci                {
720c5f01b2fSopenharmony_ci                    json j = "bar";
721c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
722c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
723c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
724c5f01b2fSopenharmony_ci                }
725c5f01b2fSopenharmony_ci            }
726c5f01b2fSopenharmony_ci
727c5f01b2fSopenharmony_ci            SECTION("number (boolean)")
728c5f01b2fSopenharmony_ci            {
729c5f01b2fSopenharmony_ci                {
730c5f01b2fSopenharmony_ci                    json j = false;
731c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
732c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
733c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
734c5f01b2fSopenharmony_ci                }
735c5f01b2fSopenharmony_ci                {
736c5f01b2fSopenharmony_ci                    json j = true;
737c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
738c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
739c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
740c5f01b2fSopenharmony_ci                }
741c5f01b2fSopenharmony_ci            }
742c5f01b2fSopenharmony_ci
743c5f01b2fSopenharmony_ci            SECTION("number (integer)")
744c5f01b2fSopenharmony_ci            {
745c5f01b2fSopenharmony_ci                {
746c5f01b2fSopenharmony_ci                    json j = 17;
747c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
748c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
749c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
750c5f01b2fSopenharmony_ci                }
751c5f01b2fSopenharmony_ci                {
752c5f01b2fSopenharmony_ci                    json j = 17;
753c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
754c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
755c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
756c5f01b2fSopenharmony_ci                }
757c5f01b2fSopenharmony_ci            }
758c5f01b2fSopenharmony_ci
759c5f01b2fSopenharmony_ci            SECTION("number (unsigned)")
760c5f01b2fSopenharmony_ci            {
761c5f01b2fSopenharmony_ci                {
762c5f01b2fSopenharmony_ci                    json j = 17u;
763c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
764c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
765c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
766c5f01b2fSopenharmony_ci                }
767c5f01b2fSopenharmony_ci                {
768c5f01b2fSopenharmony_ci                    json j = 17u;
769c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
770c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
771c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
772c5f01b2fSopenharmony_ci                }
773c5f01b2fSopenharmony_ci            }
774c5f01b2fSopenharmony_ci
775c5f01b2fSopenharmony_ci            SECTION("number (floating point)")
776c5f01b2fSopenharmony_ci            {
777c5f01b2fSopenharmony_ci                {
778c5f01b2fSopenharmony_ci                    json j = 23.42;
779c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
780c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
781c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
782c5f01b2fSopenharmony_ci                }
783c5f01b2fSopenharmony_ci                {
784c5f01b2fSopenharmony_ci                    json j = 23.42;
785c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
786c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
787c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
788c5f01b2fSopenharmony_ci                }
789c5f01b2fSopenharmony_ci            }
790c5f01b2fSopenharmony_ci
791c5f01b2fSopenharmony_ci            SECTION("binary")
792c5f01b2fSopenharmony_ci            {
793c5f01b2fSopenharmony_ci                {
794c5f01b2fSopenharmony_ci                    json j = json::binary({1, 2, 3});
795c5f01b2fSopenharmony_ci                    json::iterator it = j.erase(j.begin(), j.end());
796c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
797c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
798c5f01b2fSopenharmony_ci                }
799c5f01b2fSopenharmony_ci                {
800c5f01b2fSopenharmony_ci                    json j = json::binary({1, 2, 3});
801c5f01b2fSopenharmony_ci                    json::const_iterator it = j.erase(j.cbegin(), j.cend());
802c5f01b2fSopenharmony_ci                    CHECK(j.type() == json::value_t::null);
803c5f01b2fSopenharmony_ci                    CHECK(it == j.end());
804c5f01b2fSopenharmony_ci                }
805c5f01b2fSopenharmony_ci            }
806c5f01b2fSopenharmony_ci        }
807c5f01b2fSopenharmony_ci
808c5f01b2fSopenharmony_ci        SECTION("erase with two invalid iterators")
809c5f01b2fSopenharmony_ci        {
810c5f01b2fSopenharmony_ci            SECTION("string")
811c5f01b2fSopenharmony_ci            {
812c5f01b2fSopenharmony_ci                {
813c5f01b2fSopenharmony_ci                    json j = "foo";
814c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
815c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
816c5f01b2fSopenharmony_ci                }
817c5f01b2fSopenharmony_ci                {
818c5f01b2fSopenharmony_ci                    json j = "bar";
819c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
820c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
821c5f01b2fSopenharmony_ci                }
822c5f01b2fSopenharmony_ci            }
823c5f01b2fSopenharmony_ci
824c5f01b2fSopenharmony_ci            SECTION("number (boolean)")
825c5f01b2fSopenharmony_ci            {
826c5f01b2fSopenharmony_ci                {
827c5f01b2fSopenharmony_ci                    json j = false;
828c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
829c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
830c5f01b2fSopenharmony_ci                }
831c5f01b2fSopenharmony_ci                {
832c5f01b2fSopenharmony_ci                    json j = true;
833c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
834c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
835c5f01b2fSopenharmony_ci                }
836c5f01b2fSopenharmony_ci            }
837c5f01b2fSopenharmony_ci
838c5f01b2fSopenharmony_ci            SECTION("number (integer)")
839c5f01b2fSopenharmony_ci            {
840c5f01b2fSopenharmony_ci                {
841c5f01b2fSopenharmony_ci                    json j = 17;
842c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
843c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
844c5f01b2fSopenharmony_ci                }
845c5f01b2fSopenharmony_ci                {
846c5f01b2fSopenharmony_ci                    json j = 17;
847c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
848c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
849c5f01b2fSopenharmony_ci                }
850c5f01b2fSopenharmony_ci            }
851c5f01b2fSopenharmony_ci
852c5f01b2fSopenharmony_ci            SECTION("number (unsigned)")
853c5f01b2fSopenharmony_ci            {
854c5f01b2fSopenharmony_ci                {
855c5f01b2fSopenharmony_ci                    json j = 17u;
856c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
857c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
858c5f01b2fSopenharmony_ci                }
859c5f01b2fSopenharmony_ci                {
860c5f01b2fSopenharmony_ci                    json j = 17u;
861c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
862c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
863c5f01b2fSopenharmony_ci                }
864c5f01b2fSopenharmony_ci            }
865c5f01b2fSopenharmony_ci
866c5f01b2fSopenharmony_ci            SECTION("number (floating point)")
867c5f01b2fSopenharmony_ci            {
868c5f01b2fSopenharmony_ci                {
869c5f01b2fSopenharmony_ci                    json j = 23.42;
870c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.end(), j.end()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
871c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.begin(), j.begin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
872c5f01b2fSopenharmony_ci                }
873c5f01b2fSopenharmony_ci                {
874c5f01b2fSopenharmony_ci                    json j = 23.42;
875c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cend(), j.cend()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
876c5f01b2fSopenharmony_ci                    CHECK_THROWS_WITH_AS(j.erase(j.cbegin(), j.cbegin()), "[json.exception.invalid_iterator.204] iterators out of range", json::invalid_iterator&);
877c5f01b2fSopenharmony_ci                }
878c5f01b2fSopenharmony_ci            }
879c5f01b2fSopenharmony_ci        }
880c5f01b2fSopenharmony_ci    }
881c5f01b2fSopenharmony_ci}
882