1 #include "ClangTidyTest.h" 2 #include "llvm/HeaderGuardCheck.h" 3 #include "llvm/IncludeOrderCheck.h" 4 #include "llvm/NamespaceCommentCheck.h" 5 #include "gtest/gtest.h" 6 7 namespace clang { 8 namespace tidy { 9 namespace test { 10 11 TEST(NamespaceCommentCheckTest, Basic) { 12 EXPECT_EQ("namespace i {\n} // namespace i", 13 runCheckOnCode<NamespaceCommentCheck>("namespace i {\n}")); 14 EXPECT_EQ("namespace {\n} // namespace", 15 runCheckOnCode<NamespaceCommentCheck>("namespace {\n}")); 16 EXPECT_EQ( 17 "namespace i { namespace j {\n} // namespace j\n } // namespace i", 18 runCheckOnCode<NamespaceCommentCheck>("namespace i { namespace j {\n} }")); 19 } 20 21 TEST(NamespaceCommentCheckTest, SingleLineNamespaces) { 22 EXPECT_EQ( 23 "namespace i { namespace j { } }", 24 runCheckOnCode<NamespaceCommentCheck>("namespace i { namespace j { } }")); 25 } 26 27 TEST(NamespaceCommentCheckTest, CheckExistingComments) { 28 EXPECT_EQ("namespace i { namespace j {\n" 29 "} /* namespace j */ } // namespace i\n" 30 " /* random comment */", 31 runCheckOnCode<NamespaceCommentCheck>( 32 "namespace i { namespace j {\n" 33 "} /* namespace j */ } /* random comment */")); 34 EXPECT_EQ("namespace {\n" 35 "} // namespace", 36 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 37 "} // namespace")); 38 EXPECT_EQ("namespace {\n" 39 "} //namespace", 40 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 41 "} //namespace")); 42 EXPECT_EQ("namespace {\n" 43 "} // anonymous namespace", 44 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 45 "} // anonymous namespace")); 46 EXPECT_EQ( 47 "namespace My_NameSpace123 {\n" 48 "} // namespace My_NameSpace123", 49 runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n" 50 "} // namespace My_NameSpace123")); 51 EXPECT_EQ( 52 "namespace My_NameSpace123 {\n" 53 "} //namespace My_NameSpace123", 54 runCheckOnCode<NamespaceCommentCheck>("namespace My_NameSpace123 {\n" 55 "} //namespace My_NameSpace123")); 56 EXPECT_EQ("namespace My_NameSpace123 {\n" 57 "} // end namespace My_NameSpace123", 58 runCheckOnCode<NamespaceCommentCheck>( 59 "namespace My_NameSpace123 {\n" 60 "} // end namespace My_NameSpace123")); 61 // Understand comments only on the same line. 62 EXPECT_EQ("namespace {\n" 63 "} // namespace\n" 64 "// namespace", 65 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 66 "}\n" 67 "// namespace")); 68 // Leave unknown comments. 69 EXPECT_EQ("namespace {\n" 70 "} // namespace // random text", 71 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 72 "} // random text")); 73 } 74 75 TEST(NamespaceCommentCheckTest, FixWrongComments) { 76 EXPECT_EQ("namespace i { namespace jJ0_ {\n" 77 "} // namespace jJ0_\n" 78 " } // namespace i\n" 79 " /* random comment */", 80 runCheckOnCode<NamespaceCommentCheck>( 81 "namespace i { namespace jJ0_ {\n" 82 "} /* namespace qqq */ } /* random comment */")); 83 EXPECT_EQ("namespace {\n" 84 "} // namespace", 85 runCheckOnCode<NamespaceCommentCheck>("namespace {\n" 86 "} // namespace asdf")); 87 } 88 89 static std::string runHeaderGuardCheck(StringRef Code, const Twine &Filename) { 90 return test::runCheckOnCode<LLVMHeaderGuardCheck>( 91 Code, /*Errors=*/nullptr, Filename, std::string("-xc++-header")); 92 } 93 94 TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) { 95 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif\n", 96 runHeaderGuardCheck("#ifndef FOO\n#define FOO\n#endif\n", 97 "include/llvm/ADT/foo.h")); 98 99 // Allow trailing underscores. 100 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 101 runHeaderGuardCheck( 102 "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 103 "include/llvm/ADT/foo.h")); 104 105 EXPECT_EQ("#ifndef LLVM_CLANG_C_BAR_H\n#define LLVM_CLANG_C_BAR_H\n\n\n#endif\n", 106 runHeaderGuardCheck("", "./include/clang-c/bar.h")); 107 108 EXPECT_EQ("#ifndef LLVM_CLANG_LIB_CODEGEN_C_H\n#define " 109 "LLVM_CLANG_LIB_CODEGEN_C_H\n\n\n#endif\n", 110 runHeaderGuardCheck("", "tools/clang/lib/CodeGen/c.h")); 111 112 EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n#define " 113 "LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n\n\n#endif\n", 114 runHeaderGuardCheck("", "tools/clang/tools/extra/clang-tidy/x.h")); 115 116 EXPECT_EQ( 117 "int foo;\n#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n#endif\n", 118 runHeaderGuardCheck("int foo;\n#ifndef LLVM_CLANG_BAR_H\n" 119 "#define LLVM_CLANG_BAR_H\n#endif\n", 120 "include/clang/bar.h")); 121 122 EXPECT_EQ("#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n\n" 123 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n\n#endif\n", 124 runHeaderGuardCheck( 125 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n", 126 "include/clang/bar.h")); 127 } 128 129 } // namespace test 130 } // namespace tidy 131 } // namespace clang 132