llvm-project/clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

506 lines
21 KiB
C++

#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