• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     __ _____ _____ _____
3  __|  |   __|     |   | |  JSON for Modern C++ (test suite)
4 |  |  |__   |  |  | | | |  version 3.10.0
5 |_____|_____|_____|_|___|  https://github.com/nlohmann/json
6 
7 Licensed under the MIT License <http://opensource.org/licenses/MIT>.
8 SPDX-License-Identifier: MIT
9 Copyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>.
10 
11 Permission is hereby  granted, free of charge, to any  person obtaining a copy
12 of this software and associated  documentation files (the "Software"), to deal
13 in the Software  without restriction, including without  limitation the rights
14 to  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell
15 copies  of  the Software,  and  to  permit persons  to  whom  the Software  is
16 furnished to do so, subject to the following conditions:
17 
18 The above copyright notice and this permission notice shall be included in all
19 copies or substantial portions of the Software.
20 
21 THE SOFTWARE  IS PROVIDED "AS  IS", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR
22 IMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY,
23 FITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE
24 AUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER
25 LIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 OUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE
27 SOFTWARE.
28 */
29 
30 #include "doctest_compatibility.h"
31 
32 #define JSON_TESTS_PRIVATE
33 #include <nlohmann/json.hpp>
34 using nlohmann::json;
35 
36 TEST_CASE("iterator class")
37 {
38     SECTION("construction")
39     {
40         SECTION("constructor")
41         {
42             SECTION("null")
43             {
44                 json j(json::value_t::null);
45                 json::iterator it(&j);
46             }
47 
48             SECTION("object")
49             {
50                 json j(json::value_t::object);
51                 json::iterator it(&j);
52             }
53 
54             SECTION("array")
55             {
56                 json j(json::value_t::array);
57                 json::iterator it(&j);
58             }
59         }
60 
61         SECTION("copy assignment")
62         {
63             json j(json::value_t::null);
64             json::iterator it(&j);
65             json::iterator it2(&j);
66             it2 = it;
67         }
68     }
69 
70     SECTION("initialization")
71     {
72         SECTION("set_begin")
73         {
74             SECTION("null")
75             {
76                 json j(json::value_t::null);
77                 json::iterator it(&j);
78                 it.set_begin();
79                 CHECK((it == j.begin()));
80             }
81 
82             SECTION("object")
83             {
84                 json j(json::value_t::object);
85                 json::iterator it(&j);
86                 it.set_begin();
87                 CHECK((it == j.begin()));
88             }
89 
90             SECTION("array")
91             {
92                 json j(json::value_t::array);
93                 json::iterator it(&j);
94                 it.set_begin();
95                 CHECK((it == j.begin()));
96             }
97         }
98 
99         SECTION("set_end")
100         {
101             SECTION("null")
102             {
103                 json j(json::value_t::null);
104                 json::iterator it(&j);
105                 it.set_end();
106                 CHECK((it == j.end()));
107             }
108 
109             SECTION("object")
110             {
111                 json j(json::value_t::object);
112                 json::iterator it(&j);
113                 it.set_end();
114                 CHECK((it == j.end()));
115             }
116 
117             SECTION("array")
118             {
119                 json j(json::value_t::array);
120                 json::iterator it(&j);
121                 it.set_end();
122                 CHECK((it == j.end()));
123             }
124         }
125     }
126 
127     SECTION("element access")
128     {
129         SECTION("operator*")
130         {
131             SECTION("null")
132             {
133                 json j(json::value_t::null);
134                 json::iterator it = j.begin();
135                 CHECK_THROWS_AS(*it, json::invalid_iterator&);
136                 CHECK_THROWS_WITH(*it, "[json.exception.invalid_iterator.214] cannot get value");
137             }
138 
139             SECTION("number")
140             {
141                 json j(17);
142                 json::iterator it = j.begin();
143                 CHECK(*it == json(17));
144                 it = j.end();
145                 CHECK_THROWS_AS(*it, json::invalid_iterator&);
146                 CHECK_THROWS_WITH(*it, "[json.exception.invalid_iterator.214] cannot get value");
147             }
148 
149             SECTION("object")
150             {
151                 json j({{"foo", "bar"}});
152                 json::iterator it = j.begin();
153                 CHECK(*it == json("bar"));
154             }
155 
156             SECTION("array")
157             {
158                 json j({1, 2, 3, 4});
159                 json::iterator it = j.begin();
160                 CHECK(*it == json(1));
161             }
162         }
163 
164         SECTION("operator->")
165         {
166             SECTION("null")
167             {
168                 json j(json::value_t::null);
169                 json::iterator it = j.begin();
170                 CHECK_THROWS_AS(std::string(it->type_name()), json::invalid_iterator&);
171                 CHECK_THROWS_WITH(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value");
172             }
173 
174             SECTION("number")
175             {
176                 json j(17);
177                 json::iterator it = j.begin();
178                 CHECK(std::string(it->type_name()) == "number");
179                 it = j.end();
180                 CHECK_THROWS_AS(std::string(it->type_name()), json::invalid_iterator&);
181                 CHECK_THROWS_WITH(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value");
182             }
183 
184             SECTION("object")
185             {
186                 json j({{"foo", "bar"}});
187                 json::iterator it = j.begin();
188                 CHECK(std::string(it->type_name()) == "string");
189             }
190 
191             SECTION("array")
192             {
193                 json j({1, 2, 3, 4});
194                 json::iterator it = j.begin();
195                 CHECK(std::string(it->type_name()) == "number");
196             }
197         }
198     }
199 
200     SECTION("increment/decrement")
201     {
202         SECTION("post-increment")
203         {
204             SECTION("null")
205             {
206                 json j(json::value_t::null);
207                 json::iterator it = j.begin();
208                 CHECK((it.m_it.primitive_iterator.m_it == 1));
209                 it++;
210                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
211             }
212 
213             SECTION("number")
214             {
215                 json j(17);
216                 json::iterator it = j.begin();
217                 CHECK((it.m_it.primitive_iterator.m_it == 0));
218                 it++;
219                 CHECK((it.m_it.primitive_iterator.m_it == 1));
220                 it++;
221                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
222             }
223 
224             SECTION("object")
225             {
226                 json j({{"foo", "bar"}});
227                 json::iterator it = j.begin();
228                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
229                 it++;
230                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
231             }
232 
233             SECTION("array")
234             {
235                 json j({1, 2, 3, 4});
236                 json::iterator it = j.begin();
237                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
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                 it++;
242                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
243                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
244                 it++;
245                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
246                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
247                 it++;
248                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
249                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
250             }
251         }
252 
253         SECTION("pre-increment")
254         {
255             SECTION("null")
256             {
257                 json j(json::value_t::null);
258                 json::iterator it = j.begin();
259                 CHECK((it.m_it.primitive_iterator.m_it == 1));
260                 ++it;
261                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
262             }
263 
264             SECTION("number")
265             {
266                 json j(17);
267                 json::iterator it = j.begin();
268                 CHECK((it.m_it.primitive_iterator.m_it == 0));
269                 ++it;
270                 CHECK((it.m_it.primitive_iterator.m_it == 1));
271                 ++it;
272                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
273             }
274 
275             SECTION("object")
276             {
277                 json j({{"foo", "bar"}});
278                 json::iterator it = j.begin();
279                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
280                 ++it;
281                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
282             }
283 
284             SECTION("array")
285             {
286                 json j({1, 2, 3, 4});
287                 json::iterator it = j.begin();
288                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
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                 ++it;
293                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
294                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
295                 ++it;
296                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
297                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
298                 ++it;
299                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
300                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
301             }
302         }
303 
304         SECTION("post-decrement")
305         {
306             SECTION("null")
307             {
308                 json j(json::value_t::null);
309                 json::iterator it = j.end();
310                 CHECK((it.m_it.primitive_iterator.m_it == 1));
311             }
312 
313             SECTION("number")
314             {
315                 json j(17);
316                 json::iterator it = j.end();
317                 CHECK((it.m_it.primitive_iterator.m_it == 1));
318                 it--;
319                 CHECK((it.m_it.primitive_iterator.m_it == 0));
320                 it--;
321                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
322             }
323 
324             SECTION("object")
325             {
326                 json j({{"foo", "bar"}});
327                 json::iterator it = j.end();
328                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
329                 it--;
330                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
331             }
332 
333             SECTION("array")
334             {
335                 json j({1, 2, 3, 4});
336                 json::iterator it = j.end();
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                 it--;
342                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
343                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
344                 it--;
345                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
346                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
347                 it--;
348                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
349                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
350             }
351         }
352 
353         SECTION("pre-decrement")
354         {
355             SECTION("null")
356             {
357                 json j(json::value_t::null);
358                 json::iterator it = j.end();
359                 CHECK((it.m_it.primitive_iterator.m_it == 1));
360             }
361 
362             SECTION("number")
363             {
364                 json j(17);
365                 json::iterator it = j.end();
366                 CHECK((it.m_it.primitive_iterator.m_it == 1));
367                 --it;
368                 CHECK((it.m_it.primitive_iterator.m_it == 0));
369                 --it;
370                 CHECK((it.m_it.primitive_iterator.m_it != 0 && it.m_it.primitive_iterator.m_it != 1));
371             }
372 
373             SECTION("object")
374             {
375                 json j({{"foo", "bar"}});
376                 json::iterator it = j.end();
377                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
378                 --it;
379                 CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
380             }
381 
382             SECTION("array")
383             {
384                 json j({1, 2, 3, 4});
385                 json::iterator it = j.end();
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                 --it;
391                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
392                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
393                 --it;
394                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
395                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
396                 --it;
397                 CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
398                 CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
399             }
400         }
401     }
402 }
403