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