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" 11d89ae9d3SDaniel Jasper #include "llvm/Support/Debug.h" 12d89ae9d3SDaniel Jasper #include "gtest/gtest.h" 13d89ae9d3SDaniel Jasper 14d89ae9d3SDaniel Jasper #define DEBUG_TYPE "format-test" 15d89ae9d3SDaniel Jasper 16d89ae9d3SDaniel Jasper namespace clang { 17d89ae9d3SDaniel Jasper namespace format { 18d89ae9d3SDaniel Jasper namespace { 19d89ae9d3SDaniel Jasper 20d89ae9d3SDaniel Jasper class SortIncludesTest : public ::testing::Test { 21d89ae9d3SDaniel Jasper protected: 2294a96fceSDaniel Jasper std::vector<tooling::Range> GetCodeRange(StringRef Code) { 2394a96fceSDaniel Jasper return std::vector<tooling::Range>(1, tooling::Range(0, Code.size())); 2494a96fceSDaniel Jasper } 2594a96fceSDaniel Jasper 26d6a00780SDaniel Jasper std::string sort(StringRef Code, std::vector<tooling::Range> Ranges, 27d6a00780SDaniel Jasper StringRef FileName = "input.cc") { 289d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName); 29a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 30a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 314f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 324f8d9943SEric Liu auto Result = applyAllReplacements( 339d92c027SEric Liu *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName)); 344f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 354f8d9943SEric Liu return *Result; 36d89ae9d3SDaniel Jasper } 3785c472dcSDaniel Jasper 38d6a00780SDaniel Jasper std::string sort(StringRef Code, StringRef FileName = "input.cpp") { 39d6a00780SDaniel Jasper return sort(Code, GetCodeRange(Code), FileName); 40d6a00780SDaniel Jasper } 41d6a00780SDaniel Jasper 42b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 439d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 44b68aabf7SDaniel Jasper return Cursor; 45b68aabf7SDaniel Jasper } 46b68aabf7SDaniel Jasper 479d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 489d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 49d89ae9d3SDaniel Jasper }; 50d89ae9d3SDaniel Jasper 51d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 52d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 53d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 54d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 55d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 56d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 57d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 58d6a00780SDaniel Jasper 59d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 60d6a00780SDaniel Jasper "#include <a>\n" 61d6a00780SDaniel Jasper "#include <b>\n", 62d6a00780SDaniel Jasper sort("// comment\n" 63d6a00780SDaniel Jasper "#include <b>\n" 64d6a00780SDaniel Jasper "#include <a>\n", 65d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 66d89ae9d3SDaniel Jasper } 67d89ae9d3SDaniel Jasper 6894a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 6994a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 7094a96fceSDaniel Jasper std::string Code = "#include <a>\n" 7194a96fceSDaniel Jasper "#include <b>\n" 72a992afe8SEric Liu "#include <c>\n" 73a992afe8SEric Liu "#include <d>\n" 74a992afe8SEric Liu "#include <e>\n" 75a992afe8SEric Liu "#include <f>\n"; 769d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 7794a96fceSDaniel Jasper } 7894a96fceSDaniel Jasper 794c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 809d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 814c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 824c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 834c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 844c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 854c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 864c2c9c36SKrasimir Georgiev "\n" 874c2c9c36SKrasimir Georgiev "\n" 884c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 894c2c9c36SKrasimir Georgiev 909d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 914c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 924c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 934c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 944c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 954c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 964c2c9c36SKrasimir Georgiev "\n" 974c2c9c36SKrasimir Georgiev "\n" 984c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 994c2c9c36SKrasimir Georgiev } 1004c2c9c36SKrasimir Georgiev 1019b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1029b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1039b8c7c72SDaniel Jasper "#include <b>\n" 1049b8c7c72SDaniel Jasper "#include <c>\n" 1059b8c7c72SDaniel Jasper "// clang-format off\n" 1069b8c7c72SDaniel Jasper "#include <b>\n" 1079b8c7c72SDaniel Jasper "#include <a>\n" 1089b8c7c72SDaniel Jasper "#include <c>\n" 1099b8c7c72SDaniel Jasper "// clang-format on\n", 1109b8c7c72SDaniel Jasper sort("#include <b>\n" 1119b8c7c72SDaniel Jasper "#include <a>\n" 1129b8c7c72SDaniel Jasper "#include <c>\n" 1139b8c7c72SDaniel Jasper "// clang-format off\n" 1149b8c7c72SDaniel Jasper "#include <b>\n" 1159b8c7c72SDaniel Jasper "#include <a>\n" 1169b8c7c72SDaniel Jasper "#include <c>\n" 1179b8c7c72SDaniel Jasper "// clang-format on\n")); 1189b8c7c72SDaniel Jasper } 1199b8c7c72SDaniel Jasper 120*9b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 121*9b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 122*9b468c0bSPaul Hoad "#include <b>\n" 123*9b468c0bSPaul Hoad "#include <c>\n" 124*9b468c0bSPaul Hoad "/* clang-format off */\n" 125*9b468c0bSPaul Hoad "#include <b>\n" 126*9b468c0bSPaul Hoad "#include <a>\n" 127*9b468c0bSPaul Hoad "#include <c>\n" 128*9b468c0bSPaul Hoad "/* clang-format on */\n", 129*9b468c0bSPaul Hoad sort("#include <b>\n" 130*9b468c0bSPaul Hoad "#include <a>\n" 131*9b468c0bSPaul Hoad "#include <c>\n" 132*9b468c0bSPaul Hoad "/* clang-format off */\n" 133*9b468c0bSPaul Hoad "#include <b>\n" 134*9b468c0bSPaul Hoad "#include <a>\n" 135*9b468c0bSPaul Hoad "#include <c>\n" 136*9b468c0bSPaul Hoad "/* clang-format on */\n")); 137*9b468c0bSPaul Hoad 138*9b468c0bSPaul Hoad // Not really turning it off 139*9b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 140*9b468c0bSPaul Hoad "#include <b>\n" 141*9b468c0bSPaul Hoad "#include <c>\n" 142*9b468c0bSPaul Hoad "/* clang-format offically */\n" 143*9b468c0bSPaul Hoad "#include <a>\n" 144*9b468c0bSPaul Hoad "#include <b>\n" 145*9b468c0bSPaul Hoad "#include <c>\n" 146*9b468c0bSPaul Hoad "/* clang-format onwards */\n", 147*9b468c0bSPaul Hoad sort("#include <b>\n" 148*9b468c0bSPaul Hoad "#include <a>\n" 149*9b468c0bSPaul Hoad "#include <c>\n" 150*9b468c0bSPaul Hoad "/* clang-format offically */\n" 151*9b468c0bSPaul Hoad "#include <b>\n" 152*9b468c0bSPaul Hoad "#include <a>\n" 153*9b468c0bSPaul Hoad "#include <c>\n" 154*9b468c0bSPaul Hoad "/* clang-format onwards */\n")); 155*9b468c0bSPaul Hoad } 156*9b468c0bSPaul Hoad 157da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 1589d92c027SEric Liu FmtStyle.SortIncludes = false; 159da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 160da446770SDaniel Jasper "#include \"c.h\"\n" 161da446770SDaniel Jasper "#include \"b.h\"\n", 162da446770SDaniel Jasper sort("#include \"a.h\"\n" 163da446770SDaniel Jasper "#include \"c.h\"\n" 164da446770SDaniel Jasper "#include \"b.h\"\n")); 165da446770SDaniel Jasper } 166da446770SDaniel Jasper 167ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 168ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 169ff06370eSNico Weber "#import \"b.h\"\n" 170ff06370eSNico Weber "#include \"c.h\"\n", 171ff06370eSNico Weber sort("#include \"a.h\"\n" 172ff06370eSNico Weber "#include \"c.h\"\n" 173ff06370eSNico Weber "#import \"b.h\"\n")); 174ff06370eSNico Weber } 175ff06370eSNico Weber 176d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 177d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 178d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 179d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 180d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 181d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 182d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 183d89ae9d3SDaniel Jasper } 184d89ae9d3SDaniel Jasper 185d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 186d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 187d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 188d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 189d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 190d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 191d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 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 } 199d89ae9d3SDaniel Jasper 200d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 201d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 202d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 203d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 204d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 205d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 206d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 207d89ae9d3SDaniel Jasper } 208d89ae9d3SDaniel Jasper 209d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 210d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 211d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 212d89ae9d3SDaniel Jasper "\n" 213d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 21485c472dcSDaniel Jasper sort("#include \"a.h\"\n" 21585c472dcSDaniel Jasper "#include \"c.h\"\n" 216d89ae9d3SDaniel Jasper "\n" 217d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 218d89ae9d3SDaniel Jasper } 219d89ae9d3SDaniel Jasper 2204c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 2219d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2224c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2234c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 2244c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 2254c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 2264c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2274c2c9c36SKrasimir Georgiev "\n" 2284c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2294c2c9c36SKrasimir Georgiev } 2304c2c9c36SKrasimir Georgiev 2314c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 2324c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2334c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2344c2c9c36SKrasimir Georgiev "// comment\n" 2354c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2364c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2374c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2384c2c9c36SKrasimir Georgiev "// comment\n" 2394c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2404c2c9c36SKrasimir Georgiev 2419d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2424c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2434c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2444c2c9c36SKrasimir Georgiev "// comment\n" 2454c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2464c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2474c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2484c2c9c36SKrasimir Georgiev "// comment\n" 2494c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2504c2c9c36SKrasimir Georgiev 2519d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 2524c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2534c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2544c2c9c36SKrasimir Georgiev "// comment\n" 2554c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2564c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2574c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2584c2c9c36SKrasimir Georgiev "// comment\n" 2594c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2604c2c9c36SKrasimir Georgiev } 2614c2c9c36SKrasimir Georgiev 262d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 26385c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 26485c472dcSDaniel Jasper "#include \"c.h\"\n" 26585c472dcSDaniel Jasper "#include <b.h>\n" 26685c472dcSDaniel Jasper "#include <d.h>\n", 26785c472dcSDaniel Jasper sort("#include <d.h>\n" 26885c472dcSDaniel Jasper "#include <b.h>\n" 26985c472dcSDaniel Jasper "#include \"c.h\"\n" 27085c472dcSDaniel Jasper "#include \"a.h\"\n")); 27185c472dcSDaniel Jasper 2729d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 273d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 274d89ae9d3SDaniel Jasper "#include <d.h>\n" 275d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 276d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 277d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 278d89ae9d3SDaniel Jasper "#include <b.h>\n" 279d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 280d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 281d89ae9d3SDaniel Jasper } 282d89ae9d3SDaniel Jasper 2834c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 2849d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 2854c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2864c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2874c2c9c36SKrasimir Georgiev "\n" 2884c2c9c36SKrasimir Georgiev "#include <b.h>\n" 2894c2c9c36SKrasimir Georgiev "#include <d.h>\n", 2904c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 2914c2c9c36SKrasimir Georgiev "#include <b.h>\n" 2924c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2934c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 2944c2c9c36SKrasimir Georgiev } 2954c2c9c36SKrasimir Georgiev 296d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 297d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 298d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 299d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 300d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 301d89ae9d3SDaniel Jasper "#include \\\n" 302d89ae9d3SDaniel Jasper "\"c.h\"\n" 303d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 304d89ae9d3SDaniel Jasper } 305d89ae9d3SDaniel Jasper 30685c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 3079c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 30885c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 30985c472dcSDaniel Jasper "#include \"b.h\"\n" 31085c472dcSDaniel Jasper "#include \"c.h\"\n", 31185c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 31285c472dcSDaniel Jasper "#include \"c.h\"\n" 3130bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 3140bfdeb4bSDaniel Jasper "a.cc")); 315afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 316afa62faeSNico Weber "#include \"b.h\"\n" 317afa62faeSNico Weber "#include \"c.h\"\n", 318afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 319afa62faeSNico Weber "#include \"c.h\"\n" 320afa62faeSNico Weber "#include \"b.h\"\n", 3219c8ff355SDaniel Jasper "a_test.cc")); 3220bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 3230bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 3240bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 3250bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 3260bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 3270bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 328afa62faeSNico Weber "input.mm")); 32985c472dcSDaniel Jasper 3309c8ff355SDaniel Jasper // Don't allow prefixes. 3319c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3329c8ff355SDaniel Jasper "#include \"c.h\"\n" 3339c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 3349c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 3359c8ff355SDaniel Jasper "#include \"c.h\"\n" 3369c8ff355SDaniel Jasper "#include \"b.h\"\n", 3379c8ff355SDaniel Jasper "a.cc")); 3389c8ff355SDaniel Jasper 3399c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 3409c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3419c8ff355SDaniel Jasper "#include \"c.h\"\n" 3429c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 3439c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 3449c8ff355SDaniel Jasper "#include \"c.h\"\n" 3459c8ff355SDaniel Jasper "#include \"b.h\"\n", 3469c8ff355SDaniel Jasper "a_main.cc")); 3479c8ff355SDaniel Jasper 34885c472dcSDaniel Jasper // Don't do this in headers. 34985c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 35085c472dcSDaniel Jasper "#include \"c.h\"\n" 35185c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 35285c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 35385c472dcSDaniel Jasper "#include \"c.h\"\n" 35485c472dcSDaniel Jasper "#include \"b.h\"\n", 3550bfdeb4bSDaniel Jasper "a.h")); 35632d75fa2SDaniel Jasper 35732d75fa2SDaniel Jasper // Only do this in the first #include block. 35832d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 35932d75fa2SDaniel Jasper "\n" 36032d75fa2SDaniel Jasper "#include \"b.h\"\n" 36132d75fa2SDaniel Jasper "#include \"c.h\"\n" 36232d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 36332d75fa2SDaniel Jasper sort("#include <a>\n" 36432d75fa2SDaniel Jasper "\n" 36532d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 36632d75fa2SDaniel Jasper "#include \"c.h\"\n" 36732d75fa2SDaniel Jasper "#include \"b.h\"\n", 36832d75fa2SDaniel Jasper "a.cc")); 369a252f5d5SDaniel Jasper 370a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 371a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 372a252f5d5SDaniel Jasper "#include \"b.h\"\n" 373a252f5d5SDaniel Jasper "#include \"c.h\"\n" 374a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 375a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 376a252f5d5SDaniel Jasper "#include \"a.h\"\n" 377a252f5d5SDaniel Jasper "#include \"c.h\"\n" 378a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 379a252f5d5SDaniel Jasper "a.cc")); 38085c472dcSDaniel Jasper } 38185c472dcSDaniel Jasper 3824c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 3834c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 3849d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3854c2c9c36SKrasimir Georgiev 3864c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 3874c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3884c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3894c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 3904c2c9c36SKrasimir Georgiev "\n" 3914c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3924c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3934c2c9c36SKrasimir Georgiev "c.cc")); 3944c2c9c36SKrasimir Georgiev } 3954c2c9c36SKrasimir Georgiev 3964c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 3974c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 3989d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3994c2c9c36SKrasimir Georgiev 4004c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4014c2c9c36SKrasimir Georgiev "\n" 4024c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 4034c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4044c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 4054c2c9c36SKrasimir Georgiev "\n" 4064c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4074c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4084c2c9c36SKrasimir Georgiev "a.cc")); 4094c2c9c36SKrasimir Georgiev } 4104c2c9c36SKrasimir Georgiev 411d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 412d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 413d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 414d676ab13SChandler Carruth 415d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 416d676ab13SChandler Carruth // manner. 417d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 418d676ab13SChandler Carruth "#include \"b.h\"\n" 419d676ab13SChandler Carruth "#include \"c.h\"\n" 420d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 421d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 422d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 423d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 424d676ab13SChandler Carruth sort("#include \"c.h\"\n" 425d676ab13SChandler Carruth "#include \"b.h\"\n" 426d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 427d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 428d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 429d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 430d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 431d676ab13SChandler Carruth "a_TEST.cc")); 432d676ab13SChandler Carruth } 433d676ab13SChandler Carruth 434d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 435d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 436d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4370bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4380bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4390bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 4400bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 4410bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 4420bfdeb4bSDaniel Jasper "c_main.cc")); 4430bfdeb4bSDaniel Jasper 4440bfdeb4bSDaniel Jasper // check stable when re-run 4450bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4460bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4470bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4480bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 4490bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4500bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4510bfdeb4bSDaniel Jasper "c_main.cc")); 452d2629dc8SDaniel Jasper } 453d2629dc8SDaniel Jasper 4544c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 4554c2c9c36SKrasimir Georgiev Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 4569d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4574c2c9c36SKrasimir Georgiev 4584c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4594c2c9c36SKrasimir Georgiev "\n" 4604c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4614c2c9c36SKrasimir Georgiev "\n" 4624c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4634c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 4644c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 4654c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 4664c2c9c36SKrasimir Georgiev "c_main.cc")); 4674c2c9c36SKrasimir Georgiev 4684c2c9c36SKrasimir Georgiev // check stable when re-run 4694c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4704c2c9c36SKrasimir Georgiev "\n" 4714c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4724c2c9c36SKrasimir Georgiev "\n" 4734c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4744c2c9c36SKrasimir Georgiev sort("#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 "c_main.cc")); 4804c2c9c36SKrasimir Georgiev } 4814c2c9c36SKrasimir Georgiev 482b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 483b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 484b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 485b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 486b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 487b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 488b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 489b68aabf7SDaniel Jasper 490b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 491b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 492b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 493b68aabf7SDaniel Jasper } 494b68aabf7SDaniel Jasper 495a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 496a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 497a992afe8SEric Liu "#include <b>\n" 498a992afe8SEric Liu "#include <c>\n", 499a992afe8SEric Liu sort("#include <a>\n" 500a992afe8SEric Liu "#include <b>\n" 501a992afe8SEric Liu "#include <b>\n" 502a992afe8SEric Liu "#include <b>\n" 503a992afe8SEric Liu "#include <b>\n" 504a992afe8SEric Liu "#include <c>\n")); 5054c2c9c36SKrasimir Georgiev 5069d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5074c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5084c2c9c36SKrasimir Georgiev "#include <b>\n" 5094c2c9c36SKrasimir Georgiev "#include <c>\n", 5104c2c9c36SKrasimir Georgiev sort("#include <a>\n" 5114c2c9c36SKrasimir Georgiev "#include <b>\n" 5124c2c9c36SKrasimir Georgiev "\n" 5134c2c9c36SKrasimir Georgiev "#include <b>\n" 5144c2c9c36SKrasimir Georgiev "\n" 5154c2c9c36SKrasimir Georgiev "#include <b>\n" 5164c2c9c36SKrasimir Georgiev "#include <c>\n")); 5174c2c9c36SKrasimir Georgiev 5189d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5194c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5204c2c9c36SKrasimir Georgiev "#include <b>\n" 5214c2c9c36SKrasimir Georgiev "#include <c>\n", 5224c2c9c36SKrasimir Georgiev sort("#include <a>\n" 5234c2c9c36SKrasimir Georgiev "#include <b>\n" 5244c2c9c36SKrasimir Georgiev "\n" 5254c2c9c36SKrasimir Georgiev "#include <b>\n" 5264c2c9c36SKrasimir Georgiev "\n" 5274c2c9c36SKrasimir Georgiev "#include <b>\n" 5284c2c9c36SKrasimir Georgiev "#include <c>\n")); 529a992afe8SEric Liu } 530a992afe8SEric Liu 531a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 532a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 533a992afe8SEric Liu "#include <b>\n" 534a992afe8SEric Liu "#include <c>\n", 535a992afe8SEric Liu sort("#include <b>\n" 536a992afe8SEric Liu "#include <a>\n" 537a992afe8SEric Liu "#include <b>\n" 538a992afe8SEric Liu "#include <b>\n" 539a992afe8SEric Liu "#include <c>\n" 540a992afe8SEric Liu "#include <b>\n")); 5414c2c9c36SKrasimir Georgiev 5429d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5434c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5444c2c9c36SKrasimir Georgiev "#include <b>\n" 5454c2c9c36SKrasimir Georgiev "#include <c>\n", 5464c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5474c2c9c36SKrasimir Georgiev "#include <a>\n" 5484c2c9c36SKrasimir Georgiev "\n" 5494c2c9c36SKrasimir Georgiev "#include <b>\n" 5504c2c9c36SKrasimir Georgiev "\n" 5514c2c9c36SKrasimir Georgiev "#include <c>\n" 5524c2c9c36SKrasimir Georgiev "#include <b>\n")); 5534c2c9c36SKrasimir Georgiev 5549d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5554c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5564c2c9c36SKrasimir Georgiev "#include <b>\n" 5574c2c9c36SKrasimir Georgiev "#include <c>\n", 5584c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5594c2c9c36SKrasimir Georgiev "#include <a>\n" 5604c2c9c36SKrasimir Georgiev "\n" 5614c2c9c36SKrasimir Georgiev "#include <b>\n" 5624c2c9c36SKrasimir Georgiev "\n" 5634c2c9c36SKrasimir Georgiev "#include <c>\n" 5644c2c9c36SKrasimir Georgiev "#include <b>\n")); 565a992afe8SEric Liu } 566a992afe8SEric Liu 567a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 568a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 569a992afe8SEric Liu "#include <a>\n" // Start of line: 13 570a992afe8SEric Liu "#include <b>\n" // Start of line: 26 571a992afe8SEric Liu "#include <b>\n" // Start of line: 39 572a992afe8SEric Liu "#include <c>\n" // Start of line: 52 573a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 574a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 575a992afe8SEric Liu "#include <b>\n" // Start of line: 13 576a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 577a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 578a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 579a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 580a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 581a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 582a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 583a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 584a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 585a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 586a992afe8SEric Liu // Cursor on '#' in "#include <c>". 587a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 588a992afe8SEric Liu } 589a992afe8SEric Liu 590a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 591a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 592a992afe8SEric Liu "#include <b>\n" 593a992afe8SEric Liu "\n" 594a992afe8SEric Liu "#include <b>\n" 595a992afe8SEric Liu "#include <c>\n", 596a992afe8SEric Liu sort("#include <a>\n" 597a992afe8SEric Liu "#include <b>\n" 598a992afe8SEric Liu "\n" 599a992afe8SEric Liu "#include <c>\n" 600a992afe8SEric Liu "#include <b>\n" 601a992afe8SEric Liu "#include <b>\n")); 602a992afe8SEric Liu } 603a992afe8SEric Liu 604a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 605a992afe8SEric Liu std::string Code = "#include <a>\n" 606a992afe8SEric Liu "#include <b>\n" 607a992afe8SEric Liu "#include <a>\n" 608a992afe8SEric Liu "#include <a>\n" 609a992afe8SEric Liu "\n" 610a992afe8SEric Liu " int x ;"; 611a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 6129d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 613a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 614a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 615a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 616a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 617a992afe8SEric Liu } 618a992afe8SEric Liu 619a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 620a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 621a2e7d0deSKrasimir Georgiev "#include <b>\n" 622a2e7d0deSKrasimir Georgiev "#include <a>\n" 623a2e7d0deSKrasimir Georgiev "-->", 624a2e7d0deSKrasimir Georgiev sort("<!--;\n" 625a2e7d0deSKrasimir Georgiev "#include <b>\n" 626a2e7d0deSKrasimir Georgiev "#include <a>\n" 627a2e7d0deSKrasimir Georgiev "-->")); 628a2e7d0deSKrasimir Georgiev } 629a2e7d0deSKrasimir Georgiev 630d89ae9d3SDaniel Jasper } // end namespace 631d89ae9d3SDaniel Jasper } // end namespace format 632d89ae9d3SDaniel Jasper } // end namespace clang 633