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 
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",
8185c472dcSDaniel Jasper             sort("#include \"a.h\"\n"
8285c472dcSDaniel Jasper                  "#include \"c.h\"\n"
83d89ae9d3SDaniel Jasper                  "\n"
84d89ae9d3SDaniel Jasper                  "#include \"b.h\"\n"));
85d89ae9d3SDaniel Jasper }
86d89ae9d3SDaniel Jasper 
87d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
8885c472dcSDaniel Jasper   EXPECT_EQ("#include \"a.h\"\n"
8985c472dcSDaniel Jasper             "#include \"c.h\"\n"
9085c472dcSDaniel Jasper             "#include <b.h>\n"
9185c472dcSDaniel Jasper             "#include <d.h>\n",
9285c472dcSDaniel Jasper             sort("#include <d.h>\n"
9385c472dcSDaniel Jasper                  "#include <b.h>\n"
9485c472dcSDaniel Jasper                  "#include \"c.h\"\n"
9585c472dcSDaniel Jasper                  "#include \"a.h\"\n"));
9685c472dcSDaniel Jasper 
9785c472dcSDaniel 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 
11885c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
11985c472dcSDaniel Jasper   EXPECT_EQ("#include \"llvm/a.h\"\n"
12085c472dcSDaniel Jasper             "#include \"b.h\"\n"
12185c472dcSDaniel Jasper             "#include \"c.h\"\n",
12285c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
12385c472dcSDaniel Jasper                  "#include \"c.h\"\n"
12485c472dcSDaniel Jasper                  "#include \"b.h\"\n"));
125*afa62faeSNico Weber   EXPECT_EQ("#include \"llvm/a.h\"\n"
126*afa62faeSNico Weber             "#include \"b.h\"\n"
127*afa62faeSNico Weber             "#include \"c.h\"\n",
128*afa62faeSNico Weber             sort("#include \"llvm/a.h\"\n"
129*afa62faeSNico Weber                  "#include \"c.h\"\n"
130*afa62faeSNico Weber                  "#include \"b.h\"\n",
131*afa62faeSNico Weber                  "input.mm"));
13285c472dcSDaniel Jasper 
13385c472dcSDaniel Jasper   // Don't do this in headers.
13485c472dcSDaniel Jasper   EXPECT_EQ("#include \"b.h\"\n"
13585c472dcSDaniel Jasper             "#include \"c.h\"\n"
13685c472dcSDaniel Jasper             "#include \"llvm/a.h\"\n",
13785c472dcSDaniel Jasper             sort("#include \"llvm/a.h\"\n"
13885c472dcSDaniel Jasper                  "#include \"c.h\"\n"
13985c472dcSDaniel Jasper                  "#include \"b.h\"\n",
14085c472dcSDaniel Jasper                  "some_header.h"));
14185c472dcSDaniel Jasper }
14285c472dcSDaniel Jasper 
143d89ae9d3SDaniel Jasper } // end namespace
144d89ae9d3SDaniel Jasper } // end namespace format
145d89ae9d3SDaniel Jasper } // end namespace clang
146