10 #include "clang/Sema/CodeCompleteConsumer.h"
11 #include "gmock/gmock.h"
12 #include "gtest/gtest.h"
18 class CompletionStringTest :
public ::testing::Test {
20 CompletionStringTest()
21 :
Allocator(std::make_shared<
clang::GlobalCodeCompletionAllocator>()),
25 void computeSignature(
const CodeCompletionString &CCS,
26 bool CompletingPattern =
false) {
33 std::shared_ptr<clang::GlobalCodeCompletionAllocator>
Allocator;
41 Builder.AddResultTypeChunk(
"result");
42 Builder.AddResultTypeChunk(
"redundant result no no");
46 TEST_F(CompletionStringTest, Documentation) {
47 Builder.addBriefComment(
"This is ignored");
52 TEST_F(CompletionStringTest, DocumentationWithAnnotation) {
53 Builder.addBriefComment(
"This is ignored");
56 "Annotation: Ano\n\nIs this brief?");
59 TEST_F(CompletionStringTest, MultipleAnnotations) {
65 "Annotations: Ano1 Ano2 Ano3\n");
68 TEST_F(CompletionStringTest, EmptySignature) {
70 Builder.AddResultTypeChunk(
"result no no");
71 computeSignature(*
Builder.TakeString());
73 EXPECT_EQ(Snippet,
"");
76 TEST_F(CompletionStringTest, Function) {
77 Builder.AddResultTypeChunk(
"result no no");
78 Builder.addBriefComment(
"This comment is ignored");
79 Builder.AddTypedTextChunk(
"Foo");
80 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
81 Builder.AddPlaceholderChunk(
"p1");
82 Builder.AddChunk(CodeCompletionString::CK_Comma);
83 Builder.AddPlaceholderChunk(
"p2");
84 Builder.AddChunk(CodeCompletionString::CK_RightParen);
86 auto *CCS =
Builder.TakeString();
87 computeSignature(*CCS);
89 EXPECT_EQ(Snippet,
"(${1:p1}, ${2:p2})");
93 TEST_F(CompletionStringTest, FunctionWithDefaultParams) {
95 Builder.AddChunk(CodeCompletionString::CK_Comma);
96 Builder.AddTypedTextChunk(
"p3 = 0");
97 auto *DefaultParam2 =
Builder.TakeString();
99 Builder.AddChunk(CodeCompletionString::CK_Comma);
100 Builder.AddTypedTextChunk(
"p2 = 0");
101 Builder.AddOptionalChunk(DefaultParam2);
102 auto *DefaultParam1 =
Builder.TakeString();
104 Builder.AddResultTypeChunk(
"return_type");
105 Builder.AddTypedTextChunk(
"Foo");
106 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
107 Builder.AddPlaceholderChunk(
"p1");
108 Builder.AddOptionalChunk(DefaultParam1);
109 Builder.AddChunk(CodeCompletionString::CK_RightParen);
111 auto *CCS =
Builder.TakeString();
112 computeSignature(*CCS);
113 EXPECT_EQ(
Signature,
"(p1, p2 = 0, p3 = 0)");
114 EXPECT_EQ(Snippet,
"(${1:p1})");
117 TEST_F(CompletionStringTest, EscapeSnippet) {
118 Builder.AddTypedTextChunk(
"Foo");
119 Builder.AddChunk(CodeCompletionString::CK_LeftParen);
120 Builder.AddPlaceholderChunk(
"$p}1\\");
121 Builder.AddChunk(CodeCompletionString::CK_RightParen);
123 computeSignature(*
Builder.TakeString());
125 EXPECT_EQ(Snippet,
"(${1:\\$p\\}1\\\\})");
128 TEST_F(CompletionStringTest, SnippetsInPatterns) {
129 auto MakeCCS = [
this]() ->
const CodeCompletionString & {
131 Builder.AddTypedTextChunk(
"namespace");
132 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
133 Builder.AddPlaceholderChunk(
"name");
134 Builder.AddChunk(CodeCompletionString::CK_Equal);
135 Builder.AddPlaceholderChunk(
"target");
136 Builder.AddChunk(CodeCompletionString::CK_SemiColon);
139 computeSignature(MakeCCS(),
false);
140 EXPECT_EQ(Snippet,
" ${1:name} = ${2:target};");
143 computeSignature(MakeCCS(),
true);
144 EXPECT_EQ(Snippet,
" ${1:name} = ${0:target};");
147 TEST_F(CompletionStringTest, IgnoreInformativeQualifier) {
148 Builder.AddTypedTextChunk(
"X");
149 Builder.AddInformativeChunk(
"info ok");
150 Builder.AddInformativeChunk(
"info no no::");
151 computeSignature(*
Builder.TakeString());
153 EXPECT_EQ(Snippet,
"");
156 TEST_F(CompletionStringTest, ObjectiveCMethodNoArguments) {
157 Builder.AddResultTypeChunk(
"void");
158 Builder.AddTypedTextChunk(
"methodName");
160 auto *CCS =
Builder.TakeString();
161 computeSignature(*CCS);
163 EXPECT_EQ(Snippet,
"");
166 TEST_F(CompletionStringTest, ObjectiveCMethodOneArgument) {
167 Builder.AddResultTypeChunk(
"void");
168 Builder.AddTypedTextChunk(
"methodWithArg:");
169 Builder.AddPlaceholderChunk(
"(type)");
171 auto *CCS =
Builder.TakeString();
172 computeSignature(*CCS);
174 EXPECT_EQ(Snippet,
"${1:(type)}");
177 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromBeginning) {
178 Builder.AddResultTypeChunk(
"int");
179 Builder.AddTypedTextChunk(
"withFoo:");
180 Builder.AddPlaceholderChunk(
"(type)");
181 Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace);
182 Builder.AddTypedTextChunk(
"bar:");
183 Builder.AddPlaceholderChunk(
"(type2)");
185 auto *CCS =
Builder.TakeString();
186 computeSignature(*CCS);
187 EXPECT_EQ(
Signature,
"(type) bar:(type2)");
188 EXPECT_EQ(Snippet,
"${1:(type)} bar:${2:(type2)}");
191 TEST_F(CompletionStringTest, ObjectiveCMethodTwoArgumentsFromMiddle) {
192 Builder.AddResultTypeChunk(
"int");
193 Builder.AddInformativeChunk(
"withFoo:");
194 Builder.AddTypedTextChunk(
"bar:");
195 Builder.AddPlaceholderChunk(
"(type2)");
197 auto *CCS =
Builder.TakeString();
198 computeSignature(*CCS);
200 EXPECT_EQ(Snippet,
"${1:(type2)}");