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