blob: 5091b1d9de0bee9fff14e79239727efa2eedee16 [file] [log] [blame]
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +00001//===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "clang/Format/Format.h"
10
11#include "clang/Frontend/TextDiagnosticPrinter.h"
12#include "llvm/Support/Debug.h"
13#include "gtest/gtest.h"
14
15#define DEBUG_TYPE "namespace-end-comments-fixer-test"
16
17namespace clang {
18namespace format {
19namespace {
20
21class NamespaceEndCommentsFixerTest : public ::testing::Test {
22protected:
23 std::string
24 fixNamespaceEndComments(llvm::StringRef Code,
Krasimir Georgiev850f6892017-04-21 14:30:01 +000025 const std::vector<tooling::Range> &Ranges,
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000026 const FormatStyle &Style = getLLVMStyle()) {
Nicola Zaghen3538b392018-05-15 13:30:56 +000027 LLVM_DEBUG(llvm::errs() << "---\n");
28 LLVM_DEBUG(llvm::errs() << Code << "\n\n");
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000029 tooling::Replacements Replaces =
30 clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
31 auto Result = applyAllReplacements(Code, Replaces);
32 EXPECT_TRUE(static_cast<bool>(Result));
Nicola Zaghen3538b392018-05-15 13:30:56 +000033 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000034 return *Result;
35 }
36
37 std::string
38 fixNamespaceEndComments(llvm::StringRef Code,
39 const FormatStyle &Style = getLLVMStyle()) {
40 return fixNamespaceEndComments(
41 Code,
42 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style);
43 }
44};
45
46TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
47 EXPECT_EQ("namespace {\n"
48 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000049 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000050 "}// namespace",
51 fixNamespaceEndComments("namespace {\n"
52 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000053 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000054 "}"));
55 EXPECT_EQ("namespace {\n"
56 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000057 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000058 "}// namespace\n",
59 fixNamespaceEndComments("namespace {\n"
60 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000061 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000062 "}\n"));
63 EXPECT_EQ("namespace A {\n"
64 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000065 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000066 "}// namespace A",
67 fixNamespaceEndComments("namespace A {\n"
68 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000069 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000070 "}"));
71 EXPECT_EQ("inline namespace A {\n"
72 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000073 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000074 "}// namespace A",
75 fixNamespaceEndComments("inline namespace A {\n"
76 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000077 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000078 "}"));
79 EXPECT_EQ("namespace ::A {\n"
80 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000081 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000082 "}// namespace ::A",
83 fixNamespaceEndComments("namespace ::A {\n"
84 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000085 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000086 "}"));
87 EXPECT_EQ("namespace ::A::B {\n"
88 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000089 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000090 "}// namespace ::A::B",
91 fixNamespaceEndComments("namespace ::A::B {\n"
92 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000093 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000094 "}"));
95 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
96 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000097 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +000098 "}// namespace ::A::B",
99 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
100 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000101 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000102 "}"));
103 EXPECT_EQ("namespace A {\n"
104 "namespace B {\n"
105 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000106 "}\n"
107 "}// namespace A",
108 fixNamespaceEndComments("namespace A {\n"
109 "namespace B {\n"
110 " int i;\n"
111 "}\n"
112 "}"));
113 EXPECT_EQ("namespace A {\n"
114 "namespace B {\n"
115 " int i;\n"
116 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000117 "}// namespace B\n"
118 "}// namespace A",
119 fixNamespaceEndComments("namespace A {\n"
120 "namespace B {\n"
121 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000122 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000123 "}\n"
124 "}"));
125 EXPECT_EQ("namespace A {\n"
126 " int a;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000127 " int b;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000128 "}// namespace A\n"
129 "namespace B {\n"
130 " int b;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000131 " int a;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000132 "}// namespace B",
133 fixNamespaceEndComments("namespace A {\n"
134 " int a;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000135 " int b;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000136 "}\n"
137 "namespace B {\n"
138 " int b;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000139 " int a;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000140 "}"));
141 EXPECT_EQ("namespace A {\n"
142 " int a1;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000143 " int a2;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000144 "}// namespace A\n"
145 "namespace A {\n"
146 " int a2;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000147 " int a1;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000148 "}// namespace A",
149 fixNamespaceEndComments("namespace A {\n"
150 " int a1;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000151 " int a2;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000152 "}\n"
153 "namespace A {\n"
154 " int a2;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000155 " int a1;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000156 "}"));
157 EXPECT_EQ("namespace A {\n"
158 " int a;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000159 " int b;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000160 "}// namespace A\n"
161 "// comment about b\n"
162 "int b;",
163 fixNamespaceEndComments("namespace A {\n"
164 " int a;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000165 " int b;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000166 "}\n"
167 "// comment about b\n"
168 "int b;"));
169
170 EXPECT_EQ("namespace A {\n"
171 "namespace B {\n"
172 "namespace C {\n"
173 "namespace D {\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000174 "}\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000175 "}// namespace C\n"
176 "}// namespace B\n"
177 "}// namespace A",
178 fixNamespaceEndComments("namespace A {\n"
179 "namespace B {\n"
180 "namespace C {\n"
181 "namespace D {\n"
182 "}\n"
183 "}\n"
184 "}\n"
185 "}"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000186
Francois Ferrande56a8292017-06-14 12:29:47 +0000187 // Add comment for namespaces which will be 'compacted'
188 FormatStyle CompactNamespacesStyle = getLLVMStyle();
189 CompactNamespacesStyle.CompactNamespaces = true;
190 EXPECT_EQ("namespace out { namespace in {\n"
191 "int i;\n"
192 "int j;\n"
193 "}}// namespace out::in",
194 fixNamespaceEndComments("namespace out { namespace in {\n"
195 "int i;\n"
196 "int j;\n"
197 "}}",
198 CompactNamespacesStyle));
199 EXPECT_EQ("namespace out {\n"
200 "namespace in {\n"
201 "int i;\n"
202 "int j;\n"
203 "}\n"
204 "}// namespace out::in",
205 fixNamespaceEndComments("namespace out {\n"
206 "namespace in {\n"
207 "int i;\n"
208 "int j;\n"
209 "}\n"
210 "}",
211 CompactNamespacesStyle));
212 EXPECT_EQ("namespace out { namespace in {\n"
213 "int i;\n"
214 "int j;\n"
215 "};}// namespace out::in",
216 fixNamespaceEndComments("namespace out { namespace in {\n"
217 "int i;\n"
218 "int j;\n"
219 "};}",
220 CompactNamespacesStyle));
221
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000222 // Adds an end comment after a semicolon.
223 EXPECT_EQ("namespace {\n"
224 " int i;\n"
225 " int j;\n"
226 "};// namespace",
227 fixNamespaceEndComments("namespace {\n"
228 " int i;\n"
229 " int j;\n"
230 "};"));
231 EXPECT_EQ("namespace A {\n"
232 " int i;\n"
233 " int j;\n"
234 "};// namespace A",
235 fixNamespaceEndComments("namespace A {\n"
236 " int i;\n"
237 " int j;\n"
238 "};"));
239 EXPECT_EQ("namespace A {\n"
240 " int i;\n"
241 " int j;\n"
242 "};// namespace A\n"
243 "// unrelated",
244 fixNamespaceEndComments("namespace A {\n"
245 " int i;\n"
246 " int j;\n"
247 "};\n"
248 "// unrelated"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000249}
250
251TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
252 EXPECT_EQ("namespace A {\n"
253 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000254 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000255 "}// namespace A\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000256 " int k;",
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000257 fixNamespaceEndComments("namespace A {\n"
258 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000259 " int j;\n"
260 "} int k;"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000261 EXPECT_EQ("namespace {\n"
262 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000263 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000264 "}// namespace\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000265 " int k;",
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000266 fixNamespaceEndComments("namespace {\n"
267 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000268 " int j;\n"
269 "} int k;"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000270 EXPECT_EQ("namespace A {\n"
271 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000272 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000273 "}// namespace A\n"
274 " namespace B {\n"
275 " int j;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000276 " int k;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000277 "}// namespace B",
278 fixNamespaceEndComments("namespace A {\n"
279 " int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000280 " int j;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000281 "} namespace B {\n"
282 " int j;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000283 " int k;\n"
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000284 "}"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000285 EXPECT_EQ("namespace {\n"
286 " int i;\n"
287 " int j;\n"
288 "};// namespace\n"
289 "int k;",
290 fixNamespaceEndComments("namespace {\n"
291 " int i;\n"
292 " int j;\n"
293 "};int k;"));
294 EXPECT_EQ("namespace {\n"
295 " int i;\n"
296 " int j;\n"
297 "};// namespace\n"
298 ";",
299 fixNamespaceEndComments("namespace {\n"
300 " int i;\n"
301 " int j;\n"
302 "};;"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000303}
304
305TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
306 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
307 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000308 EXPECT_EQ("namespace A { a }",
309 fixNamespaceEndComments("namespace A { a }"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000310 EXPECT_EQ("namespace A { a };",
311 fixNamespaceEndComments("namespace A { a };"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000312}
313
314TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
315 EXPECT_EQ("namespace A {\n"
316 " int i;\n"
317 "}",
318 fixNamespaceEndComments("namespace A {\n"
319 " int i;\n"
320 "}",
321 // The range (16, 3) spans the 'int' above.
322 /*Ranges=*/{1, tooling::Range(16, 3)}));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000323 EXPECT_EQ("namespace A {\n"
324 " int i;\n"
325 "};",
326 fixNamespaceEndComments("namespace A {\n"
327 " int i;\n"
328 "};",
329 // The range (16, 3) spans the 'int' above.
330 /*Ranges=*/{1, tooling::Range(16, 3)}));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000331}
332
333TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
334 EXPECT_EQ("#define SAD \\\n"
335 "namespace A { \\\n"
336 " int i; \\\n"
337 "}",
338 fixNamespaceEndComments("#define SAD \\\n"
339 "namespace A { \\\n"
340 " int i; \\\n"
341 "}"));
342}
343
344TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
345 EXPECT_EQ("namespace {\n"
346 " int i;\n"
347 "} // end anonymous namespace",
348 fixNamespaceEndComments("namespace {\n"
349 " int i;\n"
350 "} // end anonymous namespace"));
351 EXPECT_EQ("namespace A {\n"
352 " int i;\n"
353 "} /* end of namespace A */",
354 fixNamespaceEndComments("namespace A {\n"
355 " int i;\n"
356 "} /* end of namespace A */"));
357 EXPECT_EQ("namespace A {\n"
358 " int i;\n"
359 "} // namespace A",
360 fixNamespaceEndComments("namespace A {\n"
361 " int i;\n"
362 "} // namespace A"));
363 EXPECT_EQ("namespace A::B {\n"
364 " int i;\n"
365 "} // end namespace A::B",
366 fixNamespaceEndComments("namespace A::B {\n"
367 " int i;\n"
368 "} // end namespace A::B"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000369 EXPECT_EQ("namespace A {\n"
370 " int i;\n"
371 "}; // end namespace A",
372 fixNamespaceEndComments("namespace A {\n"
373 " int i;\n"
374 "}; // end namespace A"));
375 EXPECT_EQ("namespace {\n"
376 " int i;\n"
377 "}; /* unnamed namespace */",
378 fixNamespaceEndComments("namespace {\n"
379 " int i;\n"
380 "}; /* unnamed namespace */"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000381}
382
383TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
384 EXPECT_EQ("namespace {\n"
385 " int i;\n"
386 "} // namespace",
387 fixNamespaceEndComments("namespace {\n"
388 " int i;\n"
389 "} // namespace A"));
390 EXPECT_EQ("namespace A {\n"
391 " int i;\n"
392 "} // namespace A",
393 fixNamespaceEndComments("namespace A {\n"
394 " int i;\n"
395 "} // namespace"));
396 EXPECT_EQ("namespace A {\n"
397 " int i;\n"
398 "} // namespace A",
399 fixNamespaceEndComments("namespace A {\n"
400 " int i;\n"
401 "} //"));
402 EXPECT_EQ("namespace A {\n"
403 " int i;\n"
404 "} // namespace A",
405 fixNamespaceEndComments("namespace A {\n"
406 " int i;\n"
407 "} //"));
408 EXPECT_EQ("namespace A {\n"
409 " int i;\n"
410 "} // namespace A",
411 fixNamespaceEndComments("namespace A {\n"
412 " int i;\n"
413 "} // banamespace A"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000414 EXPECT_EQ("namespace A {\n"
415 " int i;\n"
416 "}; // namespace A",
417 fixNamespaceEndComments("namespace A {\n"
418 " int i;\n"
419 "}; // banamespace A"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000420 // Updates invalid line comments even for short namespaces.
421 EXPECT_EQ("namespace A {} // namespace A",
422 fixNamespaceEndComments("namespace A {} // namespace"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000423 EXPECT_EQ("namespace A {}; // namespace A",
424 fixNamespaceEndComments("namespace A {}; // namespace"));
Francois Ferrande56a8292017-06-14 12:29:47 +0000425
426 // Update invalid comments for compacted namespaces.
427 FormatStyle CompactNamespacesStyle = getLLVMStyle();
428 CompactNamespacesStyle.CompactNamespaces = true;
429 EXPECT_EQ("namespace out { namespace in {\n"
430 "}} // namespace out::in",
431 fixNamespaceEndComments("namespace out { namespace in {\n"
432 "}} // namespace out",
433 CompactNamespacesStyle));
434 EXPECT_EQ("namespace out { namespace in {\n"
435 "}} // namespace out::in",
436 fixNamespaceEndComments("namespace out { namespace in {\n"
437 "}} // namespace in",
438 CompactNamespacesStyle));
439 EXPECT_EQ("namespace out { namespace in {\n"
440 "}\n"
441 "} // namespace out::in",
442 fixNamespaceEndComments("namespace out { namespace in {\n"
443 "}// banamespace in\n"
444 "} // namespace out",
445 CompactNamespacesStyle));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000446}
447
448TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
449 EXPECT_EQ("namespace {\n"
450 " int i;\n"
451 "} // namespace",
452 fixNamespaceEndComments("namespace {\n"
453 " int i;\n"
454 "} /* namespace A */"));
455 EXPECT_EQ("namespace A {\n"
456 " int i;\n"
457 "} // namespace A",
458 fixNamespaceEndComments("namespace A {\n"
459 " int i;\n"
460 "} /* end namespace */"));
461 EXPECT_EQ("namespace A {\n"
462 " int i;\n"
463 "} // namespace A",
464 fixNamespaceEndComments("namespace A {\n"
465 " int i;\n"
466 "} /**/"));
467 EXPECT_EQ("namespace A {\n"
468 " int i;\n"
469 "} // namespace A",
470 fixNamespaceEndComments("namespace A {\n"
471 " int i;\n"
472 "} /* end unnamed namespace */"));
473 EXPECT_EQ("namespace A {\n"
474 " int i;\n"
475 "} // namespace A",
476 fixNamespaceEndComments("namespace A {\n"
477 " int i;\n"
478 "} /* banamespace A */"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000479 EXPECT_EQ("namespace A {\n"
480 " int i;\n"
481 "}; // namespace A",
482 fixNamespaceEndComments("namespace A {\n"
483 " int i;\n"
484 "}; /* banamespace A */"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000485 EXPECT_EQ("namespace A {} // namespace A",
486 fixNamespaceEndComments("namespace A {} /**/"));
Krasimir Georgieveb62118e2017-03-07 14:07:43 +0000487 EXPECT_EQ("namespace A {}; // namespace A",
488 fixNamespaceEndComments("namespace A {}; /**/"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000489}
490
491TEST_F(NamespaceEndCommentsFixerTest,
492 DoesNotAddEndCommentForNamespacesControlledByMacros) {
493 EXPECT_EQ("#ifdef 1\n"
494 "namespace A {\n"
495 "#elseif\n"
496 "namespace B {\n"
497 "#endif\n"
498 " int i;\n"
499 "}\n"
500 "}\n",
501 fixNamespaceEndComments("#ifdef 1\n"
502 "namespace A {\n"
503 "#elseif\n"
504 "namespace B {\n"
505 "#endif\n"
506 " int i;\n"
507 "}\n"
508 "}\n"));
509}
510
Francois Ferranda98a95c2017-07-28 07:56:14 +0000511TEST_F(NamespaceEndCommentsFixerTest, AddEndCommentForNamespacesAroundMacros) {
512 // Conditional blocks around are fine
513 EXPECT_EQ("namespace A {\n"
514 "#if 1\n"
515 "int i;\n"
516 "#endif\n"
517 "}// namespace A",
518 fixNamespaceEndComments("namespace A {\n"
519 "#if 1\n"
520 "int i;\n"
521 "#endif\n"
522 "}"));
523 EXPECT_EQ("#if 1\n"
524 "#endif\n"
525 "namespace A {\n"
526 "int i;\n"
527 "int j;\n"
528 "}// namespace A",
529 fixNamespaceEndComments("#if 1\n"
530 "#endif\n"
531 "namespace A {\n"
532 "int i;\n"
533 "int j;\n"
534 "}"));
535 EXPECT_EQ("namespace A {\n"
536 "int i;\n"
537 "int j;\n"
538 "}// namespace A\n"
539 "#if 1\n"
540 "#endif",
541 fixNamespaceEndComments("namespace A {\n"
542 "int i;\n"
543 "int j;\n"
544 "}\n"
545 "#if 1\n"
546 "#endif"));
547 EXPECT_EQ("#if 1\n"
548 "namespace A {\n"
549 "int i;\n"
550 "int j;\n"
551 "}// namespace A\n"
552 "#endif",
553 fixNamespaceEndComments("#if 1\n"
554 "namespace A {\n"
555 "int i;\n"
556 "int j;\n"
557 "}\n"
558 "#endif"));
559
560 // Macro definition has no impact
561 EXPECT_EQ("namespace A {\n"
562 "#define FOO\n"
563 "int i;\n"
564 "}// namespace A",
565 fixNamespaceEndComments("namespace A {\n"
566 "#define FOO\n"
567 "int i;\n"
568 "}"));
569 EXPECT_EQ("#define FOO\n"
570 "namespace A {\n"
571 "int i;\n"
572 "int j;\n"
573 "}// namespace A",
574 fixNamespaceEndComments("#define FOO\n"
575 "namespace A {\n"
576 "int i;\n"
577 "int j;\n"
578 "}"));
579 EXPECT_EQ("namespace A {\n"
580 "int i;\n"
581 "int j;\n"
582 "}// namespace A\n"
583 "#define FOO\n",
584 fixNamespaceEndComments("namespace A {\n"
585 "int i;\n"
586 "int j;\n"
587 "}\n"
588 "#define FOO\n"));
589
590 // No replacement if open & close in different conditional blocks
591 EXPECT_EQ("#if 1\n"
592 "namespace A {\n"
593 "#endif\n"
594 "int i;\n"
595 "int j;\n"
596 "#if 1\n"
597 "}\n"
598 "#endif",
599 fixNamespaceEndComments("#if 1\n"
600 "namespace A {\n"
601 "#endif\n"
602 "int i;\n"
603 "int j;\n"
604 "#if 1\n"
605 "}\n"
606 "#endif"));
607 EXPECT_EQ("#ifdef A\n"
608 "namespace A {\n"
609 "#endif\n"
610 "int i;\n"
611 "int j;\n"
612 "#ifdef B\n"
613 "}\n"
614 "#endif",
615 fixNamespaceEndComments("#ifdef A\n"
616 "namespace A {\n"
617 "#endif\n"
618 "int i;\n"
619 "int j;\n"
620 "#ifdef B\n"
621 "}\n"
622 "#endif"));
623
624 // No replacement inside unreachable conditional block
625 EXPECT_EQ("#if 0\n"
626 "namespace A {\n"
627 "int i;\n"
628 "int j;\n"
629 "}\n"
630 "#endif",
631 fixNamespaceEndComments("#if 0\n"
632 "namespace A {\n"
633 "int i;\n"
634 "int j;\n"
635 "}\n"
636 "#endif"));
637}
638
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000639TEST_F(NamespaceEndCommentsFixerTest,
640 DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
641 EXPECT_EQ("#ifdef 1\n"
642 "namespace A {\n"
643 "#elseif\n"
644 "namespace B {\n"
645 "#endif\n"
646 " int i;\n"
647 "}\n"
648 "}\n",
649 fixNamespaceEndComments("#ifdef 1\n"
650 "namespace A {\n"
651 "#elseif\n"
652 "namespace B {\n"
653 "#endif\n"
654 " int i;\n"
655 "}\n"
656 "}\n"));
Krasimir Georgievbda77392017-03-06 16:44:45 +0000657 EXPECT_EQ("namespace {\n"
658 " int i;\n"
659 " int j;\n"
660 "}// namespace\n"
661 "#if A\n"
662 " int i;\n"
663 "#else\n"
664 " int j;\n"
665 "#endif",
666 fixNamespaceEndComments("namespace {\n"
667 " int i;\n"
668 " int j;\n"
669 "}\n"
670 "#if A\n"
671 " int i;\n"
672 "#else\n"
673 " int j;\n"
674 "#endif"));
Krasimir Georgiev615353c2017-03-06 17:29:25 +0000675 EXPECT_EQ("#if A\n"
676 "namespace A {\n"
677 "#else\n"
678 "namespace B {\n"
679 "#endif\n"
680 "int i;\n"
681 "int j;\n"
682 "}",
683 fixNamespaceEndComments("#if A\n"
684 "namespace A {\n"
685 "#else\n"
686 "namespace B {\n"
687 "#endif\n"
688 "int i;\n"
689 "int j;\n"
690 "}"));
691 EXPECT_EQ("#if A\n"
692 "namespace A {\n"
693 "#else\n"
694 "namespace B {\n"
695 "#endif\n"
696 "int i;\n"
697 "int j;\n"
698 "} // namespace A",
699 fixNamespaceEndComments("#if A\n"
700 "namespace A {\n"
701 "#else\n"
702 "namespace B {\n"
703 "#endif\n"
704 "int i;\n"
705 "int j;\n"
706 "} // namespace A"));
707 EXPECT_EQ("#if A\n"
708 "namespace A {\n"
709 "#else\n"
710 "namespace B {\n"
711 "#endif\n"
712 "int i;\n"
713 "int j;\n"
714 "} // namespace B",
715 fixNamespaceEndComments("#if A\n"
716 "namespace A {\n"
717 "#else\n"
718 "namespace B {\n"
719 "#endif\n"
720 "int i;\n"
721 "int j;\n"
722 "} // namespace B"));
723 EXPECT_EQ("namespace A\n"
724 "int i;\n"
725 "int j;\n"
726 "#if A\n"
727 "}\n"
728 "#else\n"
729 "}\n"
730 "#endif",
731 fixNamespaceEndComments("namespace A\n"
732 "int i;\n"
733 "int j;\n"
734 "#if A\n"
735 "}\n"
736 "#else\n"
737 "}\n"
738 "#endif"));
739 EXPECT_EQ("namespace A\n"
740 "int i;\n"
741 "int j;\n"
742 "#if A\n"
743 "} // namespace A\n"
744 "#else\n"
745 "} // namespace A\n"
746 "#endif",
747 fixNamespaceEndComments("namespace A\n"
748 "int i;\n"
749 "int j;\n"
750 "#if A\n"
751 "} // namespace A\n"
752 "#else\n"
753 "} // namespace A\n"
754 "#endif"));
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000755}
Krasimir Georgiev85c37042017-03-01 16:38:08 +0000756
757TEST_F(NamespaceEndCommentsFixerTest,
758 DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
759 EXPECT_EQ("namespace {\n"
760 " int i;\n"
761 "} // namespace\n"
762 "}",
763 fixNamespaceEndComments("namespace {\n"
764 " int i;\n"
765 "} // namespace\n"
766 "}"));
767}
Matthias Gehreddae2512017-04-04 20:11:13 +0000768
769TEST_F(NamespaceEndCommentsFixerTest, HandlesInlineAtEndOfLine_PR32438) {
770 EXPECT_EQ("template <int> struct a {};\n"
771 "struct a<bool{}> b() {\n"
772 "}\n"
773 "#define c inline\n"
774 "void d() {\n"
775 "}\n",
776 fixNamespaceEndComments("template <int> struct a {};\n"
777 "struct a<bool{}> b() {\n"
778 "}\n"
779 "#define c inline\n"
780 "void d() {\n"
781 "}\n"));
782}
Krasimir Georgiev7cb267a2017-02-27 13:28:36 +0000783} // end namespace
784} // end namespace format
785} // end namespace clang