diff --git a/tests/src/unit-deserialization.cpp b/tests/src/unit-deserialization.cpp index ebf25ac1b0..db5f304929 100644 --- a/tests/src/unit-deserialization.cpp +++ b/tests/src/unit-deserialization.cpp @@ -29,6 +29,7 @@ SOFTWARE. #include "doctest_compatibility.h" +#include #include using nlohmann::json; @@ -184,6 +185,52 @@ struct SaxEventLoggerExitAfterStartArray : public SaxEventLogger return false; } }; + +template +class proxy_iterator +{ + public: + using iterator = typename T::iterator; + using value_type = typename std::iterator_traits::value_type; + using reference = typename std::iterator_traits::reference; + using pointer = typename std::iterator_traits::pointer; + using difference_type = + typename std::iterator_traits::difference_type; + using iterator_category = std::input_iterator_tag; + + proxy_iterator() = default; + proxy_iterator(iterator& it) : m_it(std::addressof(it)) {} + + proxy_iterator& operator++() + { + ++*m_it; + return *this; + } + + proxy_iterator& operator--() + { + --*m_it; + return *this; + } + + bool operator==(const proxy_iterator& rhs) const + { + return (m_it && rhs.m_it) ? (*m_it == *rhs.m_it) : (m_it == rhs.m_it); + } + + bool operator!=(const proxy_iterator& rhs) const + { + return !(*this == rhs); + } + + reference operator*() const + { + return **m_it; + } + + private: + iterator* m_it = nullptr; +}; } // namespace TEST_CASE("deserialization") @@ -538,6 +585,28 @@ TEST_CASE("deserialization") CHECK(l.events.size() == 1); CHECK(l.events == std::vector({"parse_error(1)"})); } + + SECTION("iterator_input_adapter advances iterators correctly") + { + using nlohmann::json; + using nlohmann::detail::input_format_t; + using nlohmann::detail::json_sax_dom_parser; + using proxy = proxy_iterator; + + std::string str1 = "[1]"; + std::string str2 = "[2]"; + std::string str = str1 + str2; + + auto first = str.begin(); + auto last = str.end(); + json j; + json_sax_dom_parser sax(j, true); + + CHECK(json::sax_parse(proxy(first), proxy(last), &sax, + input_format_t::json, false)); + CHECK(j.dump() == str1); + CHECK(std::string(first, last) == str2); + } } // these cases are required for 100% line coverage