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:
2385c472dcSDaniel Jasper   std::string sort(llvm::StringRef Code, StringRef FileName = "input.cpp") {
24d89ae9d3SDaniel Jasper     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
2585c472dcSDaniel Jasper     std::string Sorted =
2685c472dcSDaniel Jasper         applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName));
2785c472dcSDaniel Jasper     return applyAllReplacements(Sorted,
2885c472dcSDaniel Jasper                                 reformat(Style, Sorted, Ranges, FileName));
29d89ae9d3SDaniel Jasper   }
3085c472dcSDaniel Jasper 
3185c472dcSDaniel 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 
43*9b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) {
44*9b8c7c72SDaniel Jasper   EXPECT_EQ("#include <a>\n"
45*9b8c7c72SDaniel Jasper             "#include <b>\n"
46*9b8c7c72SDaniel Jasper             "#include <c>\n"
47*9b8c7c72SDaniel Jasper             "// clang-format off\n"
48*9b8c7c72SDaniel Jasper             "#include <b>\n"
49*9b8c7c72SDaniel Jasper             "#include <a>\n"
50*9b8c7c72SDaniel Jasper             "#include <c>\n"
51*9b8c7c72SDaniel Jasper             "// clang-format on\n",
52*9b8c7c72SDaniel Jasper             sort("#include <b>\n"
53*9b8c7c72SDaniel Jasper                  "#include <a>\n"
54*9b8c7c72SDaniel Jasper                  "#include <c>\n"
55*9b8c7c72SDaniel Jasper                  "// clang-format off\n"
56*9b8c7c72SDaniel Jasper                  "#include <b>\n"
57*9b8c7c72SDaniel Jasper                  "#include <a>\n"
58*9b8c7c72SDaniel Jasper                  "#include <c>\n"
59*9b8c7c72SDaniel Jasper                  "// clang-format on\n"));
60*9b8c7c72SDaniel Jasper }
61*9b8c7c72SDaniel Jasper 
62da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
63da446770SDaniel Jasper   Style.SortIncludes = false;
64da446770SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
65da446770SDaniel Jasper             "#include \"c.h\"\n"
66da446770SDaniel Jasper             "#include \"b.h\"\n",
67da446770SDaniel Jasper             sort("#include \"a.h\"\n"
68da446770SDaniel Jasper                  "#include \"c.h\"\n"
69da446770SDaniel Jasper                  "#include \"b.h\"\n"));
70da446770SDaniel Jasper }
71da446770SDaniel Jasper 
72ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) {
73ff06370eSNico Weber   EXPECT_EQ("#include \"a.h\"\n"
74ff06370eSNico Weber             "#import \"b.h\"\n"
75ff06370eSNico Weber             "#include \"c.h\"\n",
76ff06370eSNico Weber             sort("#include \"a.h\"\n"
77ff06370eSNico Weber                  "#include \"c.h\"\n"
78ff06370eSNico Weber                  "#import \"b.h\"\n"));
79ff06370eSNico Weber }
80ff06370eSNico Weber 
81d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) {
82d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"  // comment\n"
83d89ae9d3SDaniel Jasper             "#include \"bb.h\" // comment\n"
84d89ae9d3SDaniel Jasper             "#include \"ccc.h\"\n",
85d89ae9d3SDaniel Jasper             sort("#include \"a.h\" // comment\n"
86d89ae9d3SDaniel Jasper                  "#include \"ccc.h\"\n"
87d89ae9d3SDaniel Jasper                  "#include \"bb.h\" // comment\n"));
88d89ae9d3SDaniel Jasper }
89d89ae9d3SDaniel Jasper 
90d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) {
91d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
92d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
93d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
94d89ae9d3SDaniel Jasper             sort(" #include \"a.h\"\n"
95d89ae9d3SDaniel Jasper                  "  #include \"c.h\"\n"
96d89ae9d3SDaniel Jasper                  "   #include \"b.h\"\n"));
97d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
98d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
99d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
100d89ae9d3SDaniel Jasper             sort("# include \"a.h\"\n"
101d89ae9d3SDaniel Jasper                  "#  include \"c.h\"\n"
102d89ae9d3SDaniel Jasper                  "#   include \"b.h\"\n"));
103d89ae9d3SDaniel Jasper }
104d89ae9d3SDaniel Jasper 
105d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) {
106d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
107d89ae9d3SDaniel Jasper             "#include \"b.h\" // >\n"
108d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
109d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
110d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
111d89ae9d3SDaniel Jasper                  "#include \"b.h\" // >\n"));
112d89ae9d3SDaniel Jasper }
113d89ae9d3SDaniel Jasper 
114d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
115d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
116d89ae9d3SDaniel Jasper             "#include \"c.h\"\n"
117d89ae9d3SDaniel Jasper             "\n"
118d89ae9d3SDaniel Jasper             "#include \"b.h\"\n",
11985c472dcSDaniel Jasper             sort("#include \"a.h\"\n"
12085c472dcSDaniel Jasper                  "#include \"c.h\"\n"
121d89ae9d3SDaniel Jasper                  "\n"
122d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
123d89ae9d3SDaniel Jasper }
124d89ae9d3SDaniel Jasper 
125d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
12685c472dcSDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
12785c472dcSDaniel Jasper             "#include \"c.h\"\n"
12885c472dcSDaniel Jasper             "#include <b.h>\n"
12985c472dcSDaniel Jasper             "#include <d.h>\n",
13085c472dcSDaniel Jasper             sort("#include <d.h>\n"
13185c472dcSDaniel Jasper                  "#include <b.h>\n"
13285c472dcSDaniel Jasper                  "#include \"c.h\"\n"
13385c472dcSDaniel Jasper                  "#include \"a.h\"\n"));
13485c472dcSDaniel Jasper 
13585c472dcSDaniel Jasper   Style = getGoogleStyle(FormatStyle::LK_Cpp);
136d89ae9d3SDaniel Jasper   EXPECT_EQ("#include <b.h>\n"
137d89ae9d3SDaniel Jasper             "#include <d.h>\n"
138d89ae9d3SDaniel Jasper             "#include \"a.h\"\n"
139d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
140d89ae9d3SDaniel Jasper             sort("#include <d.h>\n"
141d89ae9d3SDaniel Jasper                  "#include <b.h>\n"
142d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
143d89ae9d3SDaniel Jasper                  "#include \"a.h\"\n"));
144d89ae9d3SDaniel Jasper }
145d89ae9d3SDaniel Jasper 
146d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
147d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
148d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
149d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
150d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
151d89ae9d3SDaniel Jasper                  "#include \\\n"
152d89ae9d3SDaniel Jasper                  "\"c.h\"\n"
153d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
154d89ae9d3SDaniel Jasper }
155d89ae9d3SDaniel Jasper 
15685c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
15785c472dcSDaniel Jasper   EXPECT_EQ("#include \"llvm/a.h\"\n"
15885c472dcSDaniel Jasper             "#include \"b.h\"\n"
15985c472dcSDaniel Jasper             "#include \"c.h\"\n",
16085c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
16185c472dcSDaniel Jasper                  "#include \"c.h\"\n"
16285c472dcSDaniel Jasper                  "#include \"b.h\"\n"));
163afa62faeSNico Weber   EXPECT_EQ("#include \"llvm/a.h\"\n"
164afa62faeSNico Weber             "#include \"b.h\"\n"
165afa62faeSNico Weber             "#include \"c.h\"\n",
166afa62faeSNico Weber             sort("#include \"llvm/a.h\"\n"
167afa62faeSNico Weber                  "#include \"c.h\"\n"
168afa62faeSNico Weber                  "#include \"b.h\"\n",
169afa62faeSNico Weber                  "input.mm"));
17085c472dcSDaniel Jasper 
17185c472dcSDaniel Jasper   // Don't do this in headers.
17285c472dcSDaniel Jasper   EXPECT_EQ("#include \"b.h\"\n"
17385c472dcSDaniel Jasper             "#include \"c.h\"\n"
17485c472dcSDaniel Jasper             "#include \"llvm/a.h\"\n",
17585c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
17685c472dcSDaniel Jasper                  "#include \"c.h\"\n"
17785c472dcSDaniel Jasper                  "#include \"b.h\"\n",
17885c472dcSDaniel Jasper                  "some_header.h"));
17985c472dcSDaniel Jasper }
18085c472dcSDaniel Jasper 
181d89ae9d3SDaniel Jasper } // end namespace
182d89ae9d3SDaniel Jasper } // end namespace format
183d89ae9d3SDaniel Jasper } // end namespace clang
184