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