| #include "ClangTidyTest.h" |
| #include "readability/BracesAroundStatementsCheck.h" |
| #include "readability/NamespaceCommentCheck.h" |
| #include "gtest/gtest.h" |
| |
| namespace clang { |
| namespace tidy { |
| namespace test { |
| |
| using readability::BracesAroundStatementsCheck; |
| using readability::NamespaceCommentCheck; |
| |
| TEST(NamespaceCommentCheckTest, Basic) { |
| EXPECT_EQ("namespace i {\n} // namespace i", |
| runCheckOnCode<NamespaceCommentCheck>("namespace i {\n}")); |
| EXPECT_EQ("namespace {\n} // namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n}")); |
| EXPECT_EQ("namespace i { namespace j {\n} // namespace j\n } // namespace i", |
| runCheckOnCode<NamespaceCommentCheck>( |
| "namespace i { namespace j {\n} }")); |
| } |
| |
| TEST(NamespaceCommentCheckTest, SingleLineNamespaces) { |
| EXPECT_EQ( |
| "namespace i { namespace j { } }", |
| runCheckOnCode<NamespaceCommentCheck>("namespace i { namespace j { } }")); |
| } |
| |
| TEST(NamespaceCommentCheckTest, CheckExistingComments) { |
| EXPECT_EQ("namespace i { namespace j {\n" |
| "} /* namespace j */ } // namespace i\n" |
| " /* random comment */", |
| runCheckOnCode<NamespaceCommentCheck>( |
| "namespace i { namespace j {\n" |
| "} /* namespace j */ } /* random comment */")); |
| EXPECT_EQ("namespace {\n" |
| "} // namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} // namespace")); |
| EXPECT_EQ("namespace {\n" |
| "} //namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} //namespace")); |
| EXPECT_EQ("namespace {\n" |
| "} // anonymous namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} // anonymous namespace")); |
| EXPECT_EQ("namespace {\n" |
| "} // Anonymous namespace.", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} // Anonymous namespace.")); |
| EXPECT_EQ( |
| "namespace q {\n" |
| "} // namespace q", |
| runCheckOnCode<NamespaceCommentCheck>("namespace q {\n" |
| "} // anonymous namespace q")); |
| EXPECT_EQ( |
| "namespace My_NameSpace123 {\n" |
| "} // namespace My_NameSpace123", |
| runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n" |
| "} // namespace My_NameSpace123")); |
| EXPECT_EQ( |
| "namespace My_NameSpace123 {\n" |
| "} //namespace My_NameSpace123", |
| runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n" |
| "} //namespace My_NameSpace123")); |
| EXPECT_EQ("namespace My_NameSpace123 {\n" |
| "} // end namespace My_NameSpace123", |
| runCheckOnCode<NamespaceCommentCheck>( |
| "namespace My_NameSpace123 {\n" |
| "} // end namespace My_NameSpace123")); |
| // Understand comments only on the same line. |
| EXPECT_EQ("namespace {\n" |
| "} // namespace\n" |
| "// namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "}\n" |
| "// namespace")); |
| } |
| |
| TEST(NamespaceCommentCheckTest, FixWrongComments) { |
| EXPECT_EQ("namespace i { namespace jJ0_ {\n" |
| "} // namespace jJ0_\n" |
| " } // namespace i\n" |
| " /* random comment */", |
| runCheckOnCode<NamespaceCommentCheck>( |
| "namespace i { namespace jJ0_ {\n" |
| "} /* namespace qqq */ } /* random comment */")); |
| EXPECT_EQ("namespace {\n" |
| "} // namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} // namespace asdf")); |
| // Remove unknown line comments. These are likely to be an unrecognized form |
| // of a namespace ending comment. |
| EXPECT_EQ("namespace {\n" |
| "} // namespace", |
| runCheckOnCode<NamespaceCommentCheck>("namespace {\n" |
| "} // random text")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, IfWithComments) { |
| EXPECT_EQ("int main() {\n" |
| " if (false /*dummy token*/) {\n" |
| " // comment\n" |
| " return -1; /**/\n" |
| "}\n" |
| " if (false) {\n" |
| " return -1; // comment\n" |
| "}\n" |
| " if (false) {\n" |
| " return -1; \n" |
| "}/* multi-line \n comment */\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (false /*dummy token*/)\n" |
| " // comment\n" |
| " return -1; /**/\n" |
| " if (false)\n" |
| " return -1; // comment\n" |
| " if (false)\n" |
| " return -1; /* multi-line \n comment */\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " if (false /*dummy token*/) {\n" |
| " // comment\n" |
| " return -1 /**/ ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (false /*dummy token*/)\n" |
| " // comment\n" |
| " return -1 /**/ ;\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, If) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| " }\n" |
| "}"); |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " if (auto Cond = false) {\n" |
| " return -1;\n" |
| " }\n" |
| "}"); |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| " } else {\n" |
| " return -2;\n" |
| " }\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " if (false)\n" |
| " return -1;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " if (auto Cond = false /**/ ) {\n" |
| " return -1;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (auto Cond = false /**/ )\n" |
| " return -1;\n" |
| "}")); |
| // FIXME: Consider adding braces before EMPTY_MACRO and after the statement. |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, |
| "#define EMPTY_MACRO\n" |
| "int main() {\n" |
| " if (auto Cond = false EMPTY_MACRO /**/ ) EMPTY_MACRO\n" |
| " return -1;\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " if (true) { return -1/**/ ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (true) return -1/**/ ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| " } else {\n" |
| " return -2;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " if (false)\n" |
| " return -1;\n" |
| " else\n" |
| " return -2;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| " } else if (1 == 2) {\n" |
| " return -2;\n" |
| " } else {\n" |
| " return -3;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " if (false)\n" |
| " return -1;\n" |
| " else if (1 == 2)\n" |
| " return -2;\n" |
| " else\n" |
| " return -3;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " if (false) {\n" |
| " return -1;\n" |
| " } else if (1 == 2) {\n" |
| " return -2;\n" |
| " } else {\n" |
| " return -3;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " if (false)\n" |
| " return -1;\n" |
| " else if (1 == 2) {\n" |
| " return -2;\n" |
| " } else\n" |
| " return -3;\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, IfElseWithShortStatements) { |
| ClangTidyOptions Options; |
| Options.CheckOptions["test-check-0.ShortStatementLines"] = "1"; |
| |
| EXPECT_EQ("int main() {\n" |
| " if (true) return 1;\n" |
| " if (false) { return -1;\n" |
| " } else if (1 == 2) { return -2;\n" |
| " } else { return -3;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (true) return 1;\n" |
| " if (false) return -1;\n" |
| " else if (1 == 2) return -2;\n" |
| " else return -3;\n" |
| "}", |
| nullptr, "input.cc", None, Options)); |
| |
| // If the last else is an else-if, we also force it. |
| EXPECT_EQ("int main() {\n" |
| " if (false) { return -1;\n" |
| " } else if (1 == 2) { return -2;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " if (false) return -1;\n" |
| " else if (1 == 2) return -2;\n" |
| "}", |
| nullptr, "input.cc", None, Options)); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, For) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " for (;;) {\n" |
| " ;\n" |
| " }\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " for (;;) {\n" |
| " ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " for (;;)\n" |
| " ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " for (;;) {\n" |
| " /**/ ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " for (;;)\n" |
| " /**/ ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " for (;;) {\n" |
| " return -1 /**/ ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " for (;;)\n" |
| " return -1 /**/ ;\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, ForRange) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " int arr[4];\n" |
| " for (int i : arr) {\n" |
| " ;\n" |
| " }\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " int arr[4];\n" |
| " for (int i : arr) {\n" |
| " ;\n" |
| "}\n" |
| " for (int i : arr) {\n" |
| " return -1 ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " int arr[4];\n" |
| " for (int i : arr)\n" |
| " ;\n" |
| " for (int i : arr)\n" |
| " return -1 ;\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, DoWhile) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " do {\n" |
| " ;\n" |
| " } while (false);\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " do {\n" |
| " ;\n" |
| " } while (false);\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " do\n" |
| " ;\n" |
| " while (false);\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, While) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, "int main() {\n" |
| " while (false) {\n" |
| " ;\n" |
| " }\n" |
| "}"); |
| EXPECT_EQ("int main() {\n" |
| " while (false) {\n" |
| " ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " while (false)\n" |
| " ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " while (auto Cond = false) {\n" |
| " ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " while (auto Cond = false)\n" |
| " ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " while (false /*dummy token*/) {\n" |
| " ;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " while (false /*dummy token*/)\n" |
| " ;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " while (false) {\n" |
| " break;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " while (false)\n" |
| " break;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " while (false) {\n" |
| " break /**/;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " while (false)\n" |
| " break /**/;\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " while (false) {\n" |
| " /**/;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " while (false)\n" |
| " /**/;\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, Nested) { |
| EXPECT_EQ("int main() {\n" |
| " do { if (true) {}} while (false);\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " do if (true) {}while (false);\n" |
| "}")); |
| EXPECT_EQ("int main() {\n" |
| " do { if (true) {}} while (false);\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>( |
| "int main() {\n" |
| " do if (true) {}while (false);\n" |
| "}")); |
| EXPECT_EQ( |
| "int main() {\n" |
| " if (true) {\n" |
| " // comment\n" |
| " if (false) {\n" |
| " // comment\n" |
| " /**/ ; // comment\n" |
| " }\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("int main() {\n" |
| " if (true)\n" |
| " // comment\n" |
| " if (false) {\n" |
| " // comment\n" |
| " /**/ ; // comment\n" |
| " }\n" |
| "}")); |
| } |
| |
| TEST(BracesAroundStatementsCheckTest, Macros) { |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, |
| "#define IF(COND) if (COND) return -1;\n" |
| "int main() {\n" |
| " IF(false)\n" |
| "}"); |
| EXPECT_NO_CHANGES(BracesAroundStatementsCheck, |
| "#define FOR(COND) for (COND) return -1;\n" |
| "int main() {\n" |
| " FOR(;;)\n" |
| "}"); |
| EXPECT_EQ("#define DO_IT ++i\n" |
| "int i = 0;\n" |
| "int main() {\n" |
| " if (false) {\n" |
| " DO_IT;\n" |
| " } else if (1 == 2) {\n" |
| " DO_IT;\n" |
| " } else {\n" |
| " DO_IT;\n" |
| "}\n" |
| "}", |
| runCheckOnCode<BracesAroundStatementsCheck>("#define DO_IT ++i\n" |
| "int i = 0;\n" |
| "int main() {\n" |
| " if (false)\n" |
| " DO_IT;\n" |
| " else if (1 == 2)\n" |
| " DO_IT;\n" |
| " else\n" |
| " DO_IT;\n" |
| "}")); |
| } |
| |
| #define EXPECT_NO_CHANGES_WITH_OPTS(Check, Opts, Code) \ |
| EXPECT_EQ(Code, runCheckOnCode<Check>(Code, nullptr, "input.cc", None, Opts)) |
| TEST(BracesAroundStatementsCheckTest, ImplicitCastInReturn) { |
| ClangTidyOptions Opts; |
| Opts.CheckOptions["test-check-0.ShortStatementLines"] = "1"; |
| |
| StringRef Input = "const char *f() {\n" |
| " if (true) return \"\";\n" |
| " return \"abc\";\n" |
| "}\n"; |
| EXPECT_NO_CHANGES_WITH_OPTS(BracesAroundStatementsCheck, Opts, Input); |
| EXPECT_EQ("const char *f() {\n" |
| " if (true) { return \"\";\n" |
| "}\n" |
| " return \"abc\";\n" |
| "}\n", |
| runCheckOnCode<BracesAroundStatementsCheck>(Input)); |
| } |
| |
| } // namespace test |
| } // namespace tidy |
| } // namespace clang |