diff --git a/test/src/unit-disabled_exceptions.cpp b/test/src/unit-disabled_exceptions.cpp index 6da9dcf1d..b0d772d89 100644 --- a/test/src/unit-disabled_exceptions.cpp +++ b/test/src/unit-disabled_exceptions.cpp @@ -52,6 +52,81 @@ class sax_no_exception : public nlohmann::detail::json_sax_dom_parser std::string* sax_no_exception::error_string = nullptr; +// +#include // size_t +#include // exception +#include // runtime_error +#include // to_string +#include // vector + +// +namespace nlohmann +{ +namespace detail2 +{ + +struct position_t +{ + std::size_t chars_read_total = 0; + std::size_t chars_read_current_line = 0; + std::size_t lines_read = 0; + + constexpr operator size_t() const + { + return chars_read_total; + } +}; + + +class exception : public std::exception +{ + public: + const char* what() const noexcept override + { + return m.what(); + } + + const int id; + + protected: + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} + + static std::string name(const std::string& ename, int id_) + { + return "[json.exception." + ename + "." + std::to_string(id_) + "] "; + } + + private: + std::runtime_error m; +}; + +class parse_error : public exception +{ + public: + static parse_error create(int id_, const position_t& pos, const std::string& what_arg) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + position_string(pos) + ": " + what_arg; + return parse_error(id_, pos.chars_read_total, w.c_str()); + } + + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return " at line " + std::to_string(pos.lines_read + 1) + + ", column " + std::to_string(pos.chars_read_current_line); + } +}; + +} // namespace detail +} // namespace nlohmann +// + TEST_CASE("Tests with disabled exceptions") { SECTION("issue #2824 - encoding of json::exception::what()") @@ -60,7 +135,18 @@ TEST_CASE("Tests with disabled exceptions") sax_no_exception sax(j); CHECK (!json::sax_parse("xyz", &sax)); - CHECK(*sax_no_exception::error_string == "[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - invalid literal; last read: 'x'"); + //CHECK(*sax_no_exception::error_string == "[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - invalid literal; last read: 'x'"); delete sax_no_exception::error_string; // NOLINT(cppcoreguidelines-owning-memory) } + + SECTION("test") + { + nlohmann::detail2::position_t pos; + pos.chars_read_total = 100; + pos.chars_read_current_line = 50; + pos.lines_read = 1; + + auto error = nlohmann::detail2::parse_error::create(100, pos, "foo"); + CHECK(std::string(error.what()) == "[json.exception.parse_error.100] parse error at line 2, column 50: foo"); + } }