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*da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
44*da446770SDaniel Jasper   Style.SortIncludes = false;
45*da446770SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
46*da446770SDaniel Jasper             "#include \"c.h\"\n"
47*da446770SDaniel Jasper             "#include \"b.h\"\n",
48*da446770SDaniel Jasper             sort("#include \"a.h\"\n"
49*da446770SDaniel Jasper                  "#include \"c.h\"\n"
50*da446770SDaniel Jasper                  "#include \"b.h\"\n"));
51*da446770SDaniel Jasper }
52*da446770SDaniel Jasper 
53ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) {
54ff06370eSNico Weber   EXPECT_EQ("#include \"a.h\"\n"
55ff06370eSNico Weber             "#import \"b.h\"\n"
56ff06370eSNico Weber             "#include \"c.h\"\n",
57ff06370eSNico Weber             sort("#include \"a.h\"\n"
58ff06370eSNico Weber                  "#include \"c.h\"\n"
59ff06370eSNico Weber                  "#import \"b.h\"\n"));
60ff06370eSNico Weber }
61ff06370eSNico Weber 
62d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) {
63d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"  // comment\n"
64d89ae9d3SDaniel Jasper             "#include \"bb.h\" // comment\n"
65d89ae9d3SDaniel Jasper             "#include \"ccc.h\"\n",
66d89ae9d3SDaniel Jasper             sort("#include \"a.h\" // comment\n"
67d89ae9d3SDaniel Jasper                  "#include \"ccc.h\"\n"
68d89ae9d3SDaniel Jasper                  "#include \"bb.h\" // comment\n"));
69d89ae9d3SDaniel Jasper }
70d89ae9d3SDaniel Jasper 
71d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) {
72d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
73d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
74d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
75d89ae9d3SDaniel Jasper             sort(" #include \"a.h\"\n"
76d89ae9d3SDaniel Jasper                  "  #include \"c.h\"\n"
77d89ae9d3SDaniel Jasper                  "   #include \"b.h\"\n"));
78d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
79d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
80d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
81d89ae9d3SDaniel Jasper             sort("# include \"a.h\"\n"
82d89ae9d3SDaniel Jasper                  "#  include \"c.h\"\n"
83d89ae9d3SDaniel Jasper                  "#   include \"b.h\"\n"));
84d89ae9d3SDaniel Jasper }
85d89ae9d3SDaniel Jasper 
86d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) {
87d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
88d89ae9d3SDaniel Jasper             "#include \"b.h\" // >\n"
89d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
90d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
91d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
92d89ae9d3SDaniel Jasper                  "#include \"b.h\" // >\n"));
93d89ae9d3SDaniel Jasper }
94d89ae9d3SDaniel Jasper 
95d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
96d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
97d89ae9d3SDaniel Jasper             "#include \"c.h\"\n"
98d89ae9d3SDaniel Jasper             "\n"
99d89ae9d3SDaniel Jasper             "#include \"b.h\"\n",
10085c472dcSDaniel Jasper             sort("#include \"a.h\"\n"
10185c472dcSDaniel Jasper                  "#include \"c.h\"\n"
102d89ae9d3SDaniel Jasper                  "\n"
103d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
104d89ae9d3SDaniel Jasper }
105d89ae9d3SDaniel Jasper 
106d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
10785c472dcSDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
10885c472dcSDaniel Jasper             "#include \"c.h\"\n"
10985c472dcSDaniel Jasper             "#include <b.h>\n"
11085c472dcSDaniel Jasper             "#include <d.h>\n",
11185c472dcSDaniel Jasper             sort("#include <d.h>\n"
11285c472dcSDaniel Jasper                  "#include <b.h>\n"
11385c472dcSDaniel Jasper                  "#include \"c.h\"\n"
11485c472dcSDaniel Jasper                  "#include \"a.h\"\n"));
11585c472dcSDaniel Jasper 
11685c472dcSDaniel Jasper   Style = getGoogleStyle(FormatStyle::LK_Cpp);
117d89ae9d3SDaniel Jasper   EXPECT_EQ("#include <b.h>\n"
118d89ae9d3SDaniel Jasper             "#include <d.h>\n"
119d89ae9d3SDaniel Jasper             "#include \"a.h\"\n"
120d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
121d89ae9d3SDaniel Jasper             sort("#include <d.h>\n"
122d89ae9d3SDaniel Jasper                  "#include <b.h>\n"
123d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
124d89ae9d3SDaniel Jasper                  "#include \"a.h\"\n"));
125d89ae9d3SDaniel Jasper }
126d89ae9d3SDaniel Jasper 
127d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
128d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
129d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
130d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
131d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
132d89ae9d3SDaniel Jasper                  "#include \\\n"
133d89ae9d3SDaniel Jasper                  "\"c.h\"\n"
134d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
135d89ae9d3SDaniel Jasper }
136d89ae9d3SDaniel Jasper 
13785c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
13885c472dcSDaniel Jasper   EXPECT_EQ("#include \"llvm/a.h\"\n"
13985c472dcSDaniel Jasper             "#include \"b.h\"\n"
14085c472dcSDaniel Jasper             "#include \"c.h\"\n",
14185c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
14285c472dcSDaniel Jasper                  "#include \"c.h\"\n"
14385c472dcSDaniel Jasper                  "#include \"b.h\"\n"));
144afa62faeSNico Weber   EXPECT_EQ("#include \"llvm/a.h\"\n"
145afa62faeSNico Weber             "#include \"b.h\"\n"
146afa62faeSNico Weber             "#include \"c.h\"\n",
147afa62faeSNico Weber             sort("#include \"llvm/a.h\"\n"
148afa62faeSNico Weber                  "#include \"c.h\"\n"
149afa62faeSNico Weber                  "#include \"b.h\"\n",
150afa62faeSNico Weber                  "input.mm"));
15185c472dcSDaniel Jasper 
15285c472dcSDaniel Jasper   // Don't do this in headers.
15385c472dcSDaniel Jasper   EXPECT_EQ("#include \"b.h\"\n"
15485c472dcSDaniel Jasper             "#include \"c.h\"\n"
15585c472dcSDaniel Jasper             "#include \"llvm/a.h\"\n",
15685c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
15785c472dcSDaniel Jasper                  "#include \"c.h\"\n"
15885c472dcSDaniel Jasper                  "#include \"b.h\"\n",
15985c472dcSDaniel Jasper                  "some_header.h"));
16085c472dcSDaniel Jasper }
16185c472dcSDaniel Jasper 
162d89ae9d3SDaniel Jasper } // end namespace
163d89ae9d3SDaniel Jasper } // end namespace format
164d89ae9d3SDaniel Jasper } // end namespace clang
165