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