blob: c24894e7d4e7b61dc27e66300a0b7855f1bb114a [file] [log] [blame]
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +00001//===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
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 "clang/Format/Format.h"
11
12#include "clang/Frontend/TextDiagnosticPrinter.h"
13#include "llvm/Support/Debug.h"
14#include "gtest/gtest.h"
15
16#define DEBUG_TYPE "namespace-end-comments-fixer-test"
17
18namespace clang {
19namespace format {
20namespace {
21
22class NamespaceEndCommentsFixerTest : public ::testing::Test {
23protected:
24 std::string
25 fixNamespaceEndComments(llvm::StringRef Code,
26 std::vector<tooling::Range> Ranges,
27 const FormatStyle &Style = getLLVMStyle()) {
28 DEBUG(llvm::errs() << "---\n");
29 DEBUG(llvm::errs() << Code << "\n\n");
30 tooling::Replacements Replaces =
31 clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
32 auto Result = applyAllReplacements(Code, Replaces);
33 EXPECT_TRUE(static_cast<bool>(Result));
34 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
35 return *Result;
36 }
37
38 std::string
39 fixNamespaceEndComments(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle()) {
41 return fixNamespaceEndComments(
42 Code,
43 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
44 }
45};
46
47TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
48 EXPECT_EQ("namespace {\n"
49 " int i;\n"
50 "}// namespace",
51 fixNamespaceEndComments("namespace {\n"
52 " int i;\n"
53 "}"));
54 EXPECT_EQ("namespace {\n"
55 " int i;\n"
56 "}// namespace\n",
57 fixNamespaceEndComments("namespace {\n"
58 " int i;\n"
59 "}\n"));
60 EXPECT_EQ("namespace A {\n"
61 " int i;\n"
62 "}// namespace A",
63 fixNamespaceEndComments("namespace A {\n"
64 " int i;\n"
65 "}"));
66 EXPECT_EQ("inline namespace A {\n"
67 " int i;\n"
68 "}// namespace A",
69 fixNamespaceEndComments("inline namespace A {\n"
70 " int i;\n"
71 "}"));
72 EXPECT_EQ("namespace ::A {\n"
73 " int i;\n"
74 "}// namespace ::A",
75 fixNamespaceEndComments("namespace ::A {\n"
76 " int i;\n"
77 "}"));
78 EXPECT_EQ("namespace ::A::B {\n"
79 " int i;\n"
80 "}// namespace ::A::B",
81 fixNamespaceEndComments("namespace ::A::B {\n"
82 " int i;\n"
83 "}"));
84 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
85 " int i;\n"
86 "}// namespace ::A::B",
87 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
88 " int i;\n"
89 "}"));
90 EXPECT_EQ("namespace A {\n"
91 "namespace B {\n"
92 " int i;\n"
93 "}// namespace B\n"
94 "}// namespace A",
95 fixNamespaceEndComments("namespace A {\n"
96 "namespace B {\n"
97 " int i;\n"
98 "}\n"
99 "}"));
100 EXPECT_EQ("namespace A {\n"
101 " int a;\n"
102 "}// namespace A\n"
103 "namespace B {\n"
104 " int b;\n"
105 "}// namespace B",
106 fixNamespaceEndComments("namespace A {\n"
107 " int a;\n"
108 "}\n"
109 "namespace B {\n"
110 " int b;\n"
111 "}"));
112 EXPECT_EQ("namespace A {\n"
113 " int a1;\n"
114 "}// namespace A\n"
115 "namespace A {\n"
116 " int a2;\n"
117 "}// namespace A",
118 fixNamespaceEndComments("namespace A {\n"
119 " int a1;\n"
120 "}\n"
121 "namespace A {\n"
122 " int a2;\n"
123 "}"));
124 EXPECT_EQ("namespace A {\n"
125 " int a;\n"
126 "}// namespace A\n"
127 "// comment about b\n"
128 "int b;",
129 fixNamespaceEndComments("namespace A {\n"
130 " int a;\n"
131 "}\n"
132 "// comment about b\n"
133 "int b;"));
134
135 EXPECT_EQ("namespace A {\n"
136 "namespace B {\n"
137 "namespace C {\n"
138 "namespace D {\n"
139 "}// namespace D\n"
140 "}// namespace C\n"
141 "}// namespace B\n"
142 "}// namespace A",
143 fixNamespaceEndComments("namespace A {\n"
144 "namespace B {\n"
145 "namespace C {\n"
146 "namespace D {\n"
147 "}\n"
148 "}\n"
149 "}\n"
150 "}"));
151}
152
153TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
154 EXPECT_EQ("namespace A {\n"
155 " int i;\n"
156 "}// namespace A\n"
157 " int j;",
158 fixNamespaceEndComments("namespace A {\n"
159 " int i;\n"
160 "} int j;"));
161 EXPECT_EQ("namespace {\n"
162 " int i;\n"
163 "}// namespace\n"
164 " int j;",
165 fixNamespaceEndComments("namespace {\n"
166 " int i;\n"
167 "} int j;"));
168 EXPECT_EQ("namespace A {\n"
169 " int i;\n"
170 "}// namespace A\n"
171 " namespace B {\n"
172 " int j;\n"
173 "}// namespace B",
174 fixNamespaceEndComments("namespace A {\n"
175 " int i;\n"
176 "} namespace B {\n"
177 " int j;\n"
178 "}"));
179}
180
181TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
182 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
183 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
184 EXPECT_EQ("namespace A { int i; }",
185 fixNamespaceEndComments("namespace A { int i; }"));
186}
187
188TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
189 EXPECT_EQ("namespace A {\n"
190 " int i;\n"
191 "}",
192 fixNamespaceEndComments("namespace A {\n"
193 " int i;\n"
194 "}",
195 // The range (16, 3) spans the 'int' above.
196 /*Ranges=*/{1, tooling::Range(16, 3)}));
197}
198
199TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
200 EXPECT_EQ("#define SAD \\\n"
201 "namespace A { \\\n"
202 " int i; \\\n"
203 "}",
204 fixNamespaceEndComments("#define SAD \\\n"
205 "namespace A { \\\n"
206 " int i; \\\n"
207 "}"));
208}
209
210TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
211 EXPECT_EQ("namespace {\n"
212 " int i;\n"
213 "} // end anonymous namespace",
214 fixNamespaceEndComments("namespace {\n"
215 " int i;\n"
216 "} // end anonymous namespace"));
217 EXPECT_EQ("namespace A {\n"
218 " int i;\n"
219 "} /* end of namespace A */",
220 fixNamespaceEndComments("namespace A {\n"
221 " int i;\n"
222 "} /* end of namespace A */"));
223 EXPECT_EQ("namespace A {\n"
224 " int i;\n"
225 "} // namespace A",
226 fixNamespaceEndComments("namespace A {\n"
227 " int i;\n"
228 "} // namespace A"));
229 EXPECT_EQ("namespace A::B {\n"
230 " int i;\n"
231 "} // end namespace A::B",
232 fixNamespaceEndComments("namespace A::B {\n"
233 " int i;\n"
234 "} // end namespace A::B"));
235}
236
237TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
238 EXPECT_EQ("namespace {\n"
239 " int i;\n"
240 "} // namespace",
241 fixNamespaceEndComments("namespace {\n"
242 " int i;\n"
243 "} // namespace A"));
244 EXPECT_EQ("namespace A {\n"
245 " int i;\n"
246 "} // namespace A",
247 fixNamespaceEndComments("namespace A {\n"
248 " int i;\n"
249 "} // namespace"));
250 EXPECT_EQ("namespace A {\n"
251 " int i;\n"
252 "} // namespace A",
253 fixNamespaceEndComments("namespace A {\n"
254 " int i;\n"
255 "} //"));
256 EXPECT_EQ("namespace A {\n"
257 " int i;\n"
258 "} // namespace A",
259 fixNamespaceEndComments("namespace A {\n"
260 " int i;\n"
261 "} //"));
262 EXPECT_EQ("namespace A {\n"
263 " int i;\n"
264 "} // namespace A",
265 fixNamespaceEndComments("namespace A {\n"
266 " int i;\n"
267 "} // banamespace A"));
268
269 // Updates invalid line comments even for short namespaces.
270 EXPECT_EQ("namespace A {} // namespace A",
271 fixNamespaceEndComments("namespace A {} // namespace"));
272}
273
274TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
275 EXPECT_EQ("namespace {\n"
276 " int i;\n"
277 "} // namespace",
278 fixNamespaceEndComments("namespace {\n"
279 " int i;\n"
280 "} /* namespace A */"));
281 EXPECT_EQ("namespace A {\n"
282 " int i;\n"
283 "} // namespace A",
284 fixNamespaceEndComments("namespace A {\n"
285 " int i;\n"
286 "} /* end namespace */"));
287 EXPECT_EQ("namespace A {\n"
288 " int i;\n"
289 "} // namespace A",
290 fixNamespaceEndComments("namespace A {\n"
291 " int i;\n"
292 "} /**/"));
293 EXPECT_EQ("namespace A {\n"
294 " int i;\n"
295 "} // namespace A",
296 fixNamespaceEndComments("namespace A {\n"
297 " int i;\n"
298 "} /* end unnamed namespace */"));
299 EXPECT_EQ("namespace A {\n"
300 " int i;\n"
301 "} // namespace A",
302 fixNamespaceEndComments("namespace A {\n"
303 " int i;\n"
304 "} /* banamespace A */"));
305 EXPECT_EQ("namespace A {} // namespace A",
306 fixNamespaceEndComments("namespace A {} /**/"));
307}
308
309TEST_F(NamespaceEndCommentsFixerTest,
310 DoesNotAddEndCommentForNamespacesControlledByMacros) {
311 EXPECT_EQ("#ifdef 1\n"
312 "namespace A {\n"
313 "#elseif\n"
314 "namespace B {\n"
315 "#endif\n"
316 " int i;\n"
317 "}\n"
318 "}\n",
319 fixNamespaceEndComments("#ifdef 1\n"
320 "namespace A {\n"
321 "#elseif\n"
322 "namespace B {\n"
323 "#endif\n"
324 " int i;\n"
325 "}\n"
326 "}\n"));
327}
328
329TEST_F(NamespaceEndCommentsFixerTest,
330 DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
331 EXPECT_EQ("#ifdef 1\n"
332 "namespace A {\n"
333 "#elseif\n"
334 "namespace B {\n"
335 "#endif\n"
336 " int i;\n"
337 "}\n"
338 "}\n",
339 fixNamespaceEndComments("#ifdef 1\n"
340 "namespace A {\n"
341 "#elseif\n"
342 "namespace B {\n"
343 "#endif\n"
344 " int i;\n"
345 "}\n"
346 "}\n"));
347}
Krasimir Georgiev85c37042017-03-01 16:38:08 +0000348
349TEST_F(NamespaceEndCommentsFixerTest,
350 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
351 EXPECT_EQ("namespace {\n"
352 " int i;\n"
353 "} // namespace\n"
354 "}",
355 fixNamespaceEndComments("namespace {\n"
356 " int i;\n"
357 "} // namespace\n"
358 "}"));
359}
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000360} // end namespace
361} // end namespace format
362} // end namespace clang