mirror of
https://github.com/nlohmann/json
synced 2024-11-25 05:10:05 +00:00
Add clang-tools to required tools for ci_static_analysis_clang (#3724)
* 💚 add clang-tools to required tools for ci_static_analysis_clang * 🚨 update Clang-Tidy warning selection * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings * 🚨 fix Clang-Tidy warnings (#3738) * ⏪ revert fix * ⏪ revert fix * 🚨 fix Clang-Tidy warnings (#3739) Co-authored-by: Florian Albrechtskirchinger <falbrechtskirchinger@gmail.com>
This commit is contained in:
parent
307c053b9b
commit
58bd97e2b1
@ -6,6 +6,7 @@ Checks: '*,
|
|||||||
-bugprone-easily-swappable-parameters,
|
-bugprone-easily-swappable-parameters,
|
||||||
-cert-err58-cpp,
|
-cert-err58-cpp,
|
||||||
-concurrency-mt-unsafe,
|
-concurrency-mt-unsafe,
|
||||||
|
-cppcoreguidelines-avoid-const-or-ref-data-members,
|
||||||
-cppcoreguidelines-avoid-goto,
|
-cppcoreguidelines-avoid-goto,
|
||||||
-cppcoreguidelines-avoid-magic-numbers,
|
-cppcoreguidelines-avoid-magic-numbers,
|
||||||
-cppcoreguidelines-avoid-non-const-global-variables,
|
-cppcoreguidelines-avoid-non-const-global-variables,
|
||||||
|
2
.github/workflows/ubuntu.yml
vendored
2
.github/workflows/ubuntu.yml
vendored
@ -73,7 +73,7 @@ jobs:
|
|||||||
target: [ci_clang_tidy, ci_test_clang_sanitizer, ci_clang_analyze]
|
target: [ci_clang_tidy, ci_test_clang_sanitizer, ci_clang_analyze]
|
||||||
steps:
|
steps:
|
||||||
- name: Install git
|
- name: Install git
|
||||||
run: apt-get update ; apt-get install -y git
|
run: apt-get update ; apt-get install -y git clang-tools
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Get latest CMake and ninja
|
- name: Get latest CMake and ninja
|
||||||
uses: lukka/get-cmake@latest
|
uses: lukka/get-cmake@latest
|
||||||
|
@ -149,17 +149,17 @@ class parse_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
|
static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("parse_error", id_), "parse error",
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
position_string(pos), ": ", exception::diagnostics(context), what_arg);
|
position_string(pos), ": ", exception::diagnostics(context), what_arg);
|
||||||
return {id_, pos.chars_read_total, w.c_str()};
|
return {id_, pos.chars_read_total, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
|
static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("parse_error", id_), "parse error",
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
(byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
|
(byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
|
||||||
": ", exception::diagnostics(context), what_arg);
|
": ", exception::diagnostics(context), what_arg);
|
||||||
return {id_, byte_, w.c_str()};
|
return {id_, byte_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ class invalid_iterator : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ class type_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +228,7 @@ class out_of_range : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,7 +245,7 @@ class other_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ class binary_reader
|
|||||||
{
|
{
|
||||||
std::array<char, 3> cr{{}};
|
std::array<char, 3> cr{{}};
|
||||||
static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
|
static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
|
||||||
std::string cr_str{cr.data()};
|
const std::string cr_str{cr.data()};
|
||||||
return sax->parse_error(element_type_parse_position, cr_str,
|
return sax->parse_error(element_type_parse_position, cr_str,
|
||||||
parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
|
parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
|
||||||
}
|
}
|
||||||
@ -2265,7 +2265,7 @@ class binary_reader
|
|||||||
exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
|
exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
||||||
if (input_format == input_format_t::bjdata && is_ndarray)
|
if (input_format == input_format_t::bjdata && is_ndarray)
|
||||||
{
|
{
|
||||||
if (inside_ndarray)
|
if (inside_ndarray)
|
||||||
@ -2280,7 +2280,7 @@ class binary_reader
|
|||||||
|
|
||||||
if (current == '#')
|
if (current == '#')
|
||||||
{
|
{
|
||||||
bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
||||||
if (input_format == input_format_t::bjdata && is_ndarray)
|
if (input_format == input_format_t::bjdata && is_ndarray)
|
||||||
{
|
{
|
||||||
return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
|
return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
|
||||||
|
@ -230,7 +230,7 @@ class json_pointer
|
|||||||
const char* p = s.c_str();
|
const char* p = s.c_str();
|
||||||
char* p_end = nullptr;
|
char* p_end = nullptr;
|
||||||
errno = 0; // strtoull doesn't reset errno
|
errno = 0; // strtoull doesn't reset errno
|
||||||
unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
||||||
if (p == p_end // invalid input or empty string
|
if (p == p_end // invalid input or empty string
|
||||||
|| errno == ERANGE // out of range
|
|| errno == ERANGE // out of range
|
||||||
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
||||||
|
@ -396,7 +396,7 @@
|
|||||||
|
|
||||||
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief macro
|
@brief macro
|
||||||
@ -409,7 +409,7 @@
|
|||||||
|
|
||||||
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
|
||||||
// inspired from https://stackoverflow.com/a/26745591
|
// inspired from https://stackoverflow.com/a/26745591
|
||||||
|
@ -661,18 +661,18 @@ class binary_writer
|
|||||||
}
|
}
|
||||||
else if (N <= (std::numeric_limits<std::uint16_t>::max)())
|
else if (N <= (std::numeric_limits<std::uint16_t>::max)())
|
||||||
{
|
{
|
||||||
std::uint8_t output_type = use_ext
|
const std::uint8_t output_type = use_ext
|
||||||
? 0xC8 // ext 16
|
? 0xC8 // ext 16
|
||||||
: 0xC5; // bin 16
|
: 0xC5; // bin 16
|
||||||
|
|
||||||
oa->write_character(to_char_type(output_type));
|
oa->write_character(to_char_type(output_type));
|
||||||
write_number(static_cast<std::uint16_t>(N));
|
write_number(static_cast<std::uint16_t>(N));
|
||||||
}
|
}
|
||||||
else if (N <= (std::numeric_limits<std::uint32_t>::max)())
|
else if (N <= (std::numeric_limits<std::uint32_t>::max)())
|
||||||
{
|
{
|
||||||
std::uint8_t output_type = use_ext
|
const std::uint8_t output_type = use_ext
|
||||||
? 0xC9 // ext 32
|
? 0xC9 // ext 32
|
||||||
: 0xC6; // bin 32
|
: 0xC6; // bin 32
|
||||||
|
|
||||||
oa->write_character(to_char_type(output_type));
|
oa->write_character(to_char_type(output_type));
|
||||||
write_number(static_cast<std::uint32_t>(N));
|
write_number(static_cast<std::uint32_t>(N));
|
||||||
@ -1258,8 +1258,8 @@ class binary_writer
|
|||||||
*/
|
*/
|
||||||
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
|
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
|
||||||
{
|
{
|
||||||
std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
|
const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
|
||||||
[](size_t result, const typename BasicJsonType::object_t::value_type & el)
|
[](size_t result, const typename BasicJsonType::object_t::value_type & el)
|
||||||
{
|
{
|
||||||
return result += calc_bson_element_size(el.first, el.second);
|
return result += calc_bson_element_size(el.first, el.second);
|
||||||
});
|
});
|
||||||
|
@ -926,7 +926,7 @@ class serializer
|
|||||||
? (byte & 0x3fu) | (codep << 6u)
|
? (byte & 0x3fu) | (codep << 6u)
|
||||||
: (0xFFu >> type) & (byte);
|
: (0xFFu >> type) & (byte);
|
||||||
|
|
||||||
std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
|
const std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
|
||||||
JSON_ASSERT(index < 400);
|
JSON_ASSERT(index < 400);
|
||||||
state = utf8d[index];
|
state = utf8d[index];
|
||||||
return state;
|
return state;
|
||||||
|
@ -4718,7 +4718,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make sure the top element of the pointer exists
|
// make sure the top element of the pointer exists
|
||||||
json_pointer top_pointer = ptr.top();
|
json_pointer const top_pointer = ptr.top();
|
||||||
if (top_pointer != ptr)
|
if (top_pointer != ptr)
|
||||||
{
|
{
|
||||||
result.at(top_pointer);
|
result.at(top_pointer);
|
||||||
@ -4880,7 +4880,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
json_pointer from_ptr(from_path);
|
json_pointer from_ptr(from_path);
|
||||||
|
|
||||||
// the "from" location must exist - use at()
|
// the "from" location must exist - use at()
|
||||||
basic_json v = result.at(from_ptr);
|
basic_json const v = result.at(from_ptr);
|
||||||
|
|
||||||
// The move operation is functionally identical to a
|
// The move operation is functionally identical to a
|
||||||
// "remove" operation on the "from" location, followed
|
// "remove" operation on the "from" location, followed
|
||||||
@ -4897,7 +4897,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
const json_pointer from_ptr(from_path);
|
const json_pointer from_ptr(from_path);
|
||||||
|
|
||||||
// the "from" location must exist - use at()
|
// the "from" location must exist - use at()
|
||||||
basic_json v = result.at(from_ptr);
|
basic_json const v = result.at(from_ptr);
|
||||||
|
|
||||||
// The copy is functionally identical to an "add"
|
// The copy is functionally identical to an "add"
|
||||||
// operation at the target location using the value
|
// operation at the target location using the value
|
||||||
|
@ -2748,7 +2748,7 @@ JSON_HEDLEY_DIAGNOSTIC_POP
|
|||||||
|
|
||||||
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief macro
|
@brief macro
|
||||||
@ -2761,7 +2761,7 @@ JSON_HEDLEY_DIAGNOSTIC_POP
|
|||||||
|
|
||||||
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
|
||||||
// inspired from https://stackoverflow.com/a/26745591
|
// inspired from https://stackoverflow.com/a/26745591
|
||||||
@ -4414,17 +4414,17 @@ class parse_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
|
static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("parse_error", id_), "parse error",
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
position_string(pos), ": ", exception::diagnostics(context), what_arg);
|
position_string(pos), ": ", exception::diagnostics(context), what_arg);
|
||||||
return {id_, pos.chars_read_total, w.c_str()};
|
return {id_, pos.chars_read_total, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
|
static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("parse_error", id_), "parse error",
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
(byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
|
(byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
|
||||||
": ", exception::diagnostics(context), what_arg);
|
": ", exception::diagnostics(context), what_arg);
|
||||||
return {id_, byte_, w.c_str()};
|
return {id_, byte_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4458,7 +4458,7 @@ class invalid_iterator : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4476,7 +4476,7 @@ class type_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4493,7 +4493,7 @@ class out_of_range : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4510,7 +4510,7 @@ class other_error : public exception
|
|||||||
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
{
|
{
|
||||||
std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
|
const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
|
||||||
return {id_, w.c_str()};
|
return {id_, w.c_str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9408,7 +9408,7 @@ class binary_reader
|
|||||||
{
|
{
|
||||||
std::array<char, 3> cr{{}};
|
std::array<char, 3> cr{{}};
|
||||||
static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
|
static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
|
||||||
std::string cr_str{cr.data()};
|
const std::string cr_str{cr.data()};
|
||||||
return sax->parse_error(element_type_parse_position, cr_str,
|
return sax->parse_error(element_type_parse_position, cr_str,
|
||||||
parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
|
parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
|
||||||
}
|
}
|
||||||
@ -11343,7 +11343,7 @@ class binary_reader
|
|||||||
exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
|
exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
||||||
if (input_format == input_format_t::bjdata && is_ndarray)
|
if (input_format == input_format_t::bjdata && is_ndarray)
|
||||||
{
|
{
|
||||||
if (inside_ndarray)
|
if (inside_ndarray)
|
||||||
@ -11358,7 +11358,7 @@ class binary_reader
|
|||||||
|
|
||||||
if (current == '#')
|
if (current == '#')
|
||||||
{
|
{
|
||||||
bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
|
||||||
if (input_format == input_format_t::bjdata && is_ndarray)
|
if (input_format == input_format_t::bjdata && is_ndarray)
|
||||||
{
|
{
|
||||||
return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
|
return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
|
||||||
@ -13949,7 +13949,7 @@ class json_pointer
|
|||||||
const char* p = s.c_str();
|
const char* p = s.c_str();
|
||||||
char* p_end = nullptr;
|
char* p_end = nullptr;
|
||||||
errno = 0; // strtoull doesn't reset errno
|
errno = 0; // strtoull doesn't reset errno
|
||||||
unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
||||||
if (p == p_end // invalid input or empty string
|
if (p == p_end // invalid input or empty string
|
||||||
|| errno == ERANGE // out of range
|
|| errno == ERANGE // out of range
|
||||||
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
||||||
@ -15614,18 +15614,18 @@ class binary_writer
|
|||||||
}
|
}
|
||||||
else if (N <= (std::numeric_limits<std::uint16_t>::max)())
|
else if (N <= (std::numeric_limits<std::uint16_t>::max)())
|
||||||
{
|
{
|
||||||
std::uint8_t output_type = use_ext
|
const std::uint8_t output_type = use_ext
|
||||||
? 0xC8 // ext 16
|
? 0xC8 // ext 16
|
||||||
: 0xC5; // bin 16
|
: 0xC5; // bin 16
|
||||||
|
|
||||||
oa->write_character(to_char_type(output_type));
|
oa->write_character(to_char_type(output_type));
|
||||||
write_number(static_cast<std::uint16_t>(N));
|
write_number(static_cast<std::uint16_t>(N));
|
||||||
}
|
}
|
||||||
else if (N <= (std::numeric_limits<std::uint32_t>::max)())
|
else if (N <= (std::numeric_limits<std::uint32_t>::max)())
|
||||||
{
|
{
|
||||||
std::uint8_t output_type = use_ext
|
const std::uint8_t output_type = use_ext
|
||||||
? 0xC9 // ext 32
|
? 0xC9 // ext 32
|
||||||
: 0xC6; // bin 32
|
: 0xC6; // bin 32
|
||||||
|
|
||||||
oa->write_character(to_char_type(output_type));
|
oa->write_character(to_char_type(output_type));
|
||||||
write_number(static_cast<std::uint32_t>(N));
|
write_number(static_cast<std::uint32_t>(N));
|
||||||
@ -16211,8 +16211,8 @@ class binary_writer
|
|||||||
*/
|
*/
|
||||||
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
|
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
|
||||||
{
|
{
|
||||||
std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
|
const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
|
||||||
[](size_t result, const typename BasicJsonType::object_t::value_type & el)
|
[](size_t result, const typename BasicJsonType::object_t::value_type & el)
|
||||||
{
|
{
|
||||||
return result += calc_bson_element_size(el.first, el.second);
|
return result += calc_bson_element_size(el.first, el.second);
|
||||||
});
|
});
|
||||||
@ -18848,7 +18848,7 @@ class serializer
|
|||||||
? (byte & 0x3fu) | (codep << 6u)
|
? (byte & 0x3fu) | (codep << 6u)
|
||||||
: (0xFFu >> type) & (byte);
|
: (0xFFu >> type) & (byte);
|
||||||
|
|
||||||
std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
|
const std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
|
||||||
JSON_ASSERT(index < 400);
|
JSON_ASSERT(index < 400);
|
||||||
state = utf8d[index];
|
state = utf8d[index];
|
||||||
return state;
|
return state;
|
||||||
@ -23934,7 +23934,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make sure the top element of the pointer exists
|
// make sure the top element of the pointer exists
|
||||||
json_pointer top_pointer = ptr.top();
|
json_pointer const top_pointer = ptr.top();
|
||||||
if (top_pointer != ptr)
|
if (top_pointer != ptr)
|
||||||
{
|
{
|
||||||
result.at(top_pointer);
|
result.at(top_pointer);
|
||||||
@ -24096,7 +24096,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
json_pointer from_ptr(from_path);
|
json_pointer from_ptr(from_path);
|
||||||
|
|
||||||
// the "from" location must exist - use at()
|
// the "from" location must exist - use at()
|
||||||
basic_json v = result.at(from_ptr);
|
basic_json const v = result.at(from_ptr);
|
||||||
|
|
||||||
// The move operation is functionally identical to a
|
// The move operation is functionally identical to a
|
||||||
// "remove" operation on the "from" location, followed
|
// "remove" operation on the "from" location, followed
|
||||||
@ -24113,7 +24113,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
const json_pointer from_ptr(from_path);
|
const json_pointer from_ptr(from_path);
|
||||||
|
|
||||||
// the "from" location must exist - use at()
|
// the "from" location must exist - use at()
|
||||||
basic_json v = result.at(from_ptr);
|
basic_json const v = result.at(from_ptr);
|
||||||
|
|
||||||
// The copy is functionally identical to an "add"
|
// The copy is functionally identical to an "add"
|
||||||
// operation at the target location using the value
|
// operation at the target location using the value
|
||||||
|
@ -25,7 +25,7 @@ TEST_CASE("custom namespace")
|
|||||||
std::string expected = "nlohmann::basic_json";
|
std::string expected = "nlohmann::basic_json";
|
||||||
|
|
||||||
// fallback for Clang
|
// fallback for Clang
|
||||||
std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
const std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
||||||
|
|
||||||
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ TEST_CASE("default namespace")
|
|||||||
expected += "_" STRINGIZE(NLOHMANN_JSON_VERSION_PATCH) "::basic_json";
|
expected += "_" STRINGIZE(NLOHMANN_JSON_VERSION_PATCH) "::basic_json";
|
||||||
|
|
||||||
// fallback for Clang
|
// fallback for Clang
|
||||||
std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
const std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
||||||
|
|
||||||
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ TEST_CASE("default namespace without version component")
|
|||||||
expected += "::basic_json";
|
expected += "::basic_json";
|
||||||
|
|
||||||
// fallback for Clang
|
// fallback for Clang
|
||||||
std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
const std::string ns{STRINGIZE(NLOHMANN_JSON_NAMESPACE) "::basic_json"};
|
||||||
|
|
||||||
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
CHECK(namespace_name<nlohmann::json>(ns) == expected);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ int main()
|
|||||||
#endif
|
#endif
|
||||||
// copy stdin to byte vector
|
// copy stdin to byte vector
|
||||||
std::vector<uint8_t> vec;
|
std::vector<uint8_t> vec;
|
||||||
char c;
|
char c = 0;
|
||||||
while (std::cin.get(c))
|
while (std::cin.get(c))
|
||||||
{
|
{
|
||||||
vec.push_back(static_cast<uint8_t>(c));
|
vec.push_back(static_cast<uint8_t>(c));
|
||||||
|
@ -37,24 +37,24 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
std::vector<uint8_t> vec1(data, data + size);
|
std::vector<uint8_t> const vec1(data, data + size);
|
||||||
json j1 = json::from_bjdata(vec1);
|
json const j1 = json::from_bjdata(vec1);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2.1: round trip without adding size annotations to container types
|
// step 2.1: round trip without adding size annotations to container types
|
||||||
std::vector<uint8_t> vec2 = json::to_bjdata(j1, false, false);
|
std::vector<uint8_t> const vec2 = json::to_bjdata(j1, false, false);
|
||||||
|
|
||||||
// step 2.2: round trip with adding size annotations but without adding type annonations to container types
|
// step 2.2: round trip with adding size annotations but without adding type annonations to container types
|
||||||
std::vector<uint8_t> vec3 = json::to_bjdata(j1, true, false);
|
std::vector<uint8_t> const vec3 = json::to_bjdata(j1, true, false);
|
||||||
|
|
||||||
// step 2.3: round trip with adding size as well as type annotations to container types
|
// step 2.3: round trip with adding size as well as type annotations to container types
|
||||||
std::vector<uint8_t> vec4 = json::to_bjdata(j1, true, true);
|
std::vector<uint8_t> const vec4 = json::to_bjdata(j1, true, true);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_bjdata(vec2);
|
json const j2 = json::from_bjdata(vec2);
|
||||||
json j3 = json::from_bjdata(vec3);
|
json const j3 = json::from_bjdata(vec3);
|
||||||
json j4 = json::from_bjdata(vec4);
|
json const j4 = json::from_bjdata(vec4);
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(json::to_bjdata(j2, false, false) == vec2);
|
assert(json::to_bjdata(j2, false, false) == vec2);
|
||||||
|
@ -31,8 +31,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
std::vector<uint8_t> vec1(data, data + size);
|
std::vector<uint8_t> const vec1(data, data + size);
|
||||||
json j1 = json::from_bson(vec1);
|
json const j1 = json::from_bson(vec1);
|
||||||
|
|
||||||
if (j1.is_discarded())
|
if (j1.is_discarded())
|
||||||
{
|
{
|
||||||
@ -42,10 +42,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2: round trip
|
// step 2: round trip
|
||||||
std::vector<uint8_t> vec2 = json::to_bson(j1);
|
std::vector<uint8_t> const vec2 = json::to_bson(j1);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_bson(vec2);
|
json const j2 = json::from_bson(vec2);
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(json::to_bson(j2) == vec2);
|
assert(json::to_bson(j2) == vec2);
|
||||||
|
@ -31,16 +31,16 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
std::vector<uint8_t> vec1(data, data + size);
|
std::vector<uint8_t> const vec1(data, data + size);
|
||||||
json j1 = json::from_cbor(vec1);
|
json const j1 = json::from_cbor(vec1);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2: round trip
|
// step 2: round trip
|
||||||
std::vector<uint8_t> vec2 = json::to_cbor(j1);
|
std::vector<uint8_t> const vec2 = json::to_cbor(j1);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_cbor(vec2);
|
json const j2 = json::from_cbor(vec2);
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(json::to_cbor(j2) == vec2);
|
assert(json::to_cbor(j2) == vec2);
|
||||||
|
@ -32,20 +32,20 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
json j1 = json::parse(data, data + size);
|
json const j1 = json::parse(data, data + size);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2: round trip
|
// step 2: round trip
|
||||||
|
|
||||||
// first serialization
|
// first serialization
|
||||||
std::string s1 = j1.dump();
|
std::string const s1 = j1.dump();
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::parse(s1);
|
json const j2 = json::parse(s1);
|
||||||
|
|
||||||
// second serialization
|
// second serialization
|
||||||
std::string s2 = j2.dump();
|
std::string const s2 = j2.dump();
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(s1 == s2);
|
assert(s1 == s2);
|
||||||
|
@ -31,16 +31,16 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
std::vector<uint8_t> vec1(data, data + size);
|
std::vector<uint8_t> const vec1(data, data + size);
|
||||||
json j1 = json::from_msgpack(vec1);
|
json const j1 = json::from_msgpack(vec1);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2: round trip
|
// step 2: round trip
|
||||||
std::vector<uint8_t> vec2 = json::to_msgpack(j1);
|
std::vector<uint8_t> const vec2 = json::to_msgpack(j1);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_msgpack(vec2);
|
json const j2 = json::from_msgpack(vec2);
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(json::to_msgpack(j2) == vec2);
|
assert(json::to_msgpack(j2) == vec2);
|
||||||
|
@ -37,24 +37,24 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 1: parse input
|
// step 1: parse input
|
||||||
std::vector<uint8_t> vec1(data, data + size);
|
std::vector<uint8_t> const vec1(data, data + size);
|
||||||
json j1 = json::from_ubjson(vec1);
|
json const j1 = json::from_ubjson(vec1);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// step 2.1: round trip without adding size annotations to container types
|
// step 2.1: round trip without adding size annotations to container types
|
||||||
std::vector<uint8_t> vec2 = json::to_ubjson(j1, false, false);
|
std::vector<uint8_t> const vec2 = json::to_ubjson(j1, false, false);
|
||||||
|
|
||||||
// step 2.2: round trip with adding size annotations but without adding type annonations to container types
|
// step 2.2: round trip with adding size annotations but without adding type annonations to container types
|
||||||
std::vector<uint8_t> vec3 = json::to_ubjson(j1, true, false);
|
std::vector<uint8_t> const vec3 = json::to_ubjson(j1, true, false);
|
||||||
|
|
||||||
// step 2.3: round trip with adding size as well as type annotations to container types
|
// step 2.3: round trip with adding size as well as type annotations to container types
|
||||||
std::vector<uint8_t> vec4 = json::to_ubjson(j1, true, true);
|
std::vector<uint8_t> const vec4 = json::to_ubjson(j1, true, true);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_ubjson(vec2);
|
json const j2 = json::from_ubjson(vec2);
|
||||||
json j3 = json::from_ubjson(vec3);
|
json const j3 = json::from_ubjson(vec3);
|
||||||
json j4 = json::from_ubjson(vec4);
|
json const j4 = json::from_ubjson(vec4);
|
||||||
|
|
||||||
// serializations must match
|
// serializations must match
|
||||||
assert(json::to_ubjson(j2, false, false) == vec2);
|
assert(json::to_ubjson(j2, false, false) == vec2);
|
||||||
|
@ -18,7 +18,7 @@ namespace utils
|
|||||||
|
|
||||||
inline bool check_testsuite_downloaded()
|
inline bool check_testsuite_downloaded()
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> file(std::fopen(TEST_DATA_DIRECTORY "/README.md", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> file(std::fopen(TEST_DATA_DIRECTORY "/README.md", "r"), &std::fclose);
|
||||||
return file != nullptr;
|
return file != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,10 +33,10 @@ TEST_CASE_TEMPLATE_DEFINE("value_in_range_of trait", T, value_in_range_of_test)
|
|||||||
constexpr bool min_in_range = T::min_in_range;
|
constexpr bool min_in_range = T::min_in_range;
|
||||||
constexpr bool max_in_range = T::max_in_range;
|
constexpr bool max_in_range = T::max_in_range;
|
||||||
|
|
||||||
type val_min = std::numeric_limits<type>::min();
|
type const val_min = std::numeric_limits<type>::min();
|
||||||
type val_min2 = val_min + 1;
|
type const val_min2 = val_min + 1;
|
||||||
type val_max = std::numeric_limits<type>::max();
|
type const val_max = std::numeric_limits<type>::max();
|
||||||
type val_max2 = val_max - 1;
|
type const val_max2 = val_max - 1;
|
||||||
|
|
||||||
REQUIRE(CHAR_BIT == 8);
|
REQUIRE(CHAR_BIT == 8);
|
||||||
|
|
||||||
@ -108,8 +108,8 @@ TEST_CASE("BJData")
|
|||||||
{
|
{
|
||||||
SECTION("optimized array: negative size")
|
SECTION("optimized array: negative size")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
|
std::vector<uint8_t> const vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
|
||||||
std::vector<uint8_t> vMX = {'[', '$', 'U', '#', '[', 'M', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 'U', 0x01, ']'};
|
std::vector<uint8_t> const vMX = {'[', '$', 'U', '#', '[', 'M', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 'U', 0x01, ']'};
|
||||||
|
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vM), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vM), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
|
||||||
@ -121,8 +121,8 @@ TEST_CASE("BJData")
|
|||||||
|
|
||||||
SECTION("optimized array: integer value overflow")
|
SECTION("optimized array: integer value overflow")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vL = {'[', '#', 'L', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F};
|
std::vector<uint8_t> const vL = {'[', '#', 'L', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F};
|
||||||
std::vector<uint8_t> vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
|
std::vector<uint8_t> const vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
|
||||||
|
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vL), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vL), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
|
||||||
|
@ -159,7 +159,7 @@ TEST_CASE("controlled bad_alloc")
|
|||||||
SECTION("json_value(const string_t&)")
|
SECTION("json_value(const string_t&)")
|
||||||
{
|
{
|
||||||
next_construct_fails = false;
|
next_construct_fails = false;
|
||||||
my_json::string_t v("foo");
|
const my_json::string_t v("foo");
|
||||||
CHECK_NOTHROW(my_allocator_clean_up(my_json::json_value(v).string));
|
CHECK_NOTHROW(my_allocator_clean_up(my_json::json_value(v).string));
|
||||||
next_construct_fails = true;
|
next_construct_fails = true;
|
||||||
CHECK_THROWS_AS(my_json::json_value(v), std::bad_alloc&);
|
CHECK_THROWS_AS(my_json::json_value(v), std::bad_alloc&);
|
||||||
@ -172,7 +172,7 @@ TEST_CASE("controlled bad_alloc")
|
|||||||
SECTION("basic_json(const CompatibleObjectType&)")
|
SECTION("basic_json(const CompatibleObjectType&)")
|
||||||
{
|
{
|
||||||
next_construct_fails = false;
|
next_construct_fails = false;
|
||||||
std::map<std::string, std::string> v {{"foo", "bar"}};
|
const std::map<std::string, std::string> v {{"foo", "bar"}};
|
||||||
CHECK_NOTHROW(my_json(v));
|
CHECK_NOTHROW(my_json(v));
|
||||||
next_construct_fails = true;
|
next_construct_fails = true;
|
||||||
CHECK_THROWS_AS(my_json(v), std::bad_alloc&);
|
CHECK_THROWS_AS(my_json(v), std::bad_alloc&);
|
||||||
@ -182,7 +182,7 @@ TEST_CASE("controlled bad_alloc")
|
|||||||
SECTION("basic_json(const CompatibleArrayType&)")
|
SECTION("basic_json(const CompatibleArrayType&)")
|
||||||
{
|
{
|
||||||
next_construct_fails = false;
|
next_construct_fails = false;
|
||||||
std::vector<std::string> v {"foo", "bar", "baz"};
|
const std::vector<std::string> v {"foo", "bar", "baz"};
|
||||||
CHECK_NOTHROW(my_json(v));
|
CHECK_NOTHROW(my_json(v));
|
||||||
next_construct_fails = true;
|
next_construct_fails = true;
|
||||||
CHECK_THROWS_AS(my_json(v), std::bad_alloc&);
|
CHECK_THROWS_AS(my_json(v), std::bad_alloc&);
|
||||||
@ -201,7 +201,7 @@ TEST_CASE("controlled bad_alloc")
|
|||||||
SECTION("basic_json(const typename string_t::value_type*)")
|
SECTION("basic_json(const typename string_t::value_type*)")
|
||||||
{
|
{
|
||||||
next_construct_fails = false;
|
next_construct_fails = false;
|
||||||
std::string s("foo");
|
const std::string s("foo");
|
||||||
CHECK_NOTHROW(my_json(s));
|
CHECK_NOTHROW(my_json(s));
|
||||||
next_construct_fails = true;
|
next_construct_fails = true;
|
||||||
CHECK_THROWS_AS(my_json(s), std::bad_alloc&);
|
CHECK_THROWS_AS(my_json(s), std::bad_alloc&);
|
||||||
|
@ -148,7 +148,7 @@ class alt_string
|
|||||||
|
|
||||||
alt_string substr(std::size_t pos = 0, std::size_t count = npos) const
|
alt_string substr(std::size_t pos = 0, std::size_t count = npos) const
|
||||||
{
|
{
|
||||||
std::string s = str_impl.substr(pos, count);
|
const std::string s = str_impl.substr(pos, count);
|
||||||
return {s.data(), s.size()};
|
return {s.data(), s.size()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ TEST_CASE("JSON_ASSERT(x)")
|
|||||||
assert_counter = 0;
|
assert_counter = 0;
|
||||||
CHECK(assert_counter == 0);
|
CHECK(assert_counter == 0);
|
||||||
|
|
||||||
json::iterator it;
|
const json::iterator it{};
|
||||||
json j;
|
json j;
|
||||||
|
|
||||||
// in case assertions do not abort execution, an exception is thrown
|
// in case assertions do not abort execution, an exception is thrown
|
||||||
|
@ -19,7 +19,7 @@ TEST_CASE("Binary Formats" * doctest::skip())
|
|||||||
SECTION("canada.json")
|
SECTION("canada.json")
|
||||||
{
|
{
|
||||||
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json";
|
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json";
|
||||||
json j = json::parse(std::ifstream(filename));
|
const json j = json::parse(std::ifstream(filename));
|
||||||
|
|
||||||
const auto json_size = j.dump().size();
|
const auto json_size = j.dump().size();
|
||||||
const auto bjdata_1_size = json::to_bjdata(j).size();
|
const auto bjdata_1_size = json::to_bjdata(j).size();
|
||||||
@ -58,7 +58,7 @@ TEST_CASE("Binary Formats" * doctest::skip())
|
|||||||
SECTION("twitter.json")
|
SECTION("twitter.json")
|
||||||
{
|
{
|
||||||
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json";
|
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json";
|
||||||
json j = json::parse(std::ifstream(filename));
|
const json j = json::parse(std::ifstream(filename));
|
||||||
|
|
||||||
const auto json_size = j.dump().size();
|
const auto json_size = j.dump().size();
|
||||||
const auto bjdata_1_size = json::to_bjdata(j).size();
|
const auto bjdata_1_size = json::to_bjdata(j).size();
|
||||||
@ -97,7 +97,7 @@ TEST_CASE("Binary Formats" * doctest::skip())
|
|||||||
SECTION("citm_catalog.json")
|
SECTION("citm_catalog.json")
|
||||||
{
|
{
|
||||||
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json";
|
const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json";
|
||||||
json j = json::parse(std::ifstream(filename));
|
const json j = json::parse(std::ifstream(filename));
|
||||||
|
|
||||||
const auto json_size = j.dump().size();
|
const auto json_size = j.dump().size();
|
||||||
const auto bjdata_1_size = json::to_bjdata(j).size();
|
const auto bjdata_1_size = json::to_bjdata(j).size();
|
||||||
@ -175,7 +175,7 @@ TEST_CASE("Binary Formats" * doctest::skip())
|
|||||||
SECTION("sample.json")
|
SECTION("sample.json")
|
||||||
{
|
{
|
||||||
const auto* filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
|
const auto* filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
|
||||||
json j = json::parse(std::ifstream(filename));
|
const json j = json::parse(std::ifstream(filename));
|
||||||
|
|
||||||
const auto json_size = j.dump().size();
|
const auto json_size = j.dump().size();
|
||||||
const auto bjdata_1_size = json::to_bjdata(j).size();
|
const auto bjdata_1_size = json::to_bjdata(j).size();
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ TEST_CASE("BSON")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json const j = nullptr;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is null", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is null", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,45 +30,45 @@ TEST_CASE("BSON")
|
|||||||
{
|
{
|
||||||
SECTION("true")
|
SECTION("true")
|
||||||
{
|
{
|
||||||
json j = true;
|
json const j = true;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is boolean", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is boolean", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("false")
|
SECTION("false")
|
||||||
{
|
{
|
||||||
json j = false;
|
json const j = false;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is boolean", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is boolean", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j = 42;
|
json const j = 42;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is number", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is number", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("float")
|
SECTION("float")
|
||||||
{
|
{
|
||||||
json j = 4.2;
|
json const j = 4.2;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is number", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is number", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "not supported";
|
json const j = "not supported";
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is string", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is string", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
json const j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is array", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is array", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("keys containing code-point U+0000 cannot be serialized to BSON")
|
SECTION("keys containing code-point U+0000 cannot be serialized to BSON")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ std::string("en\0try", 6), true }
|
{ std::string("en\0try", 6), true }
|
||||||
};
|
};
|
||||||
@ -82,7 +82,7 @@ TEST_CASE("BSON")
|
|||||||
SECTION("string length must be at least 1")
|
SECTION("string length must be at least 1")
|
||||||
{
|
{
|
||||||
// from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11175
|
// from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11175
|
||||||
std::vector<std::uint8_t> v =
|
std::vector<std::uint8_t> const v =
|
||||||
{
|
{
|
||||||
0x20, 0x20, 0x20, 0x20,
|
0x20, 0x20, 0x20, 0x20,
|
||||||
0x02,
|
0x02,
|
||||||
@ -97,8 +97,8 @@ TEST_CASE("BSON")
|
|||||||
{
|
{
|
||||||
SECTION("empty object")
|
SECTION("empty object")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json const j = json::object();
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x05, 0x00, 0x00, 0x00, // size (little endian)
|
0x05, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
// no entries
|
// no entries
|
||||||
@ -115,12 +115,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with bool")
|
SECTION("non-empty object with bool")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", true }
|
{ "entry", true }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x08, // entry: boolean
|
0x08, // entry: boolean
|
||||||
@ -139,12 +139,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with bool")
|
SECTION("non-empty object with bool")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", false }
|
{ "entry", false }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x08, // entry: boolean
|
0x08, // entry: boolean
|
||||||
@ -163,12 +163,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with double")
|
SECTION("non-empty object with double")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", 4.2 }
|
{ "entry", 4.2 }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x01, /// entry: double
|
0x01, /// entry: double
|
||||||
@ -187,12 +187,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with string")
|
SECTION("non-empty object with string")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", "bsonstr" }
|
{ "entry", "bsonstr" }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x18, 0x00, 0x00, 0x00, // size (little endian)
|
0x18, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x02, /// entry: string (UTF-8)
|
0x02, /// entry: string (UTF-8)
|
||||||
@ -211,12 +211,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with null member")
|
SECTION("non-empty object with null member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", nullptr }
|
{ "entry", nullptr }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x0C, 0x00, 0x00, 0x00, // size (little endian)
|
0x0C, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x0A, /// entry: null
|
0x0A, /// entry: null
|
||||||
@ -234,12 +234,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with integer (32-bit) member")
|
SECTION("non-empty object with integer (32-bit) member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::int32_t{0x12345678} }
|
{ "entry", std::int32_t{0x12345678} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x10, /// entry: int32
|
0x10, /// entry: int32
|
||||||
@ -258,12 +258,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with integer (64-bit) member")
|
SECTION("non-empty object with integer (64-bit) member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::int64_t{0x1234567804030201} }
|
{ "entry", std::int64_t{0x1234567804030201} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x12, /// entry: int64
|
0x12, /// entry: int64
|
||||||
@ -282,12 +282,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with negative integer (32-bit) member")
|
SECTION("non-empty object with negative integer (32-bit) member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::int32_t{-1} }
|
{ "entry", std::int32_t{-1} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x10, /// entry: int32
|
0x10, /// entry: int32
|
||||||
@ -306,12 +306,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with negative integer (64-bit) member")
|
SECTION("non-empty object with negative integer (64-bit) member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::int64_t{-1} }
|
{ "entry", std::int64_t{-1} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x10, /// entry: int32
|
0x10, /// entry: int32
|
||||||
@ -331,12 +331,12 @@ TEST_CASE("BSON")
|
|||||||
SECTION("non-empty object with unsigned integer (64-bit) member")
|
SECTION("non-empty object with unsigned integer (64-bit) member")
|
||||||
{
|
{
|
||||||
// directly encoding uint64 is not supported in bson (only for timestamp values)
|
// directly encoding uint64 is not supported in bson (only for timestamp values)
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::uint64_t{0x1234567804030201} }
|
{ "entry", std::uint64_t{0x1234567804030201} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
0x14, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x12, /// entry: int64
|
0x12, /// entry: int64
|
||||||
@ -355,12 +355,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with small unsigned integer member")
|
SECTION("non-empty object with small unsigned integer member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", std::uint64_t{0x42} }
|
{ "entry", std::uint64_t{0x42} }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
0x10, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x10, /// entry: int32
|
0x10, /// entry: int32
|
||||||
@ -379,12 +379,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with object member")
|
SECTION("non-empty object with object member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::object() }
|
{ "entry", json::object() }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x11, 0x00, 0x00, 0x00, // size (little endian)
|
0x11, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x03, /// entry: embedded document
|
0x03, /// entry: embedded document
|
||||||
@ -407,12 +407,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with array member")
|
SECTION("non-empty object with array member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::array() }
|
{ "entry", json::array() }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x11, 0x00, 0x00, 0x00, // size (little endian)
|
0x11, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x04, /// entry: embedded document
|
0x04, /// entry: embedded document
|
||||||
@ -435,12 +435,12 @@ TEST_CASE("BSON")
|
|||||||
|
|
||||||
SECTION("non-empty object with non-empty array member")
|
SECTION("non-empty object with non-empty array member")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::array({1, 2, 3, 4, 5, 6, 7, 8}) }
|
{ "entry", json::array({1, 2, 3, 4, 5, 6, 7, 8}) }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x49, 0x00, 0x00, 0x00, // size (little endian)
|
0x49, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x04, /// entry: embedded document
|
0x04, /// entry: embedded document
|
||||||
@ -472,12 +472,12 @@ TEST_CASE("BSON")
|
|||||||
{
|
{
|
||||||
const size_t N = 10;
|
const size_t N = 10;
|
||||||
const auto s = std::vector<std::uint8_t>(N, 'x');
|
const auto s = std::vector<std::uint8_t>(N, 'x');
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::binary(s, 0) }
|
{ "entry", json::binary(s, 0) }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x1B, 0x00, 0x00, 0x00, // size (little endian)
|
0x1B, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x05, // entry: binary
|
0x05, // entry: binary
|
||||||
@ -502,12 +502,12 @@ TEST_CASE("BSON")
|
|||||||
{
|
{
|
||||||
// an MD5 hash
|
// an MD5 hash
|
||||||
const std::vector<std::uint8_t> md5hash = {0xd7, 0x7e, 0x27, 0x54, 0xbe, 0x12, 0x37, 0xfe, 0xd6, 0x0c, 0x33, 0x98, 0x30, 0x3b, 0x8d, 0xc4};
|
const std::vector<std::uint8_t> md5hash = {0xd7, 0x7e, 0x27, 0x54, 0xbe, 0x12, 0x37, 0xfe, 0xd6, 0x0c, 0x33, 0x98, 0x30, 0x3b, 0x8d, 0xc4};
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::binary(md5hash, 5) }
|
{ "entry", json::binary(md5hash, 5) }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x21, 0x00, 0x00, 0x00, // size (little endian)
|
0x21, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x05, // entry: binary
|
0x05, // entry: binary
|
||||||
@ -531,7 +531,7 @@ TEST_CASE("BSON")
|
|||||||
SECTION("Some more complex document")
|
SECTION("Some more complex document")
|
||||||
{
|
{
|
||||||
// directly encoding uint64 is not supported in bson (only for timestamp values)
|
// directly encoding uint64 is not supported in bson (only for timestamp values)
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{"double", 42.5},
|
{"double", 42.5},
|
||||||
{"entry", 4.2},
|
{"entry", 4.2},
|
||||||
@ -539,7 +539,7 @@ TEST_CASE("BSON")
|
|||||||
{"object", {{ "string", "value" }}}
|
{"object", {{ "string", "value" }}}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> expected =
|
std::vector<std::uint8_t> const expected =
|
||||||
{
|
{
|
||||||
/*size */ 0x4f, 0x00, 0x00, 0x00,
|
/*size */ 0x4f, 0x00, 0x00, 0x00,
|
||||||
/*entry*/ 0x01, 'd', 'o', 'u', 'b', 'l', 'e', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x40,
|
/*entry*/ 0x01, 'd', 'o', 'u', 'b', 'l', 'e', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x40,
|
||||||
@ -597,7 +597,7 @@ TEST_CASE("BSON input/output_adapters")
|
|||||||
{"object", {{ "string", "value" }}}
|
{"object", {{ "string", "value" }}}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::uint8_t> bson_representation =
|
std::vector<std::uint8_t> const bson_representation =
|
||||||
{
|
{
|
||||||
/*size */ 0x4f, 0x00, 0x00, 0x00,
|
/*size */ 0x4f, 0x00, 0x00, 0x00,
|
||||||
/*entry*/ 0x01, 'd', 'o', 'u', 'b', 'l', 'e', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x40,
|
/*entry*/ 0x01, 'd', 'o', 'u', 'b', 'l', 'e', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x40,
|
||||||
@ -726,7 +726,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
{
|
{
|
||||||
SECTION("Incomplete BSON Input 1")
|
SECTION("Incomplete BSON Input 1")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> incomplete_bson =
|
std::vector<std::uint8_t> const incomplete_bson =
|
||||||
{
|
{
|
||||||
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x08, // entry: boolean
|
0x08, // entry: boolean
|
||||||
@ -744,7 +744,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
|
|
||||||
SECTION("Incomplete BSON Input 2")
|
SECTION("Incomplete BSON Input 2")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> incomplete_bson =
|
std::vector<std::uint8_t> const incomplete_bson =
|
||||||
{
|
{
|
||||||
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
0x0D, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x08, // entry: boolean, unexpected EOF
|
0x08, // entry: boolean, unexpected EOF
|
||||||
@ -760,7 +760,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
|
|
||||||
SECTION("Incomplete BSON Input 3")
|
SECTION("Incomplete BSON Input 3")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> incomplete_bson =
|
std::vector<std::uint8_t> const incomplete_bson =
|
||||||
{
|
{
|
||||||
0x41, 0x00, 0x00, 0x00, // size (little endian)
|
0x41, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x04, /// entry: embedded document
|
0x04, /// entry: embedded document
|
||||||
@ -782,7 +782,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
|
|
||||||
SECTION("Incomplete BSON Input 4")
|
SECTION("Incomplete BSON Input 4")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> incomplete_bson =
|
std::vector<std::uint8_t> const incomplete_bson =
|
||||||
{
|
{
|
||||||
0x0D, 0x00, // size (incomplete), unexpected EOF
|
0x0D, 0x00, // size (incomplete), unexpected EOF
|
||||||
};
|
};
|
||||||
@ -799,7 +799,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
{
|
{
|
||||||
SECTION("key")
|
SECTION("key")
|
||||||
{
|
{
|
||||||
json j = {{"key", "value"}};
|
json const j = {{"key", "value"}};
|
||||||
auto bson_vec = json::to_bson(j);
|
auto bson_vec = json::to_bson(j);
|
||||||
SaxCountdown scp(2);
|
SaxCountdown scp(2);
|
||||||
CHECK(!json::sax_parse(bson_vec, &scp, json::input_format_t::bson));
|
CHECK(!json::sax_parse(bson_vec, &scp, json::input_format_t::bson));
|
||||||
@ -807,7 +807,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", json::array() }
|
{ "entry", json::array() }
|
||||||
};
|
};
|
||||||
@ -821,7 +821,7 @@ TEST_CASE("Incomplete BSON Input")
|
|||||||
TEST_CASE("Negative size of binary value")
|
TEST_CASE("Negative size of binary value")
|
||||||
{
|
{
|
||||||
// invalid BSON: the size of the binary value is -1
|
// invalid BSON: the size of the binary value is -1
|
||||||
std::vector<std::uint8_t> input =
|
std::vector<std::uint8_t> const input =
|
||||||
{
|
{
|
||||||
0x21, 0x00, 0x00, 0x00, // size (little endian)
|
0x21, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0x05, // entry: binary
|
0x05, // entry: binary
|
||||||
@ -839,7 +839,7 @@ TEST_CASE("Negative size of binary value")
|
|||||||
|
|
||||||
TEST_CASE("Unsupported BSON input")
|
TEST_CASE("Unsupported BSON input")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> bson =
|
std::vector<std::uint8_t> const bson =
|
||||||
{
|
{
|
||||||
0x0C, 0x00, 0x00, 0x00, // size (little endian)
|
0x0C, 0x00, 0x00, 0x00, // size (little endian)
|
||||||
0xFF, // entry type: Min key (not supported yet)
|
0xFF, // entry type: Min key (not supported yet)
|
||||||
@ -863,7 +863,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
{
|
{
|
||||||
SECTION("std::int64_t: INT64_MIN .. INT32_MIN-1")
|
SECTION("std::int64_t: INT64_MIN .. INT32_MIN-1")
|
||||||
{
|
{
|
||||||
std::vector<int64_t> numbers
|
std::vector<int64_t> const numbers
|
||||||
{
|
{
|
||||||
INT64_MIN,
|
INT64_MIN,
|
||||||
-1000000000000000000LL,
|
-1000000000000000000LL,
|
||||||
@ -878,19 +878,19 @@ TEST_CASE("BSON numerical data")
|
|||||||
static_cast<std::int64_t>(INT32_MIN) - 1,
|
static_cast<std::int64_t>(INT32_MIN) - 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
CHECK(j.at("entry").is_number_integer());
|
CHECK(j.at("entry").is_number_integer());
|
||||||
|
|
||||||
std::uint64_t iu = *reinterpret_cast<std::uint64_t*>(&i);
|
std::uint64_t const iu = *reinterpret_cast<const std::uint64_t*>(&i);
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x12u, /// entry: int64
|
0x12u, /// entry: int64
|
||||||
@ -921,7 +921,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
|
|
||||||
SECTION("signed std::int32_t: INT32_MIN .. INT32_MAX")
|
SECTION("signed std::int32_t: INT32_MIN .. INT32_MAX")
|
||||||
{
|
{
|
||||||
std::vector<int32_t> numbers
|
std::vector<int32_t> const numbers
|
||||||
{
|
{
|
||||||
INT32_MIN,
|
INT32_MIN,
|
||||||
-2147483647L,
|
-2147483647L,
|
||||||
@ -950,19 +950,19 @@ TEST_CASE("BSON numerical data")
|
|||||||
INT32_MAX
|
INT32_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
CHECK(j.at("entry").is_number_integer());
|
CHECK(j.at("entry").is_number_integer());
|
||||||
|
|
||||||
std::uint32_t iu = *reinterpret_cast<std::uint32_t*>(&i);
|
std::uint32_t const iu = *reinterpret_cast<const std::uint32_t*>(&i);
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x10u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x10u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x10u, /// entry: int32
|
0x10u, /// entry: int32
|
||||||
@ -988,7 +988,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
|
|
||||||
SECTION("signed std::int64_t: INT32_MAX+1 .. INT64_MAX")
|
SECTION("signed std::int64_t: INT32_MAX+1 .. INT64_MAX")
|
||||||
{
|
{
|
||||||
std::vector<int64_t> numbers
|
std::vector<int64_t> const numbers
|
||||||
{
|
{
|
||||||
INT64_MAX,
|
INT64_MAX,
|
||||||
1000000000000000000LL,
|
1000000000000000000LL,
|
||||||
@ -1003,19 +1003,19 @@ TEST_CASE("BSON numerical data")
|
|||||||
static_cast<std::int64_t>(INT32_MAX) + 1,
|
static_cast<std::int64_t>(INT32_MAX) + 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
CHECK(j.at("entry").is_number_integer());
|
CHECK(j.at("entry").is_number_integer());
|
||||||
|
|
||||||
std::uint64_t iu = *reinterpret_cast<std::uint64_t*>(&i);
|
std::uint64_t const iu = *reinterpret_cast<const std::uint64_t*>(&i);
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x12u, /// entry: int64
|
0x12u, /// entry: int64
|
||||||
@ -1048,7 +1048,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
{
|
{
|
||||||
SECTION("unsigned std::uint64_t: 0 .. INT32_MAX")
|
SECTION("unsigned std::uint64_t: 0 .. INT32_MAX")
|
||||||
{
|
{
|
||||||
std::vector<std::uint64_t> numbers
|
std::vector<std::uint64_t> const numbers
|
||||||
{
|
{
|
||||||
0ULL,
|
0ULL,
|
||||||
1ULL,
|
1ULL,
|
||||||
@ -1065,18 +1065,18 @@ TEST_CASE("BSON numerical data")
|
|||||||
static_cast<std::uint64_t>(INT32_MAX)
|
static_cast<std::uint64_t>(INT32_MAX)
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
|
|
||||||
auto iu = i;
|
auto iu = i;
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x10u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x10u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x10u, /// entry: int32
|
0x10u, /// entry: int32
|
||||||
@ -1103,7 +1103,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
|
|
||||||
SECTION("unsigned std::uint64_t: INT32_MAX+1 .. INT64_MAX")
|
SECTION("unsigned std::uint64_t: INT32_MAX+1 .. INT64_MAX")
|
||||||
{
|
{
|
||||||
std::vector<std::uint64_t> numbers
|
std::vector<std::uint64_t> const numbers
|
||||||
{
|
{
|
||||||
static_cast<std::uint64_t>(INT32_MAX) + 1,
|
static_cast<std::uint64_t>(INT32_MAX) + 1,
|
||||||
4000000000ULL,
|
4000000000ULL,
|
||||||
@ -1120,18 +1120,18 @@ TEST_CASE("BSON numerical data")
|
|||||||
static_cast<std::uint64_t>(INT64_MAX),
|
static_cast<std::uint64_t>(INT64_MAX),
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
|
|
||||||
auto iu = i;
|
auto iu = i;
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x12u, /// entry: int64
|
0x12u, /// entry: int64
|
||||||
@ -1161,7 +1161,7 @@ TEST_CASE("BSON numerical data")
|
|||||||
|
|
||||||
SECTION("unsigned std::uint64_t: INT64_MAX+1 .. UINT64_MAX")
|
SECTION("unsigned std::uint64_t: INT64_MAX+1 .. UINT64_MAX")
|
||||||
{
|
{
|
||||||
std::vector<std::uint64_t> numbers
|
std::vector<std::uint64_t> const numbers
|
||||||
{
|
{
|
||||||
static_cast<std::uint64_t>(INT64_MAX) + 1ULL,
|
static_cast<std::uint64_t>(INT64_MAX) + 1ULL,
|
||||||
10000000000000000000ULL,
|
10000000000000000000ULL,
|
||||||
@ -1170,18 +1170,18 @@ TEST_CASE("BSON numerical data")
|
|||||||
UINT64_MAX,
|
UINT64_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto i : numbers)
|
for (const auto i : numbers)
|
||||||
{
|
{
|
||||||
|
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
json j =
|
json const j =
|
||||||
{
|
{
|
||||||
{ "entry", i }
|
{ "entry", i }
|
||||||
};
|
};
|
||||||
|
|
||||||
auto iu = i;
|
auto iu = i;
|
||||||
std::vector<std::uint8_t> expected_bson =
|
std::vector<std::uint8_t> const expected_bson =
|
||||||
{
|
{
|
||||||
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
0x14u, 0x00u, 0x00u, 0x00u, // size (little endian)
|
||||||
0x12u, /// entry: int64
|
0x12u, /// entry: int64
|
||||||
@ -1214,7 +1214,7 @@ TEST_CASE("BSON roundtrips" * doctest::skip())
|
|||||||
{
|
{
|
||||||
SECTION("reference files")
|
SECTION("reference files")
|
||||||
{
|
{
|
||||||
for (std::string filename :
|
for (const std::string filename :
|
||||||
{
|
{
|
||||||
TEST_DATA_DIRECTORY "/json.org/1.json",
|
TEST_DATA_DIRECTORY "/json.org/1.json",
|
||||||
TEST_DATA_DIRECTORY "/json.org/2.json",
|
TEST_DATA_DIRECTORY "/json.org/2.json",
|
||||||
@ -1274,7 +1274,7 @@ TEST_CASE("BSON roundtrips" * doctest::skip())
|
|||||||
INFO_WITH_TEMP(filename + ": output to output adapters");
|
INFO_WITH_TEMP(filename + ": output to output adapters");
|
||||||
// parse JSON file
|
// parse JSON file
|
||||||
std::ifstream f_json(filename);
|
std::ifstream f_json(filename);
|
||||||
json j1 = json::parse(f_json);
|
json const j1 = json::parse(f_json);
|
||||||
|
|
||||||
// parse BSON file
|
// parse BSON file
|
||||||
auto packed = utils::read_binary_file(filename + ".bson");
|
auto packed = utils::read_binary_file(filename + ".bson");
|
||||||
|
@ -45,7 +45,7 @@ TEST_CASE("byte_container_with_subtype")
|
|||||||
|
|
||||||
SECTION("comparisons")
|
SECTION("comparisons")
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> bytes = {{0xCA, 0xFE, 0xBA, 0xBE}};
|
std::vector<std::uint8_t> const bytes = {{0xCA, 0xFE, 0xBA, 0xBE}};
|
||||||
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container1;
|
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container1;
|
||||||
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container2({}, 42);
|
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container2({}, 42);
|
||||||
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container3(bytes);
|
nlohmann::byte_container_with_subtype<std::vector<std::uint8_t>> container3(bytes);
|
||||||
|
@ -18,8 +18,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json j = true; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = true;
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -36,8 +36,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "hello world";
|
json j = "hello world"; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = "hello world";
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -56,8 +56,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty array")
|
SECTION("empty array")
|
||||||
{
|
{
|
||||||
json j = json::array();
|
json j = json::array(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = json::array();
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -74,8 +74,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled array")
|
SECTION("filled array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = {1, 2, 3};
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -95,8 +95,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty object")
|
SECTION("empty object")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json j = json::object(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = json::object();
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -113,8 +113,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled object")
|
SECTION("filled object")
|
||||||
{
|
{
|
||||||
json j = {{"one", 1}, {"two", 2}, {"three", 3}};
|
json j = {{"one", 1}, {"two", 2}, {"three", 3}}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = {{"one", 1}, {"two", 2}, {"three", 3}};
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -132,8 +132,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = -23;
|
json j = -23; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = -23;
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -150,8 +150,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json j = 23u; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = 23u;
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -168,8 +168,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (float)")
|
SECTION("number (float)")
|
||||||
{
|
{
|
||||||
json j = 23.42;
|
json j = 23.42; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = 23.42;
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -186,8 +186,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json j = nullptr; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = nullptr;
|
||||||
|
|
||||||
SECTION("result of empty")
|
SECTION("result of empty")
|
||||||
{
|
{
|
||||||
@ -207,8 +207,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json j = true; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = true;
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -227,8 +227,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "hello world";
|
json j = "hello world"; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = "hello world";
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -249,8 +249,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty array")
|
SECTION("empty array")
|
||||||
{
|
{
|
||||||
json j = json::array();
|
json j = json::array(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = json::array();
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -269,8 +269,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled array")
|
SECTION("filled array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = {1, 2, 3};
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -292,8 +292,8 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty object")
|
SECTION("empty object")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json j = json::object(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = json::object();
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -312,8 +312,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled object")
|
SECTION("filled object")
|
||||||
{
|
{
|
||||||
json j = {{"one", 1}, {"two", 2}, {"three", 3}};
|
json j = {{"one", 1}, {"two", 2}, {"three", 3}}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = {{"one", 1}, {"two", 2}, {"three", 3}};
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -333,8 +333,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = -23;
|
json j = -23; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = -23;
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -353,8 +353,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json j = 23u; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = 23u;
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -373,8 +373,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (float)")
|
SECTION("number (float)")
|
||||||
{
|
{
|
||||||
json j = 23.42;
|
json j = 23.42; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = 23.42;
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -393,8 +393,8 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json j = nullptr; // NOLINT(misc-const-correctness)
|
||||||
const json j_const(j);
|
const json j_const = nullptr;
|
||||||
|
|
||||||
SECTION("result of size")
|
SECTION("result of size")
|
||||||
{
|
{
|
||||||
@ -416,7 +416,7 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json j = true; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = true;
|
const json j_const = true;
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -428,7 +428,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "hello world";
|
json j = "hello world"; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = "hello world";
|
const json j_const = "hello world";
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -442,7 +442,7 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty array")
|
SECTION("empty array")
|
||||||
{
|
{
|
||||||
json j = json::array();
|
json j = json::array(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const = json::array();
|
const json j_const = json::array();
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -454,7 +454,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled array")
|
SECTION("filled array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = {1, 2, 3};
|
const json j_const = {1, 2, 3};
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -469,7 +469,7 @@ TEST_CASE("capacity")
|
|||||||
{
|
{
|
||||||
SECTION("empty object")
|
SECTION("empty object")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json j = json::object(); // NOLINT(misc-const-correctness)
|
||||||
const json j_const = json::object();
|
const json j_const = json::object();
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -481,7 +481,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("filled object")
|
SECTION("filled object")
|
||||||
{
|
{
|
||||||
json j = {{"one", 1}, {"two", 2}, {"three", 3}};
|
json j = {{"one", 1}, {"two", 2}, {"three", 3}}; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = {{"one", 1}, {"two", 2}, {"three", 3}};
|
const json j_const = {{"one", 1}, {"two", 2}, {"three", 3}};
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -494,7 +494,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = -23;
|
json j = -23; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = -23;
|
const json j_const = -23;
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -506,7 +506,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json j = 23u; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = 23u;
|
const json j_const = 23u;
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -518,7 +518,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("number (float)")
|
SECTION("number (float)")
|
||||||
{
|
{
|
||||||
json j = 23.42;
|
json j = 23.42; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = 23.42;
|
const json j_const = 23.42;
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
@ -530,7 +530,7 @@ TEST_CASE("capacity")
|
|||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json j = nullptr; // NOLINT(misc-const-correctness)
|
||||||
const json j_const = nullptr;
|
const json j_const = nullptr;
|
||||||
|
|
||||||
SECTION("result of max_size")
|
SECTION("result of max_size")
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -20,27 +20,27 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator const it(&j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j(json::value_t::object);
|
json const j(json::value_t::object);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator const it(&j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j(json::value_t::array);
|
json const j(json::value_t::array);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator const it(&j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("copy assignment")
|
SECTION("copy assignment")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator const it(&j);
|
||||||
json::const_iterator it2(&j);
|
json::const_iterator it2(&j);
|
||||||
it2 = it;
|
it2 = it;
|
||||||
}
|
}
|
||||||
@ -50,14 +50,14 @@ TEST_CASE("const_iterator class")
|
|||||||
SECTION("create from uninitialized iterator")
|
SECTION("create from uninitialized iterator")
|
||||||
{
|
{
|
||||||
const json::iterator it {};
|
const json::iterator it {};
|
||||||
json::const_iterator cit(it);
|
json::const_iterator const cit(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("create from initialized iterator")
|
SECTION("create from initialized iterator")
|
||||||
{
|
{
|
||||||
json j;
|
json j;
|
||||||
const json::iterator it = j.begin();
|
const json::iterator it = j.begin();
|
||||||
json::const_iterator cit(it);
|
json::const_iterator const cit(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,7 +68,7 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK((it == j.cbegin()));
|
CHECK((it == j.cbegin()));
|
||||||
@ -76,7 +76,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j(json::value_t::object);
|
json const j(json::value_t::object);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK((it == j.cbegin()));
|
CHECK((it == j.cbegin()));
|
||||||
@ -84,7 +84,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j(json::value_t::array);
|
json const j(json::value_t::array);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK((it == j.cbegin()));
|
CHECK((it == j.cbegin()));
|
||||||
@ -95,7 +95,7 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK((it == j.cend()));
|
CHECK((it == j.cend()));
|
||||||
@ -103,7 +103,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j(json::value_t::object);
|
json const j(json::value_t::object);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK((it == j.cend()));
|
CHECK((it == j.cend()));
|
||||||
@ -111,7 +111,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j(json::value_t::array);
|
json const j(json::value_t::array);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK((it == j.cend()));
|
CHECK((it == j.cend()));
|
||||||
@ -125,14 +125,14 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(*it == json(17));
|
CHECK(*it == json(17));
|
||||||
it = j.cend();
|
it = j.cend();
|
||||||
@ -141,15 +141,15 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK(*it == json("bar"));
|
CHECK(*it == json("bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK(*it == json(1));
|
CHECK(*it == json(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,14 +158,14 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(std::string(it->type_name()) == "number");
|
CHECK(std::string(it->type_name()) == "number");
|
||||||
it = j.cend();
|
it = j.cend();
|
||||||
@ -174,15 +174,15 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK(std::string(it->type_name()) == "string");
|
CHECK(std::string(it->type_name()) == "string");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator const it = j.cbegin();
|
||||||
CHECK(std::string(it->type_name()) == "number");
|
CHECK(std::string(it->type_name()) == "number");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -194,7 +194,7 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it++;
|
it++;
|
||||||
@ -203,7 +203,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
it++;
|
it++;
|
||||||
@ -214,7 +214,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
it++;
|
it++;
|
||||||
@ -223,7 +223,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
it++;
|
it++;
|
||||||
@ -245,7 +245,7 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
++it;
|
++it;
|
||||||
@ -254,7 +254,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
++it;
|
++it;
|
||||||
@ -265,7 +265,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
++it;
|
++it;
|
||||||
@ -274,7 +274,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
++it;
|
++it;
|
||||||
@ -296,14 +296,14 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator const it = j.cend();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it--;
|
it--;
|
||||||
@ -314,7 +314,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
it--;
|
it--;
|
||||||
@ -323,7 +323,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
@ -345,14 +345,14 @@ TEST_CASE("const_iterator class")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json const j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator const it = j.cend();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json const j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
--it;
|
--it;
|
||||||
@ -363,7 +363,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json const j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
--it;
|
--it;
|
||||||
@ -372,7 +372,7 @@ TEST_CASE("const_iterator class")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json const j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
|
@ -27,26 +27,26 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it(&j);
|
json::iterator const it(&j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j(json::value_t::object);
|
json j(json::value_t::object);
|
||||||
json::iterator it(&j);
|
json::iterator const it(&j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j(json::value_t::array);
|
json j(json::value_t::array);
|
||||||
json::iterator it(&j);
|
json::iterator const it(&j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("copy assignment")
|
SECTION("copy assignment")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it(&j);
|
json::iterator const it(&j);
|
||||||
json::iterator it2(&j);
|
json::iterator it2(&j);
|
||||||
it2 = it;
|
it2 = it;
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(*it, "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,14 +132,14 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK(*it == json("bar"));
|
CHECK(*it == json("bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK(*it == json(1));
|
CHECK(*it == json(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -149,7 +149,7 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(std::string(it->type_name()), "[json.exception.invalid_iterator.214] cannot get value", json::invalid_iterator&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,14 +165,14 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK(std::string(it->type_name()) == "string");
|
CHECK(std::string(it->type_name()) == "string");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.begin();
|
json::iterator const it = j.begin();
|
||||||
CHECK(std::string(it->type_name()) == "number");
|
CHECK(std::string(it->type_name()) == "number");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -287,7 +287,7 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator const it = j.end();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,7 +336,7 @@ TEST_CASE("iterator class")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator const it = j.end();
|
||||||
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,11 +249,11 @@ bool accept_helper(const std::string& s)
|
|||||||
CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == !el.errored);
|
CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == !el.errored);
|
||||||
|
|
||||||
// 5. parse with simple callback
|
// 5. parse with simple callback
|
||||||
json::parser_callback_t cb = [](int /*unused*/, json::parse_event_t /*unused*/, json& /*unused*/) noexcept
|
json::parser_callback_t const cb = [](int /*unused*/, json::parse_event_t /*unused*/, json& /*unused*/) noexcept
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
json j_cb = json::parse(s, cb, false);
|
json const j_cb = json::parse(s, cb, false);
|
||||||
const bool ok_noexcept_cb = !j_cb.is_discarded();
|
const bool ok_noexcept_cb = !j_cb.is_discarded();
|
||||||
|
|
||||||
// 6. check if this approach came to the same result
|
// 6. check if this approach came to the same result
|
||||||
@ -1093,7 +1093,7 @@ TEST_CASE("parser class")
|
|||||||
|
|
||||||
for (int c = 1; c < 128; ++c)
|
for (int c = 1; c < 128; ++c)
|
||||||
{
|
{
|
||||||
std::string s = "\"\\u";
|
std::string const s = "\"\\u";
|
||||||
|
|
||||||
// create a string with the iterated character at each position
|
// create a string with the iterated character at each position
|
||||||
auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\"";
|
auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\"";
|
||||||
@ -1308,7 +1308,7 @@ TEST_CASE("parser class")
|
|||||||
|
|
||||||
for (int c = 1; c < 128; ++c)
|
for (int c = 1; c < 128; ++c)
|
||||||
{
|
{
|
||||||
std::string s = "\"\\u";
|
std::string const s = "\"\\u";
|
||||||
|
|
||||||
// create a string with the iterated character at each position
|
// create a string with the iterated character at each position
|
||||||
const auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\"";
|
const auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\"";
|
||||||
@ -1361,7 +1361,7 @@ TEST_CASE("parser class")
|
|||||||
|
|
||||||
// test case to make sure the callback is properly evaluated after reading a key
|
// test case to make sure the callback is properly evaluated after reading a key
|
||||||
{
|
{
|
||||||
json::parser_callback_t cb = [](int /*unused*/, json::parse_event_t event, json& /*unused*/) noexcept
|
json::parser_callback_t const cb = [](int /*unused*/, json::parse_event_t event, json& /*unused*/) noexcept
|
||||||
{
|
{
|
||||||
return event != json::parse_event_t::key;
|
return event != json::parse_event_t::key;
|
||||||
};
|
};
|
||||||
@ -1417,7 +1417,7 @@ TEST_CASE("parser class")
|
|||||||
|
|
||||||
SECTION("filter everything")
|
SECTION("filter everything")
|
||||||
{
|
{
|
||||||
json j_object = json::parse(s_object, [](int /*unused*/, json::parse_event_t /*unused*/, const json& /*unused*/) noexcept
|
json const j_object = json::parse(s_object, [](int /*unused*/, json::parse_event_t /*unused*/, const json& /*unused*/) noexcept
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
@ -1425,7 +1425,7 @@ TEST_CASE("parser class")
|
|||||||
// the top-level object will be discarded, leaving a null
|
// the top-level object will be discarded, leaving a null
|
||||||
CHECK (j_object.is_null());
|
CHECK (j_object.is_null());
|
||||||
|
|
||||||
json j_array = json::parse(s_array, [](int /*unused*/, json::parse_event_t /*unused*/, const json& /*unused*/) noexcept
|
json const j_array = json::parse(s_array, [](int /*unused*/, json::parse_event_t /*unused*/, const json& /*unused*/) noexcept
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
@ -1574,7 +1574,7 @@ TEST_CASE("parser class")
|
|||||||
|
|
||||||
SECTION("from std::initializer_list")
|
SECTION("from std::initializer_list")
|
||||||
{
|
{
|
||||||
std::initializer_list<uint8_t> v = {'t', 'r', 'u', 'e'};
|
std::initializer_list<uint8_t> const v = {'t', 'r', 'u', 'e'};
|
||||||
json j;
|
json j;
|
||||||
json::parser(nlohmann::detail::input_adapter(std::begin(v), std::end(v))).parse(true, j);
|
json::parser(nlohmann::detail::input_adapter(std::begin(v), std::end(v))).parse(true, j);
|
||||||
CHECK(j == json(true));
|
CHECK(j == json(true));
|
||||||
@ -1593,7 +1593,7 @@ TEST_CASE("parser class")
|
|||||||
{
|
{
|
||||||
SECTION("parser with callback")
|
SECTION("parser with callback")
|
||||||
{
|
{
|
||||||
json::parser_callback_t cb = [](int /*unused*/, json::parse_event_t /*unused*/, json& /*unused*/) noexcept
|
json::parser_callback_t const cb = [](int /*unused*/, json::parse_event_t /*unused*/, json& /*unused*/) noexcept
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
@ -391,7 +391,7 @@ TEST_CASE("lexicographical comparison operators")
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compare with null pointer
|
// compare with null pointer
|
||||||
json j_null;
|
const json j_null;
|
||||||
CHECK((j_null != nullptr) == false);
|
CHECK((j_null != nullptr) == false);
|
||||||
CHECK((nullptr != j_null) == false);
|
CHECK((nullptr != j_null) == false);
|
||||||
CHECK((j_null != nullptr) == !(j_null == nullptr));
|
CHECK((j_null != nullptr) == !(j_null == nullptr));
|
||||||
|
@ -57,7 +57,7 @@ TEST_CASE("concepts")
|
|||||||
|
|
||||||
// the expression "X u" has the post-condition "u.empty()"
|
// the expression "X u" has the post-condition "u.empty()"
|
||||||
{
|
{
|
||||||
json u;
|
const json u;
|
||||||
CHECK(u.empty());
|
CHECK(u.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -83,7 +83,7 @@ TEST_CASE("other constructors and destructor")
|
|||||||
{
|
{
|
||||||
json j {{"foo", "bar"}, {"baz", {1, 2, 3, 4}}, {"a", 42u}, {"b", 42.23}, {"c", nullptr}};
|
json j {{"foo", "bar"}, {"baz", {1, 2, 3, 4}}, {"a", 42u}, {"b", 42.23}, {"c", nullptr}};
|
||||||
CHECK(j.type() == json::value_t::object);
|
CHECK(j.type() == json::value_t::object);
|
||||||
json k(std::move(j));
|
const json k(std::move(j));
|
||||||
CHECK(k.type() == json::value_t::object);
|
CHECK(k.type() == json::value_t::object);
|
||||||
CHECK(j.type() == json::value_t::null); // NOLINT: access after move is OK here
|
CHECK(j.type() == json::value_t::null); // NOLINT: access after move is OK here
|
||||||
}
|
}
|
||||||
|
@ -173,9 +173,9 @@ TEST_CASE("convenience functions")
|
|||||||
using nlohmann::detail::concat;
|
using nlohmann::detail::concat;
|
||||||
|
|
||||||
const char* expected = "Hello, world!";
|
const char* expected = "Hello, world!";
|
||||||
alt_string_iter hello_iter{"Hello, "};
|
alt_string_iter const hello_iter{"Hello, "};
|
||||||
alt_string_data hello_data{"Hello, "};
|
alt_string_data const hello_data{"Hello, "};
|
||||||
std::string world = "world";
|
std::string const world = "world";
|
||||||
|
|
||||||
SECTION("std::string")
|
SECTION("std::string")
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ TEST_CASE("value conversion")
|
|||||||
{
|
{
|
||||||
SECTION("get an object (explicit)")
|
SECTION("get an object (explicit)")
|
||||||
{
|
{
|
||||||
json::object_t o_reference = {{"object", json::object()},
|
const json::object_t o_reference = {{"object", json::object()},
|
||||||
{"array", {1, 2, 3, 4}},
|
{"array", {1, 2, 3, 4}},
|
||||||
{"number", 42},
|
{"number", 42},
|
||||||
{"boolean", false},
|
{"boolean", false},
|
||||||
@ -47,34 +47,34 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("json::object_t")
|
SECTION("json::object_t")
|
||||||
{
|
{
|
||||||
json::object_t o = j.get<json::object_t>();
|
json::object_t const o = j.get<json::object_t>();
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::map<json::string_t, json>")
|
SECTION("std::map<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::map<json::string_t, json> o =
|
const std::map<json::string_t, json> o =
|
||||||
j.get<std::map<json::string_t, json>>();
|
j.get<std::map<json::string_t, json>>();
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::multimap<json::string_t, json>")
|
SECTION("std::multimap<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::multimap<json::string_t, json> o =
|
const std::multimap<json::string_t, json> o =
|
||||||
j.get<std::multimap<json::string_t, json>>();
|
j.get<std::multimap<json::string_t, json>>();
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::unordered_map<json::string_t, json>")
|
SECTION("std::unordered_map<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::unordered_map<json::string_t, json> o =
|
const std::unordered_map<json::string_t, json> o =
|
||||||
j.get<std::unordered_map<json::string_t, json>>();
|
j.get<std::unordered_map<json::string_t, json>>();
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::unordered_multimap<json::string_t, json>")
|
SECTION("std::unordered_multimap<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::unordered_multimap<json::string_t, json> o =
|
const std::unordered_multimap<json::string_t, json> o =
|
||||||
j.get<std::unordered_multimap<json::string_t, json>>();
|
j.get<std::unordered_multimap<json::string_t, json>>();
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get an object (explicit, get_to)")
|
SECTION("get an object (explicit, get_to)")
|
||||||
{
|
{
|
||||||
json::object_t o_reference = {{"object", json::object()},
|
const json::object_t o_reference = {{"object", json::object()},
|
||||||
{"array", {1, 2, 3, 4}},
|
{"array", {1, 2, 3, 4}},
|
||||||
{"number", 42},
|
{"number", 42},
|
||||||
{"boolean", false},
|
{"boolean", false},
|
||||||
@ -155,7 +155,7 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get an object (implicit)")
|
SECTION("get an object (implicit)")
|
||||||
{
|
{
|
||||||
json::object_t o_reference = {{"object", json::object()},
|
const json::object_t o_reference = {{"object", json::object()},
|
||||||
{"array", {1, 2, 3, 4}},
|
{"array", {1, 2, 3, 4}},
|
||||||
{"number", 42},
|
{"number", 42},
|
||||||
{"boolean", false},
|
{"boolean", false},
|
||||||
@ -166,31 +166,31 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("json::object_t")
|
SECTION("json::object_t")
|
||||||
{
|
{
|
||||||
json::object_t o = j;
|
const json::object_t o = j;
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::map<json::string_t, json>")
|
SECTION("std::map<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::map<json::string_t, json> o = j;
|
const std::map<json::string_t, json> o = j;
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::multimap<json::string_t, json>")
|
SECTION("std::multimap<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::multimap<json::string_t, json> o = j;
|
const std::multimap<json::string_t, json> o = j;
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::unordered_map<json::string_t, json>")
|
SECTION("std::unordered_map<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::unordered_map<json::string_t, json> o = j;
|
const std::unordered_map<json::string_t, json> o = j;
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::unordered_multimap<json::string_t, json>")
|
SECTION("std::unordered_multimap<json::string_t, json>")
|
||||||
{
|
{
|
||||||
std::unordered_multimap<json::string_t, json> o = j;
|
const std::unordered_multimap<json::string_t, json> o = j;
|
||||||
CHECK(json(o) == j);
|
CHECK(json(o) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,25 +198,25 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get an array (explicit)")
|
SECTION("get an array (explicit)")
|
||||||
{
|
{
|
||||||
json::array_t a_reference{json(1), json(1u), json(2.2),
|
const json::array_t a_reference{json(1), json(1u), json(2.2),
|
||||||
json(false), json("string"), json()};
|
json(false), json("string"), json()};
|
||||||
json j(a_reference);
|
json j(a_reference);
|
||||||
|
|
||||||
SECTION("json::array_t")
|
SECTION("json::array_t")
|
||||||
{
|
{
|
||||||
json::array_t a = j.get<json::array_t>();
|
const json::array_t a = j.get<json::array_t>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::list<json>")
|
SECTION("std::list<json>")
|
||||||
{
|
{
|
||||||
std::list<json> a = j.get<std::list<json>>();
|
const std::list<json> a = j.get<std::list<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::forward_list<json>")
|
SECTION("std::forward_list<json>")
|
||||||
{
|
{
|
||||||
std::forward_list<json> a = j.get<std::forward_list<json>>();
|
const std::forward_list<json> a = j.get<std::forward_list<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(
|
CHECK_THROWS_WITH_AS(
|
||||||
@ -226,7 +226,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("std::vector<json>")
|
SECTION("std::vector<json>")
|
||||||
{
|
{
|
||||||
std::vector<json> a = j.get<std::vector<json>>();
|
const std::vector<json> a = j.get<std::vector<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(
|
CHECK_THROWS_WITH_AS(
|
||||||
@ -237,7 +237,7 @@ TEST_CASE("value conversion")
|
|||||||
SECTION("reserve is called on containers that supports it")
|
SECTION("reserve is called on containers that supports it")
|
||||||
{
|
{
|
||||||
// make sure all values are properly copied
|
// make sure all values are properly copied
|
||||||
json j2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
|
const json j2({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
|
||||||
auto v2 = j2.get<std::vector<int>>();
|
auto v2 = j2.get<std::vector<int>>();
|
||||||
CHECK(v2.size() == 10);
|
CHECK(v2.size() == 10);
|
||||||
}
|
}
|
||||||
@ -249,8 +249,8 @@ TEST_CASE("value conversion")
|
|||||||
const char str[] = "a string"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
const char str[] = "a string"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
|
||||||
json j2 = nbs;
|
const json j2 = nbs;
|
||||||
json j3 = str;
|
const json j3 = str;
|
||||||
|
|
||||||
auto v = j2.get<std::vector<int>>();
|
auto v = j2.get<std::vector<int>>();
|
||||||
auto s = j3.get<std::string>();
|
auto s = j3.get<std::string>();
|
||||||
@ -260,7 +260,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("std::deque<json>")
|
SECTION("std::deque<json>")
|
||||||
{
|
{
|
||||||
std::deque<json> a = j.get<std::deque<json>>();
|
const std::deque<json> a = j.get<std::deque<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,8 +295,8 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get an array (explicit, get_to)")
|
SECTION("get an array (explicit, get_to)")
|
||||||
{
|
{
|
||||||
json::array_t a_reference{json(1), json(1u), json(2.2),
|
const json::array_t a_reference{json(1), json(1u), json(2.2),
|
||||||
json(false), json("string"), json()};
|
json(false), json("string"), json()};
|
||||||
json j(a_reference);
|
json j(a_reference);
|
||||||
|
|
||||||
SECTION("json::array_t")
|
SECTION("json::array_t")
|
||||||
@ -339,7 +339,7 @@ TEST_CASE("value conversion")
|
|||||||
const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
const int nbs[] = {0, 1, 2}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
int nbs2[] = {0, 0, 0}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
int nbs2[] = {0, 0, 0}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
|
||||||
json j2 = nbs;
|
const json j2 = nbs;
|
||||||
j2.get_to(nbs2);
|
j2.get_to(nbs2);
|
||||||
CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
|
CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2)));
|
||||||
}
|
}
|
||||||
@ -355,37 +355,37 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get an array (implicit)")
|
SECTION("get an array (implicit)")
|
||||||
{
|
{
|
||||||
json::array_t a_reference{json(1), json(1u), json(2.2),
|
const json::array_t a_reference{json(1), json(1u), json(2.2),
|
||||||
json(false), json("string"), json()};
|
json(false), json("string"), json()};
|
||||||
json j(a_reference);
|
json j(a_reference);
|
||||||
|
|
||||||
SECTION("json::array_t")
|
SECTION("json::array_t")
|
||||||
{
|
{
|
||||||
json::array_t a = j;
|
const json::array_t a = j;
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::list<json>")
|
SECTION("std::list<json>")
|
||||||
{
|
{
|
||||||
std::list<json> a = j;
|
const std::list<json> a = j;
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::forward_list<json>")
|
SECTION("std::forward_list<json>")
|
||||||
{
|
{
|
||||||
std::forward_list<json> a = j;
|
const std::forward_list<json> a = j;
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::vector<json>")
|
SECTION("std::vector<json>")
|
||||||
{
|
{
|
||||||
std::vector<json> a = j;
|
const std::vector<json> a = j;
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::deque<json>")
|
SECTION("std::deque<json>")
|
||||||
{
|
{
|
||||||
std::deque<json> a = j;
|
const std::deque<json> a = j;
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -393,24 +393,24 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get a string (explicit)")
|
SECTION("get a string (explicit)")
|
||||||
{
|
{
|
||||||
json::string_t s_reference{"Hello world"};
|
const json::string_t s_reference{"Hello world"};
|
||||||
json j(s_reference);
|
json j(s_reference);
|
||||||
|
|
||||||
SECTION("string_t")
|
SECTION("string_t")
|
||||||
{
|
{
|
||||||
json::string_t s = j.get<json::string_t>();
|
const json::string_t s = j.get<json::string_t>();
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::string")
|
SECTION("std::string")
|
||||||
{
|
{
|
||||||
std::string s = j.get<std::string>();
|
const std::string s = j.get<std::string>();
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
#if defined(JSON_HAS_CPP_17)
|
#if defined(JSON_HAS_CPP_17)
|
||||||
SECTION("std::string_view")
|
SECTION("std::string_view")
|
||||||
{
|
{
|
||||||
std::string_view s = j.get<std::string_view>();
|
std::string_view const s = j.get<std::string_view>();
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -463,7 +463,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get a string (explicit, get_to)")
|
SECTION("get a string (explicit, get_to)")
|
||||||
{
|
{
|
||||||
json::string_t s_reference{"Hello world"};
|
const json::string_t s_reference{"Hello world"};
|
||||||
json j(s_reference);
|
json j(s_reference);
|
||||||
|
|
||||||
SECTION("string_t")
|
SECTION("string_t")
|
||||||
@ -482,7 +482,7 @@ TEST_CASE("value conversion")
|
|||||||
#if defined(JSON_HAS_CPP_17)
|
#if defined(JSON_HAS_CPP_17)
|
||||||
SECTION("std::string_view")
|
SECTION("std::string_view")
|
||||||
{
|
{
|
||||||
std::string s = "previous value";
|
std::string const s = "previous value";
|
||||||
std::string_view sv = s;
|
std::string_view sv = s;
|
||||||
j.get_to(sv);
|
j.get_to(sv);
|
||||||
CHECK(json(sv) == j);
|
CHECK(json(sv) == j);
|
||||||
@ -493,7 +493,7 @@ TEST_CASE("value conversion")
|
|||||||
SECTION("get null (explicit)")
|
SECTION("get null (explicit)")
|
||||||
{
|
{
|
||||||
std::nullptr_t n = nullptr;
|
std::nullptr_t n = nullptr;
|
||||||
json j(n);
|
const json j(n);
|
||||||
|
|
||||||
auto n2 = j.get<std::nullptr_t>();
|
auto n2 = j.get<std::nullptr_t>();
|
||||||
CHECK(n2 == n);
|
CHECK(n2 == n);
|
||||||
@ -517,26 +517,26 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get a string (implicit)")
|
SECTION("get a string (implicit)")
|
||||||
{
|
{
|
||||||
json::string_t s_reference{"Hello world"};
|
const json::string_t s_reference{"Hello world"};
|
||||||
json j(s_reference);
|
json j(s_reference);
|
||||||
|
|
||||||
SECTION("string_t")
|
SECTION("string_t")
|
||||||
{
|
{
|
||||||
json::string_t s = j;
|
const json::string_t s = j;
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(JSON_HAS_CPP_17)
|
#if defined(JSON_HAS_CPP_17)
|
||||||
SECTION("std::string_view")
|
SECTION("std::string_view")
|
||||||
{
|
{
|
||||||
std::string_view s = j.get<std::string_view>();
|
std::string_view const s = j.get<std::string_view>();
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SECTION("std::string")
|
SECTION("std::string")
|
||||||
{
|
{
|
||||||
std::string s = j;
|
const std::string s = j;
|
||||||
CHECK(json(s) == j);
|
CHECK(json(s) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -544,7 +544,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get a boolean (explicit)")
|
SECTION("get a boolean (explicit)")
|
||||||
{
|
{
|
||||||
json::boolean_t b_reference{true};
|
const json::boolean_t b_reference{true};
|
||||||
json j(b_reference);
|
json j(b_reference);
|
||||||
|
|
||||||
SECTION("boolean_t")
|
SECTION("boolean_t")
|
||||||
@ -561,7 +561,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("bool")
|
SECTION("bool")
|
||||||
{
|
{
|
||||||
bool b = j.get<bool>();
|
const bool b = j.get<bool>();
|
||||||
CHECK(json(b) == j);
|
CHECK(json(b) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -600,18 +600,18 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get a boolean (implicit)")
|
SECTION("get a boolean (implicit)")
|
||||||
{
|
{
|
||||||
json::boolean_t b_reference{true};
|
const json::boolean_t b_reference{true};
|
||||||
json j(b_reference);
|
json j(b_reference);
|
||||||
|
|
||||||
SECTION("boolean_t")
|
SECTION("boolean_t")
|
||||||
{
|
{
|
||||||
json::boolean_t b = j;
|
const json::boolean_t b = j;
|
||||||
CHECK(json(b) == j);
|
CHECK(json(b) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("bool")
|
SECTION("bool")
|
||||||
{
|
{
|
||||||
bool b = j;
|
const bool b = j;
|
||||||
CHECK(json(b) == j);
|
CHECK(json(b) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -619,9 +619,9 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get an integer number (explicit)")
|
SECTION("get an integer number (explicit)")
|
||||||
{
|
{
|
||||||
json::number_integer_t n_reference{42};
|
const json::number_integer_t n_reference{42};
|
||||||
json j(n_reference);
|
json j(n_reference);
|
||||||
json::number_unsigned_t n_unsigned_reference{42u};
|
const json::number_unsigned_t n_unsigned_reference{42u};
|
||||||
json j_unsigned(n_unsigned_reference);
|
json j_unsigned(n_unsigned_reference);
|
||||||
|
|
||||||
SECTION("number_integer_t")
|
SECTION("number_integer_t")
|
||||||
@ -650,7 +650,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("int")
|
SECTION("int")
|
||||||
{
|
{
|
||||||
int n = j.get<int>();
|
const int n = j.get<int>();
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +662,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("long")
|
SECTION("long")
|
||||||
{
|
{
|
||||||
long n = j.get<long>();
|
const long n = j.get<long>();
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -857,9 +857,9 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get an integer number (implicit)")
|
SECTION("get an integer number (implicit)")
|
||||||
{
|
{
|
||||||
json::number_integer_t n_reference{42};
|
json::number_integer_t const n_reference{42};
|
||||||
json j(n_reference);
|
json j(n_reference);
|
||||||
json::number_unsigned_t n_unsigned_reference{42u};
|
json::number_unsigned_t const n_unsigned_reference{42u};
|
||||||
json j_unsigned(n_unsigned_reference);
|
json j_unsigned(n_unsigned_reference);
|
||||||
|
|
||||||
SECTION("number_integer_t")
|
SECTION("number_integer_t")
|
||||||
@ -876,193 +876,193 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("short")
|
SECTION("short")
|
||||||
{
|
{
|
||||||
short n = j;
|
short const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("unsigned short")
|
SECTION("unsigned short")
|
||||||
{
|
{
|
||||||
unsigned short n = j_unsigned;
|
unsigned short const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int")
|
SECTION("int")
|
||||||
{
|
{
|
||||||
int n = j;
|
int const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("unsigned int")
|
SECTION("unsigned int")
|
||||||
{
|
{
|
||||||
unsigned int n = j_unsigned;
|
unsigned int const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("long")
|
SECTION("long")
|
||||||
{
|
{
|
||||||
long n = j;
|
long const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("unsigned long")
|
SECTION("unsigned long")
|
||||||
{
|
{
|
||||||
unsigned long n = j_unsigned;
|
unsigned long const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("long long")
|
SECTION("long long")
|
||||||
{
|
{
|
||||||
long long n = j;
|
long long const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("unsigned long long")
|
SECTION("unsigned long long")
|
||||||
{
|
{
|
||||||
unsigned long long n = j_unsigned;
|
unsigned long long const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int8_t")
|
SECTION("int8_t")
|
||||||
{
|
{
|
||||||
int8_t n = j;
|
int8_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int16_t")
|
SECTION("int16_t")
|
||||||
{
|
{
|
||||||
int16_t n = j;
|
int16_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int32_t")
|
SECTION("int32_t")
|
||||||
{
|
{
|
||||||
int32_t n = j;
|
int32_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int64_t")
|
SECTION("int64_t")
|
||||||
{
|
{
|
||||||
int64_t n = j;
|
int64_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int8_fast_t")
|
SECTION("int8_fast_t")
|
||||||
{
|
{
|
||||||
int_fast8_t n = j;
|
int_fast8_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int16_fast_t")
|
SECTION("int16_fast_t")
|
||||||
{
|
{
|
||||||
int_fast16_t n = j;
|
int_fast16_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int32_fast_t")
|
SECTION("int32_fast_t")
|
||||||
{
|
{
|
||||||
int_fast32_t n = j;
|
int_fast32_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int64_fast_t")
|
SECTION("int64_fast_t")
|
||||||
{
|
{
|
||||||
int_fast64_t n = j;
|
int_fast64_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int8_least_t")
|
SECTION("int8_least_t")
|
||||||
{
|
{
|
||||||
int_least8_t n = j;
|
int_least8_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int16_least_t")
|
SECTION("int16_least_t")
|
||||||
{
|
{
|
||||||
int_least16_t n = j;
|
int_least16_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int32_least_t")
|
SECTION("int32_least_t")
|
||||||
{
|
{
|
||||||
int_least32_t n = j;
|
int_least32_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("int64_least_t")
|
SECTION("int64_least_t")
|
||||||
{
|
{
|
||||||
int_least64_t n = j;
|
int_least64_t const n = j;
|
||||||
CHECK(json(n) == j);
|
CHECK(json(n) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint8_t")
|
SECTION("uint8_t")
|
||||||
{
|
{
|
||||||
uint8_t n = j_unsigned;
|
uint8_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint16_t")
|
SECTION("uint16_t")
|
||||||
{
|
{
|
||||||
uint16_t n = j_unsigned;
|
uint16_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint32_t")
|
SECTION("uint32_t")
|
||||||
{
|
{
|
||||||
uint32_t n = j_unsigned;
|
uint32_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint64_t")
|
SECTION("uint64_t")
|
||||||
{
|
{
|
||||||
uint64_t n = j_unsigned;
|
uint64_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint8_fast_t")
|
SECTION("uint8_fast_t")
|
||||||
{
|
{
|
||||||
uint_fast8_t n = j_unsigned;
|
uint_fast8_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint16_fast_t")
|
SECTION("uint16_fast_t")
|
||||||
{
|
{
|
||||||
uint_fast16_t n = j_unsigned;
|
uint_fast16_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint32_fast_t")
|
SECTION("uint32_fast_t")
|
||||||
{
|
{
|
||||||
uint_fast32_t n = j_unsigned;
|
uint_fast32_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint64_fast_t")
|
SECTION("uint64_fast_t")
|
||||||
{
|
{
|
||||||
uint_fast64_t n = j_unsigned;
|
uint_fast64_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint8_least_t")
|
SECTION("uint8_least_t")
|
||||||
{
|
{
|
||||||
uint_least8_t n = j_unsigned;
|
uint_least8_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint16_least_t")
|
SECTION("uint16_least_t")
|
||||||
{
|
{
|
||||||
uint_least16_t n = j_unsigned;
|
uint_least16_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint32_least_t")
|
SECTION("uint32_least_t")
|
||||||
{
|
{
|
||||||
uint_least32_t n = j_unsigned;
|
uint_least32_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("uint64_least_t")
|
SECTION("uint64_least_t")
|
||||||
{
|
{
|
||||||
uint_least64_t n = j_unsigned;
|
uint_least64_t const n = j_unsigned;
|
||||||
CHECK(json(n) == j_unsigned);
|
CHECK(json(n) == j_unsigned);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1070,8 +1070,8 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get a floating-point number (explicit)")
|
SECTION("get a floating-point number (explicit)")
|
||||||
{
|
{
|
||||||
json::number_float_t n_reference{42.23};
|
json::number_float_t const n_reference{42.23};
|
||||||
json j(n_reference);
|
json const j(n_reference);
|
||||||
|
|
||||||
SECTION("number_float_t")
|
SECTION("number_float_t")
|
||||||
{
|
{
|
||||||
@ -1120,24 +1120,24 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get a floating-point number (implicit)")
|
SECTION("get a floating-point number (implicit)")
|
||||||
{
|
{
|
||||||
json::number_float_t n_reference{42.23};
|
json::number_float_t const n_reference{42.23};
|
||||||
json j(n_reference);
|
json const j(n_reference);
|
||||||
|
|
||||||
SECTION("number_float_t")
|
SECTION("number_float_t")
|
||||||
{
|
{
|
||||||
json::number_float_t n = j;
|
json::number_float_t const n = j;
|
||||||
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("float")
|
SECTION("float")
|
||||||
{
|
{
|
||||||
float n = j;
|
float const n = j;
|
||||||
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("double")
|
SECTION("double")
|
||||||
{
|
{
|
||||||
double n = j;
|
double const n = j;
|
||||||
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1145,12 +1145,12 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("get a binary value (explicit)")
|
SECTION("get a binary value (explicit)")
|
||||||
{
|
{
|
||||||
json::binary_t n_reference{{1, 2, 3}};
|
json::binary_t const n_reference{{1, 2, 3}};
|
||||||
json j(n_reference);
|
json j(n_reference);
|
||||||
|
|
||||||
SECTION("binary_t")
|
SECTION("binary_t")
|
||||||
{
|
{
|
||||||
json::binary_t b = j.get<json::binary_t>();
|
json::binary_t const b = j.get<json::binary_t>();
|
||||||
CHECK(*json(b).m_value.binary == *j.m_value.binary);
|
CHECK(*json(b).m_value.binary == *j.m_value.binary);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1252,12 +1252,12 @@ TEST_CASE("value conversion")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("get a binary value (implicit)")
|
SECTION("get a binary value (implicit)")
|
||||||
{
|
{
|
||||||
json::binary_t n_reference{{1, 2, 3}};
|
json::binary_t const n_reference{{1, 2, 3}};
|
||||||
json j(n_reference);
|
json const j(n_reference);
|
||||||
|
|
||||||
SECTION("binary_t")
|
SECTION("binary_t")
|
||||||
{
|
{
|
||||||
json::binary_t b = j;
|
json::binary_t const b = j;
|
||||||
CHECK(*json(b).m_value.binary == *j.m_value.binary);
|
CHECK(*json(b).m_value.binary == *j.m_value.binary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1276,11 +1276,11 @@ TEST_CASE("value conversion")
|
|||||||
{
|
{
|
||||||
SECTION("object-like STL containers")
|
SECTION("object-like STL containers")
|
||||||
{
|
{
|
||||||
json j1 = {{"one", 1}, {"two", 2}, {"three", 3}};
|
json const j1 = {{"one", 1}, {"two", 2}, {"three", 3}};
|
||||||
json j2 = {{"one", 1u}, {"two", 2u}, {"three", 3u}};
|
json const j2 = {{"one", 1u}, {"two", 2u}, {"three", 3u}};
|
||||||
json j3 = {{"one", 1.1}, {"two", 2.2}, {"three", 3.3}};
|
json const j3 = {{"one", 1.1}, {"two", 2.2}, {"three", 3.3}};
|
||||||
json j4 = {{"one", true}, {"two", false}, {"three", true}};
|
json const j4 = {{"one", true}, {"two", false}, {"three", true}};
|
||||||
json j5 = {{"one", "eins"}, {"two", "zwei"}, {"three", "drei"}};
|
json const j5 = {{"one", "eins"}, {"two", "zwei"}, {"three", "drei"}};
|
||||||
|
|
||||||
SECTION("std::map")
|
SECTION("std::map")
|
||||||
{
|
{
|
||||||
@ -1331,11 +1331,11 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("array-like STL containers")
|
SECTION("array-like STL containers")
|
||||||
{
|
{
|
||||||
json j1 = {1, 2, 3, 4};
|
json const j1 = {1, 2, 3, 4};
|
||||||
json j2 = {1u, 2u, 3u, 4u};
|
json const j2 = {1u, 2u, 3u, 4u};
|
||||||
json j3 = {1.2, 2.3, 3.4, 4.5};
|
json const j3 = {1.2, 2.3, 3.4, 4.5};
|
||||||
json j4 = {true, false, true};
|
json const j4 = {true, false, true};
|
||||||
json j5 = {"one", "two", "three"};
|
json const j5 = {"one", "two", "three"};
|
||||||
|
|
||||||
SECTION("std::list")
|
SECTION("std::list")
|
||||||
{
|
{
|
||||||
@ -1427,13 +1427,13 @@ TEST_CASE("value conversion")
|
|||||||
SECTION("std::map (array of pairs)")
|
SECTION("std::map (array of pairs)")
|
||||||
{
|
{
|
||||||
std::map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
|
std::map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
|
||||||
json j6 = m;
|
json const j6 = m;
|
||||||
|
|
||||||
auto m2 = j6.get<std::map<int, int>>();
|
auto m2 = j6.get<std::map<int, int>>();
|
||||||
CHECK(m == m2);
|
CHECK(m == m2);
|
||||||
|
|
||||||
json j7 = {0, 1, 2, 3};
|
json const j7 = {0, 1, 2, 3};
|
||||||
json j8 = 2;
|
json const j8 = 2;
|
||||||
CHECK_THROWS_WITH_AS((j7.get<std::map<int, int>>()),
|
CHECK_THROWS_WITH_AS((j7.get<std::map<int, int>>()),
|
||||||
"[json.exception.type_error.302] type must be array, "
|
"[json.exception.type_error.302] type must be array, "
|
||||||
"but is number", json::type_error&);
|
"but is number", json::type_error&);
|
||||||
@ -1443,7 +1443,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("superfluous entries")
|
SECTION("superfluous entries")
|
||||||
{
|
{
|
||||||
json j9 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
|
json const j9 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
|
||||||
m2 = j9.get<std::map<int, int>>();
|
m2 = j9.get<std::map<int, int>>();
|
||||||
CHECK(m == m2);
|
CHECK(m == m2);
|
||||||
}
|
}
|
||||||
@ -1452,13 +1452,13 @@ TEST_CASE("value conversion")
|
|||||||
SECTION("std::unordered_map (array of pairs)")
|
SECTION("std::unordered_map (array of pairs)")
|
||||||
{
|
{
|
||||||
std::unordered_map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
|
std::unordered_map<int, int> m{{0, 1}, {1, 2}, {2, 3}};
|
||||||
json j6 = m;
|
json const j6 = m;
|
||||||
|
|
||||||
auto m2 = j6.get<std::unordered_map<int, int>>();
|
auto m2 = j6.get<std::unordered_map<int, int>>();
|
||||||
CHECK(m == m2);
|
CHECK(m == m2);
|
||||||
|
|
||||||
json j7 = {0, 1, 2, 3};
|
json const j7 = {0, 1, 2, 3};
|
||||||
json j8 = 2;
|
json const j8 = 2;
|
||||||
CHECK_THROWS_WITH_AS((j7.get<std::unordered_map<int, int>>()),
|
CHECK_THROWS_WITH_AS((j7.get<std::unordered_map<int, int>>()),
|
||||||
"[json.exception.type_error.302] type must be array, "
|
"[json.exception.type_error.302] type must be array, "
|
||||||
"but is number", json::type_error&);
|
"but is number", json::type_error&);
|
||||||
@ -1468,7 +1468,7 @@ TEST_CASE("value conversion")
|
|||||||
|
|
||||||
SECTION("superfluous entries")
|
SECTION("superfluous entries")
|
||||||
{
|
{
|
||||||
json j9{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
|
json const j9{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}};
|
||||||
m2 = j9.get<std::unordered_map<int, int>>();
|
m2 = j9.get<std::unordered_map<int, int>>();
|
||||||
CHECK(m == m2);
|
CHECK(m == m2);
|
||||||
}
|
}
|
||||||
|
@ -188,7 +188,7 @@ TEST_CASE("JSON Node Metadata")
|
|||||||
value.metadata().emplace_back(1);
|
value.metadata().emplace_back(1);
|
||||||
value.metadata().emplace_back(2);
|
value.metadata().emplace_back(2);
|
||||||
|
|
||||||
json array(10, value);
|
json const array(10, value);
|
||||||
|
|
||||||
CHECK(value.metadata().size() == 2);
|
CHECK(value.metadata().size() == 2);
|
||||||
CHECK(value.metadata().at(0) == 1);
|
CHECK(value.metadata().at(0) == 1);
|
||||||
|
@ -265,7 +265,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("string_t")
|
SECTION("string_t")
|
||||||
{
|
{
|
||||||
json::string_t s = R"(["foo",1,2,3,false,{"one":1}])";
|
json::string_t const s = R"(["foo",1,2,3,false,{"one":1}])";
|
||||||
json j = json::parse(s);
|
json j = json::parse(s);
|
||||||
CHECK(json::accept(s));
|
CHECK(json::accept(s));
|
||||||
CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}}));
|
CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}}));
|
||||||
@ -341,7 +341,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json::string_t s = R"(["foo",1,2,3,false,{"one":1})";
|
json::string_t const s = R"(["foo",1,2,3,false,{"one":1})";
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_WITH_AS(_ = json::parse(s), "[json.exception.parse_error.101] parse error at line 1, column 29: syntax error while parsing array - unexpected end of input; expected ']'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::parse(s), "[json.exception.parse_error.101] parse error at line 1, column 29: syntax error while parsing array - unexpected end of input; expected ']'", json::parse_error&);
|
||||||
CHECK(!json::accept(s));
|
CHECK(!json::accept(s));
|
||||||
@ -390,7 +390,7 @@ TEST_CASE("deserialization")
|
|||||||
{
|
{
|
||||||
SECTION("from std::vector")
|
SECTION("from std::vector")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v = {'t', 'r', 'u', 'e'};
|
std::vector<uint8_t> const v = {'t', 'r', 'u', 'e'};
|
||||||
CHECK(json::parse(v) == json(true));
|
CHECK(json::parse(v) == json(true));
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -402,7 +402,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("from std::array")
|
SECTION("from std::array")
|
||||||
{
|
{
|
||||||
std::array<uint8_t, 5> v { {'t', 'r', 'u', 'e'} };
|
std::array<uint8_t, 5> const v { {'t', 'r', 'u', 'e'} };
|
||||||
CHECK(json::parse(v) == json(true));
|
CHECK(json::parse(v) == json(true));
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -445,7 +445,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("from std::string")
|
SECTION("from std::string")
|
||||||
{
|
{
|
||||||
std::string v = {'t', 'r', 'u', 'e'};
|
std::string const v = {'t', 'r', 'u', 'e'};
|
||||||
CHECK(json::parse(v) == json(true));
|
CHECK(json::parse(v) == json(true));
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -457,7 +457,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("from std::initializer_list")
|
SECTION("from std::initializer_list")
|
||||||
{
|
{
|
||||||
std::initializer_list<uint8_t> v = {'t', 'r', 'u', 'e'};
|
std::initializer_list<uint8_t> const v = {'t', 'r', 'u', 'e'};
|
||||||
CHECK(json::parse(v) == json(true));
|
CHECK(json::parse(v) == json(true));
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -469,7 +469,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("empty container")
|
SECTION("empty container")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v;
|
std::vector<uint8_t> const v;
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_AS(_ = json::parse(v), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(v), json::parse_error&);
|
||||||
CHECK(!json::accept(v));
|
CHECK(!json::accept(v));
|
||||||
@ -534,7 +534,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("from std::initializer_list")
|
SECTION("from std::initializer_list")
|
||||||
{
|
{
|
||||||
std::initializer_list<uint8_t> v = {'t', 'r', 'u', 'e'};
|
std::initializer_list<uint8_t> const v = {'t', 'r', 'u', 'e'};
|
||||||
CHECK(json::parse(std::begin(v), std::end(v)) == json(true));
|
CHECK(json::parse(std::begin(v), std::end(v)) == json(true));
|
||||||
CHECK(json::accept(std::begin(v), std::end(v)));
|
CHECK(json::accept(std::begin(v), std::end(v)));
|
||||||
|
|
||||||
@ -1045,7 +1045,7 @@ TEST_CASE("deserialization")
|
|||||||
|
|
||||||
SECTION("SAX and early abort")
|
SECTION("SAX and early abort")
|
||||||
{
|
{
|
||||||
std::string s = R"([1, ["string", 43.12], null, {"key1": true, "key2": false}])";
|
std::string const s = R"([1, ["string", 43.12], null, {"key1": true, "key2": false}])";
|
||||||
|
|
||||||
SaxEventLogger default_logger;
|
SaxEventLogger default_logger;
|
||||||
SaxEventLoggerExitAfterStartObject exit_after_start_object;
|
SaxEventLoggerExitAfterStartObject exit_after_start_object;
|
||||||
@ -1139,7 +1139,7 @@ TEST_CASE_TEMPLATE("deserialization of different character types (ASCII)", T,
|
|||||||
std::int16_t, std::uint16_t,
|
std::int16_t, std::uint16_t,
|
||||||
std::int32_t, std::uint32_t)
|
std::int32_t, std::uint32_t)
|
||||||
{
|
{
|
||||||
std::vector<T> v = {'t', 'r', 'u', 'e'};
|
std::vector<T> const v = {'t', 'r', 'u', 'e'};
|
||||||
CHECK(json::parse(v) == json(true));
|
CHECK(json::parse(v) == json(true));
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -1153,7 +1153,7 @@ TEST_CASE_TEMPLATE("deserialization of different character types (UTF-8)", T,
|
|||||||
char, unsigned char, std::uint8_t)
|
char, unsigned char, std::uint8_t)
|
||||||
{
|
{
|
||||||
// a star emoji
|
// a star emoji
|
||||||
std::vector<T> v = {'"', static_cast<T>(0xe2u), static_cast<T>(0xadu), static_cast<T>(0x90u), static_cast<T>(0xefu), static_cast<T>(0xb8u), static_cast<T>(0x8fu), '"'};
|
std::vector<T> const v = {'"', static_cast<T>(0xe2u), static_cast<T>(0xadu), static_cast<T>(0x90u), static_cast<T>(0xefu), static_cast<T>(0xb8u), static_cast<T>(0x8fu), '"'};
|
||||||
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -1166,7 +1166,7 @@ TEST_CASE_TEMPLATE("deserialization of different character types (UTF-16)", T,
|
|||||||
char16_t, std::uint16_t)
|
char16_t, std::uint16_t)
|
||||||
{
|
{
|
||||||
// a star emoji
|
// a star emoji
|
||||||
std::vector<T> v = {static_cast<T>('"'), static_cast<T>(0x2b50), static_cast<T>(0xfe0f), static_cast<T>('"')};
|
std::vector<T> const v = {static_cast<T>('"'), static_cast<T>(0x2b50), static_cast<T>(0xfe0f), static_cast<T>('"')};
|
||||||
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
@ -1179,7 +1179,7 @@ TEST_CASE_TEMPLATE("deserialization of different character types (UTF-32)", T,
|
|||||||
char32_t, std::uint32_t)
|
char32_t, std::uint32_t)
|
||||||
{
|
{
|
||||||
// a star emoji
|
// a star emoji
|
||||||
std::vector<T> v = {static_cast<T>('"'), static_cast<T>(0x2b50), static_cast<T>(0xfe0f), static_cast<T>('"')};
|
std::vector<T> const v = {static_cast<T>('"'), static_cast<T>(0x2b50), static_cast<T>(0xfe0f), static_cast<T>('"')};
|
||||||
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
CHECK(json::parse(v).dump(-1, ' ', true) == "\"\\u2b50\\ufe0f\"");
|
||||||
CHECK(json::accept(v));
|
CHECK(json::accept(v));
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ TEST_CASE("Better diagnostics")
|
|||||||
{
|
{
|
||||||
SECTION("empty JSON Pointer")
|
SECTION("empty JSON Pointer")
|
||||||
{
|
{
|
||||||
json j = 1;
|
json const j = 1;
|
||||||
std::string s;
|
std::string s;
|
||||||
CHECK_THROWS_WITH_AS(s = j.get<std::string>(), "[json.exception.type_error.302] type must be string, but is number", json::type_error);
|
CHECK_THROWS_WITH_AS(s = j.get<std::string>(), "[json.exception.type_error.302] type must be string, but is number", json::type_error);
|
||||||
}
|
}
|
||||||
@ -240,7 +240,7 @@ TEST_CASE("Regression tests for extended diagnostics")
|
|||||||
j_arr[5] = 5;
|
j_arr[5] = 5;
|
||||||
j_arr[6] = 6;
|
j_arr[6] = 6;
|
||||||
j_arr[7] = 7;
|
j_arr[7] = 7;
|
||||||
json j_arr_copy = j_arr;
|
json const j_arr_copy = j_arr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,13 +274,13 @@ TEST_CASE("element access 1")
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::iterator it2 = jarray.erase(jarray.begin());
|
json::iterator const it2 = jarray.erase(jarray.begin());
|
||||||
CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(1u));
|
CHECK(*it2 == json(1u));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::const_iterator it2 = jarray.erase(jarray.cbegin());
|
json::const_iterator const it2 = jarray.erase(jarray.cbegin());
|
||||||
CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(1u));
|
CHECK(*it2 == json(1u));
|
||||||
}
|
}
|
||||||
@ -306,13 +306,13 @@ TEST_CASE("element access 1")
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::iterator it2 = jarray.erase(jarray.begin(), jarray.begin());
|
json::iterator const it2 = jarray.erase(jarray.begin(), jarray.begin());
|
||||||
CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(1));
|
CHECK(*it2 == json(1));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::const_iterator it2 = jarray.erase(jarray.cbegin(), jarray.cbegin());
|
json::const_iterator const it2 = jarray.erase(jarray.cbegin(), jarray.cbegin());
|
||||||
CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(1));
|
CHECK(*it2 == json(1));
|
||||||
}
|
}
|
||||||
@ -322,15 +322,15 @@ TEST_CASE("element access 1")
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::iterator it = jarray.begin() + 4;
|
json::iterator const it = jarray.begin() + 4;
|
||||||
json::iterator it2 = jarray.erase(it);
|
json::iterator const it2 = jarray.erase(it);
|
||||||
CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(42.23));
|
CHECK(*it2 == json(42.23));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::const_iterator it = jarray.cbegin() + 4;
|
json::const_iterator const it = jarray.cbegin() + 4;
|
||||||
json::const_iterator it2 = jarray.erase(it);
|
json::const_iterator const it2 = jarray.erase(it);
|
||||||
CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, nullptr, 42.23, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json(42.23));
|
CHECK(*it2 == json(42.23));
|
||||||
}
|
}
|
||||||
@ -340,13 +340,13 @@ TEST_CASE("element access 1")
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::iterator it2 = jarray.erase(jarray.begin() + 3, jarray.begin() + 6);
|
json::iterator const it2 = jarray.erase(jarray.begin() + 3, jarray.begin() + 6);
|
||||||
CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json::object());
|
CHECK(*it2 == json::object());
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json::const_iterator it2 = jarray.erase(jarray.cbegin() + 3, jarray.cbegin() + 6);
|
json::const_iterator const it2 = jarray.erase(jarray.cbegin() + 3, jarray.cbegin() + 6);
|
||||||
CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
|
CHECK(jarray == json({1, 1u, true, json::object(), {1, 2, 3}}));
|
||||||
CHECK(*it2 == json::object());
|
CHECK(*it2 == json::object());
|
||||||
}
|
}
|
||||||
@ -369,7 +369,7 @@ TEST_CASE("element access 1")
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
json jarray = {1, 1u, true, nullptr, "string", 42.23, json::object(), {1, 2, 3}};
|
||||||
json jarray2 = {"foo", "bar"};
|
json const jarray2 = {"foo", "bar"};
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(jarray.erase(jarray2.cbegin()),
|
CHECK_THROWS_WITH_AS(jarray.erase(jarray2.cbegin()),
|
||||||
"[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&);
|
"[json.exception.invalid_iterator.202] iterator does not fit current value", json::invalid_iterator&);
|
||||||
|
@ -469,7 +469,7 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
|
|||||||
}
|
}
|
||||||
#ifdef JSON_HAS_CPP_17
|
#ifdef JSON_HAS_CPP_17
|
||||||
{
|
{
|
||||||
std::string_view key = "key";
|
std::string_view const key = "key";
|
||||||
Json j_null;
|
Json j_null;
|
||||||
CHECK(j_null.is_null());
|
CHECK(j_null.is_null());
|
||||||
j_null[key] = 1;
|
j_null[key] = 1;
|
||||||
@ -833,13 +833,13 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::iterator it2 = jobject.erase(jobject.begin());
|
typename Json::iterator const it2 = jobject.erase(jobject.begin());
|
||||||
CHECK(jobject == Json({{"b", 1}, {"c", 17u}}));
|
CHECK(jobject == Json({{"b", 1}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json(1));
|
CHECK(*it2 == Json(1));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::const_iterator it2 = jobject.erase(jobject.cbegin());
|
typename Json::const_iterator const it2 = jobject.erase(jobject.cbegin());
|
||||||
CHECK(jobject == Json({{"b", 1}, {"c", 17u}}));
|
CHECK(jobject == Json({{"b", 1}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json(1));
|
CHECK(*it2 == Json(1));
|
||||||
}
|
}
|
||||||
@ -865,13 +865,13 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::iterator it2 = jobject.erase(jobject.begin(), jobject.begin());
|
typename Json::iterator const it2 = jobject.erase(jobject.begin(), jobject.begin());
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"b", 1}, {"c", 17u}}));
|
CHECK(jobject == Json({{"a", "a"}, {"b", 1}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json("a"));
|
CHECK(*it2 == Json("a"));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::const_iterator it2 = jobject.erase(jobject.cbegin(), jobject.cbegin());
|
typename Json::const_iterator const it2 = jobject.erase(jobject.cbegin(), jobject.cbegin());
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"b", 1}, {"c", 17u}}));
|
CHECK(jobject == Json({{"a", "a"}, {"b", 1}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json("a"));
|
CHECK(*it2 == Json("a"));
|
||||||
}
|
}
|
||||||
@ -881,15 +881,15 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::iterator it = jobject.find("b");
|
typename Json::iterator const it = jobject.find("b");
|
||||||
typename Json::iterator it2 = jobject.erase(it);
|
typename Json::iterator const it2 = jobject.erase(it);
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"c", 17u}}));
|
CHECK(jobject == Json({{"a", "a"}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json(17));
|
CHECK(*it2 == Json(17));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}};
|
||||||
typename Json::const_iterator it = jobject.find("b");
|
typename Json::const_iterator const it = jobject.find("b");
|
||||||
typename Json::const_iterator it2 = jobject.erase(it);
|
typename Json::const_iterator const it2 = jobject.erase(it);
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"c", 17u}}));
|
CHECK(jobject == Json({{"a", "a"}, {"c", 17u}}));
|
||||||
CHECK(*it2 == Json(17));
|
CHECK(*it2 == Json(17));
|
||||||
}
|
}
|
||||||
@ -899,13 +899,13 @@ TEST_CASE_TEMPLATE("element access 2", Json, nlohmann::json, nlohmann::ordered_j
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}};
|
||||||
typename Json::iterator it2 = jobject.erase(jobject.find("b"), jobject.find("e"));
|
typename Json::iterator const it2 = jobject.erase(jobject.find("b"), jobject.find("e"));
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"e", true}}));
|
CHECK(jobject == Json({{"a", "a"}, {"e", true}}));
|
||||||
CHECK(*it2 == Json(true));
|
CHECK(*it2 == Json(true));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}};
|
Json jobject = {{"a", "a"}, {"b", 1}, {"c", 17u}, {"d", false}, {"e", true}};
|
||||||
typename Json::const_iterator it2 = jobject.erase(jobject.find("b"), jobject.find("e"));
|
typename Json::const_iterator const it2 = jobject.erase(jobject.find("b"), jobject.find("e"));
|
||||||
CHECK(jobject == Json({{"a", "a"}, {"e", true}}));
|
CHECK(jobject == Json({{"a", "a"}, {"e", true}}));
|
||||||
CHECK(*it2 == Json(true));
|
CHECK(*it2 == Json(true));
|
||||||
}
|
}
|
||||||
@ -1509,7 +1509,7 @@ TEST_CASE_TEMPLATE("element access 2 (additional value() tests)", Json, nlohmann
|
|||||||
|
|
||||||
const char* cpstr = "default";
|
const char* cpstr = "default";
|
||||||
const char castr[] = "default"; // NOLINT(hicpp-avoid-c-arrays,modernize-avoid-c-arrays,cppcoreguidelines-avoid-c-arrays)
|
const char castr[] = "default"; // NOLINT(hicpp-avoid-c-arrays,modernize-avoid-c-arrays,cppcoreguidelines-avoid-c-arrays)
|
||||||
string_t str = "default";
|
string_t const str = "default";
|
||||||
|
|
||||||
number_integer_t integer = 69;
|
number_integer_t integer = 69;
|
||||||
std::size_t size = 69;
|
std::size_t size = 69;
|
||||||
@ -1592,9 +1592,9 @@ TEST_CASE_TEMPLATE("element access 2 (additional value() tests)", Json, nlohmann
|
|||||||
|
|
||||||
SECTION("string_t/object_t::key_type key")
|
SECTION("string_t/object_t::key_type key")
|
||||||
{
|
{
|
||||||
string_t key = "foo";
|
string_t const key = "foo";
|
||||||
string_t key2 = "baz";
|
string_t const key2 = "baz";
|
||||||
string_t key_notfound = "bar";
|
string_t const key_notfound = "bar";
|
||||||
|
|
||||||
CHECK(j.value(key, "default") == "bar");
|
CHECK(j.value(key, "default") == "bar");
|
||||||
CHECK(j.value(key, cpstr) == "bar");
|
CHECK(j.value(key, cpstr) == "bar");
|
||||||
@ -1618,9 +1618,9 @@ TEST_CASE_TEMPLATE("element access 2 (additional value() tests)", Json, nlohmann
|
|||||||
#ifdef JSON_HAS_CPP_17
|
#ifdef JSON_HAS_CPP_17
|
||||||
SECTION("std::string_view key")
|
SECTION("std::string_view key")
|
||||||
{
|
{
|
||||||
std::string_view key = "foo";
|
std::string_view const key = "foo";
|
||||||
std::string_view key2 = "baz";
|
std::string_view const key2 = "baz";
|
||||||
std::string_view key_notfound = "bar";
|
std::string_view const key_notfound = "bar";
|
||||||
|
|
||||||
CHECK(j.value(key, "default") == "bar");
|
CHECK(j.value(key, "default") == "bar");
|
||||||
CHECK(j.value(key, cpstr) == "bar");
|
CHECK(j.value(key, cpstr) == "bar");
|
||||||
@ -1730,9 +1730,9 @@ TEST_CASE_TEMPLATE("element access 2 (additional value() tests)", Json, nlohmann
|
|||||||
|
|
||||||
SECTION("string_t/object_t::key_type key")
|
SECTION("string_t/object_t::key_type key")
|
||||||
{
|
{
|
||||||
string_t key = "foo";
|
string_t const key = "foo";
|
||||||
string_t key2 = "baz";
|
string_t const key2 = "baz";
|
||||||
string_t key_notfound = "bar";
|
string_t const key_notfound = "bar";
|
||||||
|
|
||||||
CHECK(j.template value<string_t>(key, "default") == "bar");
|
CHECK(j.template value<string_t>(key, "default") == "bar");
|
||||||
CHECK(j.template value<string_t>(key, cpstr) == "bar");
|
CHECK(j.template value<string_t>(key, cpstr) == "bar");
|
||||||
@ -1756,9 +1756,9 @@ TEST_CASE_TEMPLATE("element access 2 (additional value() tests)", Json, nlohmann
|
|||||||
#ifdef JSON_HAS_CPP_17
|
#ifdef JSON_HAS_CPP_17
|
||||||
SECTION("std::string_view key")
|
SECTION("std::string_view key")
|
||||||
{
|
{
|
||||||
std::string_view key = "foo";
|
std::string_view const key = "foo";
|
||||||
std::string_view key2 = "baz";
|
std::string_view const key2 = "baz";
|
||||||
std::string_view key_notfound = "bar";
|
std::string_view const key_notfound = "bar";
|
||||||
|
|
||||||
CHECK(j.template value<string_t>(key, "default") == "bar");
|
CHECK(j.template value<string_t>(key, "default") == "bar");
|
||||||
CHECK(j.template value<string_t>(key, cpstr) == "bar");
|
CHECK(j.template value<string_t>(key, cpstr) == "bar");
|
||||||
|
@ -21,7 +21,7 @@ TEST_CASE("object inspection")
|
|||||||
{
|
{
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j {{"foo", 1}, {"bar", false}};
|
json const j {{"foo", 1}, {"bar", false}};
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -39,7 +39,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j {"foo", 1, 1u, 42.23, false};
|
json const j {"foo", 1, 1u, 42.23, false};
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -57,7 +57,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j(nullptr);
|
json const j(nullptr);
|
||||||
CHECK(j.is_null());
|
CHECK(j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -75,7 +75,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j(true);
|
json const j(true);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(j.is_boolean());
|
CHECK(j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -93,7 +93,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j("Hello world");
|
json const j("Hello world");
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -111,7 +111,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j(42);
|
json const j(42);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(j.is_number());
|
CHECK(j.is_number());
|
||||||
@ -129,7 +129,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j(42u);
|
json const j(42u);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(j.is_number());
|
CHECK(j.is_number());
|
||||||
@ -147,7 +147,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("number (floating-point)")
|
SECTION("number (floating-point)")
|
||||||
{
|
{
|
||||||
json j(42.23);
|
json const j(42.23);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(j.is_number());
|
CHECK(j.is_number());
|
||||||
@ -165,7 +165,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("binary")
|
SECTION("binary")
|
||||||
{
|
{
|
||||||
json j(json::value_t::binary);
|
json const j(json::value_t::binary);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -183,7 +183,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
json j(json::value_t::discarded);
|
json const j(json::value_t::discarded);
|
||||||
CHECK(!j.is_null());
|
CHECK(!j.is_null());
|
||||||
CHECK(!j.is_boolean());
|
CHECK(!j.is_boolean());
|
||||||
CHECK(!j.is_number());
|
CHECK(!j.is_number());
|
||||||
@ -202,7 +202,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("serialization")
|
SECTION("serialization")
|
||||||
{
|
{
|
||||||
json j {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} };
|
json const j {{"object", json::object()}, {"array", {1, 2, 3, 4}}, {"number", 42}, {"boolean", false}, {"null", nullptr}, {"string", "Hello world"} };
|
||||||
|
|
||||||
SECTION("no indent / indent=-1")
|
SECTION("no indent / indent=-1")
|
||||||
{
|
{
|
||||||
@ -288,7 +288,7 @@ TEST_CASE("object inspection")
|
|||||||
std::ifstream f_escaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode_ascii.json");
|
std::ifstream f_escaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode_ascii.json");
|
||||||
std::ifstream f_unescaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode.json");
|
std::ifstream f_unescaped(TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode.json");
|
||||||
|
|
||||||
json value = json::parse(f_unescaped);
|
json const value = json::parse(f_unescaped);
|
||||||
std::string text = value.dump(4, ' ', true);
|
std::string text = value.dump(4, ' ', true);
|
||||||
|
|
||||||
std::string expected((std::istreambuf_iterator<char>(f_escaped)),
|
std::string expected((std::istreambuf_iterator<char>(f_escaped)),
|
||||||
@ -299,7 +299,7 @@ TEST_CASE("object inspection")
|
|||||||
|
|
||||||
SECTION("serialization of discarded element")
|
SECTION("serialization of discarded element")
|
||||||
{
|
{
|
||||||
json j_discarded(json::value_t::discarded);
|
json const j_discarded(json::value_t::discarded);
|
||||||
CHECK(j_discarded.dump() == "<discarded>");
|
CHECK(j_discarded.dump() == "<discarded>");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +315,7 @@ TEST_CASE("object inspection")
|
|||||||
ss.str(std::string());
|
ss.str(std::string());
|
||||||
|
|
||||||
// use stringstream for JSON serialization
|
// use stringstream for JSON serialization
|
||||||
json j_number = 3.14159265358979;
|
json const j_number = 3.14159265358979;
|
||||||
ss << j_number;
|
ss << j_number;
|
||||||
|
|
||||||
// check that precision has been overridden during serialization
|
// check that precision has been overridden during serialization
|
||||||
@ -332,9 +332,9 @@ TEST_CASE("object inspection")
|
|||||||
{"3.141592653589793", "1000000000000000010E5"
|
{"3.141592653589793", "1000000000000000010E5"
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
json j1 = json::parse(s);
|
json const j1 = json::parse(s);
|
||||||
std::string s1 = j1.dump();
|
std::string s1 = j1.dump();
|
||||||
json j2 = json::parse(s1);
|
json const j2 = json::parse(s1);
|
||||||
std::string s2 = j2.dump();
|
std::string s2 = j2.dump();
|
||||||
CHECK(s1 == s2);
|
CHECK(s1 == s2);
|
||||||
}
|
}
|
||||||
@ -344,49 +344,49 @@ TEST_CASE("object inspection")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json const j = nullptr;
|
||||||
CHECK(j.type() == json::value_t::null);
|
CHECK(j.type() == json::value_t::null);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j = {{"foo", "bar"}};
|
json const j = {{"foo", "bar"}};
|
||||||
CHECK(j.type() == json::value_t::object);
|
CHECK(j.type() == json::value_t::object);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3, 4};
|
json const j = {1, 2, 3, 4};
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json const j = true;
|
||||||
CHECK(j.type() == json::value_t::boolean);
|
CHECK(j.type() == json::value_t::boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "Hello world";
|
json const j = "Hello world";
|
||||||
CHECK(j.type() == json::value_t::string);
|
CHECK(j.type() == json::value_t::string);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = 23;
|
json const j = 23;
|
||||||
CHECK(j.type() == json::value_t::number_integer);
|
CHECK(j.type() == json::value_t::number_integer);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json const j = 23u;
|
||||||
CHECK(j.type() == json::value_t::number_unsigned);
|
CHECK(j.type() == json::value_t::number_unsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (floating-point)")
|
SECTION("number (floating-point)")
|
||||||
{
|
{
|
||||||
json j = 42.23;
|
json const j = 42.23;
|
||||||
CHECK(j.type() == json::value_t::number_float);
|
CHECK(j.type() == json::value_t::number_float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -395,63 +395,63 @@ TEST_CASE("object inspection")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json const j = nullptr;
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j = {{"foo", "bar"}};
|
json const j = {{"foo", "bar"}};
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3, 4};
|
json const j = {1, 2, 3, 4};
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json const j = true;
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "Hello world";
|
json const j = "Hello world";
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = 23;
|
json const j = 23;
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json const j = 23u;
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number (floating-point)")
|
SECTION("number (floating-point)")
|
||||||
{
|
{
|
||||||
json j = 42.23;
|
json const j = 42.23;
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("binary")
|
SECTION("binary")
|
||||||
{
|
{
|
||||||
json j = json::binary({});
|
json const j = json::binary({});
|
||||||
json::value_t t = j;
|
json::value_t t = j;
|
||||||
CHECK(t == j.type());
|
CHECK(t == j.type());
|
||||||
}
|
}
|
||||||
|
@ -35,13 +35,13 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("4.1 add")
|
SECTION("4.1 add")
|
||||||
{
|
{
|
||||||
json patch1 = R"([{ "op": "add", "path": "/a/b", "value": [ "foo", "bar" ] }])"_json;
|
json const patch1 = R"([{ "op": "add", "path": "/a/b", "value": [ "foo", "bar" ] }])"_json;
|
||||||
|
|
||||||
// However, the object itself or an array containing it does need
|
// However, the object itself or an array containing it does need
|
||||||
// to exist, and it remains an error for that not to be the case.
|
// to exist, and it remains an error for that not to be the case.
|
||||||
// For example, an "add" with a target location of "/a/b" starting
|
// For example, an "add" with a target location of "/a/b" starting
|
||||||
// with this document
|
// with this document
|
||||||
json doc1 = R"({ "a": { "foo": 1 } })"_json;
|
json const doc1 = R"({ "a": { "foo": 1 } })"_json;
|
||||||
|
|
||||||
// is not an error, because "a" exists, and "b" will be added to
|
// is not an error, because "a" exists, and "b" will be added to
|
||||||
// its value.
|
// its value.
|
||||||
@ -57,13 +57,13 @@ TEST_CASE("JSON patch")
|
|||||||
CHECK(doc1.patch(patch1) == doc1_ans);
|
CHECK(doc1.patch(patch1) == doc1_ans);
|
||||||
|
|
||||||
// It is an error in this document:
|
// It is an error in this document:
|
||||||
json doc2 = R"({ "q": { "bar": 2 } })"_json;
|
json const doc2 = R"({ "q": { "bar": 2 } })"_json;
|
||||||
|
|
||||||
// because "a" does not exist.
|
// because "a" does not exist.
|
||||||
CHECK_THROWS_WITH_AS(doc2.patch(patch1), "[json.exception.out_of_range.403] key 'a' not found", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(doc2.patch(patch1), "[json.exception.out_of_range.403] key 'a' not found", json::out_of_range&);
|
||||||
|
|
||||||
json doc3 = R"({ "a": {} })"_json;
|
json const doc3 = R"({ "a": {} })"_json;
|
||||||
json patch2 = R"([{ "op": "add", "path": "/a/b/c", "value": 1 }])"_json;
|
json const patch2 = R"([{ "op": "add", "path": "/a/b/c", "value": 1 }])"_json;
|
||||||
|
|
||||||
// should cause an error because "b" does not exist in doc3
|
// should cause an error because "b" does not exist in doc3
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
@ -77,20 +77,20 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
// If removing an element from an array, any elements above the
|
// If removing an element from an array, any elements above the
|
||||||
// specified index are shifted one position to the left.
|
// specified index are shifted one position to the left.
|
||||||
json doc = {1, 2, 3, 4};
|
json const doc = {1, 2, 3, 4};
|
||||||
json patch = {{{"op", "remove"}, {"path", "/1"}}};
|
json const patch = {{{"op", "remove"}, {"path", "/1"}}};
|
||||||
CHECK(doc.patch(patch) == json({1, 3, 4}));
|
CHECK(doc.patch(patch) == json({1, 3, 4}));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("A.1. Adding an Object Member")
|
SECTION("A.1. Adding an Object Member")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": "bar"}
|
{ "foo": "bar"}
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/baz", "value": "qux" }
|
{ "op": "add", "path": "/baz", "value": "qux" }
|
||||||
]
|
]
|
||||||
@ -114,12 +114,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.2. Adding an Array Element")
|
SECTION("A.2. Adding an Array Element")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": [ "bar", "baz" ] }
|
{ "foo": [ "bar", "baz" ] }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/foo/1", "value": "qux" }
|
{ "op": "add", "path": "/foo/1", "value": "qux" }
|
||||||
]
|
]
|
||||||
@ -140,7 +140,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.3. Removing an Object Member")
|
SECTION("A.3. Removing an Object Member")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"baz": "qux",
|
"baz": "qux",
|
||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
@ -148,7 +148,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "remove", "path": "/baz" }
|
{ "op": "remove", "path": "/baz" }
|
||||||
]
|
]
|
||||||
@ -169,12 +169,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.4. Removing an Array Element")
|
SECTION("A.4. Removing an Array Element")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": [ "bar", "qux", "baz" ] }
|
{ "foo": [ "bar", "qux", "baz" ] }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "remove", "path": "/foo/1" }
|
{ "op": "remove", "path": "/foo/1" }
|
||||||
]
|
]
|
||||||
@ -195,7 +195,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.5. Replacing a Value")
|
SECTION("A.5. Replacing a Value")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"baz": "qux",
|
"baz": "qux",
|
||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
@ -203,7 +203,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "replace", "path": "/baz", "value": "boo" }
|
{ "op": "replace", "path": "/baz", "value": "boo" }
|
||||||
]
|
]
|
||||||
@ -226,7 +226,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.6. Moving a Value")
|
SECTION("A.6. Moving a Value")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"foo": {
|
"foo": {
|
||||||
"bar": "baz",
|
"bar": "baz",
|
||||||
@ -239,7 +239,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }
|
{ "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }
|
||||||
]
|
]
|
||||||
@ -268,12 +268,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.7. Moving a Value")
|
SECTION("A.7. Moving a Value")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": [ "all", "grass", "cows", "eat" ] }
|
{ "foo": [ "all", "grass", "cows", "eat" ] }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "move", "from": "/foo/1", "path": "/foo/3" }
|
{ "op": "move", "from": "/foo/1", "path": "/foo/3" }
|
||||||
]
|
]
|
||||||
@ -302,7 +302,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document that will result in successful evaluation:
|
// A JSON Patch document that will result in successful evaluation:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "test", "path": "/baz", "value": "qux" },
|
{ "op": "test", "path": "/baz", "value": "qux" },
|
||||||
{ "op": "test", "path": "/foo/1", "value": 2 }
|
{ "op": "test", "path": "/foo/1", "value": 2 }
|
||||||
@ -318,7 +318,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.9. Testing a Value: Error")
|
SECTION("A.9. Testing a Value: Error")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "baz": "qux" }
|
{ "baz": "qux" }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
@ -341,12 +341,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.10. Adding a Nested Member Object")
|
SECTION("A.10. Adding a Nested Member Object")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": "bar" }
|
{ "foo": "bar" }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/child", "value": { "grandchild": { } } }
|
{ "op": "add", "path": "/child", "value": { "grandchild": { } } }
|
||||||
]
|
]
|
||||||
@ -373,12 +373,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.11. Ignoring Unrecognized Elements")
|
SECTION("A.11. Ignoring Unrecognized Elements")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": "bar" }
|
{ "foo": "bar" }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }
|
{ "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }
|
||||||
]
|
]
|
||||||
@ -401,12 +401,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.12. Adding to a Nonexistent Target")
|
SECTION("A.12. Adding to a Nonexistent Target")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": "bar" }
|
{ "foo": "bar" }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/baz/bat", "value": "qux" }
|
{ "op": "add", "path": "/baz/bat", "value": "qux" }
|
||||||
]
|
]
|
||||||
@ -427,7 +427,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.14. Escape Ordering")
|
SECTION("A.14. Escape Ordering")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"/": 9,
|
"/": 9,
|
||||||
"~1": 10
|
"~1": 10
|
||||||
@ -435,7 +435,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "test", "path": "/~01", "value": 10}
|
{"op": "test", "path": "/~01", "value": 10}
|
||||||
]
|
]
|
||||||
@ -458,7 +458,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.15. Comparing Strings and Numbers")
|
SECTION("A.15. Comparing Strings and Numbers")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"/": 9,
|
"/": 9,
|
||||||
"~1": 10
|
"~1": 10
|
||||||
@ -484,12 +484,12 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("A.16. Adding an Array Value")
|
SECTION("A.16. Adding an Array Value")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{ "foo": ["bar"] }
|
{ "foo": ["bar"] }
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/foo/-", "value": ["abc", "def"] }
|
{ "op": "add", "path": "/foo/-", "value": ["abc", "def"] }
|
||||||
]
|
]
|
||||||
@ -519,10 +519,10 @@ TEST_CASE("JSON patch")
|
|||||||
// document.
|
// document.
|
||||||
|
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = 17;
|
json const doc = 17;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "", "value": [1,2,3] }
|
{ "op": "add", "path": "", "value": [1,2,3] }
|
||||||
]
|
]
|
||||||
@ -545,10 +545,10 @@ TEST_CASE("JSON patch")
|
|||||||
// exactly the number of elements in the array which is legal.
|
// exactly the number of elements in the array which is legal.
|
||||||
|
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = {0, 1, 2};
|
json const doc = {0, 1, 2};
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "add", "path": "/3", "value": 3 }
|
{ "op": "add", "path": "/3", "value": 3 }
|
||||||
]
|
]
|
||||||
@ -568,7 +568,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("copy")
|
SECTION("copy")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"foo": {
|
"foo": {
|
||||||
"bar": "baz",
|
"bar": "baz",
|
||||||
@ -581,7 +581,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// A JSON Patch document:
|
// A JSON Patch document:
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "copy", "from": "/foo/waldo", "path": "/qux/thud" }
|
{ "op": "copy", "from": "/foo/waldo", "path": "/qux/thud" }
|
||||||
]
|
]
|
||||||
@ -610,8 +610,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("replace")
|
SECTION("replace")
|
||||||
{
|
{
|
||||||
json j = "string";
|
json const j = "string";
|
||||||
json patch = {{{"op", "replace"}, {"path", ""}, {"value", 1}}};
|
json const patch = {{{"op", "replace"}, {"path", ""}, {"value", 1}}};
|
||||||
CHECK(j.patch(patch) == json(1));
|
CHECK(j.patch(patch) == json(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,12 +619,12 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
// a JSON patch
|
// a JSON patch
|
||||||
json p1 = R"(
|
json const p1 = R"(
|
||||||
[{"op": "add", "path": "/GB", "value": "London"}]
|
[{"op": "add", "path": "/GB", "value": "London"}]
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// a JSON value
|
// a JSON value
|
||||||
json source = R"(
|
json const source = R"(
|
||||||
{"D": "Berlin", "F": "Paris"}
|
{"D": "Berlin", "F": "Paris"}
|
||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
@ -665,15 +665,15 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("not an array")
|
SECTION("not an array")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{"op", "add"}, {"path", ""}, {"value", 1}};
|
json const patch = {{"op", "add"}, {"path", ""}, {"value", 1}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.104] parse error: JSON patch must be an array of objects", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.104] parse error: JSON patch must be an array of objects", json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("not an array of objects")
|
SECTION("not an array of objects")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {"op", "add", "path", "", "value", 1};
|
json const patch = {"op", "add", "path", "", "value", 1};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.104] parse error: (/0) JSON patch must be an array of objects", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.104] parse error: (/0) JSON patch must be an array of objects", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -683,8 +683,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'op'")
|
SECTION("missing 'op'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"foo", "bar"}}};
|
json const patch = {{{"foo", "bar"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation must have member 'op'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation must have member 'op'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -694,8 +694,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'op'")
|
SECTION("non-string 'op'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", 1}}};
|
json const patch = {{{"op", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation must have string member 'op'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation must have string member 'op'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -705,8 +705,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("invalid operation")
|
SECTION("invalid operation")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "foo"}, {"path", ""}}};
|
json const patch = {{{"op", "foo"}, {"path", ""}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation value 'foo' is invalid", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation value 'foo' is invalid", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -719,8 +719,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "add"}}};
|
json const patch = {{{"op", "add"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -730,8 +730,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "add"}, {"path", 1}}};
|
json const patch = {{{"op", "add"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -741,8 +741,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'value'")
|
SECTION("missing 'value'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "add"}, {"path", ""}}};
|
json const patch = {{{"op", "add"}, {"path", ""}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have member 'value'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'add' must have member 'value'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -752,8 +752,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("invalid array index")
|
SECTION("invalid array index")
|
||||||
{
|
{
|
||||||
json j = {1, 2};
|
json const j = {1, 2};
|
||||||
json patch = {{{"op", "add"}, {"path", "/4"}, {"value", 4}}};
|
json const patch = {{{"op", "add"}, {"path", "/4"}, {"value", 4}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 4 is out of range", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 4 is out of range", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -762,8 +762,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "remove"}}};
|
json const patch = {{{"op", "remove"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'remove' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'remove' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -773,8 +773,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "remove"}, {"path", 1}}};
|
json const patch = {{{"op", "remove"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'remove' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'remove' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -784,22 +784,22 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("nonexisting target location (array)")
|
SECTION("nonexisting target location (array)")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json const j = {1, 2, 3};
|
||||||
json patch = {{{"op", "remove"}, {"path", "/17"}}};
|
json const patch = {{{"op", "remove"}, {"path", "/17"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 17 is out of range", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 17 is out of range", json::out_of_range&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nonexisting target location (object)")
|
SECTION("nonexisting target location (object)")
|
||||||
{
|
{
|
||||||
json j = {{"foo", 1}, {"bar", 2}};
|
json const j = {{"foo", 1}, {"bar", 2}};
|
||||||
json patch = {{{"op", "remove"}, {"path", "/baz"}}};
|
json const patch = {{{"op", "remove"}, {"path", "/baz"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("root element as target location")
|
SECTION("root element as target location")
|
||||||
{
|
{
|
||||||
json j = "string";
|
json const j = "string";
|
||||||
json patch = {{{"op", "remove"}, {"path", ""}}};
|
json const patch = {{{"op", "remove"}, {"path", ""}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.405] JSON pointer has no parent", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.405] JSON pointer has no parent", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -808,8 +808,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "replace"}}};
|
json const patch = {{{"op", "replace"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -819,8 +819,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "replace"}, {"path", 1}}};
|
json const patch = {{{"op", "replace"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -830,8 +830,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'value'")
|
SECTION("missing 'value'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "replace"}, {"path", ""}}};
|
json const patch = {{{"op", "replace"}, {"path", ""}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have member 'value'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'replace' must have member 'value'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -841,15 +841,15 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("nonexisting target location (array)")
|
SECTION("nonexisting target location (array)")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json const j = {1, 2, 3};
|
||||||
json patch = {{{"op", "replace"}, {"path", "/17"}, {"value", 19}}};
|
json const patch = {{{"op", "replace"}, {"path", "/17"}, {"value", 19}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 17 is out of range", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 17 is out of range", json::out_of_range&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nonexisting target location (object)")
|
SECTION("nonexisting target location (object)")
|
||||||
{
|
{
|
||||||
json j = {{"foo", 1}, {"bar", 2}};
|
json const j = {{"foo", 1}, {"bar", 2}};
|
||||||
json patch = {{{"op", "replace"}, {"path", "/baz"}, {"value", 3}}};
|
json const patch = {{{"op", "replace"}, {"path", "/baz"}, {"value", 3}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -858,8 +858,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "move"}}};
|
json const patch = {{{"op", "move"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -869,8 +869,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "move"}, {"path", 1}}};
|
json const patch = {{{"op", "move"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -880,8 +880,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'from'")
|
SECTION("missing 'from'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "move"}, {"path", ""}}};
|
json const patch = {{{"op", "move"}, {"path", ""}}};
|
||||||
CHECK_THROWS_AS(j.patch(patch), json::parse_error&);
|
CHECK_THROWS_AS(j.patch(patch), json::parse_error&);
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have member 'from'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have member 'from'", json::parse_error&);
|
||||||
@ -892,8 +892,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'from'")
|
SECTION("non-string 'from'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}};
|
json const patch = {{{"op", "move"}, {"path", ""}, {"from", 1}}};
|
||||||
CHECK_THROWS_AS(j.patch(patch), json::parse_error&);
|
CHECK_THROWS_AS(j.patch(patch), json::parse_error&);
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have string member 'from'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'move' must have string member 'from'", json::parse_error&);
|
||||||
@ -904,15 +904,15 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("nonexisting from location (array)")
|
SECTION("nonexisting from location (array)")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json const j = {1, 2, 3};
|
||||||
json patch = {{{"op", "move"}, {"path", "/0"}, {"from", "/5"}}};
|
json const patch = {{{"op", "move"}, {"path", "/0"}, {"from", "/5"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 5 is out of range", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 5 is out of range", json::out_of_range&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nonexisting from location (object)")
|
SECTION("nonexisting from location (object)")
|
||||||
{
|
{
|
||||||
json j = {{"foo", 1}, {"bar", 2}};
|
json const j = {{"foo", 1}, {"bar", 2}};
|
||||||
json patch = {{{"op", "move"}, {"path", "/baz"}, {"from", "/baz"}}};
|
json const patch = {{{"op", "move"}, {"path", "/baz"}, {"from", "/baz"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -921,8 +921,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "copy"}}};
|
json const patch = {{{"op", "copy"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -932,8 +932,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "copy"}, {"path", 1}}};
|
json const patch = {{{"op", "copy"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -943,8 +943,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'from'")
|
SECTION("missing 'from'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "copy"}, {"path", ""}}};
|
json const patch = {{{"op", "copy"}, {"path", ""}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have member 'from'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have member 'from'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -954,8 +954,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'from'")
|
SECTION("non-string 'from'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}};
|
json const patch = {{{"op", "copy"}, {"path", ""}, {"from", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have string member 'from'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'copy' must have string member 'from'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -965,15 +965,15 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("nonexisting from location (array)")
|
SECTION("nonexisting from location (array)")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json const j = {1, 2, 3};
|
||||||
json patch = {{{"op", "copy"}, {"path", "/0"}, {"from", "/5"}}};
|
json const patch = {{{"op", "copy"}, {"path", "/0"}, {"from", "/5"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 5 is out of range", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.401] array index 5 is out of range", json::out_of_range&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("nonexisting from location (object)")
|
SECTION("nonexisting from location (object)")
|
||||||
{
|
{
|
||||||
json j = {{"foo", 1}, {"bar", 2}};
|
json const j = {{"foo", 1}, {"bar", 2}};
|
||||||
json patch = {{{"op", "copy"}, {"path", "/fob"}, {"from", "/baz"}}};
|
json const patch = {{{"op", "copy"}, {"path", "/fob"}, {"from", "/baz"}}};
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.out_of_range.403] key 'baz' not found", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -982,8 +982,8 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
SECTION("missing 'path'")
|
SECTION("missing 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "test"}}};
|
json const patch = {{{"op", "test"}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -993,8 +993,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("non-string 'path'")
|
SECTION("non-string 'path'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "test"}, {"path", 1}}};
|
json const patch = {{{"op", "test"}, {"path", 1}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have string member 'path'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have string member 'path'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -1004,8 +1004,8 @@ TEST_CASE("JSON patch")
|
|||||||
|
|
||||||
SECTION("missing 'value'")
|
SECTION("missing 'value'")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
json patch = {{{"op", "test"}, {"path", ""}}};
|
json const patch = {{{"op", "test"}, {"path", ""}}};
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have member 'value'", json::parse_error&);
|
CHECK_THROWS_WITH_AS(j.patch(patch), "[json.exception.parse_error.105] parse error: (/0) operation 'test' must have member 'value'", json::parse_error&);
|
||||||
#else
|
#else
|
||||||
@ -1020,7 +1020,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("Simple Example")
|
SECTION("Simple Example")
|
||||||
{
|
{
|
||||||
// The original document
|
// The original document
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"baz": "qux",
|
"baz": "qux",
|
||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
@ -1028,7 +1028,7 @@ TEST_CASE("JSON patch")
|
|||||||
)"_json;
|
)"_json;
|
||||||
|
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{ "op": "replace", "path": "/baz", "value": "boo" },
|
{ "op": "replace", "path": "/baz", "value": "boo" },
|
||||||
{ "op": "add", "path": "/hello", "value": ["world"] },
|
{ "op": "add", "path": "/hello", "value": ["world"] },
|
||||||
@ -1054,7 +1054,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("Operations")
|
SECTION("Operations")
|
||||||
{
|
{
|
||||||
// The original document
|
// The original document
|
||||||
json doc = R"(
|
json const doc = R"(
|
||||||
{
|
{
|
||||||
"biscuits": [
|
"biscuits": [
|
||||||
{"name":"Digestive"},
|
{"name":"Digestive"},
|
||||||
@ -1066,7 +1066,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("add")
|
SECTION("add")
|
||||||
{
|
{
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "add", "path": "/biscuits/1", "value": {"name": "Ginger Nut"}}
|
{"op": "add", "path": "/biscuits/1", "value": {"name": "Ginger Nut"}}
|
||||||
]
|
]
|
||||||
@ -1093,7 +1093,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("remove")
|
SECTION("remove")
|
||||||
{
|
{
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "remove", "path": "/biscuits"}
|
{"op": "remove", "path": "/biscuits"}
|
||||||
]
|
]
|
||||||
@ -1114,7 +1114,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("replace")
|
SECTION("replace")
|
||||||
{
|
{
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "replace", "path": "/biscuits/0/name", "value": "Chocolate Digestive"}
|
{"op": "replace", "path": "/biscuits/0/name", "value": "Chocolate Digestive"}
|
||||||
]
|
]
|
||||||
@ -1140,7 +1140,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("copy")
|
SECTION("copy")
|
||||||
{
|
{
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "copy", "from": "/biscuits/0", "path": "/best_biscuit"}
|
{"op": "copy", "from": "/biscuits/0", "path": "/best_biscuit"}
|
||||||
]
|
]
|
||||||
@ -1169,7 +1169,7 @@ TEST_CASE("JSON patch")
|
|||||||
SECTION("move")
|
SECTION("move")
|
||||||
{
|
{
|
||||||
// The patch
|
// The patch
|
||||||
json patch = R"(
|
json const patch = R"(
|
||||||
[
|
[
|
||||||
{"op": "move", "from": "/biscuits", "path": "/cookies"}
|
{"op": "move", "from": "/biscuits", "path": "/cookies"}
|
||||||
]
|
]
|
||||||
@ -1290,7 +1290,7 @@ TEST_CASE("JSON patch")
|
|||||||
{
|
{
|
||||||
CAPTURE(filename)
|
CAPTURE(filename)
|
||||||
std::ifstream f(filename);
|
std::ifstream f(filename);
|
||||||
json suite = json::parse(f);
|
json const suite = json::parse(f);
|
||||||
|
|
||||||
for (const auto& test : suite)
|
for (const auto& test : suite)
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@ TEST_CASE("JSON pointers")
|
|||||||
SECTION("array index error")
|
SECTION("array index error")
|
||||||
{
|
{
|
||||||
json v = {1, 2, 3, 4};
|
json v = {1, 2, 3, 4};
|
||||||
json::json_pointer ptr("/10e");
|
json::json_pointer const ptr("/10e");
|
||||||
CHECK_THROWS_WITH_AS(v[ptr],
|
CHECK_THROWS_WITH_AS(v[ptr],
|
||||||
"[json.exception.out_of_range.404] unresolved reference token '10e'", json::out_of_range&);
|
"[json.exception.out_of_range.404] unresolved reference token '10e'", json::out_of_range&);
|
||||||
}
|
}
|
||||||
@ -311,8 +311,8 @@ TEST_CASE("JSON pointers")
|
|||||||
|
|
||||||
{
|
{
|
||||||
auto too_large_index = std::to_string((std::numeric_limits<unsigned long long>::max)()) + "1";
|
auto too_large_index = std::to_string((std::numeric_limits<unsigned long long>::max)()) + "1";
|
||||||
json::json_pointer jp(std::string("/") + too_large_index);
|
json::json_pointer const jp(std::string("/") + too_large_index);
|
||||||
std::string throw_msg = std::string("[json.exception.out_of_range.404] unresolved reference token '") + too_large_index + "'";
|
std::string const throw_msg = std::string("[json.exception.out_of_range.404] unresolved reference token '") + too_large_index + "'";
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j[jp] = 1, throw_msg.c_str(), json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j[jp] = 1, throw_msg.c_str(), json::out_of_range&);
|
||||||
CHECK_THROWS_WITH_AS(j_const[jp] == 1, throw_msg.c_str(), json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j_const[jp] == 1, throw_msg.c_str(), json::out_of_range&);
|
||||||
@ -326,8 +326,8 @@ TEST_CASE("JSON pointers")
|
|||||||
{
|
{
|
||||||
auto size_type_max_uul = static_cast<unsigned long long>((std::numeric_limits<json::size_type>::max)());
|
auto size_type_max_uul = static_cast<unsigned long long>((std::numeric_limits<json::size_type>::max)());
|
||||||
auto too_large_index = std::to_string(size_type_max_uul);
|
auto too_large_index = std::to_string(size_type_max_uul);
|
||||||
json::json_pointer jp(std::string("/") + too_large_index);
|
json::json_pointer const jp(std::string("/") + too_large_index);
|
||||||
std::string throw_msg = std::string("[json.exception.out_of_range.410] array index ") + too_large_index + " exceeds size_type";
|
std::string const throw_msg = std::string("[json.exception.out_of_range.410] array index ") + too_large_index + " exceeds size_type";
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j[jp] = 1, throw_msg.c_str(), json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j[jp] = 1, throw_msg.c_str(), json::out_of_range&);
|
||||||
CHECK_THROWS_WITH_AS(j_const[jp] == 1, throw_msg.c_str(), json::out_of_range&);
|
CHECK_THROWS_WITH_AS(j_const[jp] == 1, throw_msg.c_str(), json::out_of_range&);
|
||||||
@ -455,7 +455,7 @@ TEST_CASE("JSON pointers")
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// error for conflicting values
|
// error for conflicting values
|
||||||
json j_error = {{"", 42}, {"/foo", 17}};
|
json const j_error = {{"", 42}, {"/foo", 17}};
|
||||||
CHECK_THROWS_WITH_AS(j_error.unflatten(),
|
CHECK_THROWS_WITH_AS(j_error.unflatten(),
|
||||||
"[json.exception.type_error.313] invalid value to unflatten", json::type_error&);
|
"[json.exception.type_error.313] invalid value to unflatten", json::type_error&);
|
||||||
|
|
||||||
@ -473,9 +473,9 @@ TEST_CASE("JSON pointers")
|
|||||||
CHECK(j_string.flatten().unflatten() == j_string);
|
CHECK(j_string.flatten().unflatten() == j_string);
|
||||||
|
|
||||||
// roundtrip for empty structured values (will be unflattened to null)
|
// roundtrip for empty structured values (will be unflattened to null)
|
||||||
json j_array(json::value_t::array);
|
json const j_array(json::value_t::array);
|
||||||
CHECK(j_array.flatten().unflatten() == json());
|
CHECK(j_array.flatten().unflatten() == json());
|
||||||
json j_object(json::value_t::object);
|
json const j_object(json::value_t::object);
|
||||||
CHECK(j_object.flatten().unflatten() == json());
|
CHECK(j_object.flatten().unflatten() == json());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ TEST_CASE("JSON pointers")
|
|||||||
{"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n"
|
{"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n"
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
json::json_pointer ptr(ptr_str);
|
json::json_pointer const ptr(ptr_str);
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << ptr;
|
ss << ptr;
|
||||||
CHECK(ptr.to_string() == ptr_str);
|
CHECK(ptr.to_string() == ptr_str);
|
||||||
@ -742,7 +742,7 @@ TEST_CASE("JSON pointers")
|
|||||||
CHECK(std::is_same<json_ptr_str::string_t, json_ptr_j::string_t>::value);
|
CHECK(std::is_same<json_ptr_str::string_t, json_ptr_j::string_t>::value);
|
||||||
CHECK(std::is_same<json_ptr_str::string_t, json_ptr_oj::string_t>::value);
|
CHECK(std::is_same<json_ptr_str::string_t, json_ptr_oj::string_t>::value);
|
||||||
|
|
||||||
std::string ptr_string{"/foo/0"};
|
std::string const ptr_string{"/foo/0"};
|
||||||
json_ptr_str ptr{ptr_string};
|
json_ptr_str ptr{ptr_string};
|
||||||
json_ptr_j ptr_j{ptr_string};
|
json_ptr_j ptr_j{ptr_string};
|
||||||
json_ptr_oj ptr_oj{ptr_string};
|
json_ptr_oj ptr_oj{ptr_string};
|
||||||
|
@ -28,7 +28,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
}
|
}
|
||||||
})"_json;
|
})"_json;
|
||||||
|
|
||||||
json patch = R"({
|
json const patch = R"({
|
||||||
"a": "z",
|
"a": "z",
|
||||||
"c": {
|
"c": {
|
||||||
"f": null
|
"f": null
|
||||||
@ -61,7 +61,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
"content": "This will be unchanged"
|
"content": "This will be unchanged"
|
||||||
})"_json;
|
})"_json;
|
||||||
|
|
||||||
json patch = R"({
|
json const patch = R"({
|
||||||
"title": "Hello!",
|
"title": "Hello!",
|
||||||
"phoneNumber": "+01-123-456-7890",
|
"phoneNumber": "+01-123-456-7890",
|
||||||
"author": {
|
"author": {
|
||||||
@ -93,7 +93,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 1")
|
SECTION("Example 1")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"b"})"_json;
|
json original = R"({"a":"b"})"_json;
|
||||||
json patch = R"({"a":"c"})"_json;
|
json const patch = R"({"a":"c"})"_json;
|
||||||
json result = R"({"a":"c"})"_json;
|
json result = R"({"a":"c"})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -103,7 +103,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 2")
|
SECTION("Example 2")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"b"})"_json;
|
json original = R"({"a":"b"})"_json;
|
||||||
json patch = R"({"b":"c"})"_json;
|
json const patch = R"({"b":"c"})"_json;
|
||||||
json result = R"({"a":"b", "b":"c"})"_json;
|
json result = R"({"a":"b", "b":"c"})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -113,7 +113,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 3")
|
SECTION("Example 3")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"b"})"_json;
|
json original = R"({"a":"b"})"_json;
|
||||||
json patch = R"({"a":null})"_json;
|
json const patch = R"({"a":null})"_json;
|
||||||
json result = R"({})"_json;
|
json result = R"({})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -123,7 +123,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 4")
|
SECTION("Example 4")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"b","b":"c"})"_json;
|
json original = R"({"a":"b","b":"c"})"_json;
|
||||||
json patch = R"({"a":null})"_json;
|
json const patch = R"({"a":null})"_json;
|
||||||
json result = R"({"b":"c"})"_json;
|
json result = R"({"b":"c"})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -133,7 +133,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 5")
|
SECTION("Example 5")
|
||||||
{
|
{
|
||||||
json original = R"({"a":["b"]})"_json;
|
json original = R"({"a":["b"]})"_json;
|
||||||
json patch = R"({"a":"c"})"_json;
|
json const patch = R"({"a":"c"})"_json;
|
||||||
json result = R"({"a":"c"})"_json;
|
json result = R"({"a":"c"})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -143,7 +143,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 6")
|
SECTION("Example 6")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"c"})"_json;
|
json original = R"({"a":"c"})"_json;
|
||||||
json patch = R"({"a":["b"]})"_json;
|
json const patch = R"({"a":["b"]})"_json;
|
||||||
json result = R"({"a":["b"]})"_json;
|
json result = R"({"a":["b"]})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -153,7 +153,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 7")
|
SECTION("Example 7")
|
||||||
{
|
{
|
||||||
json original = R"({"a":{"b": "c"}})"_json;
|
json original = R"({"a":{"b": "c"}})"_json;
|
||||||
json patch = R"({"a":{"b":"d","c":null}})"_json;
|
json const patch = R"({"a":{"b":"d","c":null}})"_json;
|
||||||
json result = R"({"a": {"b": "d"}})"_json;
|
json result = R"({"a": {"b": "d"}})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -163,7 +163,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 8")
|
SECTION("Example 8")
|
||||||
{
|
{
|
||||||
json original = R"({"a":[{"b":"c"}]})"_json;
|
json original = R"({"a":[{"b":"c"}]})"_json;
|
||||||
json patch = R"({"a":[1]})"_json;
|
json const patch = R"({"a":[1]})"_json;
|
||||||
json result = R"({"a":[1]})"_json;
|
json result = R"({"a":[1]})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -173,7 +173,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 9")
|
SECTION("Example 9")
|
||||||
{
|
{
|
||||||
json original = R"(["a","b"])"_json;
|
json original = R"(["a","b"])"_json;
|
||||||
json patch = R"(["c","d"])"_json;
|
json const patch = R"(["c","d"])"_json;
|
||||||
json result = R"(["c","d"])"_json;
|
json result = R"(["c","d"])"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -183,7 +183,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 10")
|
SECTION("Example 10")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"b"})"_json;
|
json original = R"({"a":"b"})"_json;
|
||||||
json patch = R"(["c"])"_json;
|
json const patch = R"(["c"])"_json;
|
||||||
json result = R"(["c"])"_json;
|
json result = R"(["c"])"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -193,7 +193,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 11")
|
SECTION("Example 11")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"foo"})"_json;
|
json original = R"({"a":"foo"})"_json;
|
||||||
json patch = R"(null)"_json;
|
json const patch = R"(null)"_json;
|
||||||
json result = R"(null)"_json;
|
json result = R"(null)"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -203,7 +203,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 12")
|
SECTION("Example 12")
|
||||||
{
|
{
|
||||||
json original = R"({"a":"foo"})"_json;
|
json original = R"({"a":"foo"})"_json;
|
||||||
json patch = R"("bar")"_json;
|
json const patch = R"("bar")"_json;
|
||||||
json result = R"("bar")"_json;
|
json result = R"("bar")"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -213,7 +213,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 13")
|
SECTION("Example 13")
|
||||||
{
|
{
|
||||||
json original = R"({"e":null})"_json;
|
json original = R"({"e":null})"_json;
|
||||||
json patch = R"({"a":1})"_json;
|
json const patch = R"({"a":1})"_json;
|
||||||
json result = R"({"e":null,"a":1})"_json;
|
json result = R"({"e":null,"a":1})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -223,7 +223,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 14")
|
SECTION("Example 14")
|
||||||
{
|
{
|
||||||
json original = R"([1,2])"_json;
|
json original = R"([1,2])"_json;
|
||||||
json patch = R"({"a":"b","c":null})"_json;
|
json const patch = R"({"a":"b","c":null})"_json;
|
||||||
json result = R"({"a":"b"})"_json;
|
json result = R"({"a":"b"})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
@ -233,7 +233,7 @@ TEST_CASE("JSON Merge Patch")
|
|||||||
SECTION("Example 15")
|
SECTION("Example 15")
|
||||||
{
|
{
|
||||||
json original = R"({})"_json;
|
json original = R"({})"_json;
|
||||||
json patch = R"({"a":{"bb":{"ccc":null}}})"_json;
|
json const patch = R"({"a":{"bb":{"ccc":null}}})"_json;
|
||||||
json result = R"({"a":{"bb":{}}})"_json;
|
json result = R"({"a":{"bb":{}}})"_json;
|
||||||
|
|
||||||
original.merge_patch(patch);
|
original.merge_patch(patch);
|
||||||
|
@ -19,7 +19,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json j = true;
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::boolean));
|
CHECK(j == json(json::value_t::boolean));
|
||||||
@ -29,7 +29,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "hello world";
|
json j = "hello world";
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::string));
|
CHECK(j == json(json::value_t::string));
|
||||||
@ -41,7 +41,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("empty array")
|
SECTION("empty array")
|
||||||
{
|
{
|
||||||
json j = json::array();
|
json j = json::array();
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j.empty());
|
CHECK(j.empty());
|
||||||
@ -52,7 +52,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("filled array")
|
SECTION("filled array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3};
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j.empty());
|
CHECK(j.empty());
|
||||||
@ -66,7 +66,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("empty object")
|
SECTION("empty object")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json j = json::object();
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j.empty());
|
CHECK(j.empty());
|
||||||
@ -77,7 +77,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("filled object")
|
SECTION("filled object")
|
||||||
{
|
{
|
||||||
json j = {{"one", 1}, {"two", 2}, {"three", 3}};
|
json j = {{"one", 1}, {"two", 2}, {"three", 3}};
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j.empty());
|
CHECK(j.empty());
|
||||||
@ -91,7 +91,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("empty binary")
|
SECTION("empty binary")
|
||||||
{
|
{
|
||||||
json j = json::binary({});
|
json j = json::binary({});
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(!j.empty());
|
CHECK(!j.empty());
|
||||||
@ -102,7 +102,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("filled binary")
|
SECTION("filled binary")
|
||||||
{
|
{
|
||||||
json j = json::binary({1, 2, 3, 4, 5});
|
json j = json::binary({1, 2, 3, 4, 5});
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(!j.empty());
|
CHECK(!j.empty());
|
||||||
@ -114,7 +114,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("number (integer)")
|
SECTION("number (integer)")
|
||||||
{
|
{
|
||||||
json j = 23;
|
json j = 23;
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::number_integer));
|
CHECK(j == json(json::value_t::number_integer));
|
||||||
@ -124,7 +124,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("number (unsigned)")
|
SECTION("number (unsigned)")
|
||||||
{
|
{
|
||||||
json j = 23u;
|
json j = 23u;
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::number_integer));
|
CHECK(j == json(json::value_t::number_integer));
|
||||||
@ -134,7 +134,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("number (float)")
|
SECTION("number (float)")
|
||||||
{
|
{
|
||||||
json j = 23.42;
|
json j = 23.42;
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::number_float));
|
CHECK(j == json(json::value_t::number_float));
|
||||||
@ -144,7 +144,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json j = nullptr;
|
||||||
json k = j;
|
json const k = j;
|
||||||
|
|
||||||
j.clear();
|
j.clear();
|
||||||
CHECK(j == json(json::value_t::null));
|
CHECK(j == json(json::value_t::null));
|
||||||
@ -187,7 +187,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j;
|
json j;
|
||||||
json k(1);
|
json const k(1);
|
||||||
j.push_back(k);
|
j.push_back(k);
|
||||||
j.push_back(k);
|
j.push_back(k);
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
@ -197,7 +197,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3};
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
j.push_back(k);
|
j.push_back(k);
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
CHECK(j == json({1, 2, 3, "Hello"}));
|
CHECK(j == json({1, 2, 3, "Hello"}));
|
||||||
@ -206,7 +206,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("other type")
|
SECTION("other type")
|
||||||
{
|
{
|
||||||
json j = 1;
|
json j = 1;
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
CHECK_THROWS_WITH_AS(j.push_back(k), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.push_back(k), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("other type")
|
SECTION("other type")
|
||||||
{
|
{
|
||||||
json j = 1;
|
json j = 1;
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
CHECK_THROWS_WITH_AS(j.push_back(json::object_t::value_type({"one", 1})), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.push_back(json::object_t::value_type({"one", 1})), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -415,7 +415,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j;
|
json j;
|
||||||
json k(1);
|
json const k(1);
|
||||||
j += k;
|
j += k;
|
||||||
j += k;
|
j += k;
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
@ -425,7 +425,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json j = {1, 2, 3};
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
j += k;
|
j += k;
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
CHECK(j == json({1, 2, 3, "Hello"}));
|
CHECK(j == json({1, 2, 3, "Hello"}));
|
||||||
@ -434,7 +434,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("other type")
|
SECTION("other type")
|
||||||
{
|
{
|
||||||
json j = 1;
|
json j = 1;
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
CHECK_THROWS_WITH_AS(j += k, "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
CHECK_THROWS_WITH_AS(j += k, "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -466,7 +466,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("other type")
|
SECTION("other type")
|
||||||
{
|
{
|
||||||
json j = 1;
|
json j = 1;
|
||||||
json k("Hello");
|
json const k("Hello");
|
||||||
CHECK_THROWS_WITH_AS(j += json::object_t::value_type({"one", 1}), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
CHECK_THROWS_WITH_AS(j += json::object_t::value_type({"one", 1}), "[json.exception.type_error.308] cannot use push_back() with number", json::type_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -663,7 +663,7 @@ TEST_CASE("modifiers")
|
|||||||
|
|
||||||
SECTION("invalid iterators")
|
SECTION("invalid iterators")
|
||||||
{
|
{
|
||||||
json j_other_array2 = {"first", "second"};
|
json const j_other_array2 = {"first", "second"};
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j_array.insert(j_object2.begin(), j_object2.end()), "[json.exception.type_error.309] cannot use insert() with array", json::type_error&);
|
CHECK_THROWS_WITH_AS(j_array.insert(j_object2.begin(), j_object2.end()), "[json.exception.type_error.309] cannot use insert() with array", json::type_error&);
|
||||||
CHECK_THROWS_WITH_AS(j_object1.insert(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(j_object1.insert(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&);
|
||||||
@ -774,7 +774,7 @@ TEST_CASE("modifiers")
|
|||||||
|
|
||||||
SECTION("invalid iterators")
|
SECTION("invalid iterators")
|
||||||
{
|
{
|
||||||
json j_other_array2 = {"first", "second"};
|
json const j_other_array2 = {"first", "second"};
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j_array.update(j_object2.begin(), j_object2.end()), "[json.exception.type_error.312] cannot use update() with array", json::type_error&);
|
CHECK_THROWS_WITH_AS(j_array.update(j_object2.begin(), j_object2.end()), "[json.exception.type_error.312] cannot use update() with array", json::type_error&);
|
||||||
CHECK_THROWS_WITH_AS(j_object1.update(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&);
|
CHECK_THROWS_WITH_AS(j_object1.update(j_object1.begin(), j_object2.end()), "[json.exception.invalid_iterator.210] iterators do not fit", json::invalid_iterator&);
|
||||||
@ -790,7 +790,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("extend object")
|
SECTION("extend object")
|
||||||
{
|
{
|
||||||
json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}};
|
json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}};
|
||||||
json j2 = {{"string", "t"}, {"numbers", {{"two", 2}}}};
|
json const j2 = {{"string", "t"}, {"numbers", {{"two", 2}}}};
|
||||||
j1.update(j2, true);
|
j1.update(j2, true);
|
||||||
CHECK(j1 == json({{"string", "t"}, {"numbers", {{"one", 1}, {"two", 2}}}}));
|
CHECK(j1 == json({{"string", "t"}, {"numbers", {{"one", 1}, {"two", 2}}}}));
|
||||||
}
|
}
|
||||||
@ -798,7 +798,7 @@ TEST_CASE("modifiers")
|
|||||||
SECTION("replace object")
|
SECTION("replace object")
|
||||||
{
|
{
|
||||||
json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}};
|
json j1 = {{"string", "s"}, {"numbers", {{"one", 1}}}};
|
||||||
json j2 = {{"string", "t"}, {"numbers", 1}};
|
json const j2 = {{"string", "t"}, {"numbers", 1}};
|
||||||
j1.update(j2, true);
|
j1.update(j2, true);
|
||||||
CHECK(j1 == json({{"string", "t"}, {"numbers", 1}}));
|
CHECK(j1 == json({{"string", "t"}, {"numbers", 1}}));
|
||||||
}
|
}
|
||||||
|
@ -106,15 +106,15 @@ TEST_CASE("MessagePack")
|
|||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// discarded values are not serialized
|
// discarded values are not serialized
|
||||||
json j = json::value_t::discarded;
|
json const j = json::value_t::discarded;
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result.empty());
|
CHECK(result.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j = nullptr;
|
json const j = nullptr;
|
||||||
std::vector<uint8_t> expected = {0xc0};
|
std::vector<uint8_t> const expected = {0xc0};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -127,8 +127,8 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("true")
|
SECTION("true")
|
||||||
{
|
{
|
||||||
json j = true;
|
json const j = true;
|
||||||
std::vector<uint8_t> expected = {0xc3};
|
std::vector<uint8_t> const expected = {0xc3};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -139,8 +139,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("false")
|
SECTION("false")
|
||||||
{
|
{
|
||||||
json j = false;
|
json const j = false;
|
||||||
std::vector<uint8_t> expected = {0xc2};
|
std::vector<uint8_t> const expected = {0xc2};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -161,14 +161,16 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with integer number
|
// create JSON value with integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
{
|
||||||
|
static_cast<uint8_t>(i)
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -198,8 +200,7 @@ TEST_CASE("MessagePack")
|
|||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected{static_cast<uint8_t>(i)};
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -229,9 +230,11 @@ TEST_CASE("MessagePack")
|
|||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcc);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
0xcc,
|
||||||
|
static_cast<uint8_t>(i),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -240,7 +243,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcc);
|
CHECK(result[0] == 0xcc);
|
||||||
auto restored = static_cast<uint8_t>(result[1]);
|
auto const restored = static_cast<uint8_t>(result[1]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -263,10 +266,12 @@ TEST_CASE("MessagePack")
|
|||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcd);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
0xcd,
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -275,7 +280,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcd);
|
CHECK(result[0] == 0xcd);
|
||||||
auto restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
|
auto const restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -301,12 +306,14 @@ TEST_CASE("MessagePack")
|
|||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xce);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
|
0xce,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
|
static_cast<uint8_t>((i >> 24) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
static_cast<uint8_t>((i >> 16) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -315,10 +322,10 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xce);
|
CHECK(result[0] == 0xce);
|
||||||
uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
|
uint32_t const restored = (static_cast<uint32_t>(result[1]) << 030) +
|
||||||
(static_cast<uint32_t>(result[2]) << 020) +
|
(static_cast<uint32_t>(result[2]) << 020) +
|
||||||
(static_cast<uint32_t>(result[3]) << 010) +
|
(static_cast<uint32_t>(result[3]) << 010) +
|
||||||
static_cast<uint32_t>(result[4]);
|
static_cast<uint32_t>(result[4]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -344,16 +351,18 @@ TEST_CASE("MessagePack")
|
|||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcf);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
|
0xcf,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
|
static_cast<uint8_t>((i >> 070) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
|
static_cast<uint8_t>((i >> 060) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
|
static_cast<uint8_t>((i >> 050) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
|
static_cast<uint8_t>((i >> 040) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
|
static_cast<uint8_t>((i >> 030) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
|
static_cast<uint8_t>((i >> 020) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 010) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -362,14 +371,14 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcf);
|
CHECK(result[0] == 0xcf);
|
||||||
uint64_t restored = (static_cast<uint64_t>(result[1]) << 070) +
|
uint64_t const restored = (static_cast<uint64_t>(result[1]) << 070) +
|
||||||
(static_cast<uint64_t>(result[2]) << 060) +
|
(static_cast<uint64_t>(result[2]) << 060) +
|
||||||
(static_cast<uint64_t>(result[3]) << 050) +
|
(static_cast<uint64_t>(result[3]) << 050) +
|
||||||
(static_cast<uint64_t>(result[4]) << 040) +
|
(static_cast<uint64_t>(result[4]) << 040) +
|
||||||
(static_cast<uint64_t>(result[5]) << 030) +
|
(static_cast<uint64_t>(result[5]) << 030) +
|
||||||
(static_cast<uint64_t>(result[6]) << 020) +
|
(static_cast<uint64_t>(result[6]) << 020) +
|
||||||
(static_cast<uint64_t>(result[7]) << 010) +
|
(static_cast<uint64_t>(result[7]) << 010) +
|
||||||
static_cast<uint64_t>(result[8]);
|
static_cast<uint64_t>(result[8]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -385,15 +394,17 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with integer number
|
// create JSON value with integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xd0);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
0xd0,
|
||||||
|
static_cast<uint8_t>(i),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -412,13 +423,13 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("-9263 (int 16)")
|
SECTION("-9263 (int 16)")
|
||||||
{
|
{
|
||||||
json j = -9263;
|
json const j = -9263;
|
||||||
std::vector<uint8_t> expected = {0xd1, 0xdb, 0xd1};
|
std::vector<uint8_t> const expected = {0xd1, 0xdb, 0xd1};
|
||||||
|
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
auto restored = static_cast<int16_t>((result[1] << 8) + result[2]);
|
auto const restored = static_cast<int16_t>((result[1] << 8) + result[2]);
|
||||||
CHECK(restored == -9263);
|
CHECK(restored == -9263);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -433,16 +444,18 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with integer number
|
// create JSON value with integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xd1);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
0xd1,
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -451,7 +464,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xd1);
|
CHECK(result[0] == 0xd1);
|
||||||
auto restored = static_cast<int16_t>((result[1] << 8) + result[2]);
|
auto const restored = static_cast<int16_t>((result[1] << 8) + result[2]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -462,29 +475,33 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("-32769..-2147483648")
|
SECTION("-32769..-2147483648")
|
||||||
{
|
{
|
||||||
std::vector<int32_t> numbers;
|
std::vector<int32_t> const numbers
|
||||||
numbers.push_back(-32769);
|
{
|
||||||
numbers.push_back(-65536);
|
-32769,
|
||||||
numbers.push_back(-77777);
|
-65536,
|
||||||
numbers.push_back(-1048576);
|
-77777,
|
||||||
numbers.push_back(-2147483648LL);
|
-1048576,
|
||||||
|
-2147483648LL,
|
||||||
|
};
|
||||||
for (auto i : numbers)
|
for (auto i : numbers)
|
||||||
{
|
{
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with integer number
|
// create JSON value with integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xd2);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
|
0xd2,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
|
static_cast<uint8_t>((i >> 24) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
static_cast<uint8_t>((i >> 16) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -493,10 +510,10 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xd2);
|
CHECK(result[0] == 0xd2);
|
||||||
uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
|
uint32_t const restored = (static_cast<uint32_t>(result[1]) << 030) +
|
||||||
(static_cast<uint32_t>(result[2]) << 020) +
|
(static_cast<uint32_t>(result[2]) << 020) +
|
||||||
(static_cast<uint32_t>(result[3]) << 010) +
|
(static_cast<uint32_t>(result[3]) << 010) +
|
||||||
static_cast<uint32_t>(result[4]);
|
static_cast<uint32_t>(result[4]);
|
||||||
CHECK(static_cast<std::int32_t>(restored) == i);
|
CHECK(static_cast<std::int32_t>(restored) == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -507,30 +524,34 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("-9223372036854775808..-2147483649 (int 64)")
|
SECTION("-9223372036854775808..-2147483649 (int 64)")
|
||||||
{
|
{
|
||||||
std::vector<int64_t> numbers;
|
std::vector<int64_t> const numbers
|
||||||
numbers.push_back(INT64_MIN);
|
{
|
||||||
numbers.push_back(-2147483649LL);
|
INT64_MIN,
|
||||||
|
-2147483649LL,
|
||||||
|
};
|
||||||
for (auto i : numbers)
|
for (auto i : numbers)
|
||||||
{
|
{
|
||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_integer());
|
CHECK(j.is_number_integer());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xd3);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
|
0xd3,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
|
static_cast<uint8_t>((i >> 070) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
|
static_cast<uint8_t>((i >> 060) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
|
static_cast<uint8_t>((i >> 050) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
|
static_cast<uint8_t>((i >> 040) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
|
static_cast<uint8_t>((i >> 030) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
|
static_cast<uint8_t>((i >> 020) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 010) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -539,14 +560,14 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xd3);
|
CHECK(result[0] == 0xd3);
|
||||||
int64_t restored = (static_cast<int64_t>(result[1]) << 070) +
|
int64_t const restored = (static_cast<int64_t>(result[1]) << 070) +
|
||||||
(static_cast<int64_t>(result[2]) << 060) +
|
(static_cast<int64_t>(result[2]) << 060) +
|
||||||
(static_cast<int64_t>(result[3]) << 050) +
|
(static_cast<int64_t>(result[3]) << 050) +
|
||||||
(static_cast<int64_t>(result[4]) << 040) +
|
(static_cast<int64_t>(result[4]) << 040) +
|
||||||
(static_cast<int64_t>(result[5]) << 030) +
|
(static_cast<int64_t>(result[5]) << 030) +
|
||||||
(static_cast<int64_t>(result[6]) << 020) +
|
(static_cast<int64_t>(result[6]) << 020) +
|
||||||
(static_cast<int64_t>(result[7]) << 010) +
|
(static_cast<int64_t>(result[7]) << 010) +
|
||||||
static_cast<int64_t>(result[8]);
|
static_cast<int64_t>(result[8]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -565,14 +586,13 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_unsigned());
|
CHECK(j.is_number_unsigned());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected{static_cast<uint8_t>(i)};
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -595,15 +615,17 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_unsigned());
|
CHECK(j.is_number_unsigned());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcc);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>(i));
|
0xcc,
|
||||||
|
static_cast<uint8_t>(i),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -612,7 +634,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcc);
|
CHECK(result[0] == 0xcc);
|
||||||
auto restored = static_cast<uint8_t>(result[1]);
|
auto const restored = static_cast<uint8_t>(result[1]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -628,16 +650,18 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_unsigned());
|
CHECK(j.is_number_unsigned());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcd);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
0xcd,
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -646,7 +670,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcd);
|
CHECK(result[0] == 0xcd);
|
||||||
auto restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
|
auto const restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -657,7 +681,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("65536..4294967295 (uint 32)")
|
SECTION("65536..4294967295 (uint 32)")
|
||||||
{
|
{
|
||||||
for (uint32_t i :
|
for (const uint32_t i :
|
||||||
{
|
{
|
||||||
65536u, 77777u, 1048576u, 4294967295u
|
65536u, 77777u, 1048576u, 4294967295u
|
||||||
})
|
})
|
||||||
@ -665,18 +689,20 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_unsigned());
|
CHECK(j.is_number_unsigned());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xce);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
|
0xce,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
|
static_cast<uint8_t>((i >> 24) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
|
static_cast<uint8_t>((i >> 16) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 8) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -685,10 +711,10 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xce);
|
CHECK(result[0] == 0xce);
|
||||||
uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
|
uint32_t const restored = (static_cast<uint32_t>(result[1]) << 030) +
|
||||||
(static_cast<uint32_t>(result[2]) << 020) +
|
(static_cast<uint32_t>(result[2]) << 020) +
|
||||||
(static_cast<uint32_t>(result[3]) << 010) +
|
(static_cast<uint32_t>(result[3]) << 010) +
|
||||||
static_cast<uint32_t>(result[4]);
|
static_cast<uint32_t>(result[4]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -699,7 +725,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("4294967296..18446744073709551615 (uint 64)")
|
SECTION("4294967296..18446744073709551615 (uint 64)")
|
||||||
{
|
{
|
||||||
for (uint64_t i :
|
for (const uint64_t i :
|
||||||
{
|
{
|
||||||
4294967296LU, 18446744073709551615LU
|
4294967296LU, 18446744073709551615LU
|
||||||
})
|
})
|
||||||
@ -707,22 +733,24 @@ TEST_CASE("MessagePack")
|
|||||||
CAPTURE(i)
|
CAPTURE(i)
|
||||||
|
|
||||||
// create JSON value with unsigned integer number
|
// create JSON value with unsigned integer number
|
||||||
json j = i;
|
json const j = i;
|
||||||
|
|
||||||
// check type
|
// check type
|
||||||
CHECK(j.is_number_unsigned());
|
CHECK(j.is_number_unsigned());
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> const expected
|
||||||
expected.push_back(0xcf);
|
{
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
|
0xcf,
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
|
static_cast<uint8_t>((i >> 070) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
|
static_cast<uint8_t>((i >> 060) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
|
static_cast<uint8_t>((i >> 050) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
|
static_cast<uint8_t>((i >> 040) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
|
static_cast<uint8_t>((i >> 030) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
|
static_cast<uint8_t>((i >> 020) & 0xff),
|
||||||
expected.push_back(static_cast<uint8_t>(i & 0xff));
|
static_cast<uint8_t>((i >> 010) & 0xff),
|
||||||
|
static_cast<uint8_t>(i & 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
// compare result + size
|
// compare result + size
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
@ -731,14 +759,14 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// check individual bytes
|
// check individual bytes
|
||||||
CHECK(result[0] == 0xcf);
|
CHECK(result[0] == 0xcf);
|
||||||
uint64_t restored = (static_cast<uint64_t>(result[1]) << 070) +
|
uint64_t const restored = (static_cast<uint64_t>(result[1]) << 070) +
|
||||||
(static_cast<uint64_t>(result[2]) << 060) +
|
(static_cast<uint64_t>(result[2]) << 060) +
|
||||||
(static_cast<uint64_t>(result[3]) << 050) +
|
(static_cast<uint64_t>(result[3]) << 050) +
|
||||||
(static_cast<uint64_t>(result[4]) << 040) +
|
(static_cast<uint64_t>(result[4]) << 040) +
|
||||||
(static_cast<uint64_t>(result[5]) << 030) +
|
(static_cast<uint64_t>(result[5]) << 030) +
|
||||||
(static_cast<uint64_t>(result[6]) << 020) +
|
(static_cast<uint64_t>(result[6]) << 020) +
|
||||||
(static_cast<uint64_t>(result[7]) << 010) +
|
(static_cast<uint64_t>(result[7]) << 010) +
|
||||||
static_cast<uint64_t>(result[8]);
|
static_cast<uint64_t>(result[8]);
|
||||||
CHECK(restored == i);
|
CHECK(restored == i);
|
||||||
|
|
||||||
// roundtrip
|
// roundtrip
|
||||||
@ -752,9 +780,9 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("3.1415925")
|
SECTION("3.1415925")
|
||||||
{
|
{
|
||||||
double v = 3.1415925;
|
double const v = 3.1415925;
|
||||||
json j = v;
|
json const j = v;
|
||||||
std::vector<uint8_t> expected =
|
std::vector<uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0xcb, 0x40, 0x09, 0x21, 0xfb, 0x3f, 0xa6, 0xde, 0xfc
|
0xcb, 0x40, 0x09, 0x21, 0xfb, 0x3f, 0xa6, 0xde, 0xfc
|
||||||
};
|
};
|
||||||
@ -769,9 +797,9 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("1.0")
|
SECTION("1.0")
|
||||||
{
|
{
|
||||||
double v = 1.0;
|
double const v = 1.0;
|
||||||
json j = v;
|
json const j = v;
|
||||||
std::vector<uint8_t> expected =
|
std::vector<uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0xca, 0x3f, 0x80, 0x00, 0x00
|
0xca, 0x3f, 0x80, 0x00, 0x00
|
||||||
};
|
};
|
||||||
@ -786,9 +814,9 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("128.128")
|
SECTION("128.128")
|
||||||
{
|
{
|
||||||
double v = 128.1280059814453125;
|
double const v = 128.1280059814453125;
|
||||||
json j = v;
|
json const j = v;
|
||||||
std::vector<uint8_t> expected =
|
std::vector<uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0xca, 0x43, 0x00, 0x20, 0xc5
|
0xca, 0x43, 0x00, 0x20, 0xc5
|
||||||
};
|
};
|
||||||
@ -822,7 +850,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::string(N, 'x');
|
const auto s = std::string(N, 'x');
|
||||||
json j = s;
|
json const j = s;
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> expected;
|
||||||
@ -859,7 +887,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::string(N, 'x');
|
const auto s = std::string(N, 'x');
|
||||||
json j = s;
|
json const j = s;
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<uint8_t> expected;
|
std::vector<uint8_t> expected;
|
||||||
@ -894,7 +922,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::string(N, 'x');
|
const auto s = std::string(N, 'x');
|
||||||
json j = s;
|
json const j = s;
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
std::vector<uint8_t> expected(N, 'x');
|
std::vector<uint8_t> expected(N, 'x');
|
||||||
@ -927,7 +955,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::string(N, 'x');
|
const auto s = std::string(N, 'x');
|
||||||
json j = s;
|
json const j = s;
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
std::vector<uint8_t> expected(N, 'x');
|
std::vector<uint8_t> expected(N, 'x');
|
||||||
@ -956,8 +984,8 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("empty")
|
SECTION("empty")
|
||||||
{
|
{
|
||||||
json j = json::array();
|
json const j = json::array();
|
||||||
std::vector<uint8_t> expected = {0x90};
|
std::vector<uint8_t> const expected = {0x90};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -968,8 +996,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("[null]")
|
SECTION("[null]")
|
||||||
{
|
{
|
||||||
json j = {nullptr};
|
json const j = {nullptr};
|
||||||
std::vector<uint8_t> expected = {0x91, 0xc0};
|
std::vector<uint8_t> const expected = {0x91, 0xc0};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -980,8 +1008,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("[1,2,3,4,5]")
|
SECTION("[1,2,3,4,5]")
|
||||||
{
|
{
|
||||||
json j = json::parse("[1,2,3,4,5]");
|
json const j = json::parse("[1,2,3,4,5]");
|
||||||
std::vector<uint8_t> expected = {0x95, 0x01, 0x02, 0x03, 0x04, 0x05};
|
std::vector<uint8_t> const expected = {0x95, 0x01, 0x02, 0x03, 0x04, 0x05};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -992,8 +1020,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("[[[[]]]]")
|
SECTION("[[[[]]]]")
|
||||||
{
|
{
|
||||||
json j = json::parse("[[[[]]]]");
|
json const j = json::parse("[[[[]]]]");
|
||||||
std::vector<uint8_t> expected = {0x91, 0x91, 0x91, 0x90};
|
std::vector<uint8_t> const expected = {0x91, 0x91, 0x91, 0x90};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -1046,8 +1074,8 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("empty")
|
SECTION("empty")
|
||||||
{
|
{
|
||||||
json j = json::object();
|
json const j = json::object();
|
||||||
std::vector<uint8_t> expected = {0x80};
|
std::vector<uint8_t> const expected = {0x80};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -1058,8 +1086,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("{\"\":null}")
|
SECTION("{\"\":null}")
|
||||||
{
|
{
|
||||||
json j = {{"", nullptr}};
|
json const j = {{"", nullptr}};
|
||||||
std::vector<uint8_t> expected = {0x81, 0xa0, 0xc0};
|
std::vector<uint8_t> const expected = {0x81, 0xa0, 0xc0};
|
||||||
const auto result = json::to_msgpack(j);
|
const auto result = json::to_msgpack(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
|
||||||
@ -1070,8 +1098,8 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("{\"a\": {\"b\": {\"c\": {}}}}")
|
SECTION("{\"a\": {\"b\": {\"c\": {}}}}")
|
||||||
{
|
{
|
||||||
json j = json::parse(R"({"a": {"b": {"c": {}}}})");
|
json const j = json::parse(R"({"a": {"b": {"c": {}}}})");
|
||||||
std::vector<uint8_t> expected =
|
std::vector<uint8_t> const expected =
|
||||||
{
|
{
|
||||||
0x81, 0xa1, 0x61, 0x81, 0xa1, 0x62, 0x81, 0xa1, 0x63, 0x80
|
0x81, 0xa1, 0x61, 0x81, 0xa1, 0x62, 0x81, 0xa1, 0x63, 0x80
|
||||||
};
|
};
|
||||||
@ -1085,7 +1113,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("map 16")
|
SECTION("map 16")
|
||||||
{
|
{
|
||||||
json j = R"({"00": null, "01": null, "02": null, "03": null,
|
json const j = R"({"00": null, "01": null, "02": null, "03": null,
|
||||||
"04": null, "05": null, "06": null, "07": null,
|
"04": null, "05": null, "06": null, "07": null,
|
||||||
"08": null, "09": null, "10": null, "11": null,
|
"08": null, "09": null, "10": null, "11": null,
|
||||||
"12": null, "13": null, "14": null, "15": null})"_json;
|
"12": null, "13": null, "14": null, "15": null})"_json;
|
||||||
@ -1150,7 +1178,7 @@ TEST_CASE("MessagePack")
|
|||||||
// create JSON value with byte array containing of N * 'x'
|
// create JSON value with byte array containing of N * 'x'
|
||||||
const auto s = std::vector<uint8_t>(N, 'x');
|
const auto s = std::vector<uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json j = json::binary(s);
|
||||||
std::uint8_t subtype = 42;
|
std::uint8_t const subtype = 42;
|
||||||
j.get_binary().set_subtype(subtype);
|
j.get_binary().set_subtype(subtype);
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
@ -1225,7 +1253,7 @@ TEST_CASE("MessagePack")
|
|||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::vector<uint8_t>(N, 'x');
|
const auto s = std::vector<uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json j = json::binary(s);
|
||||||
std::uint8_t subtype = 42;
|
std::uint8_t const subtype = 42;
|
||||||
j.get_binary().set_subtype(subtype);
|
j.get_binary().set_subtype(subtype);
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
@ -1261,7 +1289,7 @@ TEST_CASE("MessagePack")
|
|||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::vector<uint8_t>(N, 'x');
|
const auto s = std::vector<uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json j = json::binary(s);
|
||||||
std::uint8_t subtype = 42;
|
std::uint8_t const subtype = 42;
|
||||||
j.get_binary().set_subtype(subtype);
|
j.get_binary().set_subtype(subtype);
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
@ -1298,7 +1326,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with byte array containing of N * 'x'
|
// create JSON value with byte array containing of N * 'x'
|
||||||
const auto s = std::vector<uint8_t>(N, 'x');
|
const auto s = std::vector<uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json const j = json::binary(s);
|
||||||
|
|
||||||
// create expected byte vector
|
// create expected byte vector
|
||||||
std::vector<std::uint8_t> expected;
|
std::vector<std::uint8_t> expected;
|
||||||
@ -1336,7 +1364,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::vector<std::uint8_t>(N, 'x');
|
const auto s = std::vector<std::uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json const j = json::binary(s);
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
std::vector<std::uint8_t> expected(N, 'x');
|
std::vector<std::uint8_t> expected(N, 'x');
|
||||||
@ -1369,7 +1397,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
// create JSON value with string containing of N * 'x'
|
// create JSON value with string containing of N * 'x'
|
||||||
const auto s = std::vector<std::uint8_t>(N, 'x');
|
const auto s = std::vector<std::uint8_t>(N, 'x');
|
||||||
json j = json::binary(s);
|
json const j = json::binary(s);
|
||||||
|
|
||||||
// create expected byte vector (hack: create string first)
|
// create expected byte vector (hack: create string first)
|
||||||
std::vector<uint8_t> expected(N, 'x');
|
std::vector<uint8_t> expected(N, 'x');
|
||||||
@ -1398,7 +1426,7 @@ TEST_CASE("MessagePack")
|
|||||||
SECTION("from float32")
|
SECTION("from float32")
|
||||||
{
|
{
|
||||||
auto given = std::vector<uint8_t>({0xca, 0x41, 0xc8, 0x00, 0x01});
|
auto given = std::vector<uint8_t>({0xca, 0x41, 0xc8, 0x00, 0x01});
|
||||||
json j = json::from_msgpack(given);
|
json const j = json::from_msgpack(given);
|
||||||
CHECK(j.get<double>() == Approx(25.0000019073486));
|
CHECK(j.get<double>() == Approx(25.0000019073486));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1511,7 +1539,7 @@ TEST_CASE("MessagePack")
|
|||||||
|
|
||||||
SECTION("strict mode")
|
SECTION("strict mode")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec = {0xc0, 0xc0};
|
std::vector<uint8_t> const vec = {0xc0, 0xc0};
|
||||||
SECTION("non-strict mode")
|
SECTION("non-strict mode")
|
||||||
{
|
{
|
||||||
const auto result = json::from_msgpack(vec, false);
|
const auto result = json::from_msgpack(vec, false);
|
||||||
@ -1531,21 +1559,21 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("start_array(len)")
|
SECTION("start_array(len)")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v = {0x93, 0x01, 0x02, 0x03};
|
std::vector<uint8_t> const v = {0x93, 0x01, 0x02, 0x03};
|
||||||
SaxCountdown scp(0);
|
SaxCountdown scp(0);
|
||||||
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("start_object(len)")
|
SECTION("start_object(len)")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
|
std::vector<uint8_t> const v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
|
||||||
SaxCountdown scp(0);
|
SaxCountdown scp(0);
|
||||||
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("key()")
|
SECTION("key()")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
|
std::vector<uint8_t> const v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
|
||||||
SaxCountdown scp(1);
|
SaxCountdown scp(1);
|
||||||
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
|
||||||
}
|
}
|
||||||
@ -1557,7 +1585,7 @@ TEST_CASE("single MessagePack roundtrip")
|
|||||||
{
|
{
|
||||||
SECTION("sample.json")
|
SECTION("sample.json")
|
||||||
{
|
{
|
||||||
std::string filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
|
std::string const filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
|
||||||
|
|
||||||
// parse JSON file
|
// parse JSON file
|
||||||
std::ifstream f_json(filename);
|
std::ifstream f_json(filename);
|
||||||
@ -1817,7 +1845,7 @@ TEST_CASE("MessagePack roundtrips" * doctest::skip())
|
|||||||
INFO_WITH_TEMP(filename + ": output to output adapters");
|
INFO_WITH_TEMP(filename + ": output to output adapters");
|
||||||
// parse JSON file
|
// parse JSON file
|
||||||
std::ifstream f_json(filename);
|
std::ifstream f_json(filename);
|
||||||
json j1 = json::parse(f_json);
|
json const j1 = json::parse(f_json);
|
||||||
|
|
||||||
// parse MessagePack file
|
// parse MessagePack file
|
||||||
auto packed = utils::read_binary_file(filename + ".msgpack");
|
auto packed = utils::read_binary_file(filename + ".msgpack");
|
||||||
|
@ -46,7 +46,7 @@ TEST_CASE("ordered_json")
|
|||||||
CHECK(oj.dump() == "{\"element3\":3,\"element2\":2}");
|
CHECK(oj.dump() == "{\"element3\":3,\"element2\":2}");
|
||||||
|
|
||||||
// There are no dup keys cause constructor calls emplace...
|
// There are no dup keys cause constructor calls emplace...
|
||||||
json multi {{"z", 1}, {"m", 2}, {"m", 3}, {"y", 4}, {"m", 5}};
|
json const multi {{"z", 1}, {"m", 2}, {"m", 3}, {"y", 4}, {"m", 5}};
|
||||||
CHECK(multi.size() == 3);
|
CHECK(multi.size() == 3);
|
||||||
CHECK(multi.dump() == "{\"m\":2,\"y\":4,\"z\":1}");
|
CHECK(multi.dump() == "{\"m\":2,\"y\":4,\"z\":1}");
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ TEST_CASE("ordered_map")
|
|||||||
SECTION("constructor from iterator range")
|
SECTION("constructor from iterator range")
|
||||||
{
|
{
|
||||||
std::map<std::string, std::string> m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}};
|
std::map<std::string, std::string> m {{"eins", "one"}, {"zwei", "two"}, {"drei", "three"}};
|
||||||
ordered_map<std::string, std::string> om(m.begin(), m.end());
|
ordered_map<std::string, std::string> const om(m.begin(), m.end());
|
||||||
CHECK(om.size() == 3);
|
CHECK(om.size() == 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,8 +281,8 @@ TEST_CASE("ordered_map")
|
|||||||
|
|
||||||
SECTION("const value_type&")
|
SECTION("const value_type&")
|
||||||
{
|
{
|
||||||
ordered_map<std::string, std::string>::value_type vt1 {"eins", "1"};
|
ordered_map<std::string, std::string>::value_type const vt1 {"eins", "1"};
|
||||||
ordered_map<std::string, std::string>::value_type vt4 {"vier", "four"};
|
ordered_map<std::string, std::string>::value_type const vt4 {"vier", "four"};
|
||||||
|
|
||||||
auto res1 = om.insert(vt1);
|
auto res1 = om.insert(vt1);
|
||||||
CHECK(res1.first == om.begin());
|
CHECK(res1.first == om.begin());
|
||||||
|
@ -33,7 +33,7 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
{
|
{
|
||||||
// redirect std::cout for the README file
|
// redirect std::cout for the README file
|
||||||
auto* old_cout_buffer = std::cout.rdbuf();
|
auto* old_cout_buffer = std::cout.rdbuf();
|
||||||
std::ostringstream new_stream;
|
std::ostringstream const new_stream;
|
||||||
std::cout.rdbuf(new_stream.rdbuf());
|
std::cout.rdbuf(new_stream.rdbuf());
|
||||||
{
|
{
|
||||||
// create an empty structure (null)
|
// create an empty structure (null)
|
||||||
@ -61,7 +61,7 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
j["object"] = { {"currency", "USD"}, {"value", 42.99} };
|
j["object"] = { {"currency", "USD"}, {"value", 42.99} };
|
||||||
|
|
||||||
// instead, you could also write (which looks very similar to the JSON above)
|
// instead, you could also write (which looks very similar to the JSON above)
|
||||||
json j2 =
|
json const j2 =
|
||||||
{
|
{
|
||||||
{"pi", 3.141},
|
{"pi", 3.141},
|
||||||
{"happy", true},
|
{"happy", true},
|
||||||
@ -84,13 +84,13 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
|
|
||||||
{
|
{
|
||||||
// ways to express the empty array []
|
// ways to express the empty array []
|
||||||
json empty_array_implicit = {{}};
|
json const empty_array_implicit = {{}};
|
||||||
CHECK(empty_array_implicit.is_array());
|
CHECK(empty_array_implicit.is_array());
|
||||||
json empty_array_explicit = json::array();
|
json const empty_array_explicit = json::array();
|
||||||
CHECK(empty_array_explicit.is_array());
|
CHECK(empty_array_explicit.is_array());
|
||||||
|
|
||||||
// a way to express the empty object {}
|
// a way to express the empty object {}
|
||||||
json empty_object_explicit = json::object();
|
json const empty_object_explicit = json::object();
|
||||||
CHECK(empty_object_explicit.is_object());
|
CHECK(empty_object_explicit.is_object());
|
||||||
|
|
||||||
// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
|
// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
|
||||||
@ -103,7 +103,7 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
|
|
||||||
{
|
{
|
||||||
// create object from string literal
|
// create object from string literal
|
||||||
json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; // NOLINT(modernize-raw-string-literal)
|
json const j = "{ \"happy\": true, \"pi\": 3.141 }"_json; // NOLINT(modernize-raw-string-literal)
|
||||||
|
|
||||||
// or even nicer with a raw string literal
|
// or even nicer with a raw string literal
|
||||||
auto j2 = R"({
|
auto j2 = R"({
|
||||||
@ -115,7 +115,7 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
auto j3 = json::parse(R"({"happy": true, "pi": 3.141})");
|
auto j3 = json::parse(R"({"happy": true, "pi": 3.141})");
|
||||||
|
|
||||||
// explicit conversion to string
|
// explicit conversion to string
|
||||||
std::string s = j.dump(); // {\"happy\":true,\"pi\":3.141}
|
std::string const s = j.dump(); // {\"happy\":true,\"pi\":3.141}
|
||||||
|
|
||||||
// serialization with pretty printing
|
// serialization with pretty printing
|
||||||
// pass in the amount of spaces to indent
|
// pass in the amount of spaces to indent
|
||||||
@ -178,82 +178,82 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::vector<int> c_vector {1, 2, 3, 4};
|
std::vector<int> const c_vector {1, 2, 3, 4};
|
||||||
json j_vec(c_vector);
|
json const j_vec(c_vector);
|
||||||
// [1, 2, 3, 4]
|
// [1, 2, 3, 4]
|
||||||
|
|
||||||
std::deque<float> c_deque {1.2f, 2.3f, 3.4f, 5.6f};
|
std::deque<float> const c_deque {1.2f, 2.3f, 3.4f, 5.6f};
|
||||||
json j_deque(c_deque);
|
json const j_deque(c_deque);
|
||||||
// [1.2, 2.3, 3.4, 5.6]
|
// [1.2, 2.3, 3.4, 5.6]
|
||||||
|
|
||||||
std::list<bool> c_list {true, true, false, true};
|
std::list<bool> const c_list {true, true, false, true};
|
||||||
json j_list(c_list);
|
json const j_list(c_list);
|
||||||
// [true, true, false, true]
|
// [true, true, false, true]
|
||||||
|
|
||||||
std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
|
std::forward_list<int64_t> const c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
|
||||||
json j_flist(c_flist);
|
json const j_flist(c_flist);
|
||||||
// [12345678909876, 23456789098765, 34567890987654, 45678909876543]
|
// [12345678909876, 23456789098765, 34567890987654, 45678909876543]
|
||||||
|
|
||||||
std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
|
std::array<unsigned long, 4> const c_array {{1, 2, 3, 4}};
|
||||||
json j_array(c_array);
|
json const j_array(c_array);
|
||||||
// [1, 2, 3, 4]
|
// [1, 2, 3, 4]
|
||||||
|
|
||||||
std::set<std::string> c_set {"one", "two", "three", "four", "one"};
|
std::set<std::string> const c_set {"one", "two", "three", "four", "one"};
|
||||||
json j_set(c_set); // only one entry for "one" is used
|
json const j_set(c_set); // only one entry for "one" is used
|
||||||
// ["four", "one", "three", "two"]
|
// ["four", "one", "three", "two"]
|
||||||
|
|
||||||
std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
|
std::unordered_set<std::string> const c_uset {"one", "two", "three", "four", "one"};
|
||||||
json j_uset(c_uset); // only one entry for "one" is used
|
json const j_uset(c_uset); // only one entry for "one" is used
|
||||||
// maybe ["two", "three", "four", "one"]
|
// maybe ["two", "three", "four", "one"]
|
||||||
|
|
||||||
std::multiset<std::string> c_mset {"one", "two", "one", "four"};
|
std::multiset<std::string> const c_mset {"one", "two", "one", "four"};
|
||||||
json j_mset(c_mset); // both entries for "one" are used
|
json const j_mset(c_mset); // both entries for "one" are used
|
||||||
// maybe ["one", "two", "one", "four"]
|
// maybe ["one", "two", "one", "four"]
|
||||||
|
|
||||||
std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
|
std::unordered_multiset<std::string> const c_umset {"one", "two", "one", "four"};
|
||||||
json j_umset(c_umset); // both entries for "one" are used
|
json const j_umset(c_umset); // both entries for "one" are used
|
||||||
// maybe ["one", "two", "one", "four"]
|
// maybe ["one", "two", "one", "four"]
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::map<std::string, int> c_map { {"one", 1}, {"two", 2}, {"three", 3} };
|
std::map<std::string, int> const c_map { {"one", 1}, {"two", 2}, {"three", 3} };
|
||||||
json j_map(c_map);
|
json const j_map(c_map);
|
||||||
// {"one": 1, "two": 2, "three": 3}
|
// {"one": 1, "two": 2, "three": 3}
|
||||||
|
|
||||||
std::unordered_map<const char*, float> c_umap { {"one", 1.2f}, {"two", 2.3f}, {"three", 3.4f} };
|
std::unordered_map<const char*, float> const c_umap { {"one", 1.2f}, {"two", 2.3f}, {"three", 3.4f} };
|
||||||
json j_umap(c_umap);
|
json const j_umap(c_umap);
|
||||||
// {"one": 1.2, "two": 2.3, "three": 3.4}
|
// {"one": 1.2, "two": 2.3, "three": 3.4}
|
||||||
|
|
||||||
std::multimap<std::string, bool> c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
|
std::multimap<std::string, bool> const c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
|
||||||
json j_mmap(c_mmap); // only one entry for key "three" is used
|
json const j_mmap(c_mmap); // only one entry for key "three" is used
|
||||||
// maybe {"one": true, "two": true, "three": true}
|
// maybe {"one": true, "two": true, "three": true}
|
||||||
|
|
||||||
std::unordered_multimap<std::string, bool> c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
|
std::unordered_multimap<std::string, bool> const c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
|
||||||
json j_ummap(c_ummap); // only one entry for key "three" is used
|
json const j_ummap(c_ummap); // only one entry for key "three" is used
|
||||||
// maybe {"one": true, "two": true, "three": true}
|
// maybe {"one": true, "two": true, "three": true}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// strings
|
// strings
|
||||||
std::string s1 = "Hello, world!";
|
std::string const s1 = "Hello, world!";
|
||||||
json js = s1;
|
json const js = s1;
|
||||||
auto s2 = js.get<std::string>();
|
auto s2 = js.get<std::string>();
|
||||||
|
|
||||||
// Booleans
|
// Booleans
|
||||||
bool b1 = true;
|
bool const b1 = true;
|
||||||
json jb = b1;
|
json const jb = b1;
|
||||||
bool b2{jb};
|
bool b2{jb};
|
||||||
CHECK(b2 == true);
|
CHECK(b2 == true);
|
||||||
|
|
||||||
// numbers
|
// numbers
|
||||||
int i = 42;
|
int const i = 42;
|
||||||
json jn = i;
|
json const jn = i;
|
||||||
double f{jn};
|
double f{jn};
|
||||||
CHECK(f == 42);
|
CHECK(f == 42);
|
||||||
|
|
||||||
// etc.
|
// etc.
|
||||||
|
|
||||||
std::string vs = js.get<std::string>();
|
std::string const vs = js.get<std::string>();
|
||||||
bool vb = jb.get<bool>();
|
bool vb = jb.get<bool>();
|
||||||
CHECK(vb == true);
|
CHECK(vb == true);
|
||||||
int vi = jn.get<int>();
|
int vi = jn.get<int>();
|
||||||
@ -274,14 +274,14 @@ TEST_CASE("README" * doctest::skip())
|
|||||||
// "two"
|
// "two"
|
||||||
|
|
||||||
// a JSON patch (RFC 6902)
|
// a JSON patch (RFC 6902)
|
||||||
json j_patch = R"([
|
json const j_patch = R"([
|
||||||
{ "op": "replace", "path": "/baz", "value": "boo" },
|
{ "op": "replace", "path": "/baz", "value": "boo" },
|
||||||
{ "op": "add", "path": "/hello", "value": ["world"] },
|
{ "op": "add", "path": "/hello", "value": ["world"] },
|
||||||
{ "op": "remove", "path": "/foo"}
|
{ "op": "remove", "path": "/foo"}
|
||||||
])"_json;
|
])"_json;
|
||||||
|
|
||||||
// apply the patch
|
// apply the patch
|
||||||
json j_result = j_original.patch(j_patch);
|
json const j_result = j_original.patch(j_patch);
|
||||||
// {
|
// {
|
||||||
// "baz": "boo",
|
// "baz": "boo",
|
||||||
// "hello": ["world"]
|
// "hello": ["world"]
|
||||||
|
@ -14,7 +14,7 @@ using nlohmann::json;
|
|||||||
TEST_CASE("reference access")
|
TEST_CASE("reference access")
|
||||||
{
|
{
|
||||||
// create a JSON value with different types
|
// create a JSON value with different types
|
||||||
json json_types =
|
const json json_types =
|
||||||
{
|
{
|
||||||
{"boolean", true},
|
{"boolean", true},
|
||||||
{
|
{
|
||||||
|
@ -143,27 +143,27 @@ TEST_CASE("regression tests 1")
|
|||||||
// to null), but are serialized as null.
|
// to null), but are serialized as null.
|
||||||
SECTION("NAN value")
|
SECTION("NAN value")
|
||||||
{
|
{
|
||||||
json j1 = NAN;
|
json const j1 = NAN;
|
||||||
CHECK(j1.is_number_float());
|
CHECK(j1.is_number_float());
|
||||||
json::number_float_t f1{j1};
|
json::number_float_t const f1{j1};
|
||||||
CHECK(std::isnan(f1));
|
CHECK(std::isnan(f1));
|
||||||
|
|
||||||
json j2 = static_cast<json::number_float_t>(NAN);
|
json const j2 = static_cast<json::number_float_t>(NAN);
|
||||||
CHECK(j2.is_number_float());
|
CHECK(j2.is_number_float());
|
||||||
json::number_float_t f2{j2};
|
json::number_float_t const f2{j2};
|
||||||
CHECK(std::isnan(f2));
|
CHECK(std::isnan(f2));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("infinity")
|
SECTION("infinity")
|
||||||
{
|
{
|
||||||
json j1 = INFINITY;
|
json const j1 = INFINITY;
|
||||||
CHECK(j1.is_number_float());
|
CHECK(j1.is_number_float());
|
||||||
json::number_float_t f1{j1};
|
json::number_float_t const f1{j1};
|
||||||
CHECK(!std::isfinite(f1));
|
CHECK(!std::isfinite(f1));
|
||||||
|
|
||||||
json j2 = static_cast<json::number_float_t>(INFINITY);
|
json const j2 = static_cast<json::number_float_t>(INFINITY);
|
||||||
CHECK(j2.is_number_float());
|
CHECK(j2.is_number_float());
|
||||||
json::number_float_t f2{j2};
|
json::number_float_t const f2{j2};
|
||||||
CHECK(!std::isfinite(f2));
|
CHECK(!std::isfinite(f2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ TEST_CASE("regression tests 1")
|
|||||||
fields["three"] = std::string("three \"four\"");
|
fields["three"] = std::string("three \"four\"");
|
||||||
|
|
||||||
// create another JSON object by deserializing the serialization
|
// create another JSON object by deserializing the serialization
|
||||||
std::string payload = fields.dump();
|
std::string const payload = fields.dump();
|
||||||
json parsed_fields = json::parse(payload);
|
json parsed_fields = json::parse(payload);
|
||||||
|
|
||||||
// check individual fields to match both objects
|
// check individual fields to match both objects
|
||||||
@ -288,7 +288,7 @@ TEST_CASE("regression tests 1")
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
json a = {1, 2, 3};
|
json a = {1, 2, 3};
|
||||||
json::reverse_iterator rit = ++a.rbegin();
|
json::reverse_iterator const rit = ++a.rbegin();
|
||||||
CHECK(*rit == json(2));
|
CHECK(*rit == json(2));
|
||||||
CHECK(rit.value() == json(2));
|
CHECK(rit.value() == json(2));
|
||||||
}
|
}
|
||||||
@ -340,8 +340,8 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #101 - binary string causes numbers to be dumped as hex")
|
SECTION("issue #101 - binary string causes numbers to be dumped as hex")
|
||||||
{
|
{
|
||||||
int64_t number = 10;
|
int64_t const number = 10;
|
||||||
std::string bytes{"\x00" "asdf\n", 6};
|
std::string const bytes{"\x00" "asdf\n", 6};
|
||||||
json j;
|
json j;
|
||||||
j["int64"] = number;
|
j["int64"] = number;
|
||||||
j["binary string"] = bytes;
|
j["binary string"] = bytes;
|
||||||
@ -352,7 +352,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #111 - subsequent unicode chars")
|
SECTION("issue #111 - subsequent unicode chars")
|
||||||
{
|
{
|
||||||
std::string bytes{0x7, 0x7};
|
std::string const bytes{0x7, 0x7};
|
||||||
json j;
|
json j;
|
||||||
j["string"] = bytes;
|
j["string"] = bytes;
|
||||||
CHECK(j["string"] == "\u0007\u0007");
|
CHECK(j["string"] == "\u0007\u0007");
|
||||||
@ -465,33 +465,33 @@ TEST_CASE("regression tests 1")
|
|||||||
// create JSON class with nonstandard float number type
|
// create JSON class with nonstandard float number type
|
||||||
|
|
||||||
// float
|
// float
|
||||||
nlohmann::basic_json<std::map, std::vector, std::string, bool, int32_t, uint32_t, float> j_float =
|
nlohmann::basic_json<std::map, std::vector, std::string, bool, int32_t, uint32_t, float> const j_float =
|
||||||
1.23e25f;
|
1.23e25f;
|
||||||
CHECK(j_float.get<float>() == 1.23e25f);
|
CHECK(j_float.get<float>() == 1.23e25f);
|
||||||
|
|
||||||
// double
|
// double
|
||||||
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double> j_double =
|
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double> const j_double =
|
||||||
1.23e35;
|
1.23e35;
|
||||||
CHECK(j_double.get<double>() == 1.23e35);
|
CHECK(j_double.get<double>() == 1.23e35);
|
||||||
|
|
||||||
// long double
|
// long double
|
||||||
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, long double>
|
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, long double>
|
||||||
j_long_double = 1.23e45L;
|
const j_long_double = 1.23e45L;
|
||||||
CHECK(j_long_double.get<long double>() == 1.23e45L);
|
CHECK(j_long_double.get<long double>() == 1.23e45L);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #228 - double values are serialized with commas as decimal points")
|
SECTION("issue #228 - double values are serialized with commas as decimal points")
|
||||||
{
|
{
|
||||||
json j1a = 2312.42;
|
json const j1a = 2312.42;
|
||||||
json j1b = json::parse("2312.42");
|
json const j1b = json::parse("2312.42");
|
||||||
|
|
||||||
json j2a = 2342e-2;
|
json const j2a = 2342e-2;
|
||||||
//issue #230
|
//issue #230
|
||||||
//json j2b = json::parse("2342e-2");
|
//json j2b = json::parse("2342e-2");
|
||||||
|
|
||||||
json j3a = 10E3;
|
json const j3a = 10E3;
|
||||||
json j3b = json::parse("10E3");
|
json const j3b = json::parse("10E3");
|
||||||
json j3c = json::parse("10e3");
|
json const j3c = json::parse("10e3");
|
||||||
|
|
||||||
// class to create a locale that would use a comma for decimals
|
// class to create a locale that would use a comma for decimals
|
||||||
class CommaDecimalSeparator : public std::numpunct<char>
|
class CommaDecimalSeparator : public std::numpunct<char>
|
||||||
@ -585,7 +585,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #269 - diff generates incorrect patch when removing multiple array elements")
|
SECTION("issue #269 - diff generates incorrect patch when removing multiple array elements")
|
||||||
{
|
{
|
||||||
json doc = R"( { "arr1": [1, 2, 3, 4] } )"_json;
|
json const doc = R"( { "arr1": [1, 2, 3, 4] } )"_json;
|
||||||
json expected = R"( { "arr1": [1, 2] } )"_json;
|
json expected = R"( { "arr1": [1, 2] } )"_json;
|
||||||
|
|
||||||
// check roundtrip
|
// check roundtrip
|
||||||
@ -610,7 +610,7 @@ TEST_CASE("regression tests 1")
|
|||||||
// code triggered a "warning: unused variable" warning and is left
|
// code triggered a "warning: unused variable" warning and is left
|
||||||
// here to avoid the warning in the future
|
// here to avoid the warning in the future
|
||||||
json object;
|
json object;
|
||||||
json patch = json::array();
|
json const patch = json::array();
|
||||||
object = object.patch(patch);
|
object = object.patch(patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -837,7 +837,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("second example from #529")
|
SECTION("second example from #529")
|
||||||
{
|
{
|
||||||
std::string str = "{\n\"one\" : 1,\n\"two\" : 2\n}\n{\n\"three\" : 3\n}";
|
std::string const str = "{\n\"one\" : 1,\n\"two\" : 2\n}\n{\n\"three\" : 3\n}";
|
||||||
|
|
||||||
{
|
{
|
||||||
std::ofstream file("test.json");
|
std::ofstream file("test.json");
|
||||||
@ -875,23 +875,23 @@ TEST_CASE("regression tests 1")
|
|||||||
SECTION("issue #389 - Integer-overflow (OSS-Fuzz issue 267)")
|
SECTION("issue #389 - Integer-overflow (OSS-Fuzz issue 267)")
|
||||||
{
|
{
|
||||||
// original test case
|
// original test case
|
||||||
json j1 = json::parse("-9223372036854775808");
|
json const j1 = json::parse("-9223372036854775808");
|
||||||
CHECK(j1.is_number_integer());
|
CHECK(j1.is_number_integer());
|
||||||
CHECK(j1.get<json::number_integer_t>() == INT64_MIN);
|
CHECK(j1.get<json::number_integer_t>() == INT64_MIN);
|
||||||
|
|
||||||
// edge case (+1; still an integer)
|
// edge case (+1; still an integer)
|
||||||
json j2 = json::parse("-9223372036854775807");
|
json const j2 = json::parse("-9223372036854775807");
|
||||||
CHECK(j2.is_number_integer());
|
CHECK(j2.is_number_integer());
|
||||||
CHECK(j2.get<json::number_integer_t>() == INT64_MIN + 1);
|
CHECK(j2.get<json::number_integer_t>() == INT64_MIN + 1);
|
||||||
|
|
||||||
// edge case (-1; overflow -> floats)
|
// edge case (-1; overflow -> floats)
|
||||||
json j3 = json::parse("-9223372036854775809");
|
json const j3 = json::parse("-9223372036854775809");
|
||||||
CHECK(j3.is_number_float());
|
CHECK(j3.is_number_float());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #380 - bug in overflow detection when parsing integers")
|
SECTION("issue #380 - bug in overflow detection when parsing integers")
|
||||||
{
|
{
|
||||||
json j = json::parse("166020696663385964490");
|
json const j = json::parse("166020696663385964490");
|
||||||
CHECK(j.is_number_float());
|
CHECK(j.is_number_float());
|
||||||
CHECK(j.get<json::number_float_t>() == 166020696663385964490.0);
|
CHECK(j.get<json::number_float_t>() == 166020696663385964490.0);
|
||||||
}
|
}
|
||||||
@ -899,7 +899,7 @@ TEST_CASE("regression tests 1")
|
|||||||
SECTION("issue #405 - Heap-buffer-overflow (OSS-Fuzz issue 342)")
|
SECTION("issue #405 - Heap-buffer-overflow (OSS-Fuzz issue 342)")
|
||||||
{
|
{
|
||||||
// original test case
|
// original test case
|
||||||
std::vector<uint8_t> vec {0x65, 0xf5, 0x0a, 0x48, 0x21};
|
std::vector<uint8_t> const vec {0x65, 0xf5, 0x0a, 0x48, 0x21};
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec), "[json.exception.parse_error.110] parse error at byte 6: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec), "[json.exception.parse_error.110] parse error at byte 6: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
||||||
}
|
}
|
||||||
@ -909,23 +909,23 @@ TEST_CASE("regression tests 1")
|
|||||||
json _;
|
json _;
|
||||||
|
|
||||||
// original test case: incomplete float64
|
// original test case: incomplete float64
|
||||||
std::vector<uint8_t> vec1 {0xcb, 0x8f, 0x0a};
|
std::vector<uint8_t> const vec1 {0xcb, 0x8f, 0x0a};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec1), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec1), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: incomplete float32
|
// related test case: incomplete float32
|
||||||
std::vector<uint8_t> vec2 {0xca, 0x8f, 0x0a};
|
std::vector<uint8_t> const vec2 {0xca, 0x8f, 0x0a};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec2), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec2), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: incomplete Half-Precision Float (CBOR)
|
// related test case: incomplete Half-Precision Float (CBOR)
|
||||||
std::vector<uint8_t> vec3 {0xf9, 0x8f};
|
std::vector<uint8_t> const vec3 {0xf9, 0x8f};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: incomplete Single-Precision Float (CBOR)
|
// related test case: incomplete Single-Precision Float (CBOR)
|
||||||
std::vector<uint8_t> vec4 {0xfa, 0x8f, 0x0a};
|
std::vector<uint8_t> const vec4 {0xfa, 0x8f, 0x0a};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec4), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec4), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: incomplete Double-Precision Float (CBOR)
|
// related test case: incomplete Double-Precision Float (CBOR)
|
||||||
std::vector<uint8_t> vec5 {0xfb, 0x8f, 0x0a};
|
std::vector<uint8_t> const vec5 {0xfb, 0x8f, 0x0a};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec5), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec5), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR number: unexpected end of input", json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -934,7 +934,7 @@ TEST_CASE("regression tests 1")
|
|||||||
json _;
|
json _;
|
||||||
|
|
||||||
// original test case
|
// original test case
|
||||||
std::vector<uint8_t> vec1 {0x87};
|
std::vector<uint8_t> const vec1 {0x87};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec1), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec1), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack string: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// more test cases for MessagePack
|
// more test cases for MessagePack
|
||||||
@ -946,7 +946,7 @@ TEST_CASE("regression tests 1")
|
|||||||
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
|
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec(1, static_cast<uint8_t>(b));
|
std::vector<uint8_t> const vec(1, static_cast<uint8_t>(b));
|
||||||
CHECK_THROWS_AS(_ = json::from_msgpack(vec), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::from_msgpack(vec), json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,12 +961,12 @@ TEST_CASE("regression tests 1")
|
|||||||
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7 // map
|
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7 // map
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec(1, static_cast<uint8_t>(b));
|
std::vector<uint8_t> const vec(1, static_cast<uint8_t>(b));
|
||||||
CHECK_THROWS_AS(_ = json::from_cbor(vec), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::from_cbor(vec), json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
// special case: empty input
|
// special case: empty input
|
||||||
std::vector<uint8_t> vec2;
|
std::vector<uint8_t> const vec2;
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec2), "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing MessagePack value: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec2), "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing MessagePack value: unexpected end of input", json::parse_error&);
|
||||||
}
|
}
|
||||||
@ -976,22 +976,22 @@ TEST_CASE("regression tests 1")
|
|||||||
json _;
|
json _;
|
||||||
|
|
||||||
// original test case: empty UTF-8 string (indefinite length)
|
// original test case: empty UTF-8 string (indefinite length)
|
||||||
std::vector<uint8_t> vec1 {0x7f};
|
std::vector<uint8_t> const vec1 {0x7f};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: empty array (indefinite length)
|
// related test case: empty array (indefinite length)
|
||||||
std::vector<uint8_t> vec2 {0x9f};
|
std::vector<uint8_t> const vec2 {0x9f};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: empty map (indefinite length)
|
// related test case: empty map (indefinite length)
|
||||||
std::vector<uint8_t> vec3 {0xbf};
|
std::vector<uint8_t> const vec3 {0xbf};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #412 - Heap-buffer-overflow (OSS-Fuzz issue 367)")
|
SECTION("issue #412 - Heap-buffer-overflow (OSS-Fuzz issue 367)")
|
||||||
{
|
{
|
||||||
// original test case
|
// original test case
|
||||||
std::vector<uint8_t> vec
|
std::vector<uint8_t> const vec
|
||||||
{
|
{
|
||||||
0xab, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
|
0xab, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
|
||||||
0x98, 0x98, 0x98, 0x98, 0x98, 0x00, 0x00, 0x00,
|
0x98, 0x98, 0x98, 0x98, 0x98, 0x00, 0x00, 0x00,
|
||||||
@ -1016,15 +1016,15 @@ TEST_CASE("regression tests 1")
|
|||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec), "[json.exception.parse_error.113] parse error at byte 2: syntax error while parsing CBOR string: expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x98", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec), "[json.exception.parse_error.113] parse error at byte 2: syntax error while parsing CBOR string: expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x98", json::parse_error&);
|
||||||
|
|
||||||
// related test case: nonempty UTF-8 string (indefinite length)
|
// related test case: nonempty UTF-8 string (indefinite length)
|
||||||
std::vector<uint8_t> vec1 {0x7f, 0x61, 0x61};
|
std::vector<uint8_t> const vec1 {0x7f, 0x61, 0x61};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: nonempty array (indefinite length)
|
// related test case: nonempty array (indefinite length)
|
||||||
std::vector<uint8_t> vec2 {0x9f, 0x01};
|
std::vector<uint8_t> const vec2 {0x9f, 0x01};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec2), "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing CBOR value: unexpected end of input", json::parse_error&);
|
||||||
|
|
||||||
// related test case: nonempty map (indefinite length)
|
// related test case: nonempty map (indefinite length)
|
||||||
std::vector<uint8_t> vec3 {0xbf, 0x61, 0x61, 0x01};
|
std::vector<uint8_t> const vec3 {0xbf, 0x61, 0x61, 0x01};
|
||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 5: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec3), "[json.exception.parse_error.110] parse error at byte 5: syntax error while parsing CBOR string: unexpected end of input", json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1049,7 +1049,7 @@ TEST_CASE("regression tests 1")
|
|||||||
SECTION("issue #416 - Use-of-uninitialized-value (OSS-Fuzz issue 377)")
|
SECTION("issue #416 - Use-of-uninitialized-value (OSS-Fuzz issue 377)")
|
||||||
{
|
{
|
||||||
// original test case
|
// original test case
|
||||||
std::vector<uint8_t> vec1
|
std::vector<uint8_t> const vec1
|
||||||
{
|
{
|
||||||
0x94, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
|
0x94, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
|
||||||
0x3a, 0x96, 0x96, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
|
0x3a, 0x96, 0x96, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
|
||||||
@ -1063,7 +1063,7 @@ TEST_CASE("regression tests 1")
|
|||||||
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.113] parse error at byte 13: syntax error while parsing CBOR string: expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0xB4", json::parse_error&);
|
CHECK_THROWS_WITH_AS(_ = json::from_cbor(vec1), "[json.exception.parse_error.113] parse error at byte 13: syntax error while parsing CBOR string: expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0xB4", json::parse_error&);
|
||||||
|
|
||||||
// related test case: double-precision
|
// related test case: double-precision
|
||||||
std::vector<uint8_t> vec2
|
std::vector<uint8_t> const vec2
|
||||||
{
|
{
|
||||||
0x94, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
|
0x94, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
|
||||||
0x3a, 0x96, 0x96, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
|
0x3a, 0x96, 0x96, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
|
||||||
@ -1077,7 +1077,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #452 - Heap-buffer-overflow (OSS-Fuzz issue 585)")
|
SECTION("issue #452 - Heap-buffer-overflow (OSS-Fuzz issue 585)")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec = {'-', '0', '1', '2', '2', '7', '4'};
|
std::vector<uint8_t> const vec = {'-', '0', '1', '2', '2', '7', '4'};
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_AS(_ = json::parse(vec), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(vec), json::parse_error&);
|
||||||
}
|
}
|
||||||
@ -1100,9 +1100,9 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #465 - roundtrip error while parsing 1000000000000000010E5")
|
SECTION("issue #465 - roundtrip error while parsing 1000000000000000010E5")
|
||||||
{
|
{
|
||||||
json j1 = json::parse("1000000000000000010E5");
|
json const j1 = json::parse("1000000000000000010E5");
|
||||||
std::string s1 = j1.dump();
|
std::string s1 = j1.dump();
|
||||||
json j2 = json::parse(s1);
|
json const j2 = json::parse(s1);
|
||||||
std::string s2 = j2.dump();
|
std::string s2 = j2.dump();
|
||||||
CHECK(s1 == s2);
|
CHECK(s1 == s2);
|
||||||
}
|
}
|
||||||
@ -1110,15 +1110,15 @@ TEST_CASE("regression tests 1")
|
|||||||
#if JSON_USE_IMPLICIT_CONVERSIONS
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("issue #473 - inconsistent behavior in conversion to array type")
|
SECTION("issue #473 - inconsistent behavior in conversion to array type")
|
||||||
{
|
{
|
||||||
json j_array = {1, 2, 3, 4};
|
json const j_array = {1, 2, 3, 4};
|
||||||
json j_number = 42;
|
json const j_number = 42;
|
||||||
json j_null = nullptr;
|
json const j_null = nullptr;
|
||||||
|
|
||||||
SECTION("std::vector")
|
SECTION("std::vector")
|
||||||
{
|
{
|
||||||
auto create = [](const json & j)
|
auto create = [](const json & j)
|
||||||
{
|
{
|
||||||
std::vector<int> v = j;
|
std::vector<int> const v = j;
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_NOTHROW(create(j_array));
|
CHECK_NOTHROW(create(j_array));
|
||||||
@ -1130,7 +1130,7 @@ TEST_CASE("regression tests 1")
|
|||||||
{
|
{
|
||||||
auto create = [](const json & j)
|
auto create = [](const json & j)
|
||||||
{
|
{
|
||||||
std::list<int> v = j;
|
std::list<int> const v = j;
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_NOTHROW(create(j_array));
|
CHECK_NOTHROW(create(j_array));
|
||||||
@ -1142,7 +1142,7 @@ TEST_CASE("regression tests 1")
|
|||||||
{
|
{
|
||||||
auto create = [](const json & j)
|
auto create = [](const json & j)
|
||||||
{
|
{
|
||||||
std::forward_list<int> v = j;
|
std::forward_list<int> const v = j;
|
||||||
};
|
};
|
||||||
|
|
||||||
CHECK_NOTHROW(create(j_array));
|
CHECK_NOTHROW(create(j_array));
|
||||||
@ -1161,7 +1161,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #494 - conversion from vector<bool> to json fails to build")
|
SECTION("issue #494 - conversion from vector<bool> to json fails to build")
|
||||||
{
|
{
|
||||||
std::vector<bool> boolVector = {false, true, false, false};
|
std::vector<bool> const boolVector = {false, true, false, false};
|
||||||
json j;
|
json j;
|
||||||
j["bool_vector"] = boolVector;
|
j["bool_vector"] = boolVector;
|
||||||
|
|
||||||
@ -1170,14 +1170,14 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #504 - assertion error (OSS-Fuzz 856)")
|
SECTION("issue #504 - assertion error (OSS-Fuzz 856)")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38};
|
std::vector<uint8_t> const vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38};
|
||||||
json j1 = json::from_cbor(vec1, false);
|
json const j1 = json::from_cbor(vec1, false);
|
||||||
|
|
||||||
// step 2: round trip
|
// step 2: round trip
|
||||||
std::vector<uint8_t> vec2 = json::to_cbor(j1);
|
std::vector<uint8_t> vec2 = json::to_cbor(j1);
|
||||||
|
|
||||||
// parse serialization
|
// parse serialization
|
||||||
json j2 = json::from_cbor(vec2);
|
json const j2 = json::from_cbor(vec2);
|
||||||
|
|
||||||
// NaN is dumped to "null"
|
// NaN is dumped to "null"
|
||||||
CHECK(j2.is_number_float());
|
CHECK(j2.is_number_float());
|
||||||
@ -1226,7 +1226,7 @@ TEST_CASE("regression tests 1")
|
|||||||
SECTION("issue #575 - heap-buffer-overflow (OSS-Fuzz 1400)")
|
SECTION("issue #575 - heap-buffer-overflow (OSS-Fuzz 1400)")
|
||||||
{
|
{
|
||||||
json _;
|
json _;
|
||||||
std::vector<uint8_t> vec = {'"', '\\', '"', 'X', '"', '"'};
|
std::vector<uint8_t> const vec = {'"', '\\', '"', 'X', '"', '"'};
|
||||||
CHECK_THROWS_AS(_ = json::parse(vec), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(vec), json::parse_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1239,7 +1239,7 @@ TEST_CASE("regression tests 1")
|
|||||||
std::map<std::string, int> m1 {{"key", 1}};
|
std::map<std::string, int> m1 {{"key", 1}};
|
||||||
|
|
||||||
// create and print a JSON from the map
|
// create and print a JSON from the map
|
||||||
json j = m1;
|
json const j = m1;
|
||||||
|
|
||||||
// get the map out of JSON
|
// get the map out of JSON
|
||||||
std::map<std::string, int> m2 = j;
|
std::map<std::string, int> m2 = j;
|
||||||
@ -1254,7 +1254,7 @@ TEST_CASE("regression tests 1")
|
|||||||
std::map<std::string, std::string> m1 {{"key", "val"}};
|
std::map<std::string, std::string> m1 {{"key", "val"}};
|
||||||
|
|
||||||
// create and print a JSON from the map
|
// create and print a JSON from the map
|
||||||
json j = m1;
|
json const j = m1;
|
||||||
|
|
||||||
// get the map out of JSON
|
// get the map out of JSON
|
||||||
std::map<std::string, std::string> m2 = j;
|
std::map<std::string, std::string> m2 = j;
|
||||||
@ -1277,7 +1277,7 @@ TEST_CASE("regression tests 1")
|
|||||||
{
|
{
|
||||||
SECTION("original example")
|
SECTION("original example")
|
||||||
{
|
{
|
||||||
std::valarray<double> v;
|
std::valarray<double> const v;
|
||||||
nlohmann::json j;
|
nlohmann::json j;
|
||||||
j["test"] = v;
|
j["test"] = v;
|
||||||
}
|
}
|
||||||
@ -1364,8 +1364,8 @@ TEST_CASE("regression tests 1")
|
|||||||
SECTION("issue #838 - incorrect parse error with binary data in keys")
|
SECTION("issue #838 - incorrect parse error with binary data in keys")
|
||||||
{
|
{
|
||||||
std::array<uint8_t, 28> key1 = {{ 103, 92, 117, 48, 48, 48, 55, 92, 114, 215, 126, 214, 95, 92, 34, 174, 40, 71, 38, 174, 40, 71, 38, 223, 134, 247, 127, 0 }};
|
std::array<uint8_t, 28> key1 = {{ 103, 92, 117, 48, 48, 48, 55, 92, 114, 215, 126, 214, 95, 92, 34, 174, 40, 71, 38, 174, 40, 71, 38, 223, 134, 247, 127, 0 }};
|
||||||
std::string key1_str(reinterpret_cast<char*>(key1.data()));
|
std::string const key1_str(reinterpret_cast<char*>(key1.data()));
|
||||||
json j = key1_str;
|
json const j = key1_str;
|
||||||
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 10: 0x7E", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 10: 0x7E", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1405,7 +1405,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #961 - incorrect parsing of indefinite length CBOR strings")
|
SECTION("issue #961 - incorrect parsing of indefinite length CBOR strings")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> v_cbor =
|
std::vector<uint8_t> const v_cbor =
|
||||||
{
|
{
|
||||||
0x7F,
|
0x7F,
|
||||||
0x64,
|
0x64,
|
||||||
@ -1453,7 +1453,7 @@ TEST_CASE("regression tests 1")
|
|||||||
)";
|
)";
|
||||||
|
|
||||||
// define parser callback
|
// define parser callback
|
||||||
json::parser_callback_t cb = [](int /*depth*/, json::parse_event_t event, json & parsed)
|
json::parser_callback_t const cb = [](int /*depth*/, json::parse_event_t event, json & parsed)
|
||||||
{
|
{
|
||||||
// skip object elements with key "Thumbnail"
|
// skip object elements with key "Thumbnail"
|
||||||
return !(event == json::parse_event_t::key && parsed == json("Thumbnail"));
|
return !(event == json::parse_event_t::key && parsed == json("Thumbnail"));
|
||||||
@ -1467,7 +1467,7 @@ TEST_CASE("regression tests 1")
|
|||||||
|
|
||||||
SECTION("issue #972 - Segmentation fault on G++ when trying to assign json string literal to custom json type")
|
SECTION("issue #972 - Segmentation fault on G++ when trying to assign json string literal to custom json type")
|
||||||
{
|
{
|
||||||
my_json foo = R"([1, 2, 3])"_json;
|
my_json const foo = R"([1, 2, 3])"_json;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #977 - Assigning between different json types")
|
SECTION("issue #977 - Assigning between different json types")
|
||||||
@ -1478,7 +1478,7 @@ TEST_CASE("regression tests 1")
|
|||||||
CHECK(lj.size() == 1);
|
CHECK(lj.size() == 1);
|
||||||
CHECK(lj["x"] == 3);
|
CHECK(lj["x"] == 3);
|
||||||
CHECK(ff.x == 3);
|
CHECK(ff.x == 3);
|
||||||
nlohmann::json nj = lj; // This line works as expected
|
nlohmann::json const nj = lj; // This line works as expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,7 +348,7 @@ TEST_CASE("regression tests 2")
|
|||||||
]
|
]
|
||||||
})";
|
})";
|
||||||
|
|
||||||
json::parser_callback_t cb = [&](int /*level*/, json::parse_event_t event, json & parsed) noexcept
|
const json::parser_callback_t cb = [&](int /*level*/, json::parse_event_t event, json & parsed) noexcept
|
||||||
{
|
{
|
||||||
// skip uninteresting events
|
// skip uninteresting events
|
||||||
if (event == json::parse_event_t::value && !parsed.is_primitive())
|
if (event == json::parse_event_t::value && !parsed.is_primitive())
|
||||||
@ -440,7 +440,7 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("issue #1299 - compile error in from_json converting to container "
|
SECTION("issue #1299 - compile error in from_json converting to container "
|
||||||
"with std::pair")
|
"with std::pair")
|
||||||
{
|
{
|
||||||
json j =
|
const json j =
|
||||||
{
|
{
|
||||||
{"1", {{"a", "testa_1"}, {"b", "testb_1"}}},
|
{"1", {{"a", "testa_1"}, {"b", "testb_1"}}},
|
||||||
{"2", {{"a", "testa_2"}, {"b", "testb_2"}}},
|
{"2", {{"a", "testa_2"}, {"b", "testb_2"}}},
|
||||||
@ -501,7 +501,7 @@ TEST_CASE("regression tests 2")
|
|||||||
{109, 108, 103, 125, -122, -53, 115, 18, 3, 0, 102, 19, 1, 15, -110, 13, -3, -1, -81, 32, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, 2, 0, 0, 96, -118, 46, -116, 46, 109, -84, -87, 108, 14, 109, -24, -83, 13, -18, -51, -83, -52, -115, 14, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 35, -74, -73, 55, 57, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, -96, -54, -28, -26}
|
{109, 108, 103, 125, -122, -53, 115, 18, 3, 0, 102, 19, 1, 15, -110, 13, -3, -1, -81, 32, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, 2, 0, 0, 96, -118, 46, -116, 46, 109, -84, -87, 108, 14, 109, -24, -83, 13, -18, -51, -83, -52, -115, 14, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 35, -74, -73, 55, 57, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, -96, -54, -28, -26}
|
||||||
};
|
};
|
||||||
std::string s;
|
std::string s;
|
||||||
for (int i : data)
|
for (const int i : data)
|
||||||
{
|
{
|
||||||
s += static_cast<char>(i);
|
s += static_cast<char>(i);
|
||||||
}
|
}
|
||||||
@ -512,20 +512,20 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)")
|
SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)")
|
||||||
{
|
{
|
||||||
json j = json::parse("[-9223372036854775808]");
|
const json j = json::parse("[-9223372036854775808]");
|
||||||
CHECK(j.dump() == "[-9223372036854775808]");
|
CHECK(j.dump() == "[-9223372036854775808]");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #1708 - minimum value of int64_t can be outputted")
|
SECTION("issue #1708 - minimum value of int64_t can be outputted")
|
||||||
{
|
{
|
||||||
constexpr auto smallest = (std::numeric_limits<int64_t>::min)();
|
constexpr auto smallest = (std::numeric_limits<int64_t>::min)();
|
||||||
json j = smallest;
|
const json j = smallest;
|
||||||
CHECK(j.dump() == std::to_string(smallest));
|
CHECK(j.dump() == std::to_string(smallest));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #1727 - Contains with non-const lvalue json_pointer picks the wrong overload")
|
SECTION("issue #1727 - Contains with non-const lvalue json_pointer picks the wrong overload")
|
||||||
{
|
{
|
||||||
json j = {{"root", {{"settings", {{"logging", true}}}}}};
|
const json j = {{"root", {{"settings", {{"logging", true}}}}}};
|
||||||
|
|
||||||
auto jptr1 = "/root/settings/logging"_json_pointer;
|
auto jptr1 = "/root/settings/logging"_json_pointer;
|
||||||
auto jptr2 = json::json_pointer{"/root/settings/logging"};
|
auto jptr2 = json::json_pointer{"/root/settings/logging"};
|
||||||
@ -539,7 +539,7 @@ TEST_CASE("regression tests 2")
|
|||||||
// does not compile on ICPC when targeting C++20
|
// does not compile on ICPC when targeting C++20
|
||||||
#if !(defined(__INTEL_COMPILER) && __cplusplus >= 202000)
|
#if !(defined(__INTEL_COMPILER) && __cplusplus >= 202000)
|
||||||
{
|
{
|
||||||
json j;
|
const json j;
|
||||||
NonDefaultFromJsonStruct x(j);
|
NonDefaultFromJsonStruct x(j);
|
||||||
NonDefaultFromJsonStruct y;
|
NonDefaultFromJsonStruct y;
|
||||||
CHECK(x == y);
|
CHECK(x == y);
|
||||||
@ -548,27 +548,27 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
auto val = nlohmann::json("one").get<for_1647>();
|
auto val = nlohmann::json("one").get<for_1647>();
|
||||||
CHECK(val == for_1647::one);
|
CHECK(val == for_1647::one);
|
||||||
json j = val;
|
const json j = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal")
|
SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal")
|
||||||
{
|
{
|
||||||
SECTION("string literal")
|
SECTION("string literal")
|
||||||
{
|
{
|
||||||
json cbor = json::from_cbor("B", true, false);
|
const json cbor = json::from_cbor("B", true, false);
|
||||||
CHECK(cbor.is_discarded());
|
CHECK(cbor.is_discarded());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string array")
|
SECTION("string array")
|
||||||
{
|
{
|
||||||
const std::array<char, 2> input = {{'B', 0x00}};
|
const std::array<char, 2> input = {{'B', 0x00}};
|
||||||
json cbor = json::from_cbor(input, true, false);
|
const json cbor = json::from_cbor(input, true, false);
|
||||||
CHECK(cbor.is_discarded());
|
CHECK(cbor.is_discarded());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::string")
|
SECTION("std::string")
|
||||||
{
|
{
|
||||||
json cbor = json::from_cbor(std::string("B"), true, false);
|
const json cbor = json::from_cbor(std::string("B"), true, false);
|
||||||
CHECK(cbor.is_discarded());
|
CHECK(cbor.is_discarded());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -597,7 +597,7 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("issue #2067 - cannot serialize binary data to text JSON")
|
SECTION("issue #2067 - cannot serialize binary data to text JSON")
|
||||||
{
|
{
|
||||||
const std::array<unsigned char, 23> data = {{0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30}};
|
const std::array<unsigned char, 23> data = {{0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30}};
|
||||||
json j = json::from_msgpack(data.data(), data.size());
|
const json j = json::from_msgpack(data.data(), data.size());
|
||||||
CHECK_NOTHROW(
|
CHECK_NOTHROW(
|
||||||
j.dump(4, // Indent
|
j.dump(4, // Indent
|
||||||
' ', // Indent char
|
' ', // Indent char
|
||||||
@ -609,15 +609,15 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("PR #2181 - regression bug with lvalue")
|
SECTION("PR #2181 - regression bug with lvalue")
|
||||||
{
|
{
|
||||||
// see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060
|
// see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060
|
||||||
json j{{"x", "test"}};
|
const json j{{"x", "test"}};
|
||||||
std::string defval = "default value";
|
const std::string defval = "default value";
|
||||||
auto val = j.value("x", defval);
|
auto val = j.value("x", defval);
|
||||||
auto val2 = j.value("y", defval);
|
auto val2 = j.value("y", defval);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #2293 - eof doesn't cause parsing to stop")
|
SECTION("issue #2293 - eof doesn't cause parsing to stop")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> data =
|
const std::vector<uint8_t> data =
|
||||||
{
|
{
|
||||||
0x7B,
|
0x7B,
|
||||||
0x6F,
|
0x6F,
|
||||||
@ -630,23 +630,23 @@ TEST_CASE("regression tests 2")
|
|||||||
0x4F,
|
0x4F,
|
||||||
0x42
|
0x42
|
||||||
};
|
};
|
||||||
json result = json::from_cbor(data, true, false);
|
const json result = json::from_cbor(data, true, false);
|
||||||
CHECK(result.is_discarded());
|
CHECK(result.is_discarded());
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("issue #2315 - json.update and vector<pair>does not work with ordered_json")
|
SECTION("issue #2315 - json.update and vector<pair>does not work with ordered_json")
|
||||||
{
|
{
|
||||||
nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}};
|
nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}};
|
||||||
nlohmann::ordered_json jsonCat = {{"animal", "cat"}};
|
const nlohmann::ordered_json jsonCat = {{"animal", "cat"}};
|
||||||
jsonAnimals.update(jsonCat);
|
jsonAnimals.update(jsonCat);
|
||||||
CHECK(jsonAnimals["animal"] == "cat");
|
CHECK(jsonAnimals["animal"] == "cat");
|
||||||
|
|
||||||
auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump());
|
auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump());
|
||||||
CHECK(jsonAnimals == jsonAnimals_parsed);
|
CHECK(jsonAnimals == jsonAnimals_parsed);
|
||||||
|
|
||||||
std::vector<std::pair<std::string, int64_t>> intData = {std::make_pair("aaaa", 11),
|
const std::vector<std::pair<std::string, int64_t>> intData = {std::make_pair("aaaa", 11),
|
||||||
std::make_pair("bbb", 222)
|
std::make_pair("bbb", 222)
|
||||||
};
|
};
|
||||||
nlohmann::ordered_json jsonObj;
|
nlohmann::ordered_json jsonObj;
|
||||||
for (const auto& data : intData)
|
for (const auto& data : intData)
|
||||||
{
|
{
|
||||||
@ -658,8 +658,8 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
SECTION("issue #2330 - ignore_comment=true fails on multiple consecutive lines starting with comments")
|
SECTION("issue #2330 - ignore_comment=true fails on multiple consecutive lines starting with comments")
|
||||||
{
|
{
|
||||||
std::string ss = "//\n//\n{\n}\n";
|
const std::string ss = "//\n//\n{\n}\n";
|
||||||
json j = json::parse(ss, nullptr, true, true);
|
const json j = json::parse(ss, nullptr, true, true);
|
||||||
CHECK(j.dump() == "{}");
|
CHECK(j.dump() == "{}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,7 +668,7 @@ TEST_CASE("regression tests 2")
|
|||||||
{
|
{
|
||||||
const char DATA[] = R"("Hello, world!")"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
const char DATA[] = R"("Hello, world!")"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
const auto s = std::as_bytes(std::span(DATA));
|
const auto s = std::as_bytes(std::span(DATA));
|
||||||
json j = json::parse(s);
|
const json j = json::parse(s);
|
||||||
CHECK(j.dump() == "\"Hello, world!\"");
|
CHECK(j.dump() == "\"Hello, world!\"");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -678,14 +678,14 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("std::array")
|
SECTION("std::array")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
json j = {7, 4};
|
const json j = {7, 4};
|
||||||
auto arr = j.get<std::array<NonDefaultConstructible, 2>>();
|
auto arr = j.get<std::array<NonDefaultConstructible, 2>>();
|
||||||
CHECK(arr[0].x == 7);
|
CHECK(arr[0].x == 7);
|
||||||
CHECK(arr[1].x == 4);
|
CHECK(arr[1].x == 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = 7;
|
const json j = 7;
|
||||||
CHECK_THROWS_AS((j.get<std::array<NonDefaultConstructible, 1>>()), json::type_error);
|
CHECK_THROWS_AS((j.get<std::array<NonDefaultConstructible, 1>>()), json::type_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -693,28 +693,28 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("std::pair")
|
SECTION("std::pair")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
json j = {3, 8};
|
const json j = {3, 8};
|
||||||
auto p = j.get<std::pair<NonDefaultConstructible, NonDefaultConstructible>>();
|
auto p = j.get<std::pair<NonDefaultConstructible, NonDefaultConstructible>>();
|
||||||
CHECK(p.first.x == 3);
|
CHECK(p.first.x == 3);
|
||||||
CHECK(p.second.x == 8);
|
CHECK(p.second.x == 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = {4, 1};
|
const json j = {4, 1};
|
||||||
auto p = j.get<std::pair<int, NonDefaultConstructible>>();
|
auto p = j.get<std::pair<int, NonDefaultConstructible>>();
|
||||||
CHECK(p.first == 4);
|
CHECK(p.first == 4);
|
||||||
CHECK(p.second.x == 1);
|
CHECK(p.second.x == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = {6, 7};
|
const json j = {6, 7};
|
||||||
auto p = j.get<std::pair<NonDefaultConstructible, int>>();
|
auto p = j.get<std::pair<NonDefaultConstructible, int>>();
|
||||||
CHECK(p.first.x == 6);
|
CHECK(p.first.x == 6);
|
||||||
CHECK(p.second == 7);
|
CHECK(p.second == 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = 7;
|
const json j = 7;
|
||||||
CHECK_THROWS_AS((j.get<std::pair<NonDefaultConstructible, int>>()), json::type_error);
|
CHECK_THROWS_AS((j.get<std::pair<NonDefaultConstructible, int>>()), json::type_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -722,13 +722,13 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("std::tuple")
|
SECTION("std::tuple")
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
json j = {9};
|
const json j = {9};
|
||||||
auto t = j.get<std::tuple<NonDefaultConstructible>>();
|
auto t = j.get<std::tuple<NonDefaultConstructible>>();
|
||||||
CHECK(std::get<0>(t).x == 9);
|
CHECK(std::get<0>(t).x == 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = {9, 8, 7};
|
const json j = {9, 8, 7};
|
||||||
auto t = j.get<std::tuple<NonDefaultConstructible, int, NonDefaultConstructible>>();
|
auto t = j.get<std::tuple<NonDefaultConstructible, int, NonDefaultConstructible>>();
|
||||||
CHECK(std::get<0>(t).x == 9);
|
CHECK(std::get<0>(t).x == 9);
|
||||||
CHECK(std::get<1>(t) == 8);
|
CHECK(std::get<1>(t) == 8);
|
||||||
@ -736,7 +736,7 @@ TEST_CASE("regression tests 2")
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
json j = 7;
|
const json j = 7;
|
||||||
CHECK_THROWS_AS((j.get<std::tuple<NonDefaultConstructible>>()), json::type_error);
|
CHECK_THROWS_AS((j.get<std::tuple<NonDefaultConstructible>>()), json::type_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -747,7 +747,7 @@ TEST_CASE("regression tests 2")
|
|||||||
// the code below is expected to not leak memory
|
// the code below is expected to not leak memory
|
||||||
{
|
{
|
||||||
nlohmann::json o;
|
nlohmann::json o;
|
||||||
std::string s = "bar";
|
const std::string s = "bar";
|
||||||
|
|
||||||
nlohmann::to_json(o["foo"], s);
|
nlohmann::to_json(o["foo"], s);
|
||||||
|
|
||||||
@ -759,7 +759,7 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
{
|
{
|
||||||
nlohmann::json o;
|
nlohmann::json o;
|
||||||
std::string s = "bar";
|
const std::string s = "bar";
|
||||||
|
|
||||||
nlohmann::to_json(o["foo"], s);
|
nlohmann::to_json(o["foo"], s);
|
||||||
|
|
||||||
@ -785,7 +785,7 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
SECTION("issue #2958 - Inserting in unordered json using a pointer retains the leading slash")
|
SECTION("issue #2958 - Inserting in unordered json using a pointer retains the leading slash")
|
||||||
{
|
{
|
||||||
std::string p = "/root";
|
const std::string p = "/root";
|
||||||
|
|
||||||
json test1;
|
json test1;
|
||||||
test1[json::json_pointer(p)] = json::object();
|
test1[json::json_pointer(p)] = json::object();
|
||||||
@ -816,7 +816,7 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("issue #3070 - Version 3.10.3 breaks backward-compatibility with 3.10.2 ")
|
SECTION("issue #3070 - Version 3.10.3 breaks backward-compatibility with 3.10.2 ")
|
||||||
{
|
{
|
||||||
nlohmann::detail::std_fs::path text_path("/tmp/text.txt");
|
nlohmann::detail::std_fs::path text_path("/tmp/text.txt");
|
||||||
json j(text_path);
|
const json j(text_path);
|
||||||
|
|
||||||
const auto j_path = j.get<nlohmann::detail::std_fs::path>();
|
const auto j_path = j.get<nlohmann::detail::std_fs::path>();
|
||||||
CHECK(j_path == text_path);
|
CHECK(j_path == text_path);
|
||||||
@ -867,7 +867,7 @@ TEST_CASE("regression tests 2")
|
|||||||
|
|
||||||
SECTION("issue #3171 - if class is_constructible from std::string wrong from_json overload is being selected, compilation failed")
|
SECTION("issue #3171 - if class is_constructible from std::string wrong from_json overload is being selected, compilation failed")
|
||||||
{
|
{
|
||||||
json j{{ "str", "value"}};
|
const json j{{ "str", "value"}};
|
||||||
|
|
||||||
// failed with: error: no match for ‘operator=’ (operand types are ‘for_3171_derived’ and ‘const nlohmann::basic_json<>::string_t’
|
// failed with: error: no match for ‘operator=’ (operand types are ‘for_3171_derived’ and ‘const nlohmann::basic_json<>::string_t’
|
||||||
// {aka ‘const std::__cxx11::basic_string<char>’})
|
// {aka ‘const std::__cxx11::basic_string<char>’})
|
||||||
@ -881,7 +881,7 @@ TEST_CASE("regression tests 2")
|
|||||||
SECTION("issue #3312 - Parse to custom class from unordered_json breaks on G++11.2.0 with C++20")
|
SECTION("issue #3312 - Parse to custom class from unordered_json breaks on G++11.2.0 with C++20")
|
||||||
{
|
{
|
||||||
// see test for #3171
|
// see test for #3171
|
||||||
ordered_json j = {{"name", "class"}};
|
const ordered_json j = {{"name", "class"}};
|
||||||
for_3312 obj{};
|
for_3312 obj{};
|
||||||
|
|
||||||
j.get_to(obj);
|
j.get_to(obj);
|
||||||
@ -893,8 +893,8 @@ TEST_CASE("regression tests 2")
|
|||||||
#if defined(JSON_HAS_CPP_17) && JSON_USE_IMPLICIT_CONVERSIONS
|
#if defined(JSON_HAS_CPP_17) && JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
SECTION("issue #3428 - Error occurred when converting nlohmann::json to std::any")
|
SECTION("issue #3428 - Error occurred when converting nlohmann::json to std::any")
|
||||||
{
|
{
|
||||||
json j;
|
const json j;
|
||||||
std::any a1 = j;
|
const std::any a1 = j;
|
||||||
std::any&& a2 = j;
|
std::any&& a2 = j;
|
||||||
|
|
||||||
CHECK(a1.type() == typeid(j));
|
CHECK(a1.type() == typeid(j));
|
||||||
|
@ -21,7 +21,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("no given width")
|
SECTION("no given width")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
ss << j;
|
ss << j;
|
||||||
CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
|
CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("given width")
|
SECTION("given width")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
ss << std::setw(4) << j;
|
ss << std::setw(4) << j;
|
||||||
CHECK(ss.str() ==
|
CHECK(ss.str() ==
|
||||||
"[\n \"foo\",\n 1,\n 2,\n 3,\n false,\n {\n \"one\": 1\n }\n]");
|
"[\n \"foo\",\n 1,\n 2,\n 3,\n false,\n {\n \"one\": 1\n }\n]");
|
||||||
@ -38,7 +38,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("given fill")
|
SECTION("given fill")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
ss << std::setw(1) << std::setfill('\t') << j;
|
ss << std::setw(1) << std::setfill('\t') << j;
|
||||||
CHECK(ss.str() ==
|
CHECK(ss.str() ==
|
||||||
"[\n\t\"foo\",\n\t1,\n\t2,\n\t3,\n\tfalse,\n\t{\n\t\t\"one\": 1\n\t}\n]");
|
"[\n\t\"foo\",\n\t1,\n\t2,\n\t3,\n\tfalse,\n\t{\n\t\t\"one\": 1\n\t}\n]");
|
||||||
@ -50,7 +50,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("no given width")
|
SECTION("no given width")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
j >> ss;
|
j >> ss;
|
||||||
CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
|
CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("given width")
|
SECTION("given width")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
ss.width(4);
|
ss.width(4);
|
||||||
j >> ss;
|
j >> ss;
|
||||||
CHECK(ss.str() ==
|
CHECK(ss.str() ==
|
||||||
@ -68,7 +68,7 @@ TEST_CASE("serialization")
|
|||||||
SECTION("given fill")
|
SECTION("given fill")
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
|
||||||
ss.width(1);
|
ss.width(1);
|
||||||
ss.fill('\t');
|
ss.fill('\t');
|
||||||
j >> ss;
|
j >> ss;
|
||||||
@ -81,7 +81,7 @@ TEST_CASE("serialization")
|
|||||||
{
|
{
|
||||||
SECTION("invalid character")
|
SECTION("invalid character")
|
||||||
{
|
{
|
||||||
json j = "ä\xA9ü";
|
const json j = "ä\xA9ü";
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9", json::type_error&);
|
||||||
CHECK_THROWS_WITH_AS(j.dump(1, ' ', false, json::error_handler_t::strict), "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.dump(1, ' ', false, json::error_handler_t::strict), "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9", json::type_error&);
|
||||||
@ -92,7 +92,7 @@ TEST_CASE("serialization")
|
|||||||
|
|
||||||
SECTION("ending with incomplete character")
|
SECTION("ending with incomplete character")
|
||||||
{
|
{
|
||||||
json j = "123\xC2";
|
const json j = "123\xC2";
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] incomplete UTF-8 string; last byte: 0xC2", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] incomplete UTF-8 string; last byte: 0xC2", json::type_error&);
|
||||||
CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
|
CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
|
||||||
@ -103,7 +103,7 @@ TEST_CASE("serialization")
|
|||||||
|
|
||||||
SECTION("unexpected character")
|
SECTION("unexpected character")
|
||||||
{
|
{
|
||||||
json j = "123\xF1\xB0\x34\x35\x36";
|
const json j = "123\xF1\xB0\x34\x35\x36";
|
||||||
|
|
||||||
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 5: 0x34", json::type_error&);
|
CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 5: 0x34", json::type_error&);
|
||||||
CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
|
CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
|
||||||
@ -120,7 +120,7 @@ TEST_CASE("serialization")
|
|||||||
|
|
||||||
auto test = [&](std::string const & input, std::string const & expected)
|
auto test = [&](std::string const & input, std::string const & expected)
|
||||||
{
|
{
|
||||||
json j = input;
|
const json j = input;
|
||||||
CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"" + expected + "\"");
|
CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"" + expected + "\"");
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ TEST_CASE("serialization")
|
|||||||
auto test = [&](std::string const & input, std::string const & expected)
|
auto test = [&](std::string const & input, std::string const & expected)
|
||||||
{
|
{
|
||||||
using std::to_string;
|
using std::to_string;
|
||||||
json j = input;
|
const json j = input;
|
||||||
CHECK(to_string(j) == "\"" + expected + "\"");
|
CHECK(to_string(j) == "\"" + expected + "\"");
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -170,14 +170,14 @@ TEST_CASE_TEMPLATE("serialization for extreme integer values", T, int32_t, uint3
|
|||||||
SECTION("minimum")
|
SECTION("minimum")
|
||||||
{
|
{
|
||||||
constexpr auto minimum = (std::numeric_limits<T>::min)();
|
constexpr auto minimum = (std::numeric_limits<T>::min)();
|
||||||
json j = minimum;
|
const json j = minimum;
|
||||||
CHECK(j.dump() == std::to_string(minimum));
|
CHECK(j.dump() == std::to_string(minimum));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("maximum")
|
SECTION("maximum")
|
||||||
{
|
{
|
||||||
constexpr auto maximum = (std::numeric_limits<T>::max)();
|
constexpr auto maximum = (std::numeric_limits<T>::max)();
|
||||||
json j = maximum;
|
const json j = maximum;
|
||||||
CHECK(j.dump() == std::to_string(maximum));
|
CHECK(j.dump() == std::to_string(maximum));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,15 +189,15 @@ TEST_CASE("dump with binary values")
|
|||||||
auto binary_with_subtype = json::binary({1, 2, 3, 4}, 128);
|
auto binary_with_subtype = json::binary({1, 2, 3, 4}, 128);
|
||||||
auto binary_empty_with_subtype = json::binary({}, 128);
|
auto binary_empty_with_subtype = json::binary({}, 128);
|
||||||
|
|
||||||
json object = {{"key", binary}};
|
const json object = {{"key", binary}};
|
||||||
json object_empty = {{"key", binary_empty}};
|
const json object_empty = {{"key", binary_empty}};
|
||||||
json object_with_subtype = {{"key", binary_with_subtype}};
|
const json object_with_subtype = {{"key", binary_with_subtype}};
|
||||||
json object_empty_with_subtype = {{"key", binary_empty_with_subtype}};
|
const json object_empty_with_subtype = {{"key", binary_empty_with_subtype}};
|
||||||
|
|
||||||
json array = {"value", 1, binary};
|
const json array = {"value", 1, binary};
|
||||||
json array_empty = {"value", 1, binary_empty};
|
const json array_empty = {"value", 1, binary_empty};
|
||||||
json array_with_subtype = {"value", 1, binary_with_subtype};
|
const json array_with_subtype = {"value", 1, binary_with_subtype};
|
||||||
json array_empty_with_subtype = {"value", 1, binary_empty_with_subtype};
|
const json array_empty_with_subtype = {"value", 1, binary_empty_with_subtype};
|
||||||
|
|
||||||
SECTION("normal")
|
SECTION("normal")
|
||||||
{
|
{
|
||||||
|
@ -302,7 +302,7 @@ TEST_CASE("compliance tests from nativejson-benchmark")
|
|||||||
(std::istreambuf_iterator<char>()) );
|
(std::istreambuf_iterator<char>()) );
|
||||||
|
|
||||||
CAPTURE(json_string)
|
CAPTURE(json_string)
|
||||||
json j = json::parse(json_string);
|
const json j = json::parse(json_string);
|
||||||
CHECK(j.dump() == json_string);
|
CHECK(j.dump() == json_string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -363,35 +363,35 @@ TEST_CASE("json.org examples")
|
|||||||
}
|
}
|
||||||
SECTION("FILE 1.json")
|
SECTION("FILE 1.json")
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/1.json", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/1.json", "r"), &std::fclose);
|
||||||
json _;
|
json _;
|
||||||
CHECK_NOTHROW(_ = json::parse(f.get()));
|
CHECK_NOTHROW(_ = json::parse(f.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("FILE 2.json")
|
SECTION("FILE 2.json")
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/2.json", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/2.json", "r"), &std::fclose);
|
||||||
json _;
|
json _;
|
||||||
CHECK_NOTHROW(_ = json::parse(f.get()));
|
CHECK_NOTHROW(_ = json::parse(f.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("FILE 3.json")
|
SECTION("FILE 3.json")
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/3.json", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/3.json", "r"), &std::fclose);
|
||||||
json _;
|
json _;
|
||||||
CHECK_NOTHROW(_ = json::parse(f.get()));
|
CHECK_NOTHROW(_ = json::parse(f.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("FILE 4.json")
|
SECTION("FILE 4.json")
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/4.json", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/4.json", "r"), &std::fclose);
|
||||||
json _;
|
json _;
|
||||||
CHECK_NOTHROW(_ = json::parse(f.get()));
|
CHECK_NOTHROW(_ = json::parse(f.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("FILE 5.json")
|
SECTION("FILE 5.json")
|
||||||
{
|
{
|
||||||
std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/5.json", "r"), &std::fclose);
|
const std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen(TEST_DATA_DIRECTORY "/json.org/5.json", "r"), &std::fclose);
|
||||||
json _;
|
json _;
|
||||||
CHECK_NOTHROW(_ = json::parse(f.get()));
|
CHECK_NOTHROW(_ = json::parse(f.get()));
|
||||||
}
|
}
|
||||||
@ -1340,12 +1340,12 @@ std::string trim(const std::string& str);
|
|||||||
// from https://stackoverflow.com/a/25829178/266378
|
// from https://stackoverflow.com/a/25829178/266378
|
||||||
std::string trim(const std::string& str)
|
std::string trim(const std::string& str)
|
||||||
{
|
{
|
||||||
size_t first = str.find_first_not_of(' ');
|
const size_t first = str.find_first_not_of(' ');
|
||||||
if (std::string::npos == first)
|
if (std::string::npos == first)
|
||||||
{
|
{
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
size_t last = str.find_last_not_of(' ');
|
const size_t last = str.find_last_not_of(' ');
|
||||||
return str.substr(first, (last - first + 1));
|
return str.substr(first, (last - first + 1));
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -1384,7 +1384,7 @@ TEST_CASE("Big List of Naughty Strings")
|
|||||||
|
|
||||||
// check roundtrip
|
// check roundtrip
|
||||||
CAPTURE(line)
|
CAPTURE(line)
|
||||||
json j = json::parse(line);
|
const json j = json::parse(line);
|
||||||
CHECK(j.dump() == line);
|
CHECK(j.dump() == line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,11 +61,11 @@ float make_float(uint64_t f, int e)
|
|||||||
e--;
|
e--;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
|
const uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
|
||||||
? 0
|
? 0
|
||||||
: static_cast<uint64_t>(e + kExponentBias);
|
: static_cast<uint64_t>(e + kExponentBias);
|
||||||
|
|
||||||
uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
|
const uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
|
||||||
return reinterpret_bits<float>(static_cast<uint32_t>(bits));
|
return reinterpret_bits<float>(static_cast<uint32_t>(bits));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,11 +113,11 @@ double make_double(uint64_t f, int e)
|
|||||||
e--;
|
e--;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
|
const uint64_t biased_exponent = (e == kDenormalExponent && (f & kHiddenBit) == 0)
|
||||||
? 0
|
? 0
|
||||||
: static_cast<uint64_t>(e + kExponentBias);
|
: static_cast<uint64_t>(e + kExponentBias);
|
||||||
|
|
||||||
uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
|
const uint64_t bits = (f & kSignificandMask) | (biased_exponent << kPhysicalSignificandSize);
|
||||||
return reinterpret_bits<double>(bits);
|
return reinterpret_bits<double>(bits);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -458,7 +458,7 @@ TEST_CASE("formatting")
|
|||||||
{
|
{
|
||||||
auto check_integer = [](std::int64_t number, const std::string & expected)
|
auto check_integer = [](std::int64_t number, const std::string & expected)
|
||||||
{
|
{
|
||||||
nlohmann::json j = number;
|
const nlohmann::json j = number;
|
||||||
CHECK(j.dump() == expected);
|
CHECK(j.dump() == expected);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -418,15 +418,15 @@ TEST_CASE("adl_serializer specialization" * doctest::test_suite("udt"))
|
|||||||
{
|
{
|
||||||
SECTION("to_json")
|
SECTION("to_json")
|
||||||
{
|
{
|
||||||
udt::legacy_type lt{"4242"};
|
udt::legacy_type const lt{"4242"};
|
||||||
|
|
||||||
json j = lt;
|
json const j = lt;
|
||||||
CHECK(j.get<int>() == 4242);
|
CHECK(j.get<int>() == 4242);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("from_json")
|
SECTION("from_json")
|
||||||
{
|
{
|
||||||
json j = 4242;
|
json const j = 4242;
|
||||||
auto lt = j.get<udt::legacy_type>();
|
auto lt = j.get<udt::legacy_type>();
|
||||||
CHECK(lt.number == "4242");
|
CHECK(lt.number == "4242");
|
||||||
}
|
}
|
||||||
@ -459,7 +459,7 @@ struct adl_serializer<std::vector<float>>
|
|||||||
|
|
||||||
TEST_CASE("even supported types can be specialized" * doctest::test_suite("udt"))
|
TEST_CASE("even supported types can be specialized" * doctest::test_suite("udt"))
|
||||||
{
|
{
|
||||||
json j = std::vector<float> {1.0, 2.0, 3.0};
|
json const j = std::vector<float> {1.0, 2.0, 3.0};
|
||||||
CHECK(j.dump() == R"("hijacked!")");
|
CHECK(j.dump() == R"("hijacked!")");
|
||||||
auto f = j.get<std::vector<float>>();
|
auto f = j.get<std::vector<float>>();
|
||||||
// the single argument from_json method is preferred
|
// the single argument from_json method is preferred
|
||||||
@ -644,14 +644,14 @@ TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
|||||||
std::int64_t, std::uint64_t, double, std::allocator, pod_serializer>;
|
std::int64_t, std::uint64_t, double, std::allocator, pod_serializer>;
|
||||||
|
|
||||||
auto p = udt::small_pod{42, '/', 42};
|
auto p = udt::small_pod{42, '/', 42};
|
||||||
custom_json j = p;
|
custom_json const j = p;
|
||||||
|
|
||||||
auto p2 = j.get<udt::small_pod>();
|
auto p2 = j.get<udt::small_pod>();
|
||||||
|
|
||||||
CHECK(p == p2);
|
CHECK(p == p2);
|
||||||
|
|
||||||
auto np = udt::non_pod{{"non-pod"}};
|
auto np = udt::non_pod{{"non-pod"}};
|
||||||
custom_json j2 = np;
|
custom_json const j2 = np;
|
||||||
auto np2 = j2.get<udt::non_pod>();
|
auto np2 = j2.get<udt::non_pod>();
|
||||||
CHECK(np == np2);
|
CHECK(np == np2);
|
||||||
}
|
}
|
||||||
@ -681,8 +681,8 @@ TEST_CASE("custom serializer that does adl by default" * doctest::test_suite("ud
|
|||||||
{
|
{
|
||||||
auto me = udt::person{{23}, {"theo"}, udt::country::france};
|
auto me = udt::person{{23}, {"theo"}, udt::country::france};
|
||||||
|
|
||||||
json j = me;
|
json const j = me;
|
||||||
custom_json cj = me;
|
custom_json const cj = me;
|
||||||
|
|
||||||
CHECK(j.dump() == cj.dump());
|
CHECK(j.dump() == cj.dump());
|
||||||
|
|
||||||
@ -694,21 +694,21 @@ TEST_CASE("different basic_json types conversions")
|
|||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
json j;
|
json const j;
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == nullptr);
|
CHECK(cj == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("boolean")
|
SECTION("boolean")
|
||||||
{
|
{
|
||||||
json j = true;
|
json const j = true;
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == true);
|
CHECK(cj == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
json j(json::value_t::discarded);
|
json const j(json::value_t::discarded);
|
||||||
custom_json cj;
|
custom_json cj;
|
||||||
CHECK_NOTHROW(cj = j);
|
CHECK_NOTHROW(cj = j);
|
||||||
CHECK(cj.type() == custom_json::value_t::discarded);
|
CHECK(cj.type() == custom_json::value_t::discarded);
|
||||||
@ -716,35 +716,35 @@ TEST_CASE("different basic_json types conversions")
|
|||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j = {1, 2, 3};
|
json const j = {1, 2, 3};
|
||||||
custom_json cj = j;
|
custom_json const cj = j;
|
||||||
CHECK((cj == std::vector<int> {1, 2, 3}));
|
CHECK((cj == std::vector<int> {1, 2, 3}));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("integer")
|
SECTION("integer")
|
||||||
{
|
{
|
||||||
json j = 42;
|
json const j = 42;
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == 42);
|
CHECK(cj == 42);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("float")
|
SECTION("float")
|
||||||
{
|
{
|
||||||
json j = 42.0;
|
json const j = 42.0;
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == 42.0);
|
CHECK(cj == 42.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("unsigned")
|
SECTION("unsigned")
|
||||||
{
|
{
|
||||||
json j = 42u;
|
json const j = 42u;
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == 42u);
|
CHECK(cj == 42u);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
{
|
{
|
||||||
json j = "forty-two";
|
json const j = "forty-two";
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
CHECK(cj == "forty-two");
|
CHECK(cj == "forty-two");
|
||||||
}
|
}
|
||||||
@ -761,7 +761,7 @@ TEST_CASE("different basic_json types conversions")
|
|||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j = {{"forty", "two"}};
|
json const j = {{"forty", "two"}};
|
||||||
custom_json cj = j;
|
custom_json cj = j;
|
||||||
auto m = j.get<std::map<std::string, std::string>>();
|
auto m = j.get<std::map<std::string, std::string>>();
|
||||||
CHECK(cj == m);
|
CHECK(cj == m);
|
||||||
@ -769,7 +769,7 @@ TEST_CASE("different basic_json types conversions")
|
|||||||
|
|
||||||
SECTION("get<custom_json>")
|
SECTION("get<custom_json>")
|
||||||
{
|
{
|
||||||
json j = 42;
|
json const j = 42;
|
||||||
custom_json cj = j.get<custom_json>();
|
custom_json cj = j.get<custom_json>();
|
||||||
CHECK(cj == 42);
|
CHECK(cj == 42);
|
||||||
}
|
}
|
||||||
@ -857,8 +857,8 @@ class no_iterator_type
|
|||||||
|
|
||||||
TEST_CASE("compatible array type, without iterator type alias")
|
TEST_CASE("compatible array type, without iterator type alias")
|
||||||
{
|
{
|
||||||
no_iterator_type vec{1, 2, 3};
|
no_iterator_type const vec{1, 2, 3};
|
||||||
json j = vec;
|
json const j = vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
DOCTEST_GCC_SUPPRESS_WARNING_POP
|
DOCTEST_GCC_SUPPRESS_WARNING_POP
|
||||||
|
@ -349,7 +349,7 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j = obj1; //via json object
|
nlohmann::json const j = obj1; //via json object
|
||||||
T obj2;
|
T obj2;
|
||||||
j.get_to(obj2);
|
j.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
@ -358,9 +358,9 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
|
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j1 = obj1; //via json string
|
nlohmann::json const j1 = obj1; //via json string
|
||||||
std::string s = j1.dump();
|
std::string const s = j1.dump();
|
||||||
nlohmann::json j2 = nlohmann::json::parse(s);
|
nlohmann::json const j2 = nlohmann::json::parse(s);
|
||||||
T obj2;
|
T obj2;
|
||||||
j2.get_to(obj2);
|
j2.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
@ -369,9 +369,9 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
|
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j1 = obj1; //via msgpack
|
nlohmann::json const j1 = obj1; //via msgpack
|
||||||
std::vector<uint8_t> buf = nlohmann::json::to_msgpack(j1);
|
std::vector<uint8_t> const buf = nlohmann::json::to_msgpack(j1);
|
||||||
nlohmann::json j2 = nlohmann::json::from_msgpack(buf);
|
nlohmann::json const j2 = nlohmann::json::from_msgpack(buf);
|
||||||
T obj2;
|
T obj2;
|
||||||
j2.get_to(obj2);
|
j2.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
@ -380,9 +380,9 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
|
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j1 = obj1; //via bson
|
nlohmann::json const j1 = obj1; //via bson
|
||||||
std::vector<uint8_t> buf = nlohmann::json::to_bson(j1);
|
std::vector<uint8_t> const buf = nlohmann::json::to_bson(j1);
|
||||||
nlohmann::json j2 = nlohmann::json::from_bson(buf);
|
nlohmann::json const j2 = nlohmann::json::from_bson(buf);
|
||||||
T obj2;
|
T obj2;
|
||||||
j2.get_to(obj2);
|
j2.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
@ -391,9 +391,9 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
|
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j1 = obj1; //via cbor
|
nlohmann::json const j1 = obj1; //via cbor
|
||||||
std::vector<uint8_t> buf = nlohmann::json::to_cbor(j1);
|
std::vector<uint8_t> const buf = nlohmann::json::to_cbor(j1);
|
||||||
nlohmann::json j2 = nlohmann::json::from_cbor(buf);
|
nlohmann::json const j2 = nlohmann::json::from_cbor(buf);
|
||||||
T obj2;
|
T obj2;
|
||||||
j2.get_to(obj2);
|
j2.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
@ -402,9 +402,9 @@ TEST_CASE_TEMPLATE("Serialization/deserialization of classes with 26 public/priv
|
|||||||
|
|
||||||
{
|
{
|
||||||
T obj1;
|
T obj1;
|
||||||
nlohmann::json j1 = obj1; //via ubjson
|
nlohmann::json const j1 = obj1; //via ubjson
|
||||||
std::vector<uint8_t> buf = nlohmann::json::to_ubjson(j1);
|
std::vector<uint8_t> const buf = nlohmann::json::to_ubjson(j1);
|
||||||
nlohmann::json j2 = nlohmann::json::from_ubjson(buf);
|
nlohmann::json const j2 = nlohmann::json::from_ubjson(buf);
|
||||||
T obj2;
|
T obj2;
|
||||||
j2.get_to(obj2);
|
j2.get_to(obj2);
|
||||||
bool ok = (obj1 == obj2);
|
bool ok = (obj1 == obj2);
|
||||||
|
@ -233,9 +233,9 @@ void roundtrip(bool success_expected, const std::string& s)
|
|||||||
json _;
|
json _;
|
||||||
|
|
||||||
// create JSON string value
|
// create JSON string value
|
||||||
json j = s;
|
const json j = s;
|
||||||
// create JSON text
|
// create JSON text
|
||||||
std::string ps = std::string("\"") + s + "\"";
|
const std::string ps = std::string("\"") + s + "\"";
|
||||||
|
|
||||||
if (success_expected)
|
if (success_expected)
|
||||||
{
|
{
|
||||||
@ -253,7 +253,7 @@ void roundtrip(bool success_expected, const std::string& s)
|
|||||||
CHECK_NOTHROW(_ = json::parse(j.dump()));
|
CHECK_NOTHROW(_ = json::parse(j.dump()));
|
||||||
|
|
||||||
// after roundtrip, the same string is stored
|
// after roundtrip, the same string is stored
|
||||||
json jr = json::parse(j.dump());
|
const json jr = json::parse(j.dump());
|
||||||
CHECK(jr.get<std::string>() == s);
|
CHECK(jr.get<std::string>() == s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -45,7 +45,7 @@ const char* end(const MyContainer& c)
|
|||||||
TEST_CASE("Custom container non-member begin/end")
|
TEST_CASE("Custom container non-member begin/end")
|
||||||
{
|
{
|
||||||
|
|
||||||
MyContainer data{"[1,2,3,4]"};
|
const MyContainer data{"[1,2,3,4]"};
|
||||||
json as_json = json::parse(data);
|
json as_json = json::parse(data);
|
||||||
CHECK(as_json.at(0) == 1);
|
CHECK(as_json.at(0) == 1);
|
||||||
CHECK(as_json.at(1) == 2);
|
CHECK(as_json.at(1) == 2);
|
||||||
@ -71,7 +71,7 @@ TEST_CASE("Custom container member begin/end")
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
MyContainer2 data{"[1,2,3,4]"};
|
const MyContainer2 data{"[1,2,3,4]"};
|
||||||
json as_json = json::parse(data);
|
json as_json = json::parse(data);
|
||||||
CHECK(as_json.at(0) == 1);
|
CHECK(as_json.at(0) == 1);
|
||||||
CHECK(as_json.at(1) == 2);
|
CHECK(as_json.at(1) == 2);
|
||||||
@ -117,8 +117,8 @@ TEST_CASE("Custom iterator")
|
|||||||
CHECK(std::is_same<MyIterator::reference, const char&>::value);
|
CHECK(std::is_same<MyIterator::reference, const char&>::value);
|
||||||
CHECK(std::is_same<MyIterator::iterator_category, std::input_iterator_tag>::value);
|
CHECK(std::is_same<MyIterator::iterator_category, std::input_iterator_tag>::value);
|
||||||
|
|
||||||
MyIterator begin{raw_data};
|
const MyIterator begin{raw_data};
|
||||||
MyIterator end{raw_data + strlen(raw_data)}; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
|
const MyIterator end{raw_data + strlen(raw_data)}; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
|
||||||
|
|
||||||
json as_json = json::parse(begin, end);
|
json as_json = json::parse(begin, end);
|
||||||
CHECK(as_json.at(0) == 1);
|
CHECK(as_json.at(0) == 1);
|
||||||
|
@ -40,8 +40,8 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (wstring_is_utf16())
|
if (wstring_is_utf16())
|
||||||
{
|
{
|
||||||
std::wstring w = L"[12.2,\"Ⴥaäö💤🧢\"]";
|
std::wstring const w = L"[12.2,\"Ⴥaäö💤🧢\"]";
|
||||||
json j = json::parse(w);
|
json const j = json::parse(w);
|
||||||
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -50,7 +50,7 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (wstring_is_utf16())
|
if (wstring_is_utf16())
|
||||||
{
|
{
|
||||||
std::wstring w = L"\"\xDBFF";
|
std::wstring const w = L"\"\xDBFF";
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
||||||
}
|
}
|
||||||
@ -60,8 +60,8 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (u16string_is_utf16())
|
if (u16string_is_utf16())
|
||||||
{
|
{
|
||||||
std::u16string w = u"[12.2,\"Ⴥaäö💤🧢\"]";
|
std::u16string const w = u"[12.2,\"Ⴥaäö💤🧢\"]";
|
||||||
json j = json::parse(w);
|
json const j = json::parse(w);
|
||||||
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (wstring_is_utf16())
|
if (wstring_is_utf16())
|
||||||
{
|
{
|
||||||
std::u16string w = u"\"\xDBFF";
|
std::u16string const w = u"\"\xDBFF";
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
||||||
}
|
}
|
||||||
@ -80,8 +80,8 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (u32string_is_utf32())
|
if (u32string_is_utf32())
|
||||||
{
|
{
|
||||||
std::u32string w = U"[12.2,\"Ⴥaäö💤🧢\"]";
|
std::u32string const w = U"[12.2,\"Ⴥaäö💤🧢\"]";
|
||||||
json j = json::parse(w);
|
json const j = json::parse(w);
|
||||||
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
CHECK(j.dump() == "[12.2,\"Ⴥaäö💤🧢\"]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,7 +90,7 @@ TEST_CASE("wide strings")
|
|||||||
{
|
{
|
||||||
if (u32string_is_utf32())
|
if (u32string_is_utf32())
|
||||||
{
|
{
|
||||||
std::u32string w = U"\"\x110000";
|
std::u32string const w = U"\"\x110000";
|
||||||
json _;
|
json _;
|
||||||
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
// doctest doesn't support THROWS_WITH for std::string out of the box (has to include <string>...)
|
// doctest doesn't support THROWS_WITH for std::string out of the box (has to include <string>...)
|
||||||
#define CHECK_THROWS_WITH_STD_STR_IMPL(expr, str, var_name) \
|
#define CHECK_THROWS_WITH_STD_STR_IMPL(expr, str, var_name) \
|
||||||
do { \
|
do { \
|
||||||
std::string var_name = str; \
|
const std::string var_name = str; \
|
||||||
CHECK_THROWS_WITH(expr, var_name.c_str()); \
|
CHECK_THROWS_WITH(expr, var_name.c_str()); \
|
||||||
} while (false)
|
} while (false)
|
||||||
#define CHECK_THROWS_WITH_STD_STR(expr, str) \
|
#define CHECK_THROWS_WITH_STD_STR(expr, str) \
|
||||||
|
Loading…
Reference in New Issue
Block a user