From 067c473a2d2ba810b63c28bf1ffa6345aeb5a360 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Sun, 3 Apr 2022 18:37:05 +0200 Subject: [PATCH] Add unit test for #3388 Closes #3388. --- test/src/unit-alt-string.cpp | 47 +++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/test/src/unit-alt-string.cpp b/test/src/unit-alt-string.cpp index bcde18b75..26f66ecad 100644 --- a/test/src/unit-alt-string.cpp +++ b/test/src/unit-alt-string.cpp @@ -49,6 +49,8 @@ class alt_string public: using value_type = std::string::value_type; + static constexpr auto npos = static_cast(-1); + alt_string(const char* str): str_impl(str) {} alt_string(const char* str, std::size_t count): str_impl(str, count) {} alt_string(size_t count, char chr): str_impl(count, chr) {} @@ -144,11 +146,38 @@ class alt_string str_impl.clear(); } - const value_type* data() + const value_type* data() const { return str_impl.data(); } + bool empty() const + { + return str_impl.empty(); + } + + std::size_t find(const alt_string& str, std::size_t pos = 0) const + { + return str_impl.find(str.str_impl, pos); + } + + std::size_t find_first_of(char c, std::size_t pos = 0) const + { + return str_impl.find_first_of(c, pos); + } + + alt_string substr(std::size_t pos = 0, std::size_t count = npos) const + { + std::string s = str_impl.substr(pos, count); + return {s.data(), s.size()}; + } + + alt_string& replace(std::size_t pos, std::size_t count, const alt_string& str) + { + str_impl.replace(pos, count, str.str_impl); + return *this; + } + private: std::string str_impl {}; @@ -296,4 +325,20 @@ TEST_CASE("alternative string type") CHECK_FALSE(const_doc["Who are you?"] == "I'm Bruce Wayne"); } } + + SECTION("JSON pointer") + { + // conversion from json to alt_json fails to compile (see #3425); + // attempted fix(*) produces: [[['b','a','r'],['b','a','z']]] (with each char being an integer) + // (*) disable implicit conversion for json_refs of any basic_json type + // alt_json j = R"( + // { + // "foo": ["bar", "baz"] + // } + // )"_json; + auto j = alt_json::parse(R"({"foo": ["bar", "baz"]})"); + + CHECK(j.at(alt_json::json_pointer("/foo/0")) == j["foo"][0]); + CHECK(j.at(alt_json::json_pointer("/foo/1")) == j["foo"][1]); + } }