blob: a6038a732d1c57a15ade0d73d82019f018700a98 [file] [log] [blame]
Eric Liu63696e12017-12-20 17:24:31 +00001//===-- CodeCompletionStringsTests.cpp --------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "CodeCompletionStrings.h"
11#include "clang/Sema/CodeCompleteConsumer.h"
12#include "gmock/gmock.h"
13#include "gtest/gtest.h"
14
15namespace clang {
16namespace clangd {
17namespace {
18
19class CompletionStringTest : public ::testing::Test {
20public:
21 CompletionStringTest()
22 : Allocator(std::make_shared<clang::GlobalCodeCompletionAllocator>()),
23 CCTUInfo(Allocator), Builder(*Allocator, CCTUInfo) {}
24
25protected:
Sam McCalla68951e2018-06-22 16:11:35 +000026 void computeSignature(const CodeCompletionString &CCS) {
27 Signature.clear();
28 Snippet.clear();
29 getSignature(CCS, &Signature, &Snippet);
Eric Liu63696e12017-12-20 17:24:31 +000030 }
31
32 std::shared_ptr<clang::GlobalCodeCompletionAllocator> Allocator;
33 CodeCompletionTUInfo CCTUInfo;
34 CodeCompletionBuilder Builder;
Sam McCalla68951e2018-06-22 16:11:35 +000035 std::string Signature;
36 std::string Snippet;
Eric Liu63696e12017-12-20 17:24:31 +000037};
38
Sam McCalla68951e2018-06-22 16:11:35 +000039TEST_F(CompletionStringTest, ReturnType) {
Eric Liu63696e12017-12-20 17:24:31 +000040 Builder.AddResultTypeChunk("result");
41 Builder.AddResultTypeChunk("redundant result no no");
Sam McCalla68951e2018-06-22 16:11:35 +000042 EXPECT_EQ(getReturnType(*Builder.TakeString()), "result");
Eric Liu63696e12017-12-20 17:24:31 +000043}
44
Eric Liu63696e12017-12-20 17:24:31 +000045TEST_F(CompletionStringTest, Documentation) {
Ilya Biryukov43714502018-05-16 12:32:44 +000046 Builder.addBriefComment("This is ignored");
47 EXPECT_EQ(formatDocumentation(*Builder.TakeString(), "Is this brief?"),
48 "Is this brief?");
Eric Liu63696e12017-12-20 17:24:31 +000049}
50
51TEST_F(CompletionStringTest, DocumentationWithAnnotation) {
Ilya Biryukov43714502018-05-16 12:32:44 +000052 Builder.addBriefComment("This is ignored");
Eric Liu63696e12017-12-20 17:24:31 +000053 Builder.AddAnnotation("Ano");
Ilya Biryukov43714502018-05-16 12:32:44 +000054 EXPECT_EQ(formatDocumentation(*Builder.TakeString(), "Is this brief?"),
Eric Liu63696e12017-12-20 17:24:31 +000055 "Annotation: Ano\n\nIs this brief?");
56}
57
58TEST_F(CompletionStringTest, MultipleAnnotations) {
59 Builder.AddAnnotation("Ano1");
60 Builder.AddAnnotation("Ano2");
61 Builder.AddAnnotation("Ano3");
62
Ilya Biryukov43714502018-05-16 12:32:44 +000063 EXPECT_EQ(formatDocumentation(*Builder.TakeString(), ""),
Eric Liu63696e12017-12-20 17:24:31 +000064 "Annotations: Ano1 Ano2 Ano3\n");
65}
66
Sam McCalla68951e2018-06-22 16:11:35 +000067TEST_F(CompletionStringTest, EmptySignature) {
Eric Liu63696e12017-12-20 17:24:31 +000068 Builder.AddTypedTextChunk("X");
69 Builder.AddResultTypeChunk("result no no");
Sam McCalla68951e2018-06-22 16:11:35 +000070 computeSignature(*Builder.TakeString());
71 EXPECT_EQ(Signature, "");
72 EXPECT_EQ(Snippet, "");
Eric Liu63696e12017-12-20 17:24:31 +000073}
74
Sam McCalla68951e2018-06-22 16:11:35 +000075TEST_F(CompletionStringTest, Function) {
Eric Liu63696e12017-12-20 17:24:31 +000076 Builder.AddResultTypeChunk("result no no");
Ilya Biryukov43714502018-05-16 12:32:44 +000077 Builder.addBriefComment("This comment is ignored");
Eric Liu63696e12017-12-20 17:24:31 +000078 Builder.AddTypedTextChunk("Foo");
79 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
80 Builder.AddPlaceholderChunk("p1");
81 Builder.AddChunk(CodeCompletionString::CK_Comma);
82 Builder.AddPlaceholderChunk("p2");
83 Builder.AddChunk(CodeCompletionString::CK_RightParen);
84
85 auto *CCS = Builder.TakeString();
Sam McCalla68951e2018-06-22 16:11:35 +000086 computeSignature(*CCS);
87 EXPECT_EQ(Signature, "(p1, p2)");
88 EXPECT_EQ(Snippet, "(${1:p1}, ${2:p2})");
Ilya Biryukov43714502018-05-16 12:32:44 +000089 EXPECT_EQ(formatDocumentation(*CCS, "Foo's comment"), "Foo's comment");
Eric Liu63696e12017-12-20 17:24:31 +000090}
91
92TEST_F(CompletionStringTest, EscapeSnippet) {
93 Builder.AddTypedTextChunk("Foo");
94 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
95 Builder.AddPlaceholderChunk("$p}1\\");
96 Builder.AddChunk(CodeCompletionString::CK_RightParen);
97
Sam McCalla68951e2018-06-22 16:11:35 +000098 computeSignature(*Builder.TakeString());
99 EXPECT_EQ(Signature, "($p}1\\)");
100 EXPECT_EQ(Snippet, "(${1:\\$p\\}1\\\\})");
Eric Liu63696e12017-12-20 17:24:31 +0000101}
102
103TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
104 Builder.AddTypedTextChunk("X");
105 Builder.AddInformativeChunk("info ok");
106 Builder.AddInformativeChunk("info no no::");
Sam McCalla68951e2018-06-22 16:11:35 +0000107 computeSignature(*Builder.TakeString());
108 EXPECT_EQ(Signature, "info ok");
109 EXPECT_EQ(Snippet, "");
Eric Liu63696e12017-12-20 17:24:31 +0000110}
111
112} // namespace
113} // namespace clangd
114} // namespace clang