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             "}// namespace",
51             fixNamespaceEndComments("namespace {\n"
52                                     "  int i;\n"
53                                     "}"));
54   EXPECT_EQ("namespace {\n"
55             "  int i;\n"
56             "}// namespace\n",
57             fixNamespaceEndComments("namespace {\n"
58                                     "  int i;\n"
59                                     "}\n"));
60   EXPECT_EQ("namespace A {\n"
61             "  int i;\n"
62             "}// namespace A",
63             fixNamespaceEndComments("namespace A {\n"
64                                     "  int i;\n"
65                                     "}"));
66   EXPECT_EQ("inline namespace A {\n"
67             "  int i;\n"
68             "}// namespace A",
69             fixNamespaceEndComments("inline namespace A {\n"
70                                     "  int i;\n"
71                                     "}"));
72   EXPECT_EQ("namespace ::A {\n"
73             "  int i;\n"
74             "}// namespace ::A",
75             fixNamespaceEndComments("namespace ::A {\n"
76                                     "  int i;\n"
77                                     "}"));
78   EXPECT_EQ("namespace ::A::B {\n"
79             "  int i;\n"
80             "}// namespace ::A::B",
81             fixNamespaceEndComments("namespace ::A::B {\n"
82                                     "  int i;\n"
83                                     "}"));
84   EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n"
85             "  int i;\n"
86             "}// namespace ::A::B",
87             fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n"
88                                     "  int i;\n"
89                                     "}"));
90   EXPECT_EQ("namespace A {\n"
91             "namespace B {\n"
92             "  int i;\n"
93             "}// namespace B\n"
94             "}// namespace A",
95             fixNamespaceEndComments("namespace A {\n"
96                                     "namespace B {\n"
97                                     "  int i;\n"
98                                     "}\n"
99                                     "}"));
100   EXPECT_EQ("namespace A {\n"
101             "  int a;\n"
102             "}// namespace A\n"
103             "namespace B {\n"
104             "  int b;\n"
105             "}// namespace B",
106             fixNamespaceEndComments("namespace A {\n"
107                                     "  int a;\n"
108                                     "}\n"
109                                     "namespace B {\n"
110                                     "  int b;\n"
111                                     "}"));
112   EXPECT_EQ("namespace A {\n"
113             "  int a1;\n"
114             "}// namespace A\n"
115             "namespace A {\n"
116             "  int a2;\n"
117             "}// namespace A",
118             fixNamespaceEndComments("namespace A {\n"
119                                     "  int a1;\n"
120                                     "}\n"
121                                     "namespace A {\n"
122                                     "  int a2;\n"
123                                     "}"));
124   EXPECT_EQ("namespace A {\n"
125             "  int a;\n"
126             "}// namespace A\n"
127             "// comment about b\n"
128             "int b;",
129             fixNamespaceEndComments("namespace A {\n"
130                                     "  int a;\n"
131                                     "}\n"
132                                     "// comment about b\n"
133                                     "int b;"));
134 
135   EXPECT_EQ("namespace A {\n"
136             "namespace B {\n"
137             "namespace C {\n"
138             "namespace D {\n"
139             "}// namespace D\n"
140             "}// namespace C\n"
141             "}// namespace B\n"
142             "}// namespace A",
143             fixNamespaceEndComments("namespace A {\n"
144                                     "namespace B {\n"
145                                     "namespace C {\n"
146                                     "namespace D {\n"
147                                     "}\n"
148                                     "}\n"
149                                     "}\n"
150                                     "}"));
151 }
152 
153 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) {
154   EXPECT_EQ("namespace A {\n"
155             "  int i;\n"
156             "}// namespace A\n"
157             " int j;",
158             fixNamespaceEndComments("namespace A {\n"
159                                     "  int i;\n"
160                                     "} int j;"));
161   EXPECT_EQ("namespace {\n"
162             "  int i;\n"
163             "}// namespace\n"
164             " int j;",
165             fixNamespaceEndComments("namespace {\n"
166                                     "  int i;\n"
167                                     "} int j;"));
168   EXPECT_EQ("namespace A {\n"
169             "  int i;\n"
170             "}// namespace A\n"
171             " namespace B {\n"
172             "  int j;\n"
173             "}// namespace B",
174             fixNamespaceEndComments("namespace A {\n"
175                                     "  int i;\n"
176                                     "} namespace B {\n"
177                                     "  int j;\n"
178                                     "}"));
179 }
180 
181 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) {
182   EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}"));
183   EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}"));
184   EXPECT_EQ("namespace A { int i; }",
185             fixNamespaceEndComments("namespace A { int i; }"));
186 }
187 
188 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) {
189   EXPECT_EQ("namespace A {\n"
190             "  int i;\n"
191             "}",
192             fixNamespaceEndComments("namespace A {\n"
193                                     "  int i;\n"
194                                     "}",
195                                     // The range (16, 3) spans the 'int' above.
196                                     /*Ranges=*/{1, tooling::Range(16, 3)}));
197 }
198 
199 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) {
200   EXPECT_EQ("#define SAD \\\n"
201             "namespace A { \\\n"
202             "  int i; \\\n"
203             "}",
204             fixNamespaceEndComments("#define SAD \\\n"
205                                     "namespace A { \\\n"
206                                     "  int i; \\\n"
207                                     "}"));
208 }
209 
210 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) {
211   EXPECT_EQ("namespace {\n"
212             "  int i;\n"
213             "} // end anonymous namespace",
214             fixNamespaceEndComments("namespace {\n"
215                                     "  int i;\n"
216                                     "} // end anonymous namespace"));
217   EXPECT_EQ("namespace A {\n"
218             "  int i;\n"
219             "} /* end of namespace A */",
220             fixNamespaceEndComments("namespace A {\n"
221                                     "  int i;\n"
222                                     "} /* end of namespace A */"));
223   EXPECT_EQ("namespace A {\n"
224             "  int i;\n"
225             "}   //   namespace A",
226             fixNamespaceEndComments("namespace A {\n"
227                                     "  int i;\n"
228                                     "}   //   namespace A"));
229   EXPECT_EQ("namespace A::B {\n"
230             "  int i;\n"
231             "} // end namespace A::B",
232             fixNamespaceEndComments("namespace A::B {\n"
233                                     "  int i;\n"
234                                     "} // end namespace A::B"));
235 }
236 
237 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) {
238   EXPECT_EQ("namespace {\n"
239             "  int i;\n"
240             "} // namespace",
241             fixNamespaceEndComments("namespace {\n"
242                                     "  int i;\n"
243                                     "} // namespace A"));
244   EXPECT_EQ("namespace A {\n"
245             "  int i;\n"
246             "} // namespace A",
247             fixNamespaceEndComments("namespace A {\n"
248                                     "  int i;\n"
249                                     "} // namespace"));
250   EXPECT_EQ("namespace A {\n"
251             "  int i;\n"
252             "} // namespace A",
253             fixNamespaceEndComments("namespace A {\n"
254                                     "  int i;\n"
255                                     "} //"));
256   EXPECT_EQ("namespace A {\n"
257             "  int i;\n"
258             "} // namespace A",
259             fixNamespaceEndComments("namespace A {\n"
260                                     "  int i;\n"
261                                     "} //"));
262   EXPECT_EQ("namespace A {\n"
263             "  int i;\n"
264             "} // namespace A",
265             fixNamespaceEndComments("namespace A {\n"
266                                     "  int i;\n"
267                                     "} // banamespace A"));
268 
269   // Updates invalid line comments even for short namespaces.
270   EXPECT_EQ("namespace A {} // namespace A",
271             fixNamespaceEndComments("namespace A {} // namespace"));
272 }
273 
274 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) {
275   EXPECT_EQ("namespace {\n"
276             "  int i;\n"
277             "} // namespace",
278             fixNamespaceEndComments("namespace {\n"
279                                     "  int i;\n"
280                                     "} /* namespace A */"));
281   EXPECT_EQ("namespace A {\n"
282             "  int i;\n"
283             "}  // namespace A",
284             fixNamespaceEndComments("namespace A {\n"
285                                     "  int i;\n"
286                                     "}  /* end namespace */"));
287   EXPECT_EQ("namespace A {\n"
288             "  int i;\n"
289             "} // namespace A",
290             fixNamespaceEndComments("namespace A {\n"
291                                     "  int i;\n"
292                                     "} /**/"));
293   EXPECT_EQ("namespace A {\n"
294             "  int i;\n"
295             "} // namespace A",
296             fixNamespaceEndComments("namespace A {\n"
297                                     "  int i;\n"
298                                     "} /* end unnamed namespace */"));
299   EXPECT_EQ("namespace A {\n"
300             "  int i;\n"
301             "} // namespace A",
302             fixNamespaceEndComments("namespace A {\n"
303                                     "  int i;\n"
304                                     "} /* banamespace A */"));
305   EXPECT_EQ("namespace A {} // namespace A",
306             fixNamespaceEndComments("namespace A {} /**/"));
307 }
308 
309 TEST_F(NamespaceEndCommentsFixerTest,
310        DoesNotAddEndCommentForNamespacesControlledByMacros) {
311   EXPECT_EQ("#ifdef 1\n"
312             "namespace A {\n"
313             "#elseif\n"
314             "namespace B {\n"
315             "#endif\n"
316             "  int i;\n"
317             "}\n"
318             "}\n",
319             fixNamespaceEndComments("#ifdef 1\n"
320                                     "namespace A {\n"
321                                     "#elseif\n"
322                                     "namespace B {\n"
323                                     "#endif\n"
324                                     "  int i;\n"
325                                     "}\n"
326                                     "}\n"));
327 }
328 
329 TEST_F(NamespaceEndCommentsFixerTest,
330        DoesNotAddEndCommentForNamespacesInMacroDeclarations) {
331   EXPECT_EQ("#ifdef 1\n"
332             "namespace A {\n"
333             "#elseif\n"
334             "namespace B {\n"
335             "#endif\n"
336             "  int i;\n"
337             "}\n"
338             "}\n",
339             fixNamespaceEndComments("#ifdef 1\n"
340                                     "namespace A {\n"
341                                     "#elseif\n"
342                                     "namespace B {\n"
343                                     "#endif\n"
344                                     "  int i;\n"
345                                     "}\n"
346                                     "}\n"));
347 }
348 } // end namespace
349 } // end namespace format
350 } // end namespace clang
351