mirror of
https://github.com/nlohmann/json.git
synced 2026-09-09 09:47:58 +00:00
* Extract C++17-only content from unit-items.cpp into its own test file
unit-items.cpp is a 1433-line file that was being compiled twice per
CI configuration (once for C++11, once for C++17) purely because it
contained a single, small JSON_HAS_CPP_17-gated SECTION ("structured
bindings", 14 lines). Move that SECTION into a new, dedicated file
(tests/src/unit-items-cpp17.cpp) so only that tiny file needs a
second build; unit-items.cpp itself now builds/tests only once. No
tests/CMakeLists.txt changes are needed since the existing
file(GLOB ... src/unit-*.cpp) plus json_test_add_test_for() already
auto-register and standard-gate any new unit-*.cpp file based on
whether it textually contains JSON_HAS_CPP_<N> (the same mechanism
already used for the existing unit-iterators3.cpp file, which follows
the identical pattern).
Verified with plain clang++ under -std=c++11/14/17/20 and via a local
CMake configure+build that:
- unit-items.cpp now only produces a test-items_cpp11 target (the
former test-items_cpp17 target is gone) and its assertion/test-case
counts are unchanged (2 test cases / 222 assertions) for every
standard.
- The new unit-items-cpp17.cpp produces test-items-cpp17_cpp11 (an
intentionally empty translation unit under C++11 that reports 0
tests, 0 assertions, SUCCESS) and test-items-cpp17_cpp17 (1 test
case / 1 assertion, identical to what "structured bindings" ran
as before it was moved).
Separately, unit-regression1.cpp (1530 lines) was also being built
twice per CI configuration because it contained the substring
JSON_HAS_CPP_17 -- but on inspection this was dead code: an orphaned
"#ifdef JSON_HAS_CPP_17 / #include <variant> / #endif" left over from
when the actual std::variant-based regression test (issue #1292) was
relocated to unit-regression2.cpp. Nothing in unit-regression1.cpp
uses <variant>, so there is no SECTION/TEST_CASE to preserve here;
the dead include is simply removed. This was verified by grepping the
file for any other use of "variant" (none) and confirming issue #1292
is still covered by unit-regression2.cpp. Compiled and ran under
-std=c++11/14/17/20 and via CMake: unit-regression1.cpp now only
produces a test-regression1_cpp11 target (test-regression1_cpp17 is
gone) with an unchanged test-case count (3) under every standard.
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
* Fix astyle indentation of #include inside #ifdef in unit-items-cpp17.cpp
This repo's astyle style keeps preprocessor directives at column 0
even inside #ifdef blocks. The new tests/src/unit-items-cpp17.cpp
had its #include <map>/#include <string> indented, which made the
'check' CI job's amalgamation/formatting diff non-empty and failed
the aggregate check.
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
---------
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
1418 lines
35 KiB
C++
1418 lines
35 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#include "doctest_compatibility.h"
|
|
|
|
#include <nlohmann/json.hpp>
|
|
using nlohmann::json;
|
|
|
|
// This test suite uses range for loops where values are copied. This is inefficient in usual code, but required to achieve 100% coverage.
|
|
DOCTEST_GCC_SUPPRESS_WARNING_PUSH
|
|
#if DOCTEST_GCC >= DOCTEST_COMPILER(11, 0, 0)
|
|
DOCTEST_GCC_SUPPRESS_WARNING("-Wrange-loop-construct")
|
|
#endif
|
|
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
|
|
DOCTEST_CLANG_SUPPRESS_WARNING("-Wrange-loop-construct")
|
|
|
|
TEST_CASE("iterator_wrapper")
|
|
{
|
|
SECTION("object")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
|
|
// change the value
|
|
i.value() = json(11);
|
|
CHECK(i.value() == json(11));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
|
|
// change the value
|
|
i.value() = json(22);
|
|
CHECK(i.value() == json(22));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
|
|
// check if values where changed
|
|
CHECK(j == json({ {"A", 11}, {"B", 22} }));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("const object")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("array")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
|
|
// change the value
|
|
i.value() = "AA";
|
|
CHECK(i.value() == "AA");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
|
|
// change the value
|
|
i.value() = "BB";
|
|
CHECK(i.value() == "BB");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
|
|
// check if values where changed
|
|
CHECK(j == json({ "AA", "BB" }));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("const array")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("primitive")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
|
|
// change value
|
|
i.value() = json(2);
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
|
|
// check if value has changed
|
|
CHECK(j == json(2));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
}
|
|
|
|
SECTION("const primitive")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto& i : json::iterator_wrapper(j)) // NOLINT(readability-qualified-auto)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto i : json::iterator_wrapper(j)) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto& i : json::iterator_wrapper(j))
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
}
|
|
}
|
|
|
|
TEST_CASE("items()")
|
|
{
|
|
SECTION("object")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
|
|
// change the value
|
|
i.value() = json(11);
|
|
CHECK(i.value() == json(11));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
|
|
// change the value
|
|
i.value() = json(22);
|
|
CHECK(i.value() == json(22));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
|
|
// check if values where changed
|
|
CHECK(j == json({ {"A", 11}, {"B", 22} }));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("const object")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = { {"A", 1}, {"B", 2} };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "A");
|
|
CHECK(i.value() == json(1));
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "B");
|
|
CHECK(i.value() == json(2));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("array")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
|
|
// change the value
|
|
i.value() = "AA";
|
|
CHECK(i.value() == "AA");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
|
|
// change the value
|
|
i.value() = "BB";
|
|
CHECK(i.value() == "BB");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
|
|
// check if values where changed
|
|
CHECK(j == json({ "AA", "BB" }));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("const array")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = { "A", "B" };
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
switch (counter++)
|
|
{
|
|
case 1:
|
|
{
|
|
CHECK(i.key() == "0");
|
|
CHECK(i.value() == "A");
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
CHECK(i.key() == "1");
|
|
CHECK(i.value() == "B");
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CHECK(counter == 3);
|
|
}
|
|
}
|
|
|
|
SECTION("primitive")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
|
|
// change value
|
|
i.value() = json(2);
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
|
|
// check if value has changed
|
|
CHECK(j == json(2));
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
}
|
|
|
|
SECTION("const primitive")
|
|
{
|
|
SECTION("value")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("reference")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (auto& i : j.items()) // NOLINT(readability-qualified-auto)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const value")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto i : j.items()) // NOLINT(performance-for-range-copy)
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
|
|
SECTION("const reference")
|
|
{
|
|
const json j = 1;
|
|
int counter = 1;
|
|
|
|
for (const auto& i : j.items())
|
|
{
|
|
++counter;
|
|
CHECK(i.key() == "");
|
|
CHECK(i.value() == json(1));
|
|
}
|
|
|
|
CHECK(counter == 2);
|
|
}
|
|
}
|
|
}
|
|
|
|
DOCTEST_GCC_SUPPRESS_WARNING_POP
|
|
DOCTEST_CLANG_SUPPRESS_WARNING_POP
|