• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7 // SPDX-License-Identifier: MIT
8 
9 #include "doctest_compatibility.h"
10 
11 #define JSON_TESTS_PRIVATE
12 #include <nlohmann/json.hpp>
13 using nlohmann::json;
14 
15 TEST_CASE("const_iterator class")
16 {
17     SECTION("construction")
18     {
19         SECTION("constructor")
20         {
21             SECTION("null")
22             {
23                 json j(json::value_t::null);
24                 json::const_iterator it(&j);
25             }
26 
27             SECTION("object")
28             {
29                 json j(json::value_t::object);
30                 json::const_iterator it(&j);
31             }
32 
33             SECTION("array")
34             {
35                 json j(json::value_t::array);
36                 json::const_iterator it(&j);
37             }
38         }
39 
40         SECTION("copy assignment")
41         {
42             json j(json::value_t::null);
43             json::const_iterator it(&j);
44             json::const_iterator it2(&j);
45             it2 = it;
46         }
47 
48         SECTION("copy constructor from non-const iterator")
49         {
50             SECTION("create from uninitialized iterator")
51             {
52                 const json::iterator it {};
53                 json::const_iterator cit(it);
54             }
55 
56             SECTION("create from initialized iterator")
57             {
58                 json j;
59                 const json::iterator it = j.begin();
60                 json::const_iterator cit(it);
61             }
62         }
63     }
64 
65     SECTION("initialization")
66     {
67         SECTION("set_begin")
68         {
69             SECTION("null")
70             {
71                 json j(json::value_t::null);
72                 json::const_iterator it(&j);
73                 it.set_begin();
74                 CHECK((it == j.cbegin()));
75             }
76 
77             SECTION("object")
78             {
79                 json j(json::value_t::object);
80                 json::const_iterator it(&j);
81                 it.set_begin();
82                 CHECK((it == j.cbegin()));
83             }
84 
85             SECTION("array")
86             {
87                 json j(json::value_t::array);
88                 json::const_iterator it(&j);
89                 it.set_begin();
90                 CHECK((it == j.cbegin()));
91             }
92         }
93 
94         SECTION("set_end")
95         {
96             SECTION("null")
97             {
98                 json j(json::value_t::null);
99                 json::const_iterator it(&j);
100                 it.set_end();
101                 CHECK((it == j.cend()));
102             }
103 
104             SECTION("object")
105             {
106                 json j(json::value_t::object);
107                 json::const_iterator it(&j);
108                 it.set_end();
109                 CHECK((it == j.cend()));
110             }
111 
112             SECTION("array")
113             {
114                 json j(json::value_t::array);
115                 json::const_iterator it(&j);
116                 it.set_end();
117                 CHECK((it == j.cend()));
118             }
119         }
120     }
121 
122     SECTION("element access")
123     {
124         SECTION("operator*")
125         {
126             SECTION("null")
127             {
128                 json j(json::value_t::null);
129                 json::const_iterator it = j.cbegin();
130                 CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
131             }
132 
133             SECTION("number")
134             {
135                 json j(17);
136                 json::const_iterator it = j.cbegin();
137                 CHECK(*it == json(17));
138                 it = j.cend();
139                 CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
140             }
141 
142             SECTION("object")
143             {
144                 json j({{"foo", "bar"}});
145                 json::const_iterator it = j.cbegin();
146                 CHECK(*it == json("bar"));
147             }
148 
149             SECTION("array")
150             {
151                 json j({1, 2, 3, 4});
152                 json::const_iterator it = j.cbegin();
153                 CHECK(*it == json(1));
154             }
155         }
156 
157         SECTION("operator->")
158         {
159             SECTION("null")
160             {
161                 json j(json::value_t::null);
162                 json::const_iterator it = j.cbegin();
163                 CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
164             }
165 
166             SECTION("number")
167             {
168                 json j(17);
169                 json::const_iterator it = j.cbegin();
170                 CHECK(std::string(it->type_name()) == "number");
171                 it = j.cend();
172                 CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
173             }
174 
175             SECTION("object")
176             {
177                 json j({{"foo", "bar"}});
178                 json::const_iterator it = j.cbegin();
179                 CHECK(std::string(it->type_name()) == "string");
180             }
181 
182             SECTION("array")
183             {
184                 json j({1, 2, 3, 4});
185                 json::const_iterator it = j.cbegin();
186                 CHECK(std::string(it->type_name()) == "number");
187             }
188         }
189     }
190 
191     SECTION("increment/decrement")
192     {
193         SECTION("post-increment")
194         {
195             SECTION("null")
196             {
197                 json j(json::value_t::null);
198                 json::const_iterator it = j.cbegin();
199                 CHECK((it.m_it.primitive_iterator.m_it == 1));
200                 it++;
201                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
202             }
203 
204             SECTION("number")
205             {
206                 json j(17);
207                 json::const_iterator it = j.cbegin();
208                 CHECK((it.m_it.primitive_iterator.m_it == 0));
209                 it++;
210                 CHECK((it.m_it.primitive_iterator.m_it == 1));
211                 it++;
212                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
213             }
214 
215             SECTION("object")
216             {
217                 json j({{"foo", "bar"}});
218                 json::const_iterator it = j.cbegin();
219                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
220                 it++;
221                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
222             }
223 
224             SECTION("array")
225             {
226                 json j({1, 2, 3, 4});
227                 json::const_iterator it = j.cbegin();
228                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
229                 it++;
230                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
231                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
232                 it++;
233                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
234                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
235                 it++;
236                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
237                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
238                 it++;
239                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
240                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
241             }
242         }
243 
244         SECTION("pre-increment")
245         {
246             SECTION("null")
247             {
248                 json j(json::value_t::null);
249                 json::const_iterator it = j.cbegin();
250                 CHECK((it.m_it.primitive_iterator.m_it == 1));
251                 ++it;
252                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
253             }
254 
255             SECTION("number")
256             {
257                 json j(17);
258                 json::const_iterator it = j.cbegin();
259                 CHECK((it.m_it.primitive_iterator.m_it == 0));
260                 ++it;
261                 CHECK((it.m_it.primitive_iterator.m_it == 1));
262                 ++it;
263                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
264             }
265 
266             SECTION("object")
267             {
268                 json j({{"foo", "bar"}});
269                 json::const_iterator it = j.cbegin();
270                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
271                 ++it;
272                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
273             }
274 
275             SECTION("array")
276             {
277                 json j({1, 2, 3, 4});
278                 json::const_iterator it = j.cbegin();
279                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
280                 ++it;
281                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
282                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
283                 ++it;
284                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
285                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
286                 ++it;
287                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
288                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
289                 ++it;
290                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
291                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
292             }
293         }
294 
295         SECTION("post-decrement")
296         {
297             SECTION("null")
298             {
299                 json j(json::value_t::null);
300                 json::const_iterator it = j.cend();
301                 CHECK((it.m_it.primitive_iterator.m_it == 1));
302             }
303 
304             SECTION("number")
305             {
306                 json j(17);
307                 json::const_iterator it = j.cend();
308                 CHECK((it.m_it.primitive_iterator.m_it == 1));
309                 it--;
310                 CHECK((it.m_it.primitive_iterator.m_it == 0));
311                 it--;
312                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
313             }
314 
315             SECTION("object")
316             {
317                 json j({{"foo", "bar"}});
318                 json::const_iterator it = j.cend();
319                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
320                 it--;
321                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
322             }
323 
324             SECTION("array")
325             {
326                 json j({1, 2, 3, 4});
327                 json::const_iterator it = j.cend();
328                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
329                 it--;
330                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
331                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
332                 it--;
333                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
334                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
335                 it--;
336                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
337                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
338                 it--;
339                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
340                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
341             }
342         }
343 
344         SECTION("pre-decrement")
345         {
346             SECTION("null")
347             {
348                 json j(json::value_t::null);
349                 json::const_iterator it = j.cend();
350                 CHECK((it.m_it.primitive_iterator.m_it == 1));
351             }
352 
353             SECTION("number")
354             {
355                 json j(17);
356                 json::const_iterator it = j.cend();
357                 CHECK((it.m_it.primitive_iterator.m_it == 1));
358                 --it;
359                 CHECK((it.m_it.primitive_iterator.m_it == 0));
360                 --it;
361                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
362             }
363 
364             SECTION("object")
365             {
366                 json j({{"foo", "bar"}});
367                 json::const_iterator it = j.cend();
368                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
369                 --it;
370                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
371             }
372 
373             SECTION("array")
374             {
375                 json j({1, 2, 3, 4});
376                 json::const_iterator it = j.cend();
377                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
378                 --it;
379                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
380                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
381                 --it;
382                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
383                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
384                 --it;
385                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
386                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
387                 --it;
388                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
389                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
390             }
391         }
392     }
393 }
394