1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3 // |  |  |__   |  |  | | | |  version 3.11.2
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // Copyright (c) 2013-2022 Niels Lohmann <http://nlohmann.me>.
7 // SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
8 // SPDX-License-Identifier: MIT
9 
10 #include "doctest_compatibility.h"
11 
12 #include <nlohmann/json.hpp>
13 using nlohmann::json;
14 
15 TEST_CASE("capacity")
16 {
17     SECTION("empty()")
18     {
19         SECTION("boolean")
20         {
21             json j = true;
22             const json j_const(j);
23 
24             SECTION("result of empty")
25             {
26                 CHECK(j.empty() == false);
27                 CHECK(j_const.empty() == false);
28             }
29 
30             SECTION("definition of empty")
31             {
32                 CHECK(j.empty() == (j.begin() == j.end()));
33                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
34             }
35         }
36 
37         SECTION("string")
38         {
39             json j = "hello world";
40             const json j_const(j);
41 
42             SECTION("result of empty")
43             {
44                 CHECK(j.empty() == false);
45                 CHECK(j_const.empty() == false);
46             }
47 
48             SECTION("definition of empty")
49             {
50                 CHECK(j.empty() == (j.begin() == j.end()));
51                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
52             }
53         }
54 
55         SECTION("array")
56         {
57             SECTION("empty array")
58             {
59                 json j = json::array();
60                 const json j_const(j);
61 
62                 SECTION("result of empty")
63                 {
64                     CHECK(j.empty() == true);
65                     CHECK(j_const.empty() == true);
66                 }
67 
68                 SECTION("definition of empty")
69                 {
70                     CHECK(j.empty() == (j.begin() == j.end()));
71                     CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
72                 }
73             }
74 
75             SECTION("filled array")
76             {
77                 json j = {1, 2, 3};
78                 const json j_const(j);
79 
80                 SECTION("result of empty")
81                 {
82                     CHECK(j.empty() == false);
83                     CHECK(j_const.empty() == false);
84                 }
85 
86                 SECTION("definition of empty")
87                 {
88                     CHECK(j.empty() == (j.begin() == j.end()));
89                     CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
90                 }
91             }
92         }
93 
94         SECTION("object")
95         {
96             SECTION("empty object")
97             {
98                 json j = json::object();
99                 const json j_const(j);
100 
101                 SECTION("result of empty")
102                 {
103                     CHECK(j.empty() == true);
104                     CHECK(j_const.empty() == true);
105                 }
106 
107                 SECTION("definition of empty")
108                 {
109                     CHECK(j.empty() == (j.begin() == j.end()));
110                     CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
111                 }
112             }
113 
114             SECTION("filled object")
115             {
116                 json j = {{"one", 1}, {"two", 2}, {"three", 3}};
117                 const json j_const(j);
118 
119                 SECTION("result of empty")
120                 {
121                     CHECK(j.empty() == false);
122                     CHECK(j_const.empty() == false);
123                 }
124 
125                 SECTION("definition of empty")
126                 {
127                     CHECK(j.empty() == (j.begin() == j.end()));
128                     CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
129                 }
130             }
131         }
132 
133         SECTION("number (integer)")
134         {
135             json j = -23;
136             const json j_const(j);
137 
138             SECTION("result of empty")
139             {
140                 CHECK(j.empty() == false);
141                 CHECK(j_const.empty() == false);
142             }
143 
144             SECTION("definition of empty")
145             {
146                 CHECK(j.empty() == (j.begin() == j.end()));
147                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
148             }
149         }
150 
151         SECTION("number (unsigned)")
152         {
153             json j = 23u;
154             const json j_const(j);
155 
156             SECTION("result of empty")
157             {
158                 CHECK(j.empty() == false);
159                 CHECK(j_const.empty() == false);
160             }
161 
162             SECTION("definition of empty")
163             {
164                 CHECK(j.empty() == (j.begin() == j.end()));
165                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
166             }
167         }
168 
169         SECTION("number (float)")
170         {
171             json j = 23.42;
172             const json j_const(j);
173 
174             SECTION("result of empty")
175             {
176                 CHECK(j.empty() == false);
177                 CHECK(j_const.empty() == false);
178             }
179 
180             SECTION("definition of empty")
181             {
182                 CHECK(j.empty() == (j.begin() == j.end()));
183                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
184             }
185         }
186 
187         SECTION("null")
188         {
189             json j = nullptr;
190             const json j_const(j);
191 
192             SECTION("result of empty")
193             {
194                 CHECK(j.empty() == true);
195                 CHECK(j_const.empty() == true);
196             }
197 
198             SECTION("definition of empty")
199             {
200                 CHECK(j.empty() == (j.begin() == j.end()));
201                 CHECK(j_const.empty() == (j_const.begin() == j_const.end()));
202             }
203         }
204     }
205 
206     SECTION("size()")
207     {
208         SECTION("boolean")
209         {
210             json j = true;
211             const json j_const(j);
212 
213             SECTION("result of size")
214             {
215                 CHECK(j.size() == 1);
216                 CHECK(j_const.size() == 1);
217             }
218 
219             SECTION("definition of size")
220             {
221                 CHECK(std::distance(j.begin(), j.end()) == j.size());
222                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
223                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
224                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
225             }
226         }
227 
228         SECTION("string")
229         {
230             json j = "hello world";
231             const json j_const(j);
232 
233             SECTION("result of size")
234             {
235                 CHECK(j.size() == 1);
236                 CHECK(j_const.size() == 1);
237             }
238 
239             SECTION("definition of size")
240             {
241                 CHECK(std::distance(j.begin(), j.end()) == j.size());
242                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
243                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
244                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
245             }
246         }
247 
248         SECTION("array")
249         {
250             SECTION("empty array")
251             {
252                 json j = json::array();
253                 const json j_const(j);
254 
255                 SECTION("result of size")
256                 {
257                     CHECK(j.size() == 0);
258                     CHECK(j_const.size() == 0);
259                 }
260 
261                 SECTION("definition of size")
262                 {
263                     CHECK(std::distance(j.begin(), j.end()) == j.size());
264                     CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
265                     CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
266                     CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
267                 }
268             }
269 
270             SECTION("filled array")
271             {
272                 json j = {1, 2, 3};
273                 const json j_const(j);
274 
275                 SECTION("result of size")
276                 {
277                     CHECK(j.size() == 3);
278                     CHECK(j_const.size() == 3);
279                 }
280 
281                 SECTION("definition of size")
282                 {
283                     CHECK(std::distance(j.begin(), j.end()) == j.size());
284                     CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
285                     CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
286                     CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
287                 }
288             }
289         }
290 
291         SECTION("object")
292         {
293             SECTION("empty object")
294             {
295                 json j = json::object();
296                 const json j_const(j);
297 
298                 SECTION("result of size")
299                 {
300                     CHECK(j.size() == 0);
301                     CHECK(j_const.size() == 0);
302                 }
303 
304                 SECTION("definition of size")
305                 {
306                     CHECK(std::distance(j.begin(), j.end()) == j.size());
307                     CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
308                     CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
309                     CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
310                 }
311             }
312 
313             SECTION("filled object")
314             {
315                 json j = {{"one", 1}, {"two", 2}, {"three", 3}};
316                 const json j_const(j);
317 
318                 SECTION("result of size")
319                 {
320                     CHECK(j.size() == 3);
321                     CHECK(j_const.size() == 3);
322                 }
323 
324                 SECTION("definition of size")
325                 {
326                     CHECK(std::distance(j.begin(), j.end()) == j.size());
327                     CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
328                     CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
329                     CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
330                 }
331             }
332         }
333 
334         SECTION("number (integer)")
335         {
336             json j = -23;
337             const json j_const(j);
338 
339             SECTION("result of size")
340             {
341                 CHECK(j.size() == 1);
342                 CHECK(j_const.size() == 1);
343             }
344 
345             SECTION("definition of size")
346             {
347                 CHECK(std::distance(j.begin(), j.end()) == j.size());
348                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
349                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
350                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
351             }
352         }
353 
354         SECTION("number (unsigned)")
355         {
356             json j = 23u;
357             const json j_const(j);
358 
359             SECTION("result of size")
360             {
361                 CHECK(j.size() == 1);
362                 CHECK(j_const.size() == 1);
363             }
364 
365             SECTION("definition of size")
366             {
367                 CHECK(std::distance(j.begin(), j.end()) == j.size());
368                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
369                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
370                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
371             }
372         }
373 
374         SECTION("number (float)")
375         {
376             json j = 23.42;
377             const json j_const(j);
378 
379             SECTION("result of size")
380             {
381                 CHECK(j.size() == 1);
382                 CHECK(j_const.size() == 1);
383             }
384 
385             SECTION("definition of size")
386             {
387                 CHECK(std::distance(j.begin(), j.end()) == j.size());
388                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
389                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
390                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
391             }
392         }
393 
394         SECTION("null")
395         {
396             json j = nullptr;
397             const json j_const(j);
398 
399             SECTION("result of size")
400             {
401                 CHECK(j.size() == 0);
402                 CHECK(j_const.size() == 0);
403             }
404 
405             SECTION("definition of size")
406             {
407                 CHECK(std::distance(j.begin(), j.end()) == j.size());
408                 CHECK(std::distance(j_const.begin(), j_const.end()) == j_const.size());
409                 CHECK(std::distance(j.rbegin(), j.rend()) == j.size());
410                 CHECK(std::distance(j_const.crbegin(), j_const.crend()) == j_const.size());
411             }
412         }
413     }
414 
415     SECTION("max_size()")
416     {
417         SECTION("boolean")
418         {
419             json j = true;
420             const json j_const = true;
421 
422             SECTION("result of max_size")
423             {
424                 CHECK(j.max_size() == 1);
425                 CHECK(j_const.max_size() == 1);
426             }
427         }
428 
429         SECTION("string")
430         {
431             json j = "hello world";
432             const json j_const = "hello world";
433 
434             SECTION("result of max_size")
435             {
436                 CHECK(j.max_size() == 1);
437                 CHECK(j_const.max_size() == 1);
438             }
439         }
440 
441         SECTION("array")
442         {
443             SECTION("empty array")
444             {
445                 json j = json::array();
446                 const json j_const = json::array();
447 
448                 SECTION("result of max_size")
449                 {
450                     CHECK(j.max_size() >= j.size());
451                     CHECK(j_const.max_size() >= j_const.size());
452                 }
453             }
454 
455             SECTION("filled array")
456             {
457                 json j = {1, 2, 3};
458                 const json j_const = {1, 2, 3};
459 
460                 SECTION("result of max_size")
461                 {
462                     CHECK(j.max_size() >= j.size());
463                     CHECK(j_const.max_size() >= j_const.size());
464                 }
465             }
466         }
467 
468         SECTION("object")
469         {
470             SECTION("empty object")
471             {
472                 json j = json::object();
473                 const json j_const = json::object();
474 
475                 SECTION("result of max_size")
476                 {
477                     CHECK(j.max_size() >= j.size());
478                     CHECK(j_const.max_size() >= j_const.size());
479                 }
480             }
481 
482             SECTION("filled object")
483             {
484                 json j = {{"one", 1}, {"two", 2}, {"three", 3}};
485                 const json j_const = {{"one", 1}, {"two", 2}, {"three", 3}};
486 
487                 SECTION("result of max_size")
488                 {
489                     CHECK(j.max_size() >= j.size());
490                     CHECK(j_const.max_size() >= j_const.size());
491                 }
492             }
493         }
494 
495         SECTION("number (integer)")
496         {
497             json j = -23;
498             const json j_const = -23;
499 
500             SECTION("result of max_size")
501             {
502                 CHECK(j.max_size() == 1);
503                 CHECK(j_const.max_size() == 1);
504             }
505         }
506 
507         SECTION("number (unsigned)")
508         {
509             json j = 23u;
510             const json j_const = 23u;
511 
512             SECTION("result of max_size")
513             {
514                 CHECK(j.max_size() == 1);
515                 CHECK(j_const.max_size() == 1);
516             }
517         }
518 
519         SECTION("number (float)")
520         {
521             json j = 23.42;
522             const json j_const = 23.42;
523 
524             SECTION("result of max_size")
525             {
526                 CHECK(j.max_size() == 1);
527                 CHECK(j_const.max_size() == 1);
528             }
529         }
530 
531         SECTION("null")
532         {
533             json j = nullptr;
534             const json j_const = nullptr;
535 
536             SECTION("result of max_size")
537             {
538                 CHECK(j.max_size() == 0);
539                 CHECK(j_const.max_size() == 0);
540             }
541         }
542     }
543 }
544