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 // FIXME: It seems this might be incompatible to dos path. Investigating. 90 #if !defined(_WIN32) 91 static std::string runHeaderGuardCheck(StringRef Code, const Twine &Filename, 92 unsigned NumWarnings = 1) { 93 std::vector<ClangTidyError> Errors; 94 std::string Result = test::runCheckOnCode<LLVMHeaderGuardCheck>( 95 Code, &Errors, Filename, std::string("-xc++-header")); 96 return Errors.size() == NumWarnings ? Result : "invalid error count"; 97 } 98 99 namespace { 100 struct WithEndifComment : public LLVMHeaderGuardCheck { 101 WithEndifComment(StringRef Name, ClangTidyContext *Context) 102 : LLVMHeaderGuardCheck(Name, Context) {} 103 bool shouldSuggestEndifComment(StringRef Filename) override { return true; } 104 }; 105 } // namespace 106 107 static std::string runHeaderGuardCheckWithEndif(StringRef Code, 108 const Twine &Filename, 109 unsigned NumWarnings = 1) { 110 std::vector<ClangTidyError> Errors; 111 std::string Result = test::runCheckOnCode<WithEndifComment>( 112 Code, &Errors, Filename, std::string("-xc++-header")); 113 return Errors.size() == NumWarnings ? Result : "invalid error count"; 114 } 115 116 TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) { 117 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif\n", 118 runHeaderGuardCheck("#ifndef FOO\n#define FOO\n#endif\n", 119 "include/llvm/ADT/foo.h")); 120 121 // Allow trailing underscores. 122 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 123 runHeaderGuardCheck( 124 "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 125 "include/llvm/ADT/foo.h", 0)); 126 127 EXPECT_EQ("#ifndef LLVM_CLANG_C_BAR_H\n#define LLVM_CLANG_C_BAR_H\n\n\n#endif\n", 128 runHeaderGuardCheck("", "./include/clang-c/bar.h")); 129 130 EXPECT_EQ("#ifndef LLVM_CLANG_LIB_CODEGEN_C_H\n#define " 131 "LLVM_CLANG_LIB_CODEGEN_C_H\n\n\n#endif\n", 132 runHeaderGuardCheck("", "tools/clang/lib/CodeGen/c.h")); 133 134 EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n#define " 135 "LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n\n\n#endif\n", 136 runHeaderGuardCheck("", "tools/clang/tools/extra/clang-tidy/x.h")); 137 138 EXPECT_EQ( 139 "int foo;\n#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n#endif\n", 140 runHeaderGuardCheck("int foo;\n#ifndef LLVM_CLANG_BAR_H\n" 141 "#define LLVM_CLANG_BAR_H\n#endif\n", 142 "include/clang/bar.h")); 143 144 EXPECT_EQ("#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n\n" 145 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n\n#endif\n", 146 runHeaderGuardCheck( 147 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n", 148 "include/clang/bar.h")); 149 150 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif " 151 " // LLVM_ADT_FOO_H\n", 152 runHeaderGuardCheckWithEndif("#ifndef FOO\n#define FOO\n#endif\n", 153 "include/llvm/ADT/foo.h")); 154 155 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif " 156 " // LLVM_ADT_FOO_H\n", 157 runHeaderGuardCheckWithEndif("#ifndef LLVM_ADT_FOO_H\n#define " 158 "LLVM_ADT_FOO_H\n#endif // LLVM_H\n", 159 "include/llvm/ADT/foo.h")); 160 161 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif" 162 " /* LLVM_ADT_FOO_H */\n", 163 runHeaderGuardCheckWithEndif("#ifndef LLVM_ADT_FOO_H\n#define " 164 "LLVM_ADT_FOO_H\n" 165 "#endif /* LLVM_ADT_FOO_H */\n", 166 "include/llvm/ADT/foo.h", 0)); 167 168 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif " 169 "// LLVM_ADT_FOO_H_\n", 170 runHeaderGuardCheckWithEndif( 171 "#ifndef LLVM_ADT_FOO_H_\n#define " 172 "LLVM_ADT_FOO_H_\n#endif // LLVM_ADT_FOO_H_\n", 173 "include/llvm/ADT/foo.h", 0)); 174 175 EXPECT_EQ( 176 "#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif // " 177 "LLVM_ADT_FOO_H\n", 178 runHeaderGuardCheckWithEndif( 179 "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif // LLVM\n", 180 "include/llvm/ADT/foo.h")); 181 182 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif \\ \n// " 183 "LLVM_ADT_FOO_H\n", 184 runHeaderGuardCheckWithEndif("#ifndef LLVM_ADT_FOO_H\n#define " 185 "LLVM_ADT_FOO_H\n#endif \\ \n// " 186 "LLVM_ADT_FOO_H\n", 187 "include/llvm/ADT/foo.h", 0)); 188 189 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif /* " 190 "LLVM_ADT_FOO_H\\ \n FOO */", 191 runHeaderGuardCheckWithEndif( 192 "#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif /* " 193 "LLVM_ADT_FOO_H\\ \n FOO */", 194 "include/llvm/ADT/foo.h", 0)); 195 } 196 #endif 197 198 } // namespace test 199 } // namespace tidy 200 } // namespace clang 201