xref: /llvm-project/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp (revision cfacf8ae9ec6724a291600b848fbbb94bb5435e5)
1 #include "ClangTidyTest.h"
2 #include "readability/BracesAroundStatementsCheck.h"
3 #include "readability/NamespaceCommentCheck.h"
4 #include "gtest/gtest.h"
5 
6 namespace clang {
7 namespace tidy {
8 namespace test {
9 
10 using readability::BracesAroundStatementsCheck;
11 using readability::NamespaceCommentCheck;
12 
13 TEST(NamespaceCommentCheckTest, Basic) {
14   EXPECT_EQ("namespace i {\n} // namespace i",
15             runCheckOnCode<NamespaceCommentCheck>("namespace i {\n}"));
16   EXPECT_EQ("namespace {\n} // namespace",
17             runCheckOnCode<NamespaceCommentCheck>("namespace {\n}"));
18   EXPECT_EQ(
19       "namespace i { namespace j {\n} // namespace j\n } // namespace i",
20       runCheckOnCode<NamespaceCommentCheck>("namespace i { namespace j {\n} }"));
21 }
22 
23 TEST(NamespaceCommentCheckTest, SingleLineNamespaces) {
24   EXPECT_EQ(
25       "namespace i { namespace j { } }",
26       runCheckOnCode<NamespaceCommentCheck>("namespace i { namespace j { } }"));
27 }
28 
29 TEST(NamespaceCommentCheckTest, CheckExistingComments) {
30   EXPECT_EQ("namespace i { namespace j {\n"
31             "} /* namespace j */ } // namespace i\n"
32             " /* random comment */",
33             runCheckOnCode<NamespaceCommentCheck>(
34                 "namespace i { namespace j {\n"
35                 "} /* namespace j */ } /* random comment */"));
36   EXPECT_EQ("namespace {\n"
37             "} // namespace",
38             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
39                                                   "} // namespace"));
40   EXPECT_EQ("namespace {\n"
41             "} //namespace",
42             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
43                                                   "} //namespace"));
44   EXPECT_EQ("namespace {\n"
45             "} // anonymous namespace",
46             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
47                                                   "} // anonymous namespace"));
48   EXPECT_EQ("namespace {\n"
49             "} // Anonymous namespace.",
50             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
51                                                   "} // Anonymous namespace."));
52   EXPECT_EQ("namespace q {\n"
53             "} // namespace q",
54             runCheckOnCode<NamespaceCommentCheck>("namespace q {\n"
55                                                   "} // anonymous namespace q"));
56   EXPECT_EQ(
57       "namespace My_NameSpace123 {\n"
58       "} // namespace My_NameSpace123",
59       runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n"
60                                             "} // namespace My_NameSpace123"));
61   EXPECT_EQ(
62       "namespace My_NameSpace123 {\n"
63       "} //namespace My_NameSpace123",
64       runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n"
65                                             "} //namespace My_NameSpace123"));
66   EXPECT_EQ("namespace My_NameSpace123 {\n"
67             "} //  end namespace   My_NameSpace123",
68             runCheckOnCode<NamespaceCommentCheck>(
69                 "namespace My_NameSpace123 {\n"
70                 "} //  end namespace   My_NameSpace123"));
71   // Understand comments only on the same line.
72   EXPECT_EQ("namespace {\n"
73             "} // namespace\n"
74             "// namespace",
75             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
76                                                   "}\n"
77                                                   "// namespace"));
78 }
79 
80 TEST(NamespaceCommentCheckTest, FixWrongComments) {
81   EXPECT_EQ("namespace i { namespace jJ0_ {\n"
82             "} // namespace jJ0_\n"
83             " } // namespace i\n"
84             " /* random comment */",
85             runCheckOnCode<NamespaceCommentCheck>(
86                 "namespace i { namespace jJ0_ {\n"
87                 "} /* namespace qqq */ } /* random comment */"));
88   EXPECT_EQ("namespace {\n"
89             "} // namespace",
90             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
91                                                   "} // namespace asdf"));
92   // Remove unknown line comments. These are likely to be an unrecognized form
93   // of a namespace ending comment.
94   EXPECT_EQ("namespace {\n"
95             "} // namespace",
96             runCheckOnCode<NamespaceCommentCheck>("namespace {\n"
97                                                   "} // random text"));
98 }
99 
100 TEST(BracesAroundStatementsCheck, IfWithComments) {
101   EXPECT_EQ("int main() {\n"
102             "  if (false /*dummy token*/) {\n"
103             "    // comment\n"
104             "    return -1; /**/\n"
105             "}\n"
106             "  if (false) {\n"
107             "    return -1; // comment\n"
108             "}\n"
109             "  if (false) {\n"
110             "    return -1; \n"
111             "}/* multi-line \n comment */\n"
112             "}",
113             runCheckOnCode<BracesAroundStatementsCheck>(
114                 "int main() {\n"
115                 "  if (false /*dummy token*/)\n"
116                 "    // comment\n"
117                 "    return -1; /**/\n"
118                 "  if (false)\n"
119                 "    return -1; // comment\n"
120                 "  if (false)\n"
121                 "    return -1; /* multi-line \n comment */\n"
122                 "}"));
123   EXPECT_EQ("int main() {\n"
124             "  if (false /*dummy token*/) {\n"
125             "    // comment\n"
126             "    return -1 /**/ ;\n"
127             "}\n"
128             "}",
129             runCheckOnCode<BracesAroundStatementsCheck>(
130                 "int main() {\n"
131                 "  if (false /*dummy token*/)\n"
132                 "    // comment\n"
133                 "    return -1 /**/ ;\n"
134                 "}"));
135 }
136 
137 TEST(BracesAroundStatementsCheck, If) {
138   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
139                                                  "  if (false) {\n"
140                                                  "    return -1;\n"
141                                                  "  }\n"
142                                                  "}");
143   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
144                                                  "  if (auto Cond = false) {\n"
145                                                  "    return -1;\n"
146                                                  "  }\n"
147                                                  "}");
148   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
149                                                  "  if (false) {\n"
150                                                  "    return -1;\n"
151                                                  "  } else {\n"
152                                                  "    return -2;\n"
153                                                  "  }\n"
154                                                  "}");
155   EXPECT_EQ("int main() {\n"
156             "  if (false) {\n"
157             "    return -1;\n"
158             "}\n"
159             "}",
160             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
161                                                         "  if (false)\n"
162                                                         "    return -1;\n"
163                                                         "}"));
164   EXPECT_EQ("int main() {\n"
165             "  if (auto Cond = false /**/ ) {\n"
166             "    return -1;\n"
167             "}\n"
168             "}",
169             runCheckOnCode<BracesAroundStatementsCheck>(
170                 "int main() {\n"
171                 "  if (auto Cond = false /**/ )\n"
172                 "    return -1;\n"
173                 "}"));
174   // FIXME: Consider adding braces before EMPTY_MACRO and after the statement.
175   EXPECT_NO_CHANGES(BracesAroundStatementsCheck,
176                     "#define EMPTY_MACRO\n"
177                     "int main() {\n"
178                     "  if (auto Cond = false EMPTY_MACRO /**/ ) EMPTY_MACRO\n"
179                     "    return -1;\n"
180                     "}");
181   EXPECT_EQ("int main() {\n"
182             "  if (true) { return -1/**/ ;\n"
183             "}\n"
184             "}",
185             runCheckOnCode<BracesAroundStatementsCheck>(
186                 "int main() {\n"
187                 "  if (true) return -1/**/ ;\n"
188                 "}"));
189   EXPECT_EQ("int main() {\n"
190             "  if (false) {\n"
191             "    return -1;\n"
192             "  } else {\n"
193             "    return -2;\n"
194             "}\n"
195             "}",
196             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
197                                                         "  if (false)\n"
198                                                         "    return -1;\n"
199                                                         "  else\n"
200                                                         "    return -2;\n"
201                                                         "}"));
202   EXPECT_EQ("int main() {\n"
203             "  if (false) {\n"
204             "    return -1;\n"
205             "  } else if (1 == 2) {\n"
206             "    return -2;\n"
207             "  } else {\n"
208             "    return -3;\n"
209             "}\n"
210             "}",
211             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
212                                                         "  if (false)\n"
213                                                         "    return -1;\n"
214                                                         "  else if (1 == 2)\n"
215                                                         "    return -2;\n"
216                                                         "  else\n"
217                                                         "    return -3;\n"
218                                                         "}"));
219   EXPECT_EQ("int main() {\n"
220             "  if (false) {\n"
221             "    return -1;\n"
222             "  } else if (1 == 2) {\n"
223             "    return -2;\n"
224             "  } else {\n"
225             "    return -3;\n"
226             "}\n"
227             "}",
228             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
229                                                         "  if (false)\n"
230                                                         "    return -1;\n"
231                                                         "  else if (1 == 2) {\n"
232                                                         "    return -2;\n"
233                                                         "  } else\n"
234                                                         "    return -3;\n"
235                                                         "}"));
236 }
237 
238 TEST(BracesAroundStatementsCheck, IfElseWithShortStatements) {
239   ClangTidyOptions Options;
240   Options.CheckOptions["test-check.ShortStatementLines"] = "1";
241 
242   EXPECT_EQ("int main() {\n"
243             "  if (true) return 1;\n"
244             "  if (false) { return -1;\n"
245             "  } else if (1 == 2) { return -2;\n"
246             "  } else { return -3;\n"
247             "}\n"
248             "}",
249             runCheckOnCode<BracesAroundStatementsCheck>(
250                 "int main() {\n"
251                 "  if (true) return 1;\n"
252                 "  if (false) return -1;\n"
253                 "  else if (1 == 2) return -2;\n"
254                 "  else return -3;\n"
255                 "}",
256                 nullptr, "input.cc", None, Options));
257 
258   // If the last else is an else-if, we also force it.
259   EXPECT_EQ("int main() {\n"
260             "  if (false) { return -1;\n"
261             "  } else if (1 == 2) { return -2;\n"
262             "}\n"
263             "}",
264             runCheckOnCode<BracesAroundStatementsCheck>(
265                 "int main() {\n"
266                 "  if (false) return -1;\n"
267                 "  else if (1 == 2) return -2;\n"
268                 "}",
269                 nullptr, "input.cc", None, Options));
270 }
271 
272 TEST(BracesAroundStatementsCheck, For) {
273   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
274                                                  "  for (;;) {\n"
275                                                  "    ;\n"
276                                                  "  }\n"
277                                                  "}");
278   EXPECT_EQ("int main() {\n"
279             "  for (;;) {\n"
280             "    ;\n"
281             "}\n"
282             "}",
283             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
284                                                         "  for (;;)\n"
285                                                         "    ;\n"
286                                                         "}"));
287   EXPECT_EQ("int main() {\n"
288             "  for (;;) {\n"
289             "    /**/ ;\n"
290             "}\n"
291             "}",
292             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
293                                                         "  for (;;)\n"
294                                                         "    /**/ ;\n"
295                                                         "}"));
296   EXPECT_EQ("int main() {\n"
297             "  for (;;) {\n"
298             "    return -1 /**/ ;\n"
299             "}\n"
300             "}",
301             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
302                                                         "  for (;;)\n"
303                                                         "    return -1 /**/ ;\n"
304                                                         "}"));
305 }
306 
307 TEST(BracesAroundStatementsCheck, ForRange) {
308   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
309                                                  "  int arr[4];\n"
310                                                  "  for (int i : arr) {\n"
311                                                  "    ;\n"
312                                                  "  }\n"
313                                                  "}");
314   EXPECT_EQ("int main() {\n"
315             "  int arr[4];\n"
316             "  for (int i : arr) {\n"
317             "    ;\n"
318             "}\n"
319             "  for (int i : arr) {\n"
320             "    return -1 ;\n"
321             "}\n"
322             "}",
323             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
324                                                         "  int arr[4];\n"
325                                                         "  for (int i : arr)\n"
326                                                         "    ;\n"
327                                                         "  for (int i : arr)\n"
328                                                         "    return -1 ;\n"
329                                                         "}"));
330 }
331 
332 TEST(BracesAroundStatementsCheck, DoWhile) {
333   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
334                                                  "  do {\n"
335                                                  "    ;\n"
336                                                  "  } while (false);\n"
337                                                  "}");
338   EXPECT_EQ("int main() {\n"
339             "  do {\n"
340             "    ;\n"
341             "  } while (false);\n"
342             "}",
343             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
344                                                         "  do\n"
345                                                         "    ;\n"
346                                                         "  while (false);\n"
347                                                         "}"));
348 }
349 
350 TEST(BracesAroundStatementsCheck, While) {
351   EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n"
352                                                  "  while (false) {\n"
353                                                  "    ;\n"
354                                                  "  }\n"
355                                                  "}");
356   EXPECT_EQ("int main() {\n"
357             "  while (false) {\n"
358             "    ;\n"
359             "}\n"
360             "}",
361             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
362                                                         "  while (false)\n"
363                                                         "    ;\n"
364                                                         "}"));
365   EXPECT_EQ("int main() {\n"
366             "  while (auto Cond = false) {\n"
367             "    ;\n"
368             "}\n"
369             "}",
370             runCheckOnCode<BracesAroundStatementsCheck>(
371                 "int main() {\n"
372                 "  while (auto Cond = false)\n"
373                 "    ;\n"
374                 "}"));
375   EXPECT_EQ("int main() {\n"
376             "  while (false /*dummy token*/) {\n"
377             "    ;\n"
378             "}\n"
379             "}",
380             runCheckOnCode<BracesAroundStatementsCheck>(
381                 "int main() {\n"
382                 "  while (false /*dummy token*/)\n"
383                 "    ;\n"
384                 "}"));
385   EXPECT_EQ("int main() {\n"
386             "  while (false) {\n"
387             "    break;\n"
388             "}\n"
389             "}",
390             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
391                                                         "  while (false)\n"
392                                                         "    break;\n"
393                                                         "}"));
394   EXPECT_EQ("int main() {\n"
395             "  while (false) {\n"
396             "    break /**/;\n"
397             "}\n"
398             "}",
399             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
400                                                         "  while (false)\n"
401                                                         "    break /**/;\n"
402                                                         "}"));
403   EXPECT_EQ("int main() {\n"
404             "  while (false) {\n"
405             "    /**/;\n"
406             "}\n"
407             "}",
408             runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
409                                                         "  while (false)\n"
410                                                         "    /**/;\n"
411                                                         "}"));
412 }
413 
414 TEST(BracesAroundStatementsCheck, Nested) {
415   EXPECT_EQ("int main() {\n"
416             "  do { if (true) {}} while (false);\n"
417             "}",
418             runCheckOnCode<BracesAroundStatementsCheck>(
419                 "int main() {\n"
420                 "  do if (true) {}while (false);\n"
421                 "}"));
422   EXPECT_EQ("int main() {\n"
423             "  do { if (true) {}} while (false);\n"
424             "}",
425             runCheckOnCode<BracesAroundStatementsCheck>(
426                 "int main() {\n"
427                 "  do if (true) {}while (false);\n"
428                 "}"));
429   EXPECT_EQ(
430       "int main() {\n"
431       "  if (true) {\n"
432       "    // comment\n"
433       "    if (false) {\n"
434       "      // comment\n"
435       "      /**/ ; // comment\n"
436       "    }\n"
437       "}\n"
438       "}",
439       runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n"
440                                                   "  if (true)\n"
441                                                   "    // comment\n"
442                                                   "    if (false) {\n"
443                                                   "      // comment\n"
444                                                   "      /**/ ; // comment\n"
445                                                   "    }\n"
446                                                   "}"));
447 }
448 
449 TEST(BracesAroundStatementsCheck, Macros) {
450   EXPECT_NO_CHANGES(BracesAroundStatementsCheck,
451                     "#define IF(COND) if (COND) return -1;\n"
452                     "int main() {\n"
453                     "  IF(false)\n"
454                     "}");
455   EXPECT_NO_CHANGES(BracesAroundStatementsCheck,
456                     "#define FOR(COND) for (COND) return -1;\n"
457                     "int main() {\n"
458                     "  FOR(;;)\n"
459                     "}");
460 }
461 
462 } // namespace test
463 } // namespace tidy
464 } // namespace clang
465