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 7352e44b14SPaul Hoad TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) { 7452e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7552e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeCategories = { 7652e44b14SPaul Hoad {"^<sys/param\\.h>", 1, 0}, 7752e44b14SPaul Hoad {"^<sys/types\\.h>", 1, 1}, 7852e44b14SPaul Hoad {"^<sys.*/", 1, 2}, 7952e44b14SPaul Hoad {"^<uvm/", 2, 3}, 8052e44b14SPaul Hoad {"^<machine/", 3, 4}, 8152e44b14SPaul Hoad {"^<dev/", 4, 5}, 8252e44b14SPaul Hoad {"^<net.*/", 5, 6}, 8352e44b14SPaul Hoad {"^<protocols/", 5, 7}, 8452e44b14SPaul Hoad {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8}, 8552e44b14SPaul Hoad {"^<(x86|amd64|i386|xen)/", 7, 8}, 8652e44b14SPaul Hoad {"<path", 9, 11}, 8752e44b14SPaul Hoad {"^<[^/].*\\.h>", 8, 10}, 8852e44b14SPaul Hoad {"^\".*\\.h\"", 10, 12}}; 8952e44b14SPaul Hoad EXPECT_EQ("#include <sys/param.h>\n" 9052e44b14SPaul Hoad "#include <sys/types.h>\n" 9152e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 9252e44b14SPaul Hoad "#include <sys/socket.h>\n" 9352e44b14SPaul Hoad "#include <sys/stat.h>\n" 9452e44b14SPaul Hoad "#include <sys/wait.h>\n" 9552e44b14SPaul Hoad "\n" 9652e44b14SPaul Hoad "#include <net/if.h>\n" 9752e44b14SPaul Hoad "#include <net/if_dl.h>\n" 9852e44b14SPaul Hoad "#include <net/route.h>\n" 9952e44b14SPaul Hoad "#include <netinet/in.h>\n" 10052e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 10152e44b14SPaul Hoad "\n" 10252e44b14SPaul Hoad "#include <assert.h>\n" 10352e44b14SPaul Hoad "#include <errno.h>\n" 10452e44b14SPaul Hoad "#include <inttypes.h>\n" 10552e44b14SPaul Hoad "#include <stdio.h>\n" 10652e44b14SPaul Hoad "#include <stdlib.h>\n" 10752e44b14SPaul Hoad "\n" 10852e44b14SPaul Hoad "#include <paths.h>\n" 10952e44b14SPaul Hoad "\n" 11052e44b14SPaul Hoad "#include \"pathnames.h\"\n", 11152e44b14SPaul Hoad sort("#include <sys/param.h>\n" 11252e44b14SPaul Hoad "#include <sys/types.h>\n" 11352e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 11452e44b14SPaul Hoad "#include <net/if_dl.h>\n" 11552e44b14SPaul Hoad "#include <net/route.h>\n" 11652e44b14SPaul Hoad "#include <netinet/in.h>\n" 11752e44b14SPaul Hoad "#include <sys/socket.h>\n" 11852e44b14SPaul Hoad "#include <sys/stat.h>\n" 11952e44b14SPaul Hoad "#include <sys/wait.h>\n" 12052e44b14SPaul Hoad "#include <net/if.h>\n" 12152e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 12252e44b14SPaul Hoad "#include <assert.h>\n" 12352e44b14SPaul Hoad "#include <paths.h>\n" 12452e44b14SPaul Hoad "#include \"pathnames.h\"\n" 12552e44b14SPaul Hoad "#include <errno.h>\n" 12652e44b14SPaul Hoad "#include <inttypes.h>\n" 12752e44b14SPaul Hoad "#include <stdio.h>\n" 12852e44b14SPaul Hoad "#include <stdlib.h>\n")); 12952e44b14SPaul Hoad } 13052e44b14SPaul Hoad TEST_F(SortIncludesTest, SortPriorityNotDefined) { 13152e44b14SPaul Hoad FmtStyle = getLLVMStyle(); 13252e44b14SPaul Hoad EXPECT_EQ("#include \"FormatTestUtils.h\"\n" 13352e44b14SPaul Hoad "#include \"clang/Format/Format.h\"\n" 13452e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13552e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n" 13652e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n", 13752e44b14SPaul Hoad sort("#include \"clang/Format/Format.h\"\n" 13852e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13952e44b14SPaul Hoad "#include \"FormatTestUtils.h\"\n" 14052e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n" 14152e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n")); 14252e44b14SPaul Hoad } 14352e44b14SPaul Hoad 14494a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 14594a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 14694a96fceSDaniel Jasper std::string Code = "#include <a>\n" 14794a96fceSDaniel Jasper "#include <b>\n" 148a992afe8SEric Liu "#include <c>\n" 149a992afe8SEric Liu "#include <d>\n" 150a992afe8SEric Liu "#include <e>\n" 151a992afe8SEric Liu "#include <f>\n"; 1529d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 15394a96fceSDaniel Jasper } 15494a96fceSDaniel Jasper 1554c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 1569d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1574c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1584c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1594c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1604c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1614c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1624c2c9c36SKrasimir Georgiev "\n" 1634c2c9c36SKrasimir Georgiev "\n" 1644c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1654c2c9c36SKrasimir Georgiev 1669d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 1674c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1684c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1694c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1704c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1714c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1724c2c9c36SKrasimir Georgiev "\n" 1734c2c9c36SKrasimir Georgiev "\n" 1744c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1754c2c9c36SKrasimir Georgiev } 1764c2c9c36SKrasimir Georgiev 1779b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1789b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1799b8c7c72SDaniel Jasper "#include <b>\n" 1809b8c7c72SDaniel Jasper "#include <c>\n" 1819b8c7c72SDaniel Jasper "// clang-format off\n" 1829b8c7c72SDaniel Jasper "#include <b>\n" 1839b8c7c72SDaniel Jasper "#include <a>\n" 1849b8c7c72SDaniel Jasper "#include <c>\n" 1859b8c7c72SDaniel Jasper "// clang-format on\n", 1869b8c7c72SDaniel Jasper sort("#include <b>\n" 1879b8c7c72SDaniel Jasper "#include <a>\n" 1889b8c7c72SDaniel Jasper "#include <c>\n" 1899b8c7c72SDaniel Jasper "// clang-format off\n" 1909b8c7c72SDaniel Jasper "#include <b>\n" 1919b8c7c72SDaniel Jasper "#include <a>\n" 1929b8c7c72SDaniel Jasper "#include <c>\n" 1939b8c7c72SDaniel Jasper "// clang-format on\n")); 1949b8c7c72SDaniel Jasper } 1959b8c7c72SDaniel Jasper 1969b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 1979b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 1989b468c0bSPaul Hoad "#include <b>\n" 1999b468c0bSPaul Hoad "#include <c>\n" 2009b468c0bSPaul Hoad "/* clang-format off */\n" 2019b468c0bSPaul Hoad "#include <b>\n" 2029b468c0bSPaul Hoad "#include <a>\n" 2039b468c0bSPaul Hoad "#include <c>\n" 2049b468c0bSPaul Hoad "/* clang-format on */\n", 2059b468c0bSPaul Hoad sort("#include <b>\n" 2069b468c0bSPaul Hoad "#include <a>\n" 2079b468c0bSPaul Hoad "#include <c>\n" 2089b468c0bSPaul Hoad "/* clang-format off */\n" 2099b468c0bSPaul Hoad "#include <b>\n" 2109b468c0bSPaul Hoad "#include <a>\n" 2119b468c0bSPaul Hoad "#include <c>\n" 2129b468c0bSPaul Hoad "/* clang-format on */\n")); 2139b468c0bSPaul Hoad 2149b468c0bSPaul Hoad // Not really turning it off 2159b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2169b468c0bSPaul Hoad "#include <b>\n" 2179b468c0bSPaul Hoad "#include <c>\n" 2189b468c0bSPaul Hoad "/* clang-format offically */\n" 2199b468c0bSPaul Hoad "#include <a>\n" 2209b468c0bSPaul Hoad "#include <b>\n" 2219b468c0bSPaul Hoad "#include <c>\n" 2229b468c0bSPaul Hoad "/* clang-format onwards */\n", 2239b468c0bSPaul Hoad sort("#include <b>\n" 2249b468c0bSPaul Hoad "#include <a>\n" 2259b468c0bSPaul Hoad "#include <c>\n" 2269b468c0bSPaul Hoad "/* clang-format offically */\n" 2279b468c0bSPaul Hoad "#include <b>\n" 2289b468c0bSPaul Hoad "#include <a>\n" 2299b468c0bSPaul Hoad "#include <c>\n" 230925bb20cSKrasimir Georgiev "/* clang-format onwards */\n", "input.h", 2)); 2319b468c0bSPaul Hoad } 2329b468c0bSPaul Hoad 233da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 2349d92c027SEric Liu FmtStyle.SortIncludes = false; 235da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 236da446770SDaniel Jasper "#include \"c.h\"\n" 237da446770SDaniel Jasper "#include \"b.h\"\n", 238da446770SDaniel Jasper sort("#include \"a.h\"\n" 239da446770SDaniel Jasper "#include \"c.h\"\n" 240925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 241925bb20cSKrasimir Georgiev "input.h", 0)); 242da446770SDaniel Jasper } 243da446770SDaniel Jasper 244ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 245ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 246ff06370eSNico Weber "#import \"b.h\"\n" 247ff06370eSNico Weber "#include \"c.h\"\n", 248ff06370eSNico Weber sort("#include \"a.h\"\n" 249ff06370eSNico Weber "#include \"c.h\"\n" 250ff06370eSNico Weber "#import \"b.h\"\n")); 251ff06370eSNico Weber } 252ff06370eSNico Weber 253d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 254d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 255d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 256d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 257d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 258d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 259d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 260d89ae9d3SDaniel Jasper } 261d89ae9d3SDaniel Jasper 262d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 263d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 264d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 265d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 266d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 267d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 268d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 269d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 270d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 271d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 272d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 273d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 274d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 275d89ae9d3SDaniel Jasper } 276d89ae9d3SDaniel Jasper 277d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 278d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 279d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 280d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 281d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 282d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 283d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 284d89ae9d3SDaniel Jasper } 285d89ae9d3SDaniel Jasper 286d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 287d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 288d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 289d89ae9d3SDaniel Jasper "\n" 290d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 29185c472dcSDaniel Jasper sort("#include \"a.h\"\n" 29285c472dcSDaniel Jasper "#include \"c.h\"\n" 293d89ae9d3SDaniel Jasper "\n" 294925bb20cSKrasimir Georgiev "#include \"b.h\"\n", "input.h", 0)); 295d89ae9d3SDaniel Jasper } 296d89ae9d3SDaniel Jasper 2974c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 2989d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2994c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3004c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3014c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3024c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 3034c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3044c2c9c36SKrasimir Georgiev "\n" 3054c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3064c2c9c36SKrasimir Georgiev } 3074c2c9c36SKrasimir Georgiev 3084c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 3094c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3104c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3114c2c9c36SKrasimir Georgiev "// comment\n" 3124c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3134c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3144c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3154c2c9c36SKrasimir Georgiev "// comment\n" 3164c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3174c2c9c36SKrasimir Georgiev 3189d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3194c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3204c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3214c2c9c36SKrasimir Georgiev "// comment\n" 3224c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3234c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3244c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3254c2c9c36SKrasimir Georgiev "// comment\n" 3264c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3274c2c9c36SKrasimir Georgiev 3289d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3294c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3304c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3314c2c9c36SKrasimir Georgiev "// comment\n" 3324c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3334c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3344c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3354c2c9c36SKrasimir Georgiev "// comment\n" 3364c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3374c2c9c36SKrasimir Georgiev } 3384c2c9c36SKrasimir Georgiev 339d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 34085c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 34185c472dcSDaniel Jasper "#include \"c.h\"\n" 3420f4d5f85SEric Liu "#include <array>\n" 34385c472dcSDaniel Jasper "#include <b.h>\n" 3440f4d5f85SEric Liu "#include <d.h>\n" 3450f4d5f85SEric Liu "#include <vector>\n", 3460f4d5f85SEric Liu sort("#include <vector>\n" 3470f4d5f85SEric Liu "#include <d.h>\n" 3480f4d5f85SEric Liu "#include <array>\n" 34985c472dcSDaniel Jasper "#include <b.h>\n" 35085c472dcSDaniel Jasper "#include \"c.h\"\n" 35185c472dcSDaniel Jasper "#include \"a.h\"\n")); 35285c472dcSDaniel Jasper 3539d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 354d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 355d89ae9d3SDaniel Jasper "#include <d.h>\n" 3560f4d5f85SEric Liu "\n" 3570f4d5f85SEric Liu "#include <array>\n" 3580f4d5f85SEric Liu "#include <vector>\n" 3590f4d5f85SEric Liu "\n" 360d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 361d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 3620f4d5f85SEric Liu sort("#include <vector>\n" 3630f4d5f85SEric Liu "#include <d.h>\n" 3640f4d5f85SEric Liu "#include <array>\n" 365d89ae9d3SDaniel Jasper "#include <b.h>\n" 366d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 367d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 368d89ae9d3SDaniel Jasper } 369d89ae9d3SDaniel Jasper 3704c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 3719d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3724c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3734c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3744c2c9c36SKrasimir Georgiev "\n" 3754c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3764c2c9c36SKrasimir Georgiev "#include <d.h>\n", 3774c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 3784c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3794c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3804c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 3814c2c9c36SKrasimir Georgiev } 3824c2c9c36SKrasimir Georgiev 383d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 384d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 385d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 386d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 387d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 388d89ae9d3SDaniel Jasper "#include \\\n" 389d89ae9d3SDaniel Jasper "\"c.h\"\n" 390d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 391d89ae9d3SDaniel Jasper } 392d89ae9d3SDaniel Jasper 39385c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 3949c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 39585c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 39685c472dcSDaniel Jasper "#include \"b.h\"\n" 39785c472dcSDaniel Jasper "#include \"c.h\"\n", 39885c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 39985c472dcSDaniel Jasper "#include \"c.h\"\n" 4000bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 4010bfdeb4bSDaniel Jasper "a.cc")); 402afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 403afa62faeSNico Weber "#include \"b.h\"\n" 404afa62faeSNico Weber "#include \"c.h\"\n", 405afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 406afa62faeSNico Weber "#include \"c.h\"\n" 407afa62faeSNico Weber "#include \"b.h\"\n", 4089c8ff355SDaniel Jasper "a_test.cc")); 4090bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 4100bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 4110bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 4120bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 4130bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 4140bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 415afa62faeSNico Weber "input.mm")); 41685c472dcSDaniel Jasper 4179c8ff355SDaniel Jasper // Don't allow prefixes. 4189c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4199c8ff355SDaniel Jasper "#include \"c.h\"\n" 4209c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 4219c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 4229c8ff355SDaniel Jasper "#include \"c.h\"\n" 4239c8ff355SDaniel Jasper "#include \"b.h\"\n", 4249c8ff355SDaniel Jasper "a.cc")); 4259c8ff355SDaniel Jasper 4269c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 4279c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4289c8ff355SDaniel Jasper "#include \"c.h\"\n" 4299c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 4309c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 4319c8ff355SDaniel Jasper "#include \"c.h\"\n" 4329c8ff355SDaniel Jasper "#include \"b.h\"\n", 4339c8ff355SDaniel Jasper "a_main.cc")); 4349c8ff355SDaniel Jasper 43585c472dcSDaniel Jasper // Don't do this in headers. 43685c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 43785c472dcSDaniel Jasper "#include \"c.h\"\n" 43885c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 43985c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 44085c472dcSDaniel Jasper "#include \"c.h\"\n" 44185c472dcSDaniel Jasper "#include \"b.h\"\n", 4420bfdeb4bSDaniel Jasper "a.h")); 44332d75fa2SDaniel Jasper 44432d75fa2SDaniel Jasper // Only do this in the first #include block. 44532d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 44632d75fa2SDaniel Jasper "\n" 44732d75fa2SDaniel Jasper "#include \"b.h\"\n" 44832d75fa2SDaniel Jasper "#include \"c.h\"\n" 44932d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 45032d75fa2SDaniel Jasper sort("#include <a>\n" 45132d75fa2SDaniel Jasper "\n" 45232d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 45332d75fa2SDaniel Jasper "#include \"c.h\"\n" 45432d75fa2SDaniel Jasper "#include \"b.h\"\n", 45532d75fa2SDaniel Jasper "a.cc")); 456a252f5d5SDaniel Jasper 457a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 458a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 459a252f5d5SDaniel Jasper "#include \"b.h\"\n" 460a252f5d5SDaniel Jasper "#include \"c.h\"\n" 461a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 462a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 463a252f5d5SDaniel Jasper "#include \"a.h\"\n" 464a252f5d5SDaniel Jasper "#include \"c.h\"\n" 465a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 466a252f5d5SDaniel Jasper "a.cc")); 46785c472dcSDaniel Jasper } 46885c472dcSDaniel Jasper 4694c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 4704c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 4719d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 4724c2c9c36SKrasimir Georgiev 4734c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 4744c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4754c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 4764c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 4774c2c9c36SKrasimir Georgiev "\n" 4784c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4794c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4804c2c9c36SKrasimir Georgiev "c.cc")); 4814c2c9c36SKrasimir Georgiev } 4824c2c9c36SKrasimir Georgiev 4834c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 4844c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 4859d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4864c2c9c36SKrasimir Georgiev 4874c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4884c2c9c36SKrasimir Georgiev "\n" 4894c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 4904c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4914c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 4924c2c9c36SKrasimir Georgiev "\n" 4934c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4944c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 4954c2c9c36SKrasimir Georgiev "a.cc")); 4964c2c9c36SKrasimir Georgiev } 4974c2c9c36SKrasimir Georgiev 498d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 499d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 500d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 501d676ab13SChandler Carruth 502d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 503d676ab13SChandler Carruth // manner. 504d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 505d676ab13SChandler Carruth "#include \"b.h\"\n" 506d676ab13SChandler Carruth "#include \"c.h\"\n" 507d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 508d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 509d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 510d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 511d676ab13SChandler Carruth sort("#include \"c.h\"\n" 512d676ab13SChandler Carruth "#include \"b.h\"\n" 513d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 514d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 515d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 516d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 517d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 518d676ab13SChandler Carruth "a_TEST.cc")); 519d676ab13SChandler Carruth } 520d676ab13SChandler Carruth 521d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 52243fd14caSMikael Holmen Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; 523d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 5240bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5250bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 5260bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 5270bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 5280bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 5290bfdeb4bSDaniel Jasper "c_main.cc")); 5300bfdeb4bSDaniel Jasper 5310bfdeb4bSDaniel Jasper // check stable when re-run 5320bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 5330bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5340bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 5350bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 5360bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5370bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 538925bb20cSKrasimir Georgiev "c_main.cc", 0)); 539d2629dc8SDaniel Jasper } 540d2629dc8SDaniel Jasper 5414c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 54243fd14caSMikael Holmen Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; 5439d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5444c2c9c36SKrasimir Georgiev 5454c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 5464c2c9c36SKrasimir Georgiev "\n" 5474c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 5484c2c9c36SKrasimir Georgiev "\n" 5494c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 5504c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 5514c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 5524c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 5534c2c9c36SKrasimir Georgiev "c_main.cc")); 5544c2c9c36SKrasimir Georgiev 5554c2c9c36SKrasimir Georgiev // check stable when re-run 5564c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 5574c2c9c36SKrasimir Georgiev "\n" 5584c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 5594c2c9c36SKrasimir Georgiev "\n" 5604c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 5614c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 5624c2c9c36SKrasimir Georgiev "\n" 5634c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 5644c2c9c36SKrasimir Georgiev "\n" 5654c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 566925bb20cSKrasimir Georgiev "c_main.cc", 0)); 5674c2c9c36SKrasimir Georgiev } 5684c2c9c36SKrasimir Georgiev 569b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 570b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 571b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 572b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 573b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 574b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 575b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 576b68aabf7SDaniel Jasper 577b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 578b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 579b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 580b68aabf7SDaniel Jasper } 581b68aabf7SDaniel Jasper 582a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 583a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 584a992afe8SEric Liu "#include <b>\n" 585a992afe8SEric Liu "#include <c>\n", 586a992afe8SEric Liu sort("#include <a>\n" 587a992afe8SEric Liu "#include <b>\n" 588a992afe8SEric Liu "#include <b>\n" 589a992afe8SEric Liu "#include <b>\n" 590a992afe8SEric Liu "#include <b>\n" 591a992afe8SEric Liu "#include <c>\n")); 5924c2c9c36SKrasimir Georgiev 5939d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5944c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5954c2c9c36SKrasimir Georgiev "#include <b>\n" 5964c2c9c36SKrasimir Georgiev "#include <c>\n", 5974c2c9c36SKrasimir Georgiev sort("#include <a>\n" 5984c2c9c36SKrasimir Georgiev "#include <b>\n" 5994c2c9c36SKrasimir Georgiev "\n" 6004c2c9c36SKrasimir Georgiev "#include <b>\n" 6014c2c9c36SKrasimir Georgiev "\n" 6024c2c9c36SKrasimir Georgiev "#include <b>\n" 6034c2c9c36SKrasimir Georgiev "#include <c>\n")); 6044c2c9c36SKrasimir Georgiev 6059d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6064c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6074c2c9c36SKrasimir Georgiev "#include <b>\n" 6084c2c9c36SKrasimir Georgiev "#include <c>\n", 6094c2c9c36SKrasimir Georgiev sort("#include <a>\n" 6104c2c9c36SKrasimir Georgiev "#include <b>\n" 6114c2c9c36SKrasimir Georgiev "\n" 6124c2c9c36SKrasimir Georgiev "#include <b>\n" 6134c2c9c36SKrasimir Georgiev "\n" 6144c2c9c36SKrasimir Georgiev "#include <b>\n" 6154c2c9c36SKrasimir Georgiev "#include <c>\n")); 616a992afe8SEric Liu } 617a992afe8SEric Liu 618a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 619a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 620a992afe8SEric Liu "#include <b>\n" 621a992afe8SEric Liu "#include <c>\n", 622a992afe8SEric Liu sort("#include <b>\n" 623a992afe8SEric Liu "#include <a>\n" 624a992afe8SEric Liu "#include <b>\n" 625a992afe8SEric Liu "#include <b>\n" 626a992afe8SEric Liu "#include <c>\n" 627a992afe8SEric Liu "#include <b>\n")); 6284c2c9c36SKrasimir Georgiev 6299d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 6304c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6314c2c9c36SKrasimir Georgiev "#include <b>\n" 6324c2c9c36SKrasimir Georgiev "#include <c>\n", 6334c2c9c36SKrasimir Georgiev sort("#include <b>\n" 6344c2c9c36SKrasimir Georgiev "#include <a>\n" 6354c2c9c36SKrasimir Georgiev "\n" 6364c2c9c36SKrasimir Georgiev "#include <b>\n" 6374c2c9c36SKrasimir Georgiev "\n" 6384c2c9c36SKrasimir Georgiev "#include <c>\n" 6394c2c9c36SKrasimir Georgiev "#include <b>\n")); 6404c2c9c36SKrasimir Georgiev 6419d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6424c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6434c2c9c36SKrasimir Georgiev "#include <b>\n" 6444c2c9c36SKrasimir Georgiev "#include <c>\n", 6454c2c9c36SKrasimir Georgiev sort("#include <b>\n" 6464c2c9c36SKrasimir Georgiev "#include <a>\n" 6474c2c9c36SKrasimir Georgiev "\n" 6484c2c9c36SKrasimir Georgiev "#include <b>\n" 6494c2c9c36SKrasimir Georgiev "\n" 6504c2c9c36SKrasimir Georgiev "#include <c>\n" 6514c2c9c36SKrasimir Georgiev "#include <b>\n")); 652a992afe8SEric Liu } 653a992afe8SEric Liu 654a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 655a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 656a992afe8SEric Liu "#include <a>\n" // Start of line: 13 657a992afe8SEric Liu "#include <b>\n" // Start of line: 26 658a992afe8SEric Liu "#include <b>\n" // Start of line: 39 659a992afe8SEric Liu "#include <c>\n" // Start of line: 52 660a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 661a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 662a992afe8SEric Liu "#include <b>\n" // Start of line: 13 663a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 664a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 665a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 666a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 667a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 668a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 669a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 670a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 671a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 672a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 673a992afe8SEric Liu // Cursor on '#' in "#include <c>". 674a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 675a992afe8SEric Liu } 676a992afe8SEric Liu 677a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 678a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 679a992afe8SEric Liu "#include <b>\n" 680a992afe8SEric Liu "\n" 681a992afe8SEric Liu "#include <b>\n" 682a992afe8SEric Liu "#include <c>\n", 683a992afe8SEric Liu sort("#include <a>\n" 684a992afe8SEric Liu "#include <b>\n" 685a992afe8SEric Liu "\n" 686a992afe8SEric Liu "#include <c>\n" 687a992afe8SEric Liu "#include <b>\n" 688a992afe8SEric Liu "#include <b>\n")); 689a992afe8SEric Liu } 690a992afe8SEric Liu 691a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 692a992afe8SEric Liu std::string Code = "#include <a>\n" 693a992afe8SEric Liu "#include <b>\n" 694a992afe8SEric Liu "#include <a>\n" 695a992afe8SEric Liu "#include <a>\n" 696a992afe8SEric Liu "\n" 697a992afe8SEric Liu " int x ;"; 698a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 6999d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 700a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 701a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 702a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 703a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 704a992afe8SEric Liu } 705a992afe8SEric Liu 706a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 707a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 708a2e7d0deSKrasimir Georgiev "#include <b>\n" 709a2e7d0deSKrasimir Georgiev "#include <a>\n" 710a2e7d0deSKrasimir Georgiev "-->", 711a2e7d0deSKrasimir Georgiev sort("<!--;\n" 712a2e7d0deSKrasimir Georgiev "#include <b>\n" 713a2e7d0deSKrasimir Georgiev "#include <a>\n" 714925bb20cSKrasimir Georgiev "-->", "input.h", 0)); 715925bb20cSKrasimir Georgiev } 716925bb20cSKrasimir Georgiev 717925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 718925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 719925bb20cSKrasimir Georgiev std::string Code = R"( 720925bb20cSKrasimir Georgiev #include "b.h" 721925bb20cSKrasimir Georgiev 722925bb20cSKrasimir Georgiev #include <a.h> 723925bb20cSKrasimir Georgiev )"; 724925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 725a2e7d0deSKrasimir Georgiev } 726a2e7d0deSKrasimir Georgiev 727*60365021SPaul Hoad TEST_F(SortIncludesTest, 728*60365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 729*60365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 730*60365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 731*60365021SPaul Hoad "\r\n" 732*60365021SPaul Hoad "#include <a.h>\r\n"; 733*60365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 734*60365021SPaul Hoad } 73500e7ae9fSKrasimir Georgiev 73600e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 73700e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 73800e7ae9fSKrasimir Georgiev 73900e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 74000e7ae9fSKrasimir Georgiev "#include <b.h>\n" 74100e7ae9fSKrasimir Georgiev "#include \"a.h\"", 74200e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 74300e7ae9fSKrasimir Georgiev "#include <a.h>\n" 74400e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 74500e7ae9fSKrasimir Georgiev } 74600e7ae9fSKrasimir Georgiev 747d89ae9d3SDaniel Jasper } // end namespace 748d89ae9d3SDaniel Jasper } // end namespace format 749d89ae9d3SDaniel Jasper } // end namespace clang 750