1 //===- 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 
18 namespace clang {
19 namespace format {
20 namespace {
21 
22 class NamespaceEndCommentsFixerTest : public ::testing::Test {
23 protected:
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 
47 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
48   EXPECT_EQ("namespace {\n"
49             "  int i;\n"
50             "  int j;\n"
51             "}// namespace",
52             fixNamespaceEndComments("namespace {\n"
53                                     "  int i;\n"
54                                     "  int j;\n"
55                                     "}"));
56   EXPECT_EQ("namespace {\n"
57             "  int i;\n"
58             "  int j;\n"
59             "}// namespace\n",
60             fixNamespaceEndComments("namespace {\n"
61                                     "  int i;\n"
62                                     "  int j;\n"
63                                     "}\n"));
64   EXPECT_EQ("namespace A {\n"
65             "  int i;\n"
66             "  int j;\n"
67             "}// namespace A",
68             fixNamespaceEndComments("namespace A {\n"
69                                     "  int i;\n"
70                                     "  int j;\n"
71                                     "}"));
72   EXPECT_EQ("inline namespace A {\n"
73             "  int i;\n"
74             "  int j;\n"
75             "}// namespace A",
76             fixNamespaceEndComments("inline namespace A {\n"
77                                     "  int i;\n"
78                                     "  int j;\n"
79                                     "}"));
80   EXPECT_EQ("namespace ::A {\n"
81             "  int i;\n"
82             "  int j;\n"
83             "}// namespace ::A",
84             fixNamespaceEndComments("namespace ::A {\n"
85                                     "  int i;\n"
86                                     "  int j;\n"
87                                     "}"));
88   EXPECT_EQ("namespace ::A::B {\n"
89             "  int i;\n"
90             "  int j;\n"
91             "}// namespace ::A::B",
92             fixNamespaceEndComments("namespace ::A::B {\n"
93                                     "  int i;\n"
94                                     "  int j;\n"
95                                     "}"));
96   EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
97             "  int i;\n"
98             "  int j;\n"
99             "}// namespace ::A::B",
100             fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
101                                     "  int i;\n"
102                                     "  int j;\n"
103                                     "}"));
104   EXPECT_EQ("namespace A {\n"
105             "namespace B {\n"
106             "  int i;\n"
107             "}\n"
108             "}// namespace A",
109             fixNamespaceEndComments("namespace A {\n"
110                                     "namespace B {\n"
111                                     "  int i;\n"
112                                     "}\n"
113                                     "}"));
114   EXPECT_EQ("namespace A {\n"
115             "namespace B {\n"
116             "  int i;\n"
117             "  int j;\n"
118             "}// namespace B\n"
119             "}// namespace A",
120             fixNamespaceEndComments("namespace A {\n"
121                                     "namespace B {\n"
122                                     "  int i;\n"
123                                     "  int j;\n"
124                                     "}\n"
125                                     "}"));
126   EXPECT_EQ("namespace A {\n"
127             "  int a;\n"
128             "  int b;\n"
129             "}// namespace A\n"
130             "namespace B {\n"
131             "  int b;\n"
132             "  int a;\n"
133             "}// namespace B",
134             fixNamespaceEndComments("namespace A {\n"
135                                     "  int a;\n"
136                                     "  int b;\n"
137                                     "}\n"
138                                     "namespace B {\n"
139                                     "  int b;\n"
140                                     "  int a;\n"
141                                     "}"));
142   EXPECT_EQ("namespace A {\n"
143             "  int a1;\n"
144             "  int a2;\n"
145             "}// namespace A\n"
146             "namespace A {\n"
147             "  int a2;\n"
148             "  int a1;\n"
149             "}// namespace A",
150             fixNamespaceEndComments("namespace A {\n"
151                                     "  int a1;\n"
152                                     "  int a2;\n"
153                                     "}\n"
154                                     "namespace A {\n"
155                                     "  int a2;\n"
156                                     "  int a1;\n"
157                                     "}"));
158   EXPECT_EQ("namespace A {\n"
159             "  int a;\n"
160             "  int b;\n"
161             "}// namespace A\n"
162             "// comment about b\n"
163             "int b;",
164             fixNamespaceEndComments("namespace A {\n"
165                                     "  int a;\n"
166                                     "  int b;\n"
167                                     "}\n"
168                                     "// comment about b\n"
169                                     "int b;"));
170 
171   EXPECT_EQ("namespace A {\n"
172             "namespace B {\n"
173             "namespace C {\n"
174             "namespace D {\n"
175             "}\n"
176             "}// namespace C\n"
177             "}// namespace B\n"
178             "}// namespace A",
179             fixNamespaceEndComments("namespace A {\n"
180                                     "namespace B {\n"
181                                     "namespace C {\n"
182                                     "namespace D {\n"
183                                     "}\n"
184                                     "}\n"
185                                     "}\n"
186                                     "}"));
187 
188   // Adds an end comment after a semicolon.
189   EXPECT_EQ("namespace {\n"
190             "  int i;\n"
191             "  int j;\n"
192             "};// namespace",
193             fixNamespaceEndComments("namespace {\n"
194                                     "  int i;\n"
195                                     "  int j;\n"
196                                     "};"));
197   EXPECT_EQ("namespace A {\n"
198             "  int i;\n"
199             "  int j;\n"
200             "};// namespace A",
201             fixNamespaceEndComments("namespace A {\n"
202                                     "  int i;\n"
203                                     "  int j;\n"
204                                     "};"));
205   EXPECT_EQ("namespace A {\n"
206             "  int i;\n"
207             "  int j;\n"
208             "};// namespace A\n"
209             "// unrelated",
210             fixNamespaceEndComments("namespace A {\n"
211                                     "  int i;\n"
212                                     "  int j;\n"
213                                     "};\n"
214                                     "// unrelated"));
215 }
216 
217 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
218   EXPECT_EQ("namespace A {\n"
219             "  int i;\n"
220             "  int j;\n"
221             "}// namespace A\n"
222             " int k;",
223             fixNamespaceEndComments("namespace A {\n"
224                                     "  int i;\n"
225                                     "  int j;\n"
226                                     "} int k;"));
227   EXPECT_EQ("namespace {\n"
228             "  int i;\n"
229             "  int j;\n"
230             "}// namespace\n"
231             " int k;",
232             fixNamespaceEndComments("namespace {\n"
233                                     "  int i;\n"
234                                     "  int j;\n"
235                                     "} int k;"));
236   EXPECT_EQ("namespace A {\n"
237             "  int i;\n"
238             "  int j;\n"
239             "}// namespace A\n"
240             " namespace B {\n"
241             "  int j;\n"
242             "  int k;\n"
243             "}// namespace B",
244             fixNamespaceEndComments("namespace A {\n"
245                                     "  int i;\n"
246                                     "  int j;\n"
247                                     "} namespace B {\n"
248                                     "  int j;\n"
249                                     "  int k;\n"
250                                     "}"));
251   EXPECT_EQ("namespace {\n"
252             "  int i;\n"
253             "  int j;\n"
254             "};// namespace\n"
255             "int k;",
256             fixNamespaceEndComments("namespace {\n"
257                                     "  int i;\n"
258                                     "  int j;\n"
259                                     "};int k;"));
260   EXPECT_EQ("namespace {\n"
261             "  int i;\n"
262             "  int j;\n"
263             "};// namespace\n"
264             ";",
265             fixNamespaceEndComments("namespace {\n"
266                                     "  int i;\n"
267                                     "  int j;\n"
268                                     "};;"));
269 }
270 
271 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
272   EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
273   EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
274   EXPECT_EQ("namespace A { a }",
275             fixNamespaceEndComments("namespace A { a }"));
276   EXPECT_EQ("namespace A { a };",
277             fixNamespaceEndComments("namespace A { a };"));
278 }
279 
280 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
281   EXPECT_EQ("namespace A {\n"
282             "  int i;\n"
283             "}",
284             fixNamespaceEndComments("namespace A {\n"
285                                     "  int i;\n"
286                                     "}",
287                                     // The range (16, 3) spans the 'int' above.
288                                     /*Ranges=*/{1, tooling::Range(16, 3)}));
289   EXPECT_EQ("namespace A {\n"
290             "  int i;\n"
291             "};",
292             fixNamespaceEndComments("namespace A {\n"
293                                     "  int i;\n"
294                                     "};",
295                                     // The range (16, 3) spans the 'int' above.
296                                     /*Ranges=*/{1, tooling::Range(16, 3)}));
297 }
298 
299 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
300   EXPECT_EQ("#define SAD \\\n"
301             "namespace A { \\\n"
302             "  int i; \\\n"
303             "}",
304             fixNamespaceEndComments("#define SAD \\\n"
305                                     "namespace A { \\\n"
306                                     "  int i; \\\n"
307                                     "}"));
308 }
309 
310 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
311   EXPECT_EQ("namespace {\n"
312             "  int i;\n"
313             "} // end anonymous namespace",
314             fixNamespaceEndComments("namespace {\n"
315                                     "  int i;\n"
316                                     "} // end anonymous namespace"));
317   EXPECT_EQ("namespace A {\n"
318             "  int i;\n"
319             "} /* end of namespace A */",
320             fixNamespaceEndComments("namespace A {\n"
321                                     "  int i;\n"
322                                     "} /* end of namespace A */"));
323   EXPECT_EQ("namespace A {\n"
324             "  int i;\n"
325             "}   //   namespace A",
326             fixNamespaceEndComments("namespace A {\n"
327                                     "  int i;\n"
328                                     "}   //   namespace A"));
329   EXPECT_EQ("namespace A::B {\n"
330             "  int i;\n"
331             "} // end namespace A::B",
332             fixNamespaceEndComments("namespace A::B {\n"
333                                     "  int i;\n"
334                                     "} // end namespace A::B"));
335   EXPECT_EQ("namespace A {\n"
336             "  int i;\n"
337             "}; // end namespace A",
338             fixNamespaceEndComments("namespace A {\n"
339                                     "  int i;\n"
340                                     "}; // end namespace A"));
341   EXPECT_EQ("namespace {\n"
342             "  int i;\n"
343             "}; /* unnamed namespace */",
344             fixNamespaceEndComments("namespace {\n"
345                                     "  int i;\n"
346                                     "}; /* unnamed namespace */"));
347 }
348 
349 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
350   EXPECT_EQ("namespace {\n"
351             "  int i;\n"
352             "} // namespace",
353             fixNamespaceEndComments("namespace {\n"
354                                     "  int i;\n"
355                                     "} // namespace A"));
356   EXPECT_EQ("namespace A {\n"
357             "  int i;\n"
358             "} // namespace A",
359             fixNamespaceEndComments("namespace A {\n"
360                                     "  int i;\n"
361                                     "} // namespace"));
362   EXPECT_EQ("namespace A {\n"
363             "  int i;\n"
364             "} // namespace A",
365             fixNamespaceEndComments("namespace A {\n"
366                                     "  int i;\n"
367                                     "} //"));
368   EXPECT_EQ("namespace A {\n"
369             "  int i;\n"
370             "} // namespace A",
371             fixNamespaceEndComments("namespace A {\n"
372                                     "  int i;\n"
373                                     "} //"));
374   EXPECT_EQ("namespace A {\n"
375             "  int i;\n"
376             "} // namespace A",
377             fixNamespaceEndComments("namespace A {\n"
378                                     "  int i;\n"
379                                     "} // banamespace A"));
380   EXPECT_EQ("namespace A {\n"
381             "  int i;\n"
382             "}; // namespace A",
383             fixNamespaceEndComments("namespace A {\n"
384                                     "  int i;\n"
385                                     "}; // banamespace A"));
386   // Updates invalid line comments even for short namespaces.
387   EXPECT_EQ("namespace A {} // namespace A",
388             fixNamespaceEndComments("namespace A {} // namespace"));
389   EXPECT_EQ("namespace A {}; // namespace A",
390             fixNamespaceEndComments("namespace A {}; // namespace"));
391 }
392 
393 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
394   EXPECT_EQ("namespace {\n"
395             "  int i;\n"
396             "} // namespace",
397             fixNamespaceEndComments("namespace {\n"
398                                     "  int i;\n"
399                                     "} /* namespace A */"));
400   EXPECT_EQ("namespace A {\n"
401             "  int i;\n"
402             "}  // namespace A",
403             fixNamespaceEndComments("namespace A {\n"
404                                     "  int i;\n"
405                                     "}  /* end namespace */"));
406   EXPECT_EQ("namespace A {\n"
407             "  int i;\n"
408             "} // namespace A",
409             fixNamespaceEndComments("namespace A {\n"
410                                     "  int i;\n"
411                                     "} /**/"));
412   EXPECT_EQ("namespace A {\n"
413             "  int i;\n"
414             "} // namespace A",
415             fixNamespaceEndComments("namespace A {\n"
416                                     "  int i;\n"
417                                     "} /* end unnamed namespace */"));
418   EXPECT_EQ("namespace A {\n"
419             "  int i;\n"
420             "} // namespace A",
421             fixNamespaceEndComments("namespace A {\n"
422                                     "  int i;\n"
423                                     "} /* banamespace A */"));
424   EXPECT_EQ("namespace A {\n"
425             "  int i;\n"
426             "}; // namespace A",
427             fixNamespaceEndComments("namespace A {\n"
428                                     "  int i;\n"
429                                     "}; /* banamespace A */"));
430   EXPECT_EQ("namespace A {} // namespace A",
431             fixNamespaceEndComments("namespace A {} /**/"));
432   EXPECT_EQ("namespace A {}; // namespace A",
433             fixNamespaceEndComments("namespace A {}; /**/"));
434 }
435 
436 TEST_F(NamespaceEndCommentsFixerTest,
437        DoesNotAddEndCommentForNamespacesControlledByMacros) {
438   EXPECT_EQ("#ifdef 1\n"
439             "namespace A {\n"
440             "#elseif\n"
441             "namespace B {\n"
442             "#endif\n"
443             "  int i;\n"
444             "}\n"
445             "}\n",
446             fixNamespaceEndComments("#ifdef 1\n"
447                                     "namespace A {\n"
448                                     "#elseif\n"
449                                     "namespace B {\n"
450                                     "#endif\n"
451                                     "  int i;\n"
452                                     "}\n"
453                                     "}\n"));
454 }
455 
456 TEST_F(NamespaceEndCommentsFixerTest,
457        DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
458   EXPECT_EQ("#ifdef 1\n"
459             "namespace A {\n"
460             "#elseif\n"
461             "namespace B {\n"
462             "#endif\n"
463             "  int i;\n"
464             "}\n"
465             "}\n",
466             fixNamespaceEndComments("#ifdef 1\n"
467                                     "namespace A {\n"
468                                     "#elseif\n"
469                                     "namespace B {\n"
470                                     "#endif\n"
471                                     "  int i;\n"
472                                     "}\n"
473                                     "}\n"));
474   EXPECT_EQ("namespace {\n"
475             "  int i;\n"
476             "  int j;\n"
477             "}// namespace\n"
478             "#if A\n"
479             "  int i;\n"
480             "#else\n"
481             "  int j;\n"
482             "#endif",
483             fixNamespaceEndComments("namespace {\n"
484                                     "  int i;\n"
485                                     "  int j;\n"
486                                     "}\n"
487                                     "#if A\n"
488                                     "  int i;\n"
489                                     "#else\n"
490                                     "  int j;\n"
491                                     "#endif"));
492   EXPECT_EQ("#if A\n"
493             "namespace A {\n"
494             "#else\n"
495             "namespace B {\n"
496             "#endif\n"
497             "int i;\n"
498             "int j;\n"
499             "}",
500             fixNamespaceEndComments("#if A\n"
501                                     "namespace A {\n"
502                                     "#else\n"
503                                     "namespace B {\n"
504                                     "#endif\n"
505                                     "int i;\n"
506                                     "int j;\n"
507                                     "}"));
508   EXPECT_EQ("#if A\n"
509             "namespace A {\n"
510             "#else\n"
511             "namespace B {\n"
512             "#endif\n"
513             "int i;\n"
514             "int j;\n"
515             "} // namespace A",
516             fixNamespaceEndComments("#if A\n"
517                                     "namespace A {\n"
518                                     "#else\n"
519                                     "namespace B {\n"
520                                     "#endif\n"
521                                     "int i;\n"
522                                     "int j;\n"
523                                     "} // namespace A"));
524   EXPECT_EQ("#if A\n"
525             "namespace A {\n"
526             "#else\n"
527             "namespace B {\n"
528             "#endif\n"
529             "int i;\n"
530             "int j;\n"
531             "} // namespace B",
532             fixNamespaceEndComments("#if A\n"
533                                     "namespace A {\n"
534                                     "#else\n"
535                                     "namespace B {\n"
536                                     "#endif\n"
537                                     "int i;\n"
538                                     "int j;\n"
539                                     "} // namespace B"));
540   EXPECT_EQ("namespace A\n"
541             "int i;\n"
542             "int j;\n"
543             "#if A\n"
544             "}\n"
545             "#else\n"
546             "}\n"
547             "#endif",
548             fixNamespaceEndComments("namespace A\n"
549                                     "int i;\n"
550                                     "int j;\n"
551                                     "#if A\n"
552                                     "}\n"
553                                     "#else\n"
554                                     "}\n"
555                                     "#endif"));
556   EXPECT_EQ("namespace A\n"
557             "int i;\n"
558             "int j;\n"
559             "#if A\n"
560             "} // namespace A\n"
561             "#else\n"
562             "} // namespace A\n"
563             "#endif",
564             fixNamespaceEndComments("namespace A\n"
565                                     "int i;\n"
566                                     "int j;\n"
567                                     "#if A\n"
568                                     "} // namespace A\n"
569                                     "#else\n"
570                                     "} // namespace A\n"
571                                     "#endif"));
572 }
573 
574 TEST_F(NamespaceEndCommentsFixerTest,
575        DoesNotAddEndCommentForUnbalancedRBracesAfterNamespaceEnd) {
576   EXPECT_EQ("namespace {\n"
577             "  int i;\n"
578             "} // namespace\n"
579             "}",
580             fixNamespaceEndComments("namespace {\n"
581                                     "  int i;\n"
582                                     "} // namespace\n"
583                                     "}"));
584 }
585 } // end namespace
586 } // end namespace format
587 } // end namespace clang
588