💚 improved test coverage
This commit is contained in:
parent
6399cd3039
commit
149d2fd09c
3 changed files with 38 additions and 49 deletions
|
@ -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())
|
||||||
|
@ -177,13 +179,10 @@ class parser
|
||||||
case token_type::begin_object:
|
case token_type::begin_object:
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
@ -219,17 +218,10 @@ class parser
|
||||||
|
|
||||||
bool keep_tag = false;
|
bool keep_tag = false;
|
||||||
if (keep)
|
if (keep)
|
||||||
{
|
|
||||||
if (callback)
|
|
||||||
{
|
{
|
||||||
BasicJsonType k(key);
|
BasicJsonType k(key);
|
||||||
keep_tag = callback(depth, parse_event_t::key, k);
|
keep_tag = callback(depth, parse_event_t::key, k);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
keep_tag = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse separator (:)
|
// parse separator (:)
|
||||||
get_token();
|
get_token();
|
||||||
|
@ -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;
|
||||||
|
@ -281,13 +273,10 @@ class parser
|
||||||
case token_type::begin_array:
|
case token_type::begin_array:
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
|
@ -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())
|
||||||
|
@ -3654,13 +3656,10 @@ class parser
|
||||||
case token_type::begin_object:
|
case token_type::begin_object:
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
@ -3696,17 +3695,10 @@ class parser
|
||||||
|
|
||||||
bool keep_tag = false;
|
bool keep_tag = false;
|
||||||
if (keep)
|
if (keep)
|
||||||
{
|
|
||||||
if (callback)
|
|
||||||
{
|
{
|
||||||
BasicJsonType k(key);
|
BasicJsonType k(key);
|
||||||
keep_tag = callback(depth, parse_event_t::key, k);
|
keep_tag = callback(depth, parse_event_t::key, k);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
keep_tag = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse separator (:)
|
// parse separator (:)
|
||||||
get_token();
|
get_token();
|
||||||
|
@ -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;
|
||||||
|
@ -3758,13 +3750,10 @@ class parser
|
||||||
case token_type::begin_array:
|
case token_type::begin_array:
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue