1d89ae9d3SDaniel Jasper //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===//
2d89ae9d3SDaniel Jasper //
3d89ae9d3SDaniel Jasper //                     The LLVM Compiler Infrastructure
4d89ae9d3SDaniel Jasper //
5d89ae9d3SDaniel Jasper // This file is distributed under the University of Illinois Open Source
6d89ae9d3SDaniel Jasper // License. See LICENSE.TXT for details.
7d89ae9d3SDaniel Jasper //
8d89ae9d3SDaniel Jasper //===----------------------------------------------------------------------===//
9d89ae9d3SDaniel Jasper 
10d89ae9d3SDaniel Jasper #include "FormatTestUtils.h"
11d89ae9d3SDaniel Jasper #include "clang/Format/Format.h"
12d89ae9d3SDaniel Jasper #include "llvm/Support/Debug.h"
13d89ae9d3SDaniel Jasper #include "gtest/gtest.h"
14d89ae9d3SDaniel Jasper 
15d89ae9d3SDaniel Jasper #define DEBUG_TYPE "format-test"
16d89ae9d3SDaniel Jasper 
17d89ae9d3SDaniel Jasper namespace clang {
18d89ae9d3SDaniel Jasper namespace format {
19d89ae9d3SDaniel Jasper namespace {
20d89ae9d3SDaniel Jasper 
21d89ae9d3SDaniel Jasper class SortIncludesTest : public ::testing::Test {
22d89ae9d3SDaniel Jasper protected:
23*85c472dcSDaniel Jasper   std::string sort(llvm::StringRef Code, StringRef FileName = "input.cpp") {
24d89ae9d3SDaniel Jasper     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
25*85c472dcSDaniel Jasper     std::string Sorted =
26*85c472dcSDaniel Jasper         applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName));
27*85c472dcSDaniel Jasper     return applyAllReplacements(Sorted,
28*85c472dcSDaniel Jasper                                 reformat(Style, Sorted, Ranges, FileName));
29d89ae9d3SDaniel Jasper   }
30*85c472dcSDaniel Jasper 
31*85c472dcSDaniel Jasper   FormatStyle Style = getLLVMStyle();
32d89ae9d3SDaniel Jasper };
33d89ae9d3SDaniel Jasper 
34d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) {
35d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
36d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
37d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
38d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
39d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
40d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
41d89ae9d3SDaniel Jasper }
42d89ae9d3SDaniel Jasper 
43d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) {
44d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"  // comment\n"
45d89ae9d3SDaniel Jasper             "#include \"bb.h\" // comment\n"
46d89ae9d3SDaniel Jasper             "#include \"ccc.h\"\n",
47d89ae9d3SDaniel Jasper             sort("#include \"a.h\" // comment\n"
48d89ae9d3SDaniel Jasper                  "#include \"ccc.h\"\n"
49d89ae9d3SDaniel Jasper                  "#include \"bb.h\" // comment\n"));
50d89ae9d3SDaniel Jasper }
51d89ae9d3SDaniel Jasper 
52d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) {
53d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
54d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
55d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
56d89ae9d3SDaniel Jasper             sort(" #include \"a.h\"\n"
57d89ae9d3SDaniel Jasper                  "  #include \"c.h\"\n"
58d89ae9d3SDaniel Jasper                  "   #include \"b.h\"\n"));
59d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
60d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
61d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
62d89ae9d3SDaniel Jasper             sort("# include \"a.h\"\n"
63d89ae9d3SDaniel Jasper                  "#  include \"c.h\"\n"
64d89ae9d3SDaniel Jasper                  "#   include \"b.h\"\n"));
65d89ae9d3SDaniel Jasper }
66d89ae9d3SDaniel Jasper 
67d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) {
68d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
69d89ae9d3SDaniel Jasper             "#include \"b.h\" // >\n"
70d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
71d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
72d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
73d89ae9d3SDaniel Jasper                  "#include \"b.h\" // >\n"));
74d89ae9d3SDaniel Jasper }
75d89ae9d3SDaniel Jasper 
76d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
77d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
78d89ae9d3SDaniel Jasper             "#include \"c.h\"\n"
79d89ae9d3SDaniel Jasper             "\n"
80d89ae9d3SDaniel Jasper             "#include \"b.h\"\n",
81*85c472dcSDaniel Jasper             sort("#include \"a.h\"\n"
82*85c472dcSDaniel Jasper                  "#include \"c.h\"\n"
83d89ae9d3SDaniel Jasper                  "\n"
84d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
85d89ae9d3SDaniel Jasper }
86d89ae9d3SDaniel Jasper 
87d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
88*85c472dcSDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
89*85c472dcSDaniel Jasper             "#include \"c.h\"\n"
90*85c472dcSDaniel Jasper             "#include <b.h>\n"
91*85c472dcSDaniel Jasper             "#include <d.h>\n",
92*85c472dcSDaniel Jasper             sort("#include <d.h>\n"
93*85c472dcSDaniel Jasper                  "#include <b.h>\n"
94*85c472dcSDaniel Jasper                  "#include \"c.h\"\n"
95*85c472dcSDaniel Jasper                  "#include \"a.h\"\n"));
96*85c472dcSDaniel Jasper 
97*85c472dcSDaniel Jasper   Style = getGoogleStyle(FormatStyle::LK_Cpp);
98d89ae9d3SDaniel Jasper   EXPECT_EQ("#include <b.h>\n"
99d89ae9d3SDaniel Jasper             "#include <d.h>\n"
100d89ae9d3SDaniel Jasper             "#include \"a.h\"\n"
101d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
102d89ae9d3SDaniel Jasper             sort("#include <d.h>\n"
103d89ae9d3SDaniel Jasper                  "#include <b.h>\n"
104d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
105d89ae9d3SDaniel Jasper                  "#include \"a.h\"\n"));
106d89ae9d3SDaniel Jasper }
107d89ae9d3SDaniel Jasper 
108d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
109d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
110d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
111d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
112d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
113d89ae9d3SDaniel Jasper                  "#include \\\n"
114d89ae9d3SDaniel Jasper                  "\"c.h\"\n"
115d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
116d89ae9d3SDaniel Jasper }
117d89ae9d3SDaniel Jasper 
118*85c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
119*85c472dcSDaniel Jasper   EXPECT_EQ("#include \"llvm/a.h\"\n"
120*85c472dcSDaniel Jasper             "#include \"b.h\"\n"
121*85c472dcSDaniel Jasper             "#include \"c.h\"\n",
122*85c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
123*85c472dcSDaniel Jasper                  "#include \"c.h\"\n"
124*85c472dcSDaniel Jasper                  "#include \"b.h\"\n"));
125*85c472dcSDaniel Jasper 
126*85c472dcSDaniel Jasper   // Don't do this in headers.
127*85c472dcSDaniel Jasper   EXPECT_EQ("#include \"b.h\"\n"
128*85c472dcSDaniel Jasper             "#include \"c.h\"\n"
129*85c472dcSDaniel Jasper             "#include \"llvm/a.h\"\n",
130*85c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
131*85c472dcSDaniel Jasper                  "#include \"c.h\"\n"
132*85c472dcSDaniel Jasper                  "#include \"b.h\"\n",
133*85c472dcSDaniel Jasper                  "some_header.h"));
134*85c472dcSDaniel Jasper }
135*85c472dcSDaniel Jasper 
136d89ae9d3SDaniel Jasper } // end namespace
137d89ae9d3SDaniel Jasper } // end namespace format
138d89ae9d3SDaniel Jasper } // end namespace clang
139