docs: correct JSON Pointer documentation and add tests (#5937)
Fix inaccurate or missing statements about unflatten (third round-trip failure, empty token, typo), value (type_error.306 before pointer lookup), contains (pointer overload), parent_pointer and operator<< (bad_alloc), out_of_range.410 example, template parameter requirements (resize(n)), and document the URI fragment form and non-unique member names of RFC 6901. Add tests for the unflatten and value() cases. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
1 parent
8679c011db
commit
c20b6eddf4
9 files changed
+94
-10
No files matched your search
@@ -1044,6 +1044,56 @@ TEST_CASE("flatten of structured values")
|
||||
CHECK(flat_object.unflatten() == nlohmann::ordered_json::parse(R"({"b": {"1": 2}})"));
|
||||
}
|
||||
|
||||
#if !defined(JSON_NOEXCEPTION)
|
||||
SECTION("an object with the key \"0\" next to a non-index key does not round-trip")
|
||||
{
|
||||
// the third documented case in which j != j.flatten().unflatten()
|
||||
const json value = {{"a", {{"0", 1}, {"b", 2}}}};
|
||||
const json flat = value.flatten();
|
||||
CHECK(flat == json({{"/a/0", 1}, {"/a/b", 2}}));
|
||||
CHECK_THROWS_WITH_AS(flat.unflatten(),
|
||||
"[json.exception.parse_error.109] parse error: array index 'b' is not a number", json::parse_error&);
|
||||
|
||||
// the same for other keys that are not valid array indices
|
||||
CHECK_THROWS_WITH_AS(json({{"/a/0", 1}, {"/a/1a", 2}}).unflatten(),
|
||||
"[json.exception.out_of_range.404] unresolved reference token '1a'", json::out_of_range&);
|
||||
CHECK_THROWS_WITH_AS(json({{"/a/0", 1}, {"/a/-", 2}}).unflatten(),
|
||||
"[json.exception.out_of_range.404] unresolved reference token '-'", json::out_of_range&);
|
||||
}
|
||||
|
||||
SECTION("unflatten with the empty token among array indices")
|
||||
{
|
||||
CHECK_THROWS_WITH_AS(json({{"/a/0", 1}, {"/a/", 2}}).unflatten(),
|
||||
"[json.exception.out_of_range.404] unresolved reference token ''", json::out_of_range&);
|
||||
CHECK_THROWS_WITH_AS(json({{"/a/0", 1}, {"/a/1", 2}, {"/a/", 3}}).unflatten(),
|
||||
"[json.exception.out_of_range.404] unresolved reference token ''", json::out_of_range&);
|
||||
|
||||
// without an index "0", the empty token is an ordinary object key
|
||||
CHECK(json({{"/a/", 2}}).unflatten() == json({{"a", {{"", 2}}}}));
|
||||
}
|
||||
|
||||
SECTION("value() with the empty pointer on a primitive root")
|
||||
{
|
||||
// unlike at(), value() rejects primitive values before it looks at the pointer
|
||||
const json number = 1;
|
||||
CHECK(number.at(""_json_pointer) == 1);
|
||||
CHECK_THROWS_WITH_AS(number.value(""_json_pointer, 7),
|
||||
"[json.exception.type_error.306] cannot use value() with number", json::type_error&);
|
||||
|
||||
const json string = "s";
|
||||
CHECK_THROWS_WITH_AS(string.value(""_json_pointer, 7),
|
||||
"[json.exception.type_error.306] cannot use value() with string", json::type_error&);
|
||||
|
||||
// contains() accepts the empty pointer on every value
|
||||
CHECK(number.contains(""_json_pointer));
|
||||
CHECK_FALSE(number.contains("/a"_json_pointer));
|
||||
|
||||
// arrays and objects return the default for a missing location
|
||||
CHECK(json::array().value(""_json_pointer, json(7)) == json::array());
|
||||
CHECK(json::array().value("/0"_json_pointer, 7) == 7);
|
||||
}
|
||||
#endif
|
||||
|
||||
SECTION("objects and arrays interleaved")
|
||||
{
|
||||
const json value =
|
||||
|
||||
Reference in new issue
Block a user