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