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 bool shouldSuggestEndifComment(StringRef Filename) override { return true; } 99 }; 100 } // namespace 101 102 static std::string runHeaderGuardCheckWithEndif(StringRef Code, 103 const Twine &Filename) { 104 return test::runCheckOnCode<WithEndifComment>( 105 Code, /*Errors=*/nullptr, Filename, std::string("-xc++-header")); 106 } 107 108 TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) { 109 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif\n", 110 runHeaderGuardCheck("#ifndef FOO\n#define FOO\n#endif\n", 111 "include/llvm/ADT/foo.h")); 112 113 // Allow trailing underscores. 114 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 115 runHeaderGuardCheck( 116 "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", 117 "include/llvm/ADT/foo.h")); 118 119 EXPECT_EQ("#ifndef LLVM_CLANG_C_BAR_H\n#define LLVM_CLANG_C_BAR_H\n\n\n#endif\n", 120 runHeaderGuardCheck("", "./include/clang-c/bar.h")); 121 122 EXPECT_EQ("#ifndef LLVM_CLANG_LIB_CODEGEN_C_H\n#define " 123 "LLVM_CLANG_LIB_CODEGEN_C_H\n\n\n#endif\n", 124 runHeaderGuardCheck("", "tools/clang/lib/CodeGen/c.h")); 125 126 EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n#define " 127 "LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n\n\n#endif\n", 128 runHeaderGuardCheck("", "tools/clang/tools/extra/clang-tidy/x.h")); 129 130 EXPECT_EQ( 131 "int foo;\n#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n#endif\n", 132 runHeaderGuardCheck("int foo;\n#ifndef LLVM_CLANG_BAR_H\n" 133 "#define LLVM_CLANG_BAR_H\n#endif\n", 134 "include/clang/bar.h")); 135 136 EXPECT_EQ("#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n\n" 137 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n\n#endif\n", 138 runHeaderGuardCheck( 139 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n", 140 "include/clang/bar.h")); 141 142 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif " 143 " // LLVM_ADT_FOO_H\n", 144 runHeaderGuardCheckWithEndif("#ifndef FOO\n#define FOO\n#endif\n", 145 "include/llvm/ADT/foo.h")); 146 147 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif " 148 " // LLVM_ADT_FOO_H\n", 149 runHeaderGuardCheckWithEndif("#ifndef LLVM_ADT_FOO_H\n#define " 150 "LLVM_ADT_FOO_H\n#endif // LLVM_H\n", 151 "include/llvm/ADT/foo.h")); 152 153 EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif" 154 " /* LLVM_ADT_FOO_H */\n", 155 runHeaderGuardCheckWithEndif("#ifndef LLVM_ADT_FOO_H\n#define " 156 "LLVM_ADT_FOO_H\n" 157 "#endif /* LLVM_ADT_FOO_H */\n", 158 "include/llvm/ADT/foo.h")); 159 } 160 #endif 161 162 } // namespace test 163 } // namespace tidy 164 } // namespace clang 165