#include "swift/IDE/CodeCompletion.h" #include "gtest/gtest.h" using namespace swift; using namespace ide; static std::string replaceAtWithNull(const std::string &S) { std::string Result = S; for (char &C : Result) { if (C == '@') C = '\0'; } return Result; } TEST(CodeCompletionToken, FindInEmptyFile) { std::string Source = ""; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(~0U, Offset); EXPECT_EQ("", Clean); } TEST(CodeCompletionToken, FindNonExistent) { std::string Source = "func zzz() {}"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(~0U, Offset); EXPECT_EQ(Source, Clean); } TEST(CodeCompletionToken, RemovesOtherTokens) { std::string Source = "func zzz() {#^B^#}"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(~0U, Offset); EXPECT_EQ("func zzz() {}", Clean); } TEST(CodeCompletionToken, FindBegin) { std::string Source = "#^A^# func"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(0U, Offset); EXPECT_EQ(replaceAtWithNull("@ func"), Clean); } TEST(CodeCompletionToken, FindEnd) { std::string Source = "func #^A^#"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(5U, Offset); EXPECT_EQ(replaceAtWithNull("func @"), Clean); } TEST(CodeCompletionToken, FindSingleLine) { std::string Source = "func zzz() {#^A^#}"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(12U, Offset); EXPECT_EQ(replaceAtWithNull("func zzz() {@}"), Clean); } TEST(CodeCompletionToken, FindMultiline) { std::string Source = "func zzz() {\n" " 1 + #^A^#\r\n" "}\n"; unsigned Offset; std::string Clean = removeCodeCompletionTokens(Source, "A", &Offset); EXPECT_EQ(19U, Offset); EXPECT_EQ(replaceAtWithNull("func zzz() {\n 1 + @\r\n}\n"), Clean); }