Clang Project

clang_source_code/unittests/Format/NamespaceEndCommentsFixerTest.cpp
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
17namespace clang {
18namespace format {
19namespace {
20
21class NamespaceEndCommentsFixerTest : public ::testing::Test {
22protected:
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
46TEST_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
251TEST_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
305TEST_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
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)}));
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
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"));
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
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"));
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
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 */"));
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
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
511TEST_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
639TEST_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
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}
768
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}
783} // end namespace
784} // end namespace format
785} // end namespace clang
786