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*ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) {
44*ff06370eSNico Weber   EXPECT_EQ("#include \"a.h\"\n"
45*ff06370eSNico Weber             "#import \"b.h\"\n"
46*ff06370eSNico Weber             "#include \"c.h\"\n",
47*ff06370eSNico Weber             sort("#include \"a.h\"\n"
48*ff06370eSNico Weber                  "#include \"c.h\"\n"
49*ff06370eSNico Weber                  "#import \"b.h\"\n"));
50*ff06370eSNico Weber }
51*ff06370eSNico Weber 
52d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) {
53d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"  // comment\n"
54d89ae9d3SDaniel Jasper             "#include \"bb.h\" // comment\n"
55d89ae9d3SDaniel Jasper             "#include \"ccc.h\"\n",
56d89ae9d3SDaniel Jasper             sort("#include \"a.h\" // comment\n"
57d89ae9d3SDaniel Jasper                  "#include \"ccc.h\"\n"
58d89ae9d3SDaniel Jasper                  "#include \"bb.h\" // comment\n"));
59d89ae9d3SDaniel Jasper }
60d89ae9d3SDaniel Jasper 
61d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) {
62d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
63d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
64d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
65d89ae9d3SDaniel Jasper             sort(" #include \"a.h\"\n"
66d89ae9d3SDaniel Jasper                  "  #include \"c.h\"\n"
67d89ae9d3SDaniel Jasper                  "   #include \"b.h\"\n"));
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, GreaterInComment) {
77d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
78d89ae9d3SDaniel Jasper             "#include \"b.h\" // >\n"
79d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
80d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
81d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
82d89ae9d3SDaniel Jasper                  "#include \"b.h\" // >\n"));
83d89ae9d3SDaniel Jasper }
84d89ae9d3SDaniel Jasper 
85d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
86d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
87d89ae9d3SDaniel Jasper             "#include \"c.h\"\n"
88d89ae9d3SDaniel Jasper             "\n"
89d89ae9d3SDaniel Jasper             "#include \"b.h\"\n",
9085c472dcSDaniel Jasper             sort("#include \"a.h\"\n"
9185c472dcSDaniel Jasper                  "#include \"c.h\"\n"
92d89ae9d3SDaniel Jasper                  "\n"
93d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
94d89ae9d3SDaniel Jasper }
95d89ae9d3SDaniel Jasper 
96d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
9785c472dcSDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
9885c472dcSDaniel Jasper             "#include \"c.h\"\n"
9985c472dcSDaniel Jasper             "#include <b.h>\n"
10085c472dcSDaniel Jasper             "#include <d.h>\n",
10185c472dcSDaniel Jasper             sort("#include <d.h>\n"
10285c472dcSDaniel Jasper                  "#include <b.h>\n"
10385c472dcSDaniel Jasper                  "#include \"c.h\"\n"
10485c472dcSDaniel Jasper                  "#include \"a.h\"\n"));
10585c472dcSDaniel Jasper 
10685c472dcSDaniel Jasper   Style = getGoogleStyle(FormatStyle::LK_Cpp);
107d89ae9d3SDaniel Jasper   EXPECT_EQ("#include <b.h>\n"
108d89ae9d3SDaniel Jasper             "#include <d.h>\n"
109d89ae9d3SDaniel Jasper             "#include \"a.h\"\n"
110d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
111d89ae9d3SDaniel Jasper             sort("#include <d.h>\n"
112d89ae9d3SDaniel Jasper                  "#include <b.h>\n"
113d89ae9d3SDaniel Jasper                  "#include \"c.h\"\n"
114d89ae9d3SDaniel Jasper                  "#include \"a.h\"\n"));
115d89ae9d3SDaniel Jasper }
116d89ae9d3SDaniel Jasper 
117d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
118d89ae9d3SDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
119d89ae9d3SDaniel Jasper             "#include \"b.h\"\n"
120d89ae9d3SDaniel Jasper             "#include \"c.h\"\n",
121d89ae9d3SDaniel Jasper             sort("#include \"a.h\"\n"
122d89ae9d3SDaniel Jasper                  "#include \\\n"
123d89ae9d3SDaniel Jasper                  "\"c.h\"\n"
124d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
125d89ae9d3SDaniel Jasper }
126d89ae9d3SDaniel Jasper 
12785c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
12885c472dcSDaniel Jasper   EXPECT_EQ("#include \"llvm/a.h\"\n"
12985c472dcSDaniel Jasper             "#include \"b.h\"\n"
13085c472dcSDaniel Jasper             "#include \"c.h\"\n",
13185c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
13285c472dcSDaniel Jasper                  "#include \"c.h\"\n"
13385c472dcSDaniel Jasper                  "#include \"b.h\"\n"));
134afa62faeSNico Weber   EXPECT_EQ("#include \"llvm/a.h\"\n"
135afa62faeSNico Weber             "#include \"b.h\"\n"
136afa62faeSNico Weber             "#include \"c.h\"\n",
137afa62faeSNico Weber             sort("#include \"llvm/a.h\"\n"
138afa62faeSNico Weber                  "#include \"c.h\"\n"
139afa62faeSNico Weber                  "#include \"b.h\"\n",
140afa62faeSNico Weber                  "input.mm"));
14185c472dcSDaniel Jasper 
14285c472dcSDaniel Jasper   // Don't do this in headers.
14385c472dcSDaniel Jasper   EXPECT_EQ("#include \"b.h\"\n"
14485c472dcSDaniel Jasper             "#include \"c.h\"\n"
14585c472dcSDaniel Jasper             "#include \"llvm/a.h\"\n",
14685c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
14785c472dcSDaniel Jasper                  "#include \"c.h\"\n"
14885c472dcSDaniel Jasper                  "#include \"b.h\"\n",
14985c472dcSDaniel Jasper                  "some_header.h"));
15085c472dcSDaniel Jasper }
15185c472dcSDaniel Jasper 
152d89ae9d3SDaniel Jasper } // end namespace
153d89ae9d3SDaniel Jasper } // end namespace format
154d89ae9d3SDaniel Jasper } // end namespace clang
155