mirror of
https://github.com/nlohmann/json.git
synced 2026-07-21 19:23:03 +04:00
Flush serializer buffer in dump_escaped unit test
test-convenience failed (macOS finished first; the failure is platform-independent) because check_escaped() calls the internal serializer::dump_escaped() directly and then reads the output stream. Since dump_escaped() now writes into the serializer's internal write buffer, the bytes were still buffered and the stream was empty. Expose flush() under JSON_PRIVATE_UNLESS_TESTED (same visibility as dump_escaped) and flush in check_escaped() before inspecting the output. Per-string flushing inside dump_escaped() was rejected on purpose: it would defeat the buffering that makes object/array-heavy dumps faster. Library behavior is unchanged (flush()'s body is identical; only its access label moved). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XAYM1qhSA2FDaDcGfPW3fG Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -730,12 +730,17 @@ class serializer
|
|||||||
write_buffer_pos += length;
|
write_buffer_pos += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
/*!
|
/*!
|
||||||
@brief flush the write buffer to the output adapter
|
@brief flush the write buffer to the output adapter
|
||||||
|
|
||||||
Writing zero characters is a well-defined no-op for every output adapter, so
|
Writing zero characters is a well-defined no-op for every output adapter, so
|
||||||
the buffered length is passed through unconditionally (no empty-guard branch
|
the buffered length is passed through unconditionally (no empty-guard branch
|
||||||
to leave uncovered).
|
to leave uncovered).
|
||||||
|
|
||||||
|
@note dump_escaped() and dump_integer()/dump_float() write into the internal
|
||||||
|
write buffer; callers that invoke them directly (rather than through the
|
||||||
|
public dump()) must call flush() before inspecting the output.
|
||||||
*/
|
*/
|
||||||
void flush()
|
void flush()
|
||||||
{
|
{
|
||||||
@@ -743,6 +748,7 @@ class serializer
|
|||||||
write_buffer_pos = 0;
|
write_buffer_pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
/*!
|
/*!
|
||||||
@brief count digits
|
@brief count digits
|
||||||
|
|
||||||
|
|||||||
@@ -21313,12 +21313,17 @@ class serializer
|
|||||||
write_buffer_pos += length;
|
write_buffer_pos += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
/*!
|
/*!
|
||||||
@brief flush the write buffer to the output adapter
|
@brief flush the write buffer to the output adapter
|
||||||
|
|
||||||
Writing zero characters is a well-defined no-op for every output adapter, so
|
Writing zero characters is a well-defined no-op for every output adapter, so
|
||||||
the buffered length is passed through unconditionally (no empty-guard branch
|
the buffered length is passed through unconditionally (no empty-guard branch
|
||||||
to leave uncovered).
|
to leave uncovered).
|
||||||
|
|
||||||
|
@note dump_escaped() and dump_integer()/dump_float() write into the internal
|
||||||
|
write buffer; callers that invoke them directly (rather than through the
|
||||||
|
public dump()) must call flush() before inspecting the output.
|
||||||
*/
|
*/
|
||||||
void flush()
|
void flush()
|
||||||
{
|
{
|
||||||
@@ -21326,6 +21331,7 @@ class serializer
|
|||||||
write_buffer_pos = 0;
|
write_buffer_pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
/*!
|
/*!
|
||||||
@brief count digits
|
@brief count digits
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ void check_escaped(const char* original, const char* escaped, const bool ensure_
|
|||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
json::serializer s(nlohmann::detail::output_adapter<char>(ss), ' ');
|
json::serializer s(nlohmann::detail::output_adapter<char>(ss), ' ');
|
||||||
s.dump_escaped(original, ensure_ascii);
|
s.dump_escaped(original, ensure_ascii);
|
||||||
|
s.flush(); // dump_escaped writes into the serializer's internal buffer
|
||||||
CHECK(ss.str() == escaped);
|
CHECK(ss.str() == escaped);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user