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: 2394a96fceSDaniel Jasper std::vector<tooling::Range> GetCodeRange(StringRef Code) { 2494a96fceSDaniel Jasper return std::vector<tooling::Range>(1, tooling::Range(0, Code.size())); 2594a96fceSDaniel Jasper } 2694a96fceSDaniel Jasper 2794a96fceSDaniel Jasper std::string sort(StringRef Code, StringRef FileName = "input.cpp") { 2894a96fceSDaniel Jasper auto Ranges = GetCodeRange(Code); 2985c472dcSDaniel Jasper std::string Sorted = 3085c472dcSDaniel Jasper applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName)); 3185c472dcSDaniel Jasper return applyAllReplacements(Sorted, 3285c472dcSDaniel Jasper reformat(Style, Sorted, Ranges, FileName)); 33d89ae9d3SDaniel Jasper } 3485c472dcSDaniel Jasper 35b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 3694a96fceSDaniel Jasper sortIncludes(Style, Code, GetCodeRange(Code), "input.cpp", &Cursor); 37b68aabf7SDaniel Jasper return Cursor; 38b68aabf7SDaniel Jasper } 39b68aabf7SDaniel Jasper 4085c472dcSDaniel Jasper FormatStyle Style = getLLVMStyle(); 41b68aabf7SDaniel Jasper 42d89ae9d3SDaniel Jasper }; 43d89ae9d3SDaniel Jasper 44d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 45d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 46d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 47d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 48d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 49d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 50d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 51d89ae9d3SDaniel Jasper } 52d89ae9d3SDaniel Jasper 5394a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 5494a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 5594a96fceSDaniel Jasper std::string Code = "#include <a>\n" 5694a96fceSDaniel Jasper "#include <b>\n" 5794a96fceSDaniel Jasper "#include <b>\n" 5894a96fceSDaniel Jasper "#include <b>\n" 5994a96fceSDaniel Jasper "#include <b>\n" 6094a96fceSDaniel Jasper "#include <c>\n"; 6194a96fceSDaniel Jasper EXPECT_TRUE(sortIncludes(Style, Code, GetCodeRange(Code), "a.cc").empty()); 6294a96fceSDaniel Jasper } 6394a96fceSDaniel Jasper 649b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 659b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 669b8c7c72SDaniel Jasper "#include <b>\n" 679b8c7c72SDaniel Jasper "#include <c>\n" 689b8c7c72SDaniel Jasper "// clang-format off\n" 699b8c7c72SDaniel Jasper "#include <b>\n" 709b8c7c72SDaniel Jasper "#include <a>\n" 719b8c7c72SDaniel Jasper "#include <c>\n" 729b8c7c72SDaniel Jasper "// clang-format on\n", 739b8c7c72SDaniel Jasper sort("#include <b>\n" 749b8c7c72SDaniel Jasper "#include <a>\n" 759b8c7c72SDaniel Jasper "#include <c>\n" 769b8c7c72SDaniel Jasper "// clang-format off\n" 779b8c7c72SDaniel Jasper "#include <b>\n" 789b8c7c72SDaniel Jasper "#include <a>\n" 799b8c7c72SDaniel Jasper "#include <c>\n" 809b8c7c72SDaniel Jasper "// clang-format on\n")); 819b8c7c72SDaniel Jasper } 829b8c7c72SDaniel Jasper 83da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 84da446770SDaniel Jasper Style.SortIncludes = false; 85da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 86da446770SDaniel Jasper "#include \"c.h\"\n" 87da446770SDaniel Jasper "#include \"b.h\"\n", 88da446770SDaniel Jasper sort("#include \"a.h\"\n" 89da446770SDaniel Jasper "#include \"c.h\"\n" 90da446770SDaniel Jasper "#include \"b.h\"\n")); 91da446770SDaniel Jasper } 92da446770SDaniel Jasper 93ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 94ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 95ff06370eSNico Weber "#import \"b.h\"\n" 96ff06370eSNico Weber "#include \"c.h\"\n", 97ff06370eSNico Weber sort("#include \"a.h\"\n" 98ff06370eSNico Weber "#include \"c.h\"\n" 99ff06370eSNico Weber "#import \"b.h\"\n")); 100ff06370eSNico Weber } 101ff06370eSNico Weber 102d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 103d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 104d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 105d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 106d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 107d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 108d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 109d89ae9d3SDaniel Jasper } 110d89ae9d3SDaniel Jasper 111d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 112d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 113d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 114d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 115d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 116d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 117d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 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 \"c.h\"\n" 123d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 124d89ae9d3SDaniel Jasper } 125d89ae9d3SDaniel Jasper 126d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 127d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 128d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 129d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 130d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 131d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 132d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 133d89ae9d3SDaniel Jasper } 134d89ae9d3SDaniel Jasper 135d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 136d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 137d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 138d89ae9d3SDaniel Jasper "\n" 139d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 14085c472dcSDaniel Jasper sort("#include \"a.h\"\n" 14185c472dcSDaniel Jasper "#include \"c.h\"\n" 142d89ae9d3SDaniel Jasper "\n" 143d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 144d89ae9d3SDaniel Jasper } 145d89ae9d3SDaniel Jasper 146d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 14785c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 14885c472dcSDaniel Jasper "#include \"c.h\"\n" 14985c472dcSDaniel Jasper "#include <b.h>\n" 15085c472dcSDaniel Jasper "#include <d.h>\n", 15185c472dcSDaniel Jasper sort("#include <d.h>\n" 15285c472dcSDaniel Jasper "#include <b.h>\n" 15385c472dcSDaniel Jasper "#include \"c.h\"\n" 15485c472dcSDaniel Jasper "#include \"a.h\"\n")); 15585c472dcSDaniel Jasper 15685c472dcSDaniel Jasper Style = getGoogleStyle(FormatStyle::LK_Cpp); 157d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 158d89ae9d3SDaniel Jasper "#include <d.h>\n" 159d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 160d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 161d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 162d89ae9d3SDaniel Jasper "#include <b.h>\n" 163d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 164d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 165d89ae9d3SDaniel Jasper } 166d89ae9d3SDaniel Jasper 167d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 168d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 169d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 170d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 171d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 172d89ae9d3SDaniel Jasper "#include \\\n" 173d89ae9d3SDaniel Jasper "\"c.h\"\n" 174d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 175d89ae9d3SDaniel Jasper } 176d89ae9d3SDaniel Jasper 17785c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 178*9c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 17985c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 18085c472dcSDaniel Jasper "#include \"b.h\"\n" 18185c472dcSDaniel Jasper "#include \"c.h\"\n", 18285c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 18385c472dcSDaniel Jasper "#include \"c.h\"\n" 1840bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 1850bfdeb4bSDaniel Jasper "a.cc")); 186afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 187afa62faeSNico Weber "#include \"b.h\"\n" 188afa62faeSNico Weber "#include \"c.h\"\n", 189afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 190afa62faeSNico Weber "#include \"c.h\"\n" 191afa62faeSNico Weber "#include \"b.h\"\n", 192*9c8ff355SDaniel Jasper "a_test.cc")); 1930bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 1940bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 1950bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 1960bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 1970bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 1980bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 199afa62faeSNico Weber "input.mm")); 20085c472dcSDaniel Jasper 201*9c8ff355SDaniel Jasper // Don't allow prefixes. 202*9c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 203*9c8ff355SDaniel Jasper "#include \"c.h\"\n" 204*9c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 205*9c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 206*9c8ff355SDaniel Jasper "#include \"c.h\"\n" 207*9c8ff355SDaniel Jasper "#include \"b.h\"\n", 208*9c8ff355SDaniel Jasper "a.cc")); 209*9c8ff355SDaniel Jasper 210*9c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 211*9c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 212*9c8ff355SDaniel Jasper "#include \"c.h\"\n" 213*9c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 214*9c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 215*9c8ff355SDaniel Jasper "#include \"c.h\"\n" 216*9c8ff355SDaniel Jasper "#include \"b.h\"\n", 217*9c8ff355SDaniel Jasper "a_main.cc")); 218*9c8ff355SDaniel Jasper 21985c472dcSDaniel Jasper // Don't do this in headers. 22085c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 22185c472dcSDaniel Jasper "#include \"c.h\"\n" 22285c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 22385c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 22485c472dcSDaniel Jasper "#include \"c.h\"\n" 22585c472dcSDaniel Jasper "#include \"b.h\"\n", 2260bfdeb4bSDaniel Jasper "a.h")); 22732d75fa2SDaniel Jasper 22832d75fa2SDaniel Jasper // Only do this in the first #include block. 22932d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 23032d75fa2SDaniel Jasper "\n" 23132d75fa2SDaniel Jasper "#include \"b.h\"\n" 23232d75fa2SDaniel Jasper "#include \"c.h\"\n" 23332d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 23432d75fa2SDaniel Jasper sort("#include <a>\n" 23532d75fa2SDaniel Jasper "\n" 23632d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 23732d75fa2SDaniel Jasper "#include \"c.h\"\n" 23832d75fa2SDaniel Jasper "#include \"b.h\"\n", 23932d75fa2SDaniel Jasper "a.cc")); 240a252f5d5SDaniel Jasper 241a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 242a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 243a252f5d5SDaniel Jasper "#include \"b.h\"\n" 244a252f5d5SDaniel Jasper "#include \"c.h\"\n" 245a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 246a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 247a252f5d5SDaniel Jasper "#include \"a.h\"\n" 248a252f5d5SDaniel Jasper "#include \"c.h\"\n" 249a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 250a252f5d5SDaniel Jasper "a.cc")); 25185c472dcSDaniel Jasper } 25285c472dcSDaniel Jasper 253d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 254d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 255d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 2560bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2570bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2580bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 2590bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 2600bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 2610bfdeb4bSDaniel Jasper "c_main.cc")); 2620bfdeb4bSDaniel Jasper 2630bfdeb4bSDaniel Jasper // check stable when re-run 2640bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 2650bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2660bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2670bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 2680bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 2690bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 2700bfdeb4bSDaniel Jasper "c_main.cc")); 271d2629dc8SDaniel Jasper } 272d2629dc8SDaniel Jasper 273b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 274b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 275b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 276b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 277b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 278b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 279b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 280b68aabf7SDaniel Jasper 281b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 282b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 283b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 284b68aabf7SDaniel Jasper } 285b68aabf7SDaniel Jasper 286d89ae9d3SDaniel Jasper } // end namespace 287d89ae9d3SDaniel Jasper } // end namespace format 288d89ae9d3SDaniel Jasper } // end namespace clang 289