summaryrefslogtreecommitdiffstats
path: root/unittests/clangd/CodeCompletionStringsTests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/clangd/CodeCompletionStringsTests.cpp')
-rw-r--r--unittests/clangd/CodeCompletionStringsTests.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/unittests/clangd/CodeCompletionStringsTests.cpp b/unittests/clangd/CodeCompletionStringsTests.cpp
new file mode 100644
index 00000000..9f2ed804
--- /dev/null
+++ b/unittests/clangd/CodeCompletionStringsTests.cpp
@@ -0,0 +1,142 @@
+//===-- CodeCompletionStringsTests.cpp --------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CodeCompletionStrings.h"
+#include "clang/Sema/CodeCompleteConsumer.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace clang {
+namespace clangd {
+namespace {
+
+class CompletionStringTest : public ::testing::Test {
+public:
+ CompletionStringTest()
+ : Allocator(std::make_shared<clang::GlobalCodeCompletionAllocator>()),
+ CCTUInfo(Allocator), Builder(*Allocator, CCTUInfo) {}
+
+protected:
+ void labelAndInsertText(const CodeCompletionString &CCS,
+ bool EnableSnippets = false) {
+ Label.clear();
+ InsertText.clear();
+ getLabelAndInsertText(CCS, &Label, &InsertText, EnableSnippets);
+ }
+
+ std::shared_ptr<clang::GlobalCodeCompletionAllocator> Allocator;
+ CodeCompletionTUInfo CCTUInfo;
+ CodeCompletionBuilder Builder;
+ std::string Label;
+ std::string InsertText;
+};
+
+TEST_F(CompletionStringTest, Detail) {
+ Builder.AddResultTypeChunk("result");
+ Builder.AddResultTypeChunk("redundant result no no");
+ EXPECT_EQ(getDetail(*Builder.TakeString()), "result");
+}
+
+TEST_F(CompletionStringTest, FilterText) {
+ Builder.AddTypedTextChunk("typed");
+ Builder.AddTypedTextChunk("redundant typed no no");
+ auto *S = Builder.TakeString();
+ EXPECT_EQ(getFilterText(*S), "typed");
+}
+
+TEST_F(CompletionStringTest, Documentation) {
+ Builder.addBriefComment("Is this brief?");
+ EXPECT_EQ(getDocumentation(*Builder.TakeString()), "Is this brief?");
+}
+
+TEST_F(CompletionStringTest, DocumentationWithAnnotation) {
+ Builder.addBriefComment("Is this brief?");
+ Builder.AddAnnotation("Ano");
+ EXPECT_EQ(getDocumentation(*Builder.TakeString()),
+ "Annotation: Ano\n\nIs this brief?");
+}
+
+TEST_F(CompletionStringTest, MultipleAnnotations) {
+ Builder.AddAnnotation("Ano1");
+ Builder.AddAnnotation("Ano2");
+ Builder.AddAnnotation("Ano3");
+
+ EXPECT_EQ(getDocumentation(*Builder.TakeString()),
+ "Annotations: Ano1 Ano2 Ano3\n");
+}
+
+TEST_F(CompletionStringTest, SimpleLabelAndInsert) {
+ Builder.AddTypedTextChunk("X");
+ Builder.AddResultTypeChunk("result no no");
+ labelAndInsertText(*Builder.TakeString());
+ EXPECT_EQ(Label, "X");
+ EXPECT_EQ(InsertText, "X");
+}
+
+TEST_F(CompletionStringTest, FunctionPlainText) {
+ Builder.AddResultTypeChunk("result no no");
+ Builder.AddTypedTextChunk("Foo");
+ Builder.AddChunk(CodeCompletionString::CK_LeftParen);
+ Builder.AddPlaceholderChunk("p1");
+ Builder.AddChunk(CodeCompletionString::CK_Comma);
+ Builder.AddPlaceholderChunk("p2");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+ Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
+ Builder.AddInformativeChunk("const");
+
+ labelAndInsertText(*Builder.TakeString());
+ EXPECT_EQ(Label, "Foo(p1, p2) const");
+ EXPECT_EQ(InsertText, "Foo");
+}
+
+TEST_F(CompletionStringTest, FunctionSnippet) {
+ Builder.AddResultTypeChunk("result no no");
+ Builder.addBriefComment("Foo's comment");
+ Builder.AddTypedTextChunk("Foo");
+ Builder.AddChunk(CodeCompletionString::CK_LeftParen);
+ Builder.AddPlaceholderChunk("p1");
+ Builder.AddChunk(CodeCompletionString::CK_Comma);
+ Builder.AddPlaceholderChunk("p2");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+
+ auto *CCS = Builder.TakeString();
+ labelAndInsertText(*CCS);
+ EXPECT_EQ(Label, "Foo(p1, p2)");
+ EXPECT_EQ(InsertText, "Foo");
+
+ labelAndInsertText(*CCS, /*EnableSnippets=*/true);
+ EXPECT_EQ(Label, "Foo(p1, p2)");
+ EXPECT_EQ(InsertText, "Foo(${1:p1}, ${2:p2})");
+ EXPECT_EQ(getDocumentation(*CCS), "Foo's comment");
+ EXPECT_EQ(getFilterText(*CCS), "Foo");
+}
+
+TEST_F(CompletionStringTest, EscapeSnippet) {
+ Builder.AddTypedTextChunk("Foo");
+ Builder.AddChunk(CodeCompletionString::CK_LeftParen);
+ Builder.AddPlaceholderChunk("$p}1\\");
+ Builder.AddChunk(CodeCompletionString::CK_RightParen);
+
+ labelAndInsertText(*Builder.TakeString(), /*EnableSnippets=*/true);
+ EXPECT_EQ(Label, "Foo($p}1\\)");
+ EXPECT_EQ(InsertText, "Foo(${1:\\$p\\}1\\\\})");
+}
+
+TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
+ Builder.AddTypedTextChunk("X");
+ Builder.AddInformativeChunk("info ok");
+ Builder.AddInformativeChunk("info no no::");
+ labelAndInsertText(*Builder.TakeString());
+ EXPECT_EQ(Label, "Xinfo ok");
+ EXPECT_EQ(InsertText, "X");
+}
+
+} // namespace
+} // namespace clangd
+} // namespace clang