diff --git a/src/tools/clangbackend/ipcsource/clangstring.h b/src/tools/clangbackend/ipcsource/clangstring.h index d235ed8a538..a4c0f0a5838 100644 --- a/src/tools/clangbackend/ipcsource/clangstring.h +++ b/src/tools/clangbackend/ipcsource/clangstring.h @@ -85,7 +85,38 @@ public: return cxString.data == nullptr; } + friend bool operator==(const ClangString &first, const ClangString &second) + { + return std::strcmp(first.cString(), second.cString()) == 0; + } + template + friend bool operator==(const ClangString &first, const char(&second)[Size]) + { + return std::strncmp(first.cString(), second, Size) == 0; // Size includes \0 + } + + template + friend bool operator==(const char(&first)[Size], const ClangString &second) + { + return second == first; + } + + template::value>::type + > + friend bool operator==(const ClangString &first, Type second) + { + return std::strcmp(first.cString(), second) == 0; + } + + template::value>::type + > + friend bool operator==(Type first, const ClangString &second) + { + return second == first; + } private: CXString cxString; diff --git a/tests/unit/unittest/clangstring-test.cpp b/tests/unit/unittest/clangstring-test.cpp index 6fb59daef22..4db02510a6c 100644 --- a/tests/unit/unittest/clangstring-test.cpp +++ b/tests/unit/unittest/clangstring-test.cpp @@ -35,6 +35,7 @@ namespace { using ::testing::StrEq; +using ::testing::Eq; using ClangBackEnd::ClangString; @@ -88,4 +89,82 @@ TEST(ClangString, SpellingAsCString) ASSERT_THAT(text.cString(), StrEq("text")); } + +TEST(ClangString, EqualBetweenClangStrings) +{ + ClangString text(CXString{"text", 0}); + ClangString text2(CXString{"text", 0}); + + bool textIsEqual = text == text2; + + ASSERT_TRUE(textIsEqual); +} + +TEST(ClangString, NotEqualBetweenClangStrings) +{ + ClangString text(CXString{"text", 0}); + ClangString text2(CXString{"text ", 0}); + + bool textIsEqual = text == text2; + + ASSERT_FALSE(textIsEqual); +} + +TEST(ClangString, EqualClangStringAndCString) +{ + ClangString text(CXString{"text", 0}); + + bool textIsEqual = text == "text"; + + ASSERT_TRUE(textIsEqual); +} + +TEST(ClangString, NotEqualClangStringAndCString) +{ + ClangString text(CXString{"text", 0}); + + bool textIsEqual = text == "text "; + + ASSERT_FALSE(textIsEqual); +} + +TEST(ClangString, EqualCStringAndClangString) +{ + ClangString text(CXString{"text", 0}); + + bool textIsEqual = "text" == text; + + ASSERT_TRUE(textIsEqual); +} + +TEST(ClangString, EqualClangStringPointerAndCString) +{ + ClangString text(CXString{"text", 0}); + const char *cString = "text"; + + bool textIsEqual = cString == text; + + ASSERT_TRUE(textIsEqual); +} + +TEST(ClangString, NotEqualClangStringPointerAndCString) +{ + ClangString text(CXString{"text", 0}); + const char *cString = "text "; + + bool textIsEqual = cString == text; + + ASSERT_FALSE(textIsEqual); +} + +TEST(ClangString, EqualCStringAndClangStringPointer) +{ + ClangString text(CXString{"text", 0}); + const char *cString = "text"; + + bool textIsEqual = text == cString; + + ASSERT_TRUE(textIsEqual); +} + }