xref: /llvm-project/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp (revision 208faaaa290319b7eecab112e7922f88097c3ebe)
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