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