mirror of
https://github.com/nlohmann/json.git
synced 2026-09-11 10:48:01 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25c46590f3 |
@@ -3602,6 +3602,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
{
|
{
|
||||||
using std::swap;
|
using std::swap;
|
||||||
swap(*(m_data.m_value.array), other);
|
swap(*(m_data.m_value.array), other);
|
||||||
|
set_parents();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3618,6 +3619,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
{
|
{
|
||||||
using std::swap;
|
using std::swap;
|
||||||
swap(*(m_data.m_value.object), other);
|
swap(*(m_data.m_value.object), other);
|
||||||
|
set_parents();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27335,6 +27335,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
{
|
{
|
||||||
using std::swap;
|
using std::swap;
|
||||||
swap(*(m_data.m_value.array), other);
|
swap(*(m_data.m_value.array), other);
|
||||||
|
set_parents();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -27351,6 +27352,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
{
|
{
|
||||||
using std::swap;
|
using std::swap;
|
||||||
swap(*(m_data.m_value.object), other);
|
swap(*(m_data.m_value.object), other);
|
||||||
|
set_parents();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -273,5 +273,36 @@ TEST_CASE("Regression tests for extended diagnostics")
|
|||||||
CHECK(j1["numbers"]["two"] == 2);
|
CHECK(j1["numbers"]["two"] == 2);
|
||||||
CHECK(j1["string"] == "t");
|
CHECK(j1["string"] == "t");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("Regression test - swap(array_t&)/swap(object_t&) must update JSON_DIAGNOSTICS parent pointers")
|
||||||
|
{
|
||||||
|
// swap(array_t&)
|
||||||
|
{
|
||||||
|
json j = json::array();
|
||||||
|
json::array_t arr = {json::array({1})};
|
||||||
|
j.swap(arr);
|
||||||
|
|
||||||
|
// parent pointers of the moved-in elements must point into j, not
|
||||||
|
// into the now-defunct free-standing array_t
|
||||||
|
CHECK_THROWS_WITH_AS(j[0][0].get<std::string>(), "[json.exception.type_error.302] (/0/0) type must be string, but is number", json::type_error);
|
||||||
|
|
||||||
|
// must not trigger assert_invariant() in a debug/assert-enabled build
|
||||||
|
json const k = j;
|
||||||
|
CHECK(k == j);
|
||||||
|
}
|
||||||
|
|
||||||
|
// swap(object_t&)
|
||||||
|
{
|
||||||
|
json o = json::object();
|
||||||
|
json::object_t obj = {{"a", json::array({1})}};
|
||||||
|
o.swap(obj);
|
||||||
|
|
||||||
|
CHECK_THROWS_WITH_AS(o["a"][0].get<std::string>(), "[json.exception.type_error.302] (/a/0) type must be string, but is number", json::type_error);
|
||||||
|
|
||||||
|
// must not trigger assert_invariant() in a debug/assert-enabled build
|
||||||
|
json const p = o;
|
||||||
|
CHECK(p == o);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,71 +245,6 @@ TEST_CASE("object inspection")
|
|||||||
CHECK(binary.dump(1024).size() == 2086);
|
CHECK(binary.dump(1024).size() == 2086);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("indentation and resize")
|
|
||||||
{
|
|
||||||
SECTION("array")
|
|
||||||
{
|
|
||||||
const auto j_array = json::parse("[[[[[[]]]]]]");
|
|
||||||
// check right size after indentation triggering a resize
|
|
||||||
CHECK(j_array.dump(1024).size() == 25622);
|
|
||||||
// check if right indentation symbol is used
|
|
||||||
CHECK(j_array.dump(1024, '\t')[4096] == '\t');
|
|
||||||
// check resize is large enough
|
|
||||||
CHECK(j_array.dump(10000).size() == 250022);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("object")
|
|
||||||
{
|
|
||||||
const auto j_object = json::parse(R"({"":{"":{"":{"":{"":{}}}}}})");
|
|
||||||
// check right size after indentation triggering a resize
|
|
||||||
CHECK(j_object.dump(1024).size() == 25642);
|
|
||||||
// check if right indentation symbol is used
|
|
||||||
CHECK(j_object.dump(1024, '\t')[4096] == '\t');
|
|
||||||
// check resize is large enough
|
|
||||||
CHECK(j_object.dump(10000).size() == 250042);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("binary")
|
|
||||||
{
|
|
||||||
const auto j_binary = json::binary({1, 2, 3}, 128);
|
|
||||||
// check right size after indentation triggering a resize
|
|
||||||
CHECK(j_binary.dump(1024).size() == 2086);
|
|
||||||
CHECK(j_binary.dump(1024, '\t')[1024] == '\t');
|
|
||||||
// check resize is large enough
|
|
||||||
CHECK(j_binary.dump(10000).size() == 20038);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("full-width run integrity")
|
|
||||||
{
|
|
||||||
// the size/single-index checks above can't catch a corrupted byte
|
|
||||||
// in the middle of an indentation run, so also verify each level's
|
|
||||||
// indentation is an intact, uninterrupted run of the indent character
|
|
||||||
const std::string::size_type width = 1100;
|
|
||||||
|
|
||||||
SECTION("object")
|
|
||||||
{
|
|
||||||
const json j_object = {{"outer", {{"inner", 1}}}};
|
|
||||||
const std::string s = j_object.dump(static_cast<int>(width));
|
|
||||||
CHECK(s.find('\n' + std::string(width, ' ') + "\"outer\"") != std::string::npos);
|
|
||||||
CHECK(s.find('\n' + std::string(2 * width, ' ') + "\"inner\"") != std::string::npos);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("array")
|
|
||||||
{
|
|
||||||
const json j_array = json::array({json::array({1})});
|
|
||||||
const std::string s = j_array.dump(static_cast<int>(width));
|
|
||||||
CHECK(s.find('\n' + std::string(2 * width, ' ') + '1') != std::string::npos);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("binary")
|
|
||||||
{
|
|
||||||
const json j_binary = json::binary({1, 2, 3});
|
|
||||||
const std::string s = j_binary.dump(static_cast<int>(width));
|
|
||||||
CHECK(s.find('\n' + std::string(width, ' ') + "\"bytes\"") != std::string::npos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("dump and floating-point numbers")
|
SECTION("dump and floating-point numbers")
|
||||||
{
|
{
|
||||||
auto s = json(42.23).dump();
|
auto s = json(42.23).dump();
|
||||||
|
|||||||
Reference in New Issue
Block a user