From 2614b81092e8afdc1c3eedc2fa53cd2c0ecf3e47 Mon Sep 17 00:00:00 2001 From: Luca Date: Mon, 20 Jun 2022 12:54:05 +0200 Subject: [PATCH] Added basic test for the applied fix --- tests/src/unit-consuming_stream.cpp | 126 ++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tests/src/unit-consuming_stream.cpp diff --git a/tests/src/unit-consuming_stream.cpp b/tests/src/unit-consuming_stream.cpp new file mode 100644 index 000000000..7a700c348 --- /dev/null +++ b/tests/src/unit-consuming_stream.cpp @@ -0,0 +1,126 @@ + + + +#include "doctest_compatibility.h" + +#define JSON_TESTS_PRIVATE +#include +using nlohmann::json; + + +//This struct emulate an Input Stream, once a "char" is readed from it it is lost +struct EmulateStream +{ + using difference_type = std::ptrdiff_t; + using value_type = char; + using pointer = const char*; + using reference = const char&; + using iterator_category = std::input_iterator_tag; + + // Like a pop_left() -> consume one char from the underlying buffer + static char ConsumeChar(std::string* str) + { + const char c = str->front(); + str->erase(0, 1); + + return c; + } + + EmulateStream() + : + target{nullptr} + {} + + EmulateStream(std::string* target_) + : + target{target_}, + c{ConsumeChar(target_)} + {} + + EmulateStream& operator++() + { + c = ConsumeChar(target); + + return *this; + } + + bool operator!=(const EmulateStream& rhs) const + { + return rhs.target != target; + } + + reference operator*() const + { + return c; + } + + std::string* target; + char c; + +}; + +EmulateStream CreateBegin(std::string& tgt) +{ + return EmulateStream{&tgt}; +} + +EmulateStream CreateEnd(const std::string& tgt) +{ + return {}; +} + + + +TEST_CASE("consume only needed") +{ + + nlohmann::detail::json_sax_acceptor sax_parser; + + const std::string json_A = R"({ "key_A" : "value_A" })"; + const std::string json_B = R"({ "key_B" : "value_B" })"; + + std::string json_concat_AB = json_A + json_B; + + CHECK( + json::sax_parse( + CreateBegin(json_concat_AB), + CreateEnd(json_concat_AB), + &sax_parser, + nlohmann::detail::input_format_t::json, + false + ) + == true + ); + + + CHECK(json_concat_AB == json_B); + + + CHECK( + json::sax_parse( + CreateBegin(json_concat_AB), + CreateEnd(json_concat_AB), + &sax_parser, + nlohmann::detail::input_format_t::json, + false + ) + == true + ); + + + CHECK(json_concat_AB == ""); + CHECK(json_concat_AB.size() == 0); + + + CHECK( + json::sax_parse( + CreateBegin(json_concat_AB), + CreateEnd(json_concat_AB), + &sax_parser, + nlohmann::detail::input_format_t::json, + false + ) + == false + ); + +} \ No newline at end of file