xref: /llvm-project/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp (revision 498cce575f348ae645561665fcfd0d5ef83280db)
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 static std::string runHeaderGuardCheck(StringRef Code, const Twine &Filename) {
90   return test::runCheckOnCode<LLVMHeaderGuardCheck>(
91       Code, /*Errors=*/nullptr, Filename, std::string("-xc++-header"));
92 }
93 
94 TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) {
95   EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif\n",
96             runHeaderGuardCheck("#ifndef FOO\n#define FOO\n#endif\n",
97                                 "include/llvm/ADT/foo.h"));
98 
99   // Allow trailing underscores.
100   EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n",
101             runHeaderGuardCheck(
102                 "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n",
103                 "include/llvm/ADT/foo.h"));
104 
105   EXPECT_EQ("#ifndef LLVM_CLANG_C_BAR_H\n#define LLVM_CLANG_C_BAR_H\n\n\n#endif\n",
106             runHeaderGuardCheck("", "./include/clang-c/bar.h"));
107 
108   EXPECT_EQ("#ifndef LLVM_CLANG_LIB_CODEGEN_C_H\n#define "
109             "LLVM_CLANG_LIB_CODEGEN_C_H\n\n\n#endif\n",
110             runHeaderGuardCheck("", "tools/clang/lib/CodeGen/c.h"));
111 
112   EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n#define "
113             "LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n\n\n#endif\n",
114             runHeaderGuardCheck("", "tools/clang/tools/extra/clang-tidy/x.h"));
115 
116   EXPECT_EQ(
117       "int foo;\n#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n#endif\n",
118       runHeaderGuardCheck("int foo;\n#ifndef LLVM_CLANG_BAR_H\n"
119                           "#define LLVM_CLANG_BAR_H\n#endif\n",
120                           "include/clang/bar.h"));
121 
122   EXPECT_EQ("#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n\n"
123             "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n\n#endif\n",
124             runHeaderGuardCheck(
125                 "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n",
126                 "include/clang/bar.h"));
127 }
128 
129 } // namespace test
130 } // namespace tidy
131 } // namespace clang
132