From 4174f1c6095cc2cf6a164f43c927e2ce36a8c887 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Mon, 19 May 2025 17:15:56 -0400 Subject: [PATCH] Add test witnessing unescaping bug --- src/test.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index 6ef47c2..a4b80ce 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -208,10 +209,10 @@ TEST_CASE("parser3") { TEST_CASE("streaming") { testStreaming(json); } void doTestUnescapingUtf8(std::string const &escaped, - std::string const &expected, bool streaming) { + std::string const &expected, int stride) { CAPTURE(escaped); CAPTURE(expected); - CAPTURE(streaming); + CAPTURE(stride); auto c = noopCallbacks(); std::string result; c.on_string_data = +[](void *p, const char *buf, int len) { @@ -220,13 +221,11 @@ void doTestUnescapingUtf8(std::string const &escaped, }; parser3::Parser3 parser(&c, &result); auto copy = escaped; - if (streaming) { - for (int i = 0; i < copy.size(); ++i) { - CAPTURE(i); - CHECK(parser.parse(copy.data() + i, 1) == parser3::S_AGAIN); - } - } else { - CHECK(parser.parse(copy.data(), copy.size()) == parser3::S_AGAIN); + for (int i = 0; i < copy.size(); i += stride) { + CAPTURE(i); + CHECK( + parser.parse(copy.data() + i, std::min(stride, copy.size() - i)) == + parser3::S_AGAIN); } CHECK(parser.parse(nullptr, 0) == parser3::S_OK); CHECK(result.size() == expected.size()); @@ -235,8 +234,11 @@ void doTestUnescapingUtf8(std::string const &escaped, void testUnescapingUtf8(std::string const &escaped, std::string const &expected) { - doTestUnescapingUtf8(escaped, expected, false); - doTestUnescapingUtf8(escaped, expected, true); + for (int stride = 0; stride < 10; ++stride) { + doTestUnescapingUtf8(escaped, expected, + stride == 0 ? std::numeric_limits::max() + : stride); + } } TEST_CASE("unescaping utf-8") {