💚 improved test coverage

This commit is contained in:
Niels Lohmann 2018-03-10 11:24:00 +01:00
parent 6399cd3039
commit 149d2fd09c
No known key found for this signature in database
GPG key ID: 7F3CEA63AE251B69
3 changed files with 38 additions and 49 deletions

View file

@ -164,6 +164,8 @@ class parser
{ {
// never parse after a parse error was detected // never parse after a parse error was detected
assert(not errored); assert(not errored);
// this function is only called when a callback is given
assert(callback);
// start with a discarded value // start with a discarded value
if (not result.is_discarded()) if (not result.is_discarded())
@ -178,12 +180,9 @@ class parser
{ {
if (keep) if (keep)
{ {
if (callback) keep = callback(depth++, parse_event_t::object_start, result);
{
keep = callback(depth++, parse_event_t::object_start, result);
}
if (not callback or keep) if (keep)
{ {
// explicitly set result to object to cope with {} // explicitly set result to object to cope with {}
result.m_type = value_t::object; result.m_type = value_t::object;
@ -197,7 +196,7 @@ class parser
// closing } -> we are done // closing } -> we are done
if (last_token == token_type::end_object) if (last_token == token_type::end_object)
{ {
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -220,15 +219,8 @@ class parser
bool keep_tag = false; bool keep_tag = false;
if (keep) if (keep)
{ {
if (callback) BasicJsonType k(key);
{ keep_tag = callback(depth, parse_event_t::key, k);
BasicJsonType k(key);
keep_tag = callback(depth, parse_event_t::key, k);
}
else
{
keep_tag = true;
}
} }
// parse separator (:) // parse separator (:)
@ -270,7 +262,7 @@ class parser
break; break;
} }
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -282,12 +274,9 @@ class parser
{ {
if (keep) if (keep)
{ {
if (callback) keep = callback(depth++, parse_event_t::array_start, result);
{
keep = callback(depth++, parse_event_t::array_start, result);
}
if (not callback or keep) if (keep)
{ {
// explicitly set result to array to cope with [] // explicitly set result to array to cope with []
result.m_type = value_t::array; result.m_type = value_t::array;
@ -301,7 +290,7 @@ class parser
// closing ] -> we are done // closing ] -> we are done
if (last_token == token_type::end_array) if (last_token == token_type::end_array)
{ {
if (callback and not callback(--depth, parse_event_t::array_end, result)) if (not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -344,7 +333,7 @@ class parser
break; break;
} }
if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) if (keep and not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -432,7 +421,7 @@ class parser
} }
} }
if (keep and callback and not callback(depth, parse_event_t::value, result)) if (keep and not callback(depth, parse_event_t::value, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;

View file

@ -3641,6 +3641,8 @@ class parser
{ {
// never parse after a parse error was detected // never parse after a parse error was detected
assert(not errored); assert(not errored);
// this function is only called when a callback is given
assert(callback);
// start with a discarded value // start with a discarded value
if (not result.is_discarded()) if (not result.is_discarded())
@ -3655,12 +3657,9 @@ class parser
{ {
if (keep) if (keep)
{ {
if (callback) keep = callback(depth++, parse_event_t::object_start, result);
{
keep = callback(depth++, parse_event_t::object_start, result);
}
if (not callback or keep) if (keep)
{ {
// explicitly set result to object to cope with {} // explicitly set result to object to cope with {}
result.m_type = value_t::object; result.m_type = value_t::object;
@ -3674,7 +3673,7 @@ class parser
// closing } -> we are done // closing } -> we are done
if (last_token == token_type::end_object) if (last_token == token_type::end_object)
{ {
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -3697,15 +3696,8 @@ class parser
bool keep_tag = false; bool keep_tag = false;
if (keep) if (keep)
{ {
if (callback) BasicJsonType k(key);
{ keep_tag = callback(depth, parse_event_t::key, k);
BasicJsonType k(key);
keep_tag = callback(depth, parse_event_t::key, k);
}
else
{
keep_tag = true;
}
} }
// parse separator (:) // parse separator (:)
@ -3747,7 +3739,7 @@ class parser
break; break;
} }
if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) if (keep and not callback(--depth, parse_event_t::object_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -3759,12 +3751,9 @@ class parser
{ {
if (keep) if (keep)
{ {
if (callback) keep = callback(depth++, parse_event_t::array_start, result);
{
keep = callback(depth++, parse_event_t::array_start, result);
}
if (not callback or keep) if (keep)
{ {
// explicitly set result to array to cope with [] // explicitly set result to array to cope with []
result.m_type = value_t::array; result.m_type = value_t::array;
@ -3778,7 +3767,7 @@ class parser
// closing ] -> we are done // closing ] -> we are done
if (last_token == token_type::end_array) if (last_token == token_type::end_array)
{ {
if (callback and not callback(--depth, parse_event_t::array_end, result)) if (not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -3821,7 +3810,7 @@ class parser
break; break;
} }
if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) if (keep and not callback(--depth, parse_event_t::array_end, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;
@ -3909,7 +3898,7 @@ class parser
} }
} }
if (keep and callback and not callback(depth, parse_event_t::value, result)) if (keep and not callback(depth, parse_event_t::value, result))
{ {
result.m_value.destroy(result.m_type); result.m_value.destroy(result.m_type);
result.m_type = value_t::discarded; result.m_type = value_t::discarded;

View file

@ -176,7 +176,18 @@ bool accept_helper(const std::string& s)
CHECK_NOTHROW(json::sax_parse(s, &el)); CHECK_NOTHROW(json::sax_parse(s, &el));
CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored); CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored);
// 5. return result // 5. parse with simple callback
json::parser_callback_t cb = [](int, json::parse_event_t, json&)
{
return true;
};
json j_cb = json::parse(s, cb, false);
const bool ok_noexcept_cb = not j_cb.is_discarded();
// 6. check if this approach came to the same result
CHECK(ok_noexcept == ok_noexcept_cb);
// 7. return result
return ok_accept; return ok_accept;
} }