1d89ae9d3SDaniel Jasper //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===// 2d89ae9d3SDaniel Jasper // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d89ae9d3SDaniel Jasper // 7d89ae9d3SDaniel Jasper //===----------------------------------------------------------------------===// 8d89ae9d3SDaniel Jasper 9d89ae9d3SDaniel Jasper #include "FormatTestUtils.h" 10d89ae9d3SDaniel Jasper #include "clang/Format/Format.h" 11925bb20cSKrasimir Georgiev #include "llvm/ADT/None.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 27d6a00780SDaniel Jasper std::string sort(StringRef Code, std::vector<tooling::Range> Ranges, 28925bb20cSKrasimir Georgiev StringRef FileName = "input.cc", 29925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 309d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName); 31a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 32925bb20cSKrasimir Georgiev EXPECT_EQ(ExpectedNumRanges, Replaces.size()); 33a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 344f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 354f8d9943SEric Liu auto Result = applyAllReplacements( 369d92c027SEric Liu *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName)); 374f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 384f8d9943SEric Liu return *Result; 39d89ae9d3SDaniel Jasper } 4085c472dcSDaniel Jasper 41925bb20cSKrasimir Georgiev std::string sort(StringRef Code, 42925bb20cSKrasimir Georgiev StringRef FileName = "input.cpp", 43925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 44925bb20cSKrasimir Georgiev return sort(Code, GetCodeRange(Code), FileName, ExpectedNumRanges); 45d6a00780SDaniel Jasper } 46d6a00780SDaniel Jasper 47b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 489d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 49b68aabf7SDaniel Jasper return Cursor; 50b68aabf7SDaniel Jasper } 51b68aabf7SDaniel Jasper 529d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 539d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 54d89ae9d3SDaniel Jasper }; 55d89ae9d3SDaniel Jasper 56d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 57d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 59d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 60d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 61d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 62d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 63d6a00780SDaniel Jasper 64d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 65d6a00780SDaniel Jasper "#include <a>\n" 66d6a00780SDaniel Jasper "#include <b>\n", 67d6a00780SDaniel Jasper sort("// comment\n" 68d6a00780SDaniel Jasper "#include <b>\n" 69d6a00780SDaniel Jasper "#include <a>\n", 70d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 71d89ae9d3SDaniel Jasper } 72d89ae9d3SDaniel Jasper 7394a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 7494a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 7594a96fceSDaniel Jasper std::string Code = "#include <a>\n" 7694a96fceSDaniel Jasper "#include <b>\n" 77a992afe8SEric Liu "#include <c>\n" 78a992afe8SEric Liu "#include <d>\n" 79a992afe8SEric Liu "#include <e>\n" 80a992afe8SEric Liu "#include <f>\n"; 819d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 8294a96fceSDaniel Jasper } 8394a96fceSDaniel Jasper 844c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 859d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 864c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 874c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 884c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 894c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 904c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 914c2c9c36SKrasimir Georgiev "\n" 924c2c9c36SKrasimir Georgiev "\n" 934c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 944c2c9c36SKrasimir Georgiev 959d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 964c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 974c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 984c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 994c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1004c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1014c2c9c36SKrasimir Georgiev "\n" 1024c2c9c36SKrasimir Georgiev "\n" 1034c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1044c2c9c36SKrasimir Georgiev } 1054c2c9c36SKrasimir Georgiev 1069b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1079b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1089b8c7c72SDaniel Jasper "#include <b>\n" 1099b8c7c72SDaniel Jasper "#include <c>\n" 1109b8c7c72SDaniel Jasper "// clang-format off\n" 1119b8c7c72SDaniel Jasper "#include <b>\n" 1129b8c7c72SDaniel Jasper "#include <a>\n" 1139b8c7c72SDaniel Jasper "#include <c>\n" 1149b8c7c72SDaniel Jasper "// clang-format on\n", 1159b8c7c72SDaniel Jasper sort("#include <b>\n" 1169b8c7c72SDaniel Jasper "#include <a>\n" 1179b8c7c72SDaniel Jasper "#include <c>\n" 1189b8c7c72SDaniel Jasper "// clang-format off\n" 1199b8c7c72SDaniel Jasper "#include <b>\n" 1209b8c7c72SDaniel Jasper "#include <a>\n" 1219b8c7c72SDaniel Jasper "#include <c>\n" 1229b8c7c72SDaniel Jasper "// clang-format on\n")); 1239b8c7c72SDaniel Jasper } 1249b8c7c72SDaniel Jasper 1259b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 1269b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 1279b468c0bSPaul Hoad "#include <b>\n" 1289b468c0bSPaul Hoad "#include <c>\n" 1299b468c0bSPaul Hoad "/* clang-format off */\n" 1309b468c0bSPaul Hoad "#include <b>\n" 1319b468c0bSPaul Hoad "#include <a>\n" 1329b468c0bSPaul Hoad "#include <c>\n" 1339b468c0bSPaul Hoad "/* clang-format on */\n", 1349b468c0bSPaul Hoad sort("#include <b>\n" 1359b468c0bSPaul Hoad "#include <a>\n" 1369b468c0bSPaul Hoad "#include <c>\n" 1379b468c0bSPaul Hoad "/* clang-format off */\n" 1389b468c0bSPaul Hoad "#include <b>\n" 1399b468c0bSPaul Hoad "#include <a>\n" 1409b468c0bSPaul Hoad "#include <c>\n" 1419b468c0bSPaul Hoad "/* clang-format on */\n")); 1429b468c0bSPaul Hoad 1439b468c0bSPaul Hoad // Not really turning it off 1449b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 1459b468c0bSPaul Hoad "#include <b>\n" 1469b468c0bSPaul Hoad "#include <c>\n" 1479b468c0bSPaul Hoad "/* clang-format offically */\n" 1489b468c0bSPaul Hoad "#include <a>\n" 1499b468c0bSPaul Hoad "#include <b>\n" 1509b468c0bSPaul Hoad "#include <c>\n" 1519b468c0bSPaul Hoad "/* clang-format onwards */\n", 1529b468c0bSPaul Hoad sort("#include <b>\n" 1539b468c0bSPaul Hoad "#include <a>\n" 1549b468c0bSPaul Hoad "#include <c>\n" 1559b468c0bSPaul Hoad "/* clang-format offically */\n" 1569b468c0bSPaul Hoad "#include <b>\n" 1579b468c0bSPaul Hoad "#include <a>\n" 1589b468c0bSPaul Hoad "#include <c>\n" 159925bb20cSKrasimir Georgiev "/* clang-format onwards */\n", "input.h", 2)); 1609b468c0bSPaul Hoad } 1619b468c0bSPaul Hoad 162da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 1639d92c027SEric Liu FmtStyle.SortIncludes = false; 164da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 165da446770SDaniel Jasper "#include \"c.h\"\n" 166da446770SDaniel Jasper "#include \"b.h\"\n", 167da446770SDaniel Jasper sort("#include \"a.h\"\n" 168da446770SDaniel Jasper "#include \"c.h\"\n" 169925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 170925bb20cSKrasimir Georgiev "input.h", 0)); 171da446770SDaniel Jasper } 172da446770SDaniel Jasper 173ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 174ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 175ff06370eSNico Weber "#import \"b.h\"\n" 176ff06370eSNico Weber "#include \"c.h\"\n", 177ff06370eSNico Weber sort("#include \"a.h\"\n" 178ff06370eSNico Weber "#include \"c.h\"\n" 179ff06370eSNico Weber "#import \"b.h\"\n")); 180ff06370eSNico Weber } 181ff06370eSNico Weber 182d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 183d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 184d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 185d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 186d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 187d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 188d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 189d89ae9d3SDaniel Jasper } 190d89ae9d3SDaniel Jasper 191d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 192d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 193d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 194d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 195d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 196d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 197d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 198d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 199d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 200d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 201d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 202d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 203d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 204d89ae9d3SDaniel Jasper } 205d89ae9d3SDaniel Jasper 206d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 207d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 208d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 209d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 210d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 211d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 212d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 213d89ae9d3SDaniel Jasper } 214d89ae9d3SDaniel Jasper 215d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 216d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 217d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 218d89ae9d3SDaniel Jasper "\n" 219d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 22085c472dcSDaniel Jasper sort("#include \"a.h\"\n" 22185c472dcSDaniel Jasper "#include \"c.h\"\n" 222d89ae9d3SDaniel Jasper "\n" 223925bb20cSKrasimir Georgiev "#include \"b.h\"\n", "input.h", 0)); 224d89ae9d3SDaniel Jasper } 225d89ae9d3SDaniel Jasper 2264c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 2279d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2284c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2294c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 2304c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 2314c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 2324c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2334c2c9c36SKrasimir Georgiev "\n" 2344c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2354c2c9c36SKrasimir Georgiev } 2364c2c9c36SKrasimir Georgiev 2374c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 2384c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2394c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2404c2c9c36SKrasimir Georgiev "// comment\n" 2414c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2424c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2434c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2444c2c9c36SKrasimir Georgiev "// comment\n" 2454c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2464c2c9c36SKrasimir Georgiev 2479d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2484c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2494c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2504c2c9c36SKrasimir Georgiev "// comment\n" 2514c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2524c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2534c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2544c2c9c36SKrasimir Georgiev "// comment\n" 2554c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2564c2c9c36SKrasimir Georgiev 2579d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 2584c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2594c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2604c2c9c36SKrasimir Georgiev "// comment\n" 2614c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2624c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2634c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2644c2c9c36SKrasimir Georgiev "// comment\n" 2654c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2664c2c9c36SKrasimir Georgiev } 2674c2c9c36SKrasimir Georgiev 268d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 26985c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 27085c472dcSDaniel Jasper "#include \"c.h\"\n" 2710f4d5f85SEric Liu "#include <array>\n" 27285c472dcSDaniel Jasper "#include <b.h>\n" 2730f4d5f85SEric Liu "#include <d.h>\n" 2740f4d5f85SEric Liu "#include <vector>\n", 2750f4d5f85SEric Liu sort("#include <vector>\n" 2760f4d5f85SEric Liu "#include <d.h>\n" 2770f4d5f85SEric Liu "#include <array>\n" 27885c472dcSDaniel Jasper "#include <b.h>\n" 27985c472dcSDaniel Jasper "#include \"c.h\"\n" 28085c472dcSDaniel Jasper "#include \"a.h\"\n")); 28185c472dcSDaniel Jasper 2829d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 283d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 284d89ae9d3SDaniel Jasper "#include <d.h>\n" 2850f4d5f85SEric Liu "\n" 2860f4d5f85SEric Liu "#include <array>\n" 2870f4d5f85SEric Liu "#include <vector>\n" 2880f4d5f85SEric Liu "\n" 289d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 290d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 2910f4d5f85SEric Liu sort("#include <vector>\n" 2920f4d5f85SEric Liu "#include <d.h>\n" 2930f4d5f85SEric Liu "#include <array>\n" 294d89ae9d3SDaniel Jasper "#include <b.h>\n" 295d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 296d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 297d89ae9d3SDaniel Jasper } 298d89ae9d3SDaniel Jasper 2994c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 3009d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3014c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3024c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3034c2c9c36SKrasimir Georgiev "\n" 3044c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3054c2c9c36SKrasimir Georgiev "#include <d.h>\n", 3064c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 3074c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3084c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3094c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 3104c2c9c36SKrasimir Georgiev } 3114c2c9c36SKrasimir Georgiev 312d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 313d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 314d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 315d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 316d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 317d89ae9d3SDaniel Jasper "#include \\\n" 318d89ae9d3SDaniel Jasper "\"c.h\"\n" 319d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 320d89ae9d3SDaniel Jasper } 321d89ae9d3SDaniel Jasper 32285c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 3239c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 32485c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 32585c472dcSDaniel Jasper "#include \"b.h\"\n" 32685c472dcSDaniel Jasper "#include \"c.h\"\n", 32785c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 32885c472dcSDaniel Jasper "#include \"c.h\"\n" 3290bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 3300bfdeb4bSDaniel Jasper "a.cc")); 331afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 332afa62faeSNico Weber "#include \"b.h\"\n" 333afa62faeSNico Weber "#include \"c.h\"\n", 334afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 335afa62faeSNico Weber "#include \"c.h\"\n" 336afa62faeSNico Weber "#include \"b.h\"\n", 3379c8ff355SDaniel Jasper "a_test.cc")); 3380bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 3390bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 3400bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 3410bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 3420bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 3430bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 344afa62faeSNico Weber "input.mm")); 34585c472dcSDaniel Jasper 3469c8ff355SDaniel Jasper // Don't allow prefixes. 3479c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3489c8ff355SDaniel Jasper "#include \"c.h\"\n" 3499c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 3509c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 3519c8ff355SDaniel Jasper "#include \"c.h\"\n" 3529c8ff355SDaniel Jasper "#include \"b.h\"\n", 3539c8ff355SDaniel Jasper "a.cc")); 3549c8ff355SDaniel Jasper 3559c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 3569c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3579c8ff355SDaniel Jasper "#include \"c.h\"\n" 3589c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 3599c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 3609c8ff355SDaniel Jasper "#include \"c.h\"\n" 3619c8ff355SDaniel Jasper "#include \"b.h\"\n", 3629c8ff355SDaniel Jasper "a_main.cc")); 3639c8ff355SDaniel Jasper 36485c472dcSDaniel Jasper // Don't do this in headers. 36585c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 36685c472dcSDaniel Jasper "#include \"c.h\"\n" 36785c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 36885c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 36985c472dcSDaniel Jasper "#include \"c.h\"\n" 37085c472dcSDaniel Jasper "#include \"b.h\"\n", 3710bfdeb4bSDaniel Jasper "a.h")); 37232d75fa2SDaniel Jasper 37332d75fa2SDaniel Jasper // Only do this in the first #include block. 37432d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 37532d75fa2SDaniel Jasper "\n" 37632d75fa2SDaniel Jasper "#include \"b.h\"\n" 37732d75fa2SDaniel Jasper "#include \"c.h\"\n" 37832d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 37932d75fa2SDaniel Jasper sort("#include <a>\n" 38032d75fa2SDaniel Jasper "\n" 38132d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 38232d75fa2SDaniel Jasper "#include \"c.h\"\n" 38332d75fa2SDaniel Jasper "#include \"b.h\"\n", 38432d75fa2SDaniel Jasper "a.cc")); 385a252f5d5SDaniel Jasper 386a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 387a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 388a252f5d5SDaniel Jasper "#include \"b.h\"\n" 389a252f5d5SDaniel Jasper "#include \"c.h\"\n" 390a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 391a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 392a252f5d5SDaniel Jasper "#include \"a.h\"\n" 393a252f5d5SDaniel Jasper "#include \"c.h\"\n" 394a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 395a252f5d5SDaniel Jasper "a.cc")); 39685c472dcSDaniel Jasper } 39785c472dcSDaniel Jasper 3984c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 3994c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 4009d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 4014c2c9c36SKrasimir Georgiev 4024c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 4034c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4044c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 4054c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 4064c2c9c36SKrasimir Georgiev "\n" 4074c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4084c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4094c2c9c36SKrasimir Georgiev "c.cc")); 4104c2c9c36SKrasimir Georgiev } 4114c2c9c36SKrasimir Georgiev 4124c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 4134c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 4149d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4154c2c9c36SKrasimir Georgiev 4164c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4174c2c9c36SKrasimir Georgiev "\n" 4184c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 4194c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4204c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 4214c2c9c36SKrasimir Georgiev "\n" 4224c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4234c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4244c2c9c36SKrasimir Georgiev "a.cc")); 4254c2c9c36SKrasimir Georgiev } 4264c2c9c36SKrasimir Georgiev 427d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 428d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 429d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 430d676ab13SChandler Carruth 431d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 432d676ab13SChandler Carruth // manner. 433d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 434d676ab13SChandler Carruth "#include \"b.h\"\n" 435d676ab13SChandler Carruth "#include \"c.h\"\n" 436d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 437d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 438d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 439d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 440d676ab13SChandler Carruth sort("#include \"c.h\"\n" 441d676ab13SChandler Carruth "#include \"b.h\"\n" 442d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 443d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 444d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 445d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 446d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 447d676ab13SChandler Carruth "a_TEST.cc")); 448d676ab13SChandler Carruth } 449d676ab13SChandler Carruth 450d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 451d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 452d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4530bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4540bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4550bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 4560bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 4570bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 4580bfdeb4bSDaniel Jasper "c_main.cc")); 4590bfdeb4bSDaniel Jasper 4600bfdeb4bSDaniel Jasper // check stable when re-run 4610bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4620bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4630bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4640bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 4650bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4660bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 467925bb20cSKrasimir Georgiev "c_main.cc", 0)); 468d2629dc8SDaniel Jasper } 469d2629dc8SDaniel Jasper 4704c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 4714c2c9c36SKrasimir Georgiev Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 4729d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4734c2c9c36SKrasimir Georgiev 4744c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4754c2c9c36SKrasimir Georgiev "\n" 4764c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4774c2c9c36SKrasimir Georgiev "\n" 4784c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4794c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 4804c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 4814c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 4824c2c9c36SKrasimir Georgiev "c_main.cc")); 4834c2c9c36SKrasimir Georgiev 4844c2c9c36SKrasimir Georgiev // check stable when re-run 4854c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4864c2c9c36SKrasimir Georgiev "\n" 4874c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4884c2c9c36SKrasimir Georgiev "\n" 4894c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4904c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 4914c2c9c36SKrasimir Georgiev "\n" 4924c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4934c2c9c36SKrasimir Georgiev "\n" 4944c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 495925bb20cSKrasimir Georgiev "c_main.cc", 0)); 4964c2c9c36SKrasimir Georgiev } 4974c2c9c36SKrasimir Georgiev 498b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 499b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 500b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 501b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 502b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 503b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 504b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 505b68aabf7SDaniel Jasper 506b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 507b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 508b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 509b68aabf7SDaniel Jasper } 510b68aabf7SDaniel Jasper 511a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 512a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 513a992afe8SEric Liu "#include <b>\n" 514a992afe8SEric Liu "#include <c>\n", 515a992afe8SEric Liu sort("#include <a>\n" 516a992afe8SEric Liu "#include <b>\n" 517a992afe8SEric Liu "#include <b>\n" 518a992afe8SEric Liu "#include <b>\n" 519a992afe8SEric Liu "#include <b>\n" 520a992afe8SEric Liu "#include <c>\n")); 5214c2c9c36SKrasimir Georgiev 5229d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5234c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5244c2c9c36SKrasimir Georgiev "#include <b>\n" 5254c2c9c36SKrasimir Georgiev "#include <c>\n", 5264c2c9c36SKrasimir Georgiev sort("#include <a>\n" 5274c2c9c36SKrasimir Georgiev "#include <b>\n" 5284c2c9c36SKrasimir Georgiev "\n" 5294c2c9c36SKrasimir Georgiev "#include <b>\n" 5304c2c9c36SKrasimir Georgiev "\n" 5314c2c9c36SKrasimir Georgiev "#include <b>\n" 5324c2c9c36SKrasimir Georgiev "#include <c>\n")); 5334c2c9c36SKrasimir Georgiev 5349d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5354c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5364c2c9c36SKrasimir Georgiev "#include <b>\n" 5374c2c9c36SKrasimir Georgiev "#include <c>\n", 5384c2c9c36SKrasimir Georgiev sort("#include <a>\n" 5394c2c9c36SKrasimir Georgiev "#include <b>\n" 5404c2c9c36SKrasimir Georgiev "\n" 5414c2c9c36SKrasimir Georgiev "#include <b>\n" 5424c2c9c36SKrasimir Georgiev "\n" 5434c2c9c36SKrasimir Georgiev "#include <b>\n" 5444c2c9c36SKrasimir Georgiev "#include <c>\n")); 545a992afe8SEric Liu } 546a992afe8SEric Liu 547a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 548a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 549a992afe8SEric Liu "#include <b>\n" 550a992afe8SEric Liu "#include <c>\n", 551a992afe8SEric Liu sort("#include <b>\n" 552a992afe8SEric Liu "#include <a>\n" 553a992afe8SEric Liu "#include <b>\n" 554a992afe8SEric Liu "#include <b>\n" 555a992afe8SEric Liu "#include <c>\n" 556a992afe8SEric Liu "#include <b>\n")); 5574c2c9c36SKrasimir Georgiev 5589d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5594c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5604c2c9c36SKrasimir Georgiev "#include <b>\n" 5614c2c9c36SKrasimir Georgiev "#include <c>\n", 5624c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5634c2c9c36SKrasimir Georgiev "#include <a>\n" 5644c2c9c36SKrasimir Georgiev "\n" 5654c2c9c36SKrasimir Georgiev "#include <b>\n" 5664c2c9c36SKrasimir Georgiev "\n" 5674c2c9c36SKrasimir Georgiev "#include <c>\n" 5684c2c9c36SKrasimir Georgiev "#include <b>\n")); 5694c2c9c36SKrasimir Georgiev 5709d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5714c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5724c2c9c36SKrasimir Georgiev "#include <b>\n" 5734c2c9c36SKrasimir Georgiev "#include <c>\n", 5744c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5754c2c9c36SKrasimir Georgiev "#include <a>\n" 5764c2c9c36SKrasimir Georgiev "\n" 5774c2c9c36SKrasimir Georgiev "#include <b>\n" 5784c2c9c36SKrasimir Georgiev "\n" 5794c2c9c36SKrasimir Georgiev "#include <c>\n" 5804c2c9c36SKrasimir Georgiev "#include <b>\n")); 581a992afe8SEric Liu } 582a992afe8SEric Liu 583a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 584a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 585a992afe8SEric Liu "#include <a>\n" // Start of line: 13 586a992afe8SEric Liu "#include <b>\n" // Start of line: 26 587a992afe8SEric Liu "#include <b>\n" // Start of line: 39 588a992afe8SEric Liu "#include <c>\n" // Start of line: 52 589a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 590a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 591a992afe8SEric Liu "#include <b>\n" // Start of line: 13 592a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 593a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 594a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 595a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 596a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 597a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 598a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 599a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 600a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 601a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 602a992afe8SEric Liu // Cursor on '#' in "#include <c>". 603a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 604a992afe8SEric Liu } 605a992afe8SEric Liu 606a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 607a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 608a992afe8SEric Liu "#include <b>\n" 609a992afe8SEric Liu "\n" 610a992afe8SEric Liu "#include <b>\n" 611a992afe8SEric Liu "#include <c>\n", 612a992afe8SEric Liu sort("#include <a>\n" 613a992afe8SEric Liu "#include <b>\n" 614a992afe8SEric Liu "\n" 615a992afe8SEric Liu "#include <c>\n" 616a992afe8SEric Liu "#include <b>\n" 617a992afe8SEric Liu "#include <b>\n")); 618a992afe8SEric Liu } 619a992afe8SEric Liu 620a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 621a992afe8SEric Liu std::string Code = "#include <a>\n" 622a992afe8SEric Liu "#include <b>\n" 623a992afe8SEric Liu "#include <a>\n" 624a992afe8SEric Liu "#include <a>\n" 625a992afe8SEric Liu "\n" 626a992afe8SEric Liu " int x ;"; 627a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 6289d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 629a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 630a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 631a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 632a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 633a992afe8SEric Liu } 634a992afe8SEric Liu 635a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 636a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 637a2e7d0deSKrasimir Georgiev "#include <b>\n" 638a2e7d0deSKrasimir Georgiev "#include <a>\n" 639a2e7d0deSKrasimir Georgiev "-->", 640a2e7d0deSKrasimir Georgiev sort("<!--;\n" 641a2e7d0deSKrasimir Georgiev "#include <b>\n" 642a2e7d0deSKrasimir Georgiev "#include <a>\n" 643925bb20cSKrasimir Georgiev "-->", "input.h", 0)); 644925bb20cSKrasimir Georgiev } 645925bb20cSKrasimir Georgiev 646925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 647925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 648925bb20cSKrasimir Georgiev std::string Code = R"( 649925bb20cSKrasimir Georgiev #include "b.h" 650925bb20cSKrasimir Georgiev 651925bb20cSKrasimir Georgiev #include <a.h> 652925bb20cSKrasimir Georgiev )"; 653925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 654a2e7d0deSKrasimir Georgiev } 655a2e7d0deSKrasimir Georgiev 656*00e7ae9fSKrasimir Georgiev 657*00e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 658*00e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 659*00e7ae9fSKrasimir Georgiev 660*00e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 661*00e7ae9fSKrasimir Georgiev "#include <b.h>\n" 662*00e7ae9fSKrasimir Georgiev "#include \"a.h\"", 663*00e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 664*00e7ae9fSKrasimir Georgiev "#include <a.h>\n" 665*00e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 666*00e7ae9fSKrasimir Georgiev } 667*00e7ae9fSKrasimir Georgiev 668d89ae9d3SDaniel Jasper } // end namespace 669d89ae9d3SDaniel Jasper } // end namespace format 670d89ae9d3SDaniel Jasper } // end namespace clang 671