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 31b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 32b68aabf7SDaniel Jasper std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 33b68aabf7SDaniel Jasper sortIncludes(Style, Code, Ranges, "input.cpp", &Cursor); 34b68aabf7SDaniel Jasper return Cursor; 35b68aabf7SDaniel Jasper } 36b68aabf7SDaniel Jasper 3785c472dcSDaniel Jasper FormatStyle Style = getLLVMStyle(); 38b68aabf7SDaniel Jasper 39d89ae9d3SDaniel Jasper }; 40d89ae9d3SDaniel Jasper 41d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 42d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 43d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 44d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 45d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 46d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 47d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 48d89ae9d3SDaniel Jasper } 49d89ae9d3SDaniel Jasper 509b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 519b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 529b8c7c72SDaniel Jasper "#include <b>\n" 539b8c7c72SDaniel Jasper "#include <c>\n" 549b8c7c72SDaniel Jasper "// clang-format off\n" 559b8c7c72SDaniel Jasper "#include <b>\n" 569b8c7c72SDaniel Jasper "#include <a>\n" 579b8c7c72SDaniel Jasper "#include <c>\n" 589b8c7c72SDaniel Jasper "// clang-format on\n", 599b8c7c72SDaniel Jasper sort("#include <b>\n" 609b8c7c72SDaniel Jasper "#include <a>\n" 619b8c7c72SDaniel Jasper "#include <c>\n" 629b8c7c72SDaniel Jasper "// clang-format off\n" 639b8c7c72SDaniel Jasper "#include <b>\n" 649b8c7c72SDaniel Jasper "#include <a>\n" 659b8c7c72SDaniel Jasper "#include <c>\n" 669b8c7c72SDaniel Jasper "// clang-format on\n")); 679b8c7c72SDaniel Jasper } 689b8c7c72SDaniel Jasper 69da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 70da446770SDaniel Jasper Style.SortIncludes = false; 71da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 72da446770SDaniel Jasper "#include \"c.h\"\n" 73da446770SDaniel Jasper "#include \"b.h\"\n", 74da446770SDaniel Jasper sort("#include \"a.h\"\n" 75da446770SDaniel Jasper "#include \"c.h\"\n" 76da446770SDaniel Jasper "#include \"b.h\"\n")); 77da446770SDaniel Jasper } 78da446770SDaniel Jasper 79ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 80ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 81ff06370eSNico Weber "#import \"b.h\"\n" 82ff06370eSNico Weber "#include \"c.h\"\n", 83ff06370eSNico Weber sort("#include \"a.h\"\n" 84ff06370eSNico Weber "#include \"c.h\"\n" 85ff06370eSNico Weber "#import \"b.h\"\n")); 86ff06370eSNico Weber } 87ff06370eSNico Weber 88d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 89d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 90d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 91d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 92d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 93d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 94d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 95d89ae9d3SDaniel Jasper } 96d89ae9d3SDaniel Jasper 97d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 98d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 99d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 100d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 101d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 102d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 103d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 104d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 105d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 106d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 107d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 108d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 109d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 110d89ae9d3SDaniel Jasper } 111d89ae9d3SDaniel Jasper 112d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 113d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 114d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 115d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 116d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 117d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 118d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 119d89ae9d3SDaniel Jasper } 120d89ae9d3SDaniel Jasper 121d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 122d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 123d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 124d89ae9d3SDaniel Jasper "\n" 125d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 12685c472dcSDaniel Jasper sort("#include \"a.h\"\n" 12785c472dcSDaniel Jasper "#include \"c.h\"\n" 128d89ae9d3SDaniel Jasper "\n" 129d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 130d89ae9d3SDaniel Jasper } 131d89ae9d3SDaniel Jasper 132d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 13385c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 13485c472dcSDaniel Jasper "#include \"c.h\"\n" 13585c472dcSDaniel Jasper "#include <b.h>\n" 13685c472dcSDaniel Jasper "#include <d.h>\n", 13785c472dcSDaniel Jasper sort("#include <d.h>\n" 13885c472dcSDaniel Jasper "#include <b.h>\n" 13985c472dcSDaniel Jasper "#include \"c.h\"\n" 14085c472dcSDaniel Jasper "#include \"a.h\"\n")); 14185c472dcSDaniel Jasper 14285c472dcSDaniel Jasper Style = getGoogleStyle(FormatStyle::LK_Cpp); 143d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 144d89ae9d3SDaniel Jasper "#include <d.h>\n" 145d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 146d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 147d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 148d89ae9d3SDaniel Jasper "#include <b.h>\n" 149d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 150d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 151d89ae9d3SDaniel Jasper } 152d89ae9d3SDaniel Jasper 153d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 154d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 155d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 156d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 157d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 158d89ae9d3SDaniel Jasper "#include \\\n" 159d89ae9d3SDaniel Jasper "\"c.h\"\n" 160d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 161d89ae9d3SDaniel Jasper } 162d89ae9d3SDaniel Jasper 16385c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 16485c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 16585c472dcSDaniel Jasper "#include \"b.h\"\n" 16685c472dcSDaniel Jasper "#include \"c.h\"\n", 16785c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 16885c472dcSDaniel Jasper "#include \"c.h\"\n" 1690bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 1700bfdeb4bSDaniel Jasper "a.cc")); 171afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 172afa62faeSNico Weber "#include \"b.h\"\n" 173afa62faeSNico Weber "#include \"c.h\"\n", 174afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 175afa62faeSNico Weber "#include \"c.h\"\n" 176afa62faeSNico Weber "#include \"b.h\"\n", 1770bfdeb4bSDaniel Jasper "a_main.cc")); 1780bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 1790bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 1800bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 1810bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 1820bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 1830bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 184afa62faeSNico Weber "input.mm")); 18585c472dcSDaniel Jasper 18685c472dcSDaniel Jasper // Don't do this in headers. 18785c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 18885c472dcSDaniel Jasper "#include \"c.h\"\n" 18985c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 19085c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 19185c472dcSDaniel Jasper "#include \"c.h\"\n" 19285c472dcSDaniel Jasper "#include \"b.h\"\n", 1930bfdeb4bSDaniel Jasper "a.h")); 19432d75fa2SDaniel Jasper 19532d75fa2SDaniel Jasper // Only do this in the first #include block. 19632d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 19732d75fa2SDaniel Jasper "\n" 19832d75fa2SDaniel Jasper "#include \"b.h\"\n" 19932d75fa2SDaniel Jasper "#include \"c.h\"\n" 20032d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 20132d75fa2SDaniel Jasper sort("#include <a>\n" 20232d75fa2SDaniel Jasper "\n" 20332d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 20432d75fa2SDaniel Jasper "#include \"c.h\"\n" 20532d75fa2SDaniel Jasper "#include \"b.h\"\n", 20632d75fa2SDaniel Jasper "a.cc")); 207*a252f5d5SDaniel Jasper 208*a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 209*a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 210*a252f5d5SDaniel Jasper "#include \"b.h\"\n" 211*a252f5d5SDaniel Jasper "#include \"c.h\"\n" 212*a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 213*a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 214*a252f5d5SDaniel Jasper "#include \"a.h\"\n" 215*a252f5d5SDaniel Jasper "#include \"c.h\"\n" 216*a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 217*a252f5d5SDaniel Jasper "a.cc")); 21885c472dcSDaniel Jasper } 21985c472dcSDaniel Jasper 220d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 221d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 222d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 2230bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2240bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2250bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 2260bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 2270bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 2280bfdeb4bSDaniel Jasper "c_main.cc")); 2290bfdeb4bSDaniel Jasper 2300bfdeb4bSDaniel Jasper // check stable when re-run 2310bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 2320bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2330bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2340bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 2350bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2360bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2370bfdeb4bSDaniel Jasper "c_main.cc")); 238d2629dc8SDaniel Jasper } 239d2629dc8SDaniel Jasper 240b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 241b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 242b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 243b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 244b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 245b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 246b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 247b68aabf7SDaniel Jasper 248b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 249b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 250b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 251b68aabf7SDaniel Jasper } 252b68aabf7SDaniel Jasper 253d89ae9d3SDaniel Jasper } // end namespace 254d89ae9d3SDaniel Jasper } // end namespace format 255d89ae9d3SDaniel Jasper } // end namespace clang 256