1 //===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===//
2 //
3 // 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
6 //
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 
17 namespace clang {
18 namespace format {
19 namespace {
20 
21 class NamespaceEndCommentsFixerTest : public ::testing::Test {
22 protected:
23   std::string
24   fixNamespaceEndComments(llvm::StringRef Code,
25                           const std::vector<tooling::Range> &Ranges,
26                           const FormatStyle &Style = getLLVMStyle()) {
27     LLVM_DEBUG(llvm::errs() << "---\n");
28     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
29     tooling::Replacements Replaces =
30         clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>");
31     auto Result = applyAllReplacements(Code, Replaces);
32     EXPECT_TRUE(static_cast<bool>(Result));
33     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
34     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 
46 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) {
47   EXPECT_EQ("namespace {\n"
48             "  int i;\n"
49             "  int j;\n"
50             "}// namespace",
51             fixNamespaceEndComments("namespace {\n"
52                                     "  int i;\n"
53                                     "  int j;\n"
54                                     "}"));
55   EXPECT_EQ("namespace {\n"
56             "  int i;\n"
57             "  int j;\n"
58             "}// namespace\n",
59             fixNamespaceEndComments("namespace {\n"
60                                     "  int i;\n"
61                                     "  int j;\n"
62                                     "}\n"));
63   EXPECT_EQ("namespace A {\n"
64             "  int i;\n"
65             "  int j;\n"
66             "}// namespace A",
67             fixNamespaceEndComments("namespace A {\n"
68                                     "  int i;\n"
69                                     "  int j;\n"
70                                     "}"));
71   EXPECT_EQ("inline namespace A {\n"
72             "  int i;\n"
73             "  int j;\n"
74             "}// namespace A",
75             fixNamespaceEndComments("inline namespace A {\n"
76                                     "  int i;\n"
77                                     "  int j;\n"
78                                     "}"));
79   EXPECT_EQ("namespace ::A {\n"
80             "  int i;\n"
81             "  int j;\n"
82             "}// namespace ::A",
83             fixNamespaceEndComments("namespace ::A {\n"
84                                     "  int i;\n"
85                                     "  int j;\n"
86                                     "}"));
87   EXPECT_EQ("namespace ::A::B {\n"
88             "  int i;\n"
89             "  int j;\n"
90             "}// namespace ::A::B",
91             fixNamespaceEndComments("namespace ::A::B {\n"
92                                     "  int i;\n"
93                                     "  int j;\n"
94                                     "}"));
95   EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
96             "  int i;\n"
97             "  int j;\n"
98             "}// namespace ::A::B",
99             fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
100                                     "  int i;\n"
101                                     "  int j;\n"
102                                     "}"));
103   EXPECT_EQ("namespace A {\n"
104             "namespace B {\n"
105             "  int i;\n"
106             "}\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"
117             "}// namespace B\n"
118             "}// namespace A",
119             fixNamespaceEndComments("namespace A {\n"
120                                     "namespace B {\n"
121                                     "  int i;\n"
122                                     "  int j;\n"
123                                     "}\n"
124                                     "}"));
125   EXPECT_EQ("namespace A {\n"
126             "  int a;\n"
127             "  int b;\n"
128             "}// namespace A\n"
129             "namespace B {\n"
130             "  int b;\n"
131             "  int a;\n"
132             "}// namespace B",
133             fixNamespaceEndComments("namespace A {\n"
134                                     "  int a;\n"
135                                     "  int b;\n"
136                                     "}\n"
137                                     "namespace B {\n"
138                                     "  int b;\n"
139                                     "  int a;\n"
140                                     "}"));
141   EXPECT_EQ("namespace A {\n"
142             "  int a1;\n"
143             "  int a2;\n"
144             "}// namespace A\n"
145             "namespace A {\n"
146             "  int a2;\n"
147             "  int a1;\n"
148             "}// namespace A",
149             fixNamespaceEndComments("namespace A {\n"
150                                     "  int a1;\n"
151                                     "  int a2;\n"
152                                     "}\n"
153                                     "namespace A {\n"
154                                     "  int a2;\n"
155                                     "  int a1;\n"
156                                     "}"));
157   EXPECT_EQ("namespace A {\n"
158             "  int a;\n"
159             "  int b;\n"
160             "}// namespace A\n"
161             "// comment about b\n"
162             "int b;",
163             fixNamespaceEndComments("namespace A {\n"
164                                     "  int a;\n"
165                                     "  int b;\n"
166                                     "}\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"
174             "}\n"
175             "}// 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                                     "}"));
186 
187   // 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 
222   // 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"));
249 }
250 
251 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
252   EXPECT_EQ("namespace A {\n"
253             "  int i;\n"
254             "  int j;\n"
255             "}// namespace A\n"
256             " int k;",
257             fixNamespaceEndComments("namespace A {\n"
258                                     "  int i;\n"
259                                     "  int j;\n"
260                                     "} int k;"));
261   EXPECT_EQ("namespace {\n"
262             "  int i;\n"
263             "  int j;\n"
264             "}// namespace\n"
265             " int k;",
266             fixNamespaceEndComments("namespace {\n"
267                                     "  int i;\n"
268                                     "  int j;\n"
269                                     "} int k;"));
270   EXPECT_EQ("namespace A {\n"
271             "  int i;\n"
272             "  int j;\n"
273             "}// namespace A\n"
274             " namespace B {\n"
275             "  int j;\n"
276             "  int k;\n"
277             "}// namespace B",
278             fixNamespaceEndComments("namespace A {\n"
279                                     "  int i;\n"
280                                     "  int j;\n"
281                                     "} namespace B {\n"
282                                     "  int j;\n"
283                                     "  int k;\n"
284                                     "}"));
285   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                                     "};;"));
303 }
304 
305 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
306   EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
307   EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
308   EXPECT_EQ("namespace A { a }",
309             fixNamespaceEndComments("namespace A { a }"));
310   EXPECT_EQ("namespace A { a };",
311             fixNamespaceEndComments("namespace A { a };"));
312 }
313 
314 TEST_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)}));
323   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)}));
331 }
332 
333 TEST_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 
344 TEST_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"));
369   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 */"));
381 }
382 
383 TEST_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"));
414   EXPECT_EQ("namespace A {\n"
415             "  int i;\n"
416             "}; // namespace A",
417             fixNamespaceEndComments("namespace A {\n"
418                                     "  int i;\n"
419                                     "}; // banamespace A"));
420   // Updates invalid line comments even for short namespaces.
421   EXPECT_EQ("namespace A {} // namespace A",
422             fixNamespaceEndComments("namespace A {} // namespace"));
423   EXPECT_EQ("namespace A {}; // namespace A",
424             fixNamespaceEndComments("namespace A {}; // namespace"));
425 
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));
446 }
447 
448 TEST_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 */"));
479   EXPECT_EQ("namespace A {\n"
480             "  int i;\n"
481             "}; // namespace A",
482             fixNamespaceEndComments("namespace A {\n"
483                                     "  int i;\n"
484                                     "}; /* banamespace A */"));
485   EXPECT_EQ("namespace A {} // namespace A",
486             fixNamespaceEndComments("namespace A {} /**/"));
487   EXPECT_EQ("namespace A {}; // namespace A",
488             fixNamespaceEndComments("namespace A {}; /**/"));
489 }
490 
491 TEST_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 
511 TEST_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 
639 TEST_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"));
657   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"));
675   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"));
755 }
756 
757 TEST_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 }
768 
769 TEST_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 }
783 } // end namespace
784 } // end namespace format
785 } // end namespace clang
786