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