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 41ece7e95fSmydeveloperday std::string sort(StringRef Code, StringRef FileName = "input.cpp", 42925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 43925bb20cSKrasimir Georgiev return sort(Code, GetCodeRange(Code), FileName, ExpectedNumRanges); 44d6a00780SDaniel Jasper } 45d6a00780SDaniel Jasper 46b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 479d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 48b68aabf7SDaniel Jasper return Cursor; 49b68aabf7SDaniel Jasper } 50b68aabf7SDaniel Jasper 519d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 529d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 53d89ae9d3SDaniel Jasper }; 54d89ae9d3SDaniel Jasper 55d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 56d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 57d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 59d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 60d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 61d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 62d6a00780SDaniel Jasper 63d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 64d6a00780SDaniel Jasper "#include <a>\n" 65d6a00780SDaniel Jasper "#include <b>\n", 66d6a00780SDaniel Jasper sort("// comment\n" 67d6a00780SDaniel Jasper "#include <b>\n" 68d6a00780SDaniel Jasper "#include <a>\n", 69d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 70d89ae9d3SDaniel Jasper } 71d89ae9d3SDaniel Jasper 7252e44b14SPaul Hoad TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) { 7352e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7452e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeCategories = { 7552e44b14SPaul Hoad {"^<sys/param\\.h>", 1, 0}, 7652e44b14SPaul Hoad {"^<sys/types\\.h>", 1, 1}, 7752e44b14SPaul Hoad {"^<sys.*/", 1, 2}, 7852e44b14SPaul Hoad {"^<uvm/", 2, 3}, 7952e44b14SPaul Hoad {"^<machine/", 3, 4}, 8052e44b14SPaul Hoad {"^<dev/", 4, 5}, 8152e44b14SPaul Hoad {"^<net.*/", 5, 6}, 8252e44b14SPaul Hoad {"^<protocols/", 5, 7}, 8352e44b14SPaul Hoad {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8}, 8452e44b14SPaul Hoad {"^<(x86|amd64|i386|xen)/", 7, 8}, 8552e44b14SPaul Hoad {"<path", 9, 11}, 8652e44b14SPaul Hoad {"^<[^/].*\\.h>", 8, 10}, 8752e44b14SPaul Hoad {"^\".*\\.h\"", 10, 12}}; 8852e44b14SPaul Hoad EXPECT_EQ("#include <sys/param.h>\n" 8952e44b14SPaul Hoad "#include <sys/types.h>\n" 9052e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 9152e44b14SPaul Hoad "#include <sys/socket.h>\n" 9252e44b14SPaul Hoad "#include <sys/stat.h>\n" 9352e44b14SPaul Hoad "#include <sys/wait.h>\n" 9452e44b14SPaul Hoad "\n" 9552e44b14SPaul Hoad "#include <net/if.h>\n" 9652e44b14SPaul Hoad "#include <net/if_dl.h>\n" 9752e44b14SPaul Hoad "#include <net/route.h>\n" 9852e44b14SPaul Hoad "#include <netinet/in.h>\n" 9952e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 10052e44b14SPaul Hoad "\n" 10152e44b14SPaul Hoad "#include <assert.h>\n" 10252e44b14SPaul Hoad "#include <errno.h>\n" 10352e44b14SPaul Hoad "#include <inttypes.h>\n" 10452e44b14SPaul Hoad "#include <stdio.h>\n" 10552e44b14SPaul Hoad "#include <stdlib.h>\n" 10652e44b14SPaul Hoad "\n" 10752e44b14SPaul Hoad "#include <paths.h>\n" 10852e44b14SPaul Hoad "\n" 10952e44b14SPaul Hoad "#include \"pathnames.h\"\n", 11052e44b14SPaul Hoad sort("#include <sys/param.h>\n" 11152e44b14SPaul Hoad "#include <sys/types.h>\n" 11252e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 11352e44b14SPaul Hoad "#include <net/if_dl.h>\n" 11452e44b14SPaul Hoad "#include <net/route.h>\n" 11552e44b14SPaul Hoad "#include <netinet/in.h>\n" 11652e44b14SPaul Hoad "#include <sys/socket.h>\n" 11752e44b14SPaul Hoad "#include <sys/stat.h>\n" 11852e44b14SPaul Hoad "#include <sys/wait.h>\n" 11952e44b14SPaul Hoad "#include <net/if.h>\n" 12052e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 12152e44b14SPaul Hoad "#include <assert.h>\n" 12252e44b14SPaul Hoad "#include <paths.h>\n" 12352e44b14SPaul Hoad "#include \"pathnames.h\"\n" 12452e44b14SPaul Hoad "#include <errno.h>\n" 12552e44b14SPaul Hoad "#include <inttypes.h>\n" 12652e44b14SPaul Hoad "#include <stdio.h>\n" 12752e44b14SPaul Hoad "#include <stdlib.h>\n")); 12852e44b14SPaul Hoad } 12952e44b14SPaul Hoad TEST_F(SortIncludesTest, SortPriorityNotDefined) { 13052e44b14SPaul Hoad FmtStyle = getLLVMStyle(); 13152e44b14SPaul Hoad EXPECT_EQ("#include \"FormatTestUtils.h\"\n" 13252e44b14SPaul Hoad "#include \"clang/Format/Format.h\"\n" 13352e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13452e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n" 13552e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n", 13652e44b14SPaul Hoad sort("#include \"clang/Format/Format.h\"\n" 13752e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13852e44b14SPaul Hoad "#include \"FormatTestUtils.h\"\n" 13952e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n" 14052e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n")); 14152e44b14SPaul Hoad } 14252e44b14SPaul Hoad 14394a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 14494a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 14594a96fceSDaniel Jasper std::string Code = "#include <a>\n" 14694a96fceSDaniel Jasper "#include <b>\n" 147a992afe8SEric Liu "#include <c>\n" 148a992afe8SEric Liu "#include <d>\n" 149a992afe8SEric Liu "#include <e>\n" 150a992afe8SEric Liu "#include <f>\n"; 1519d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 15294a96fceSDaniel Jasper } 15394a96fceSDaniel Jasper 154*c1b209ccSHaojian Wu TEST_F(SortIncludesTest, NoMainFileHeader) { 155*c1b209ccSHaojian Wu std::string Code = "#include <string>\n" 156*c1b209ccSHaojian Wu "\n" 157*c1b209ccSHaojian Wu "#include \"a/extra_action.proto.h\"\n"; 158*c1b209ccSHaojian Wu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 159*c1b209ccSHaojian Wu EXPECT_TRUE( 160*c1b209ccSHaojian Wu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a/extra_action.cc") 161*c1b209ccSHaojian Wu .empty()); 162*c1b209ccSHaojian Wu } 163*c1b209ccSHaojian Wu 1644c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 1659d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1664c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1674c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1684c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1694c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1704c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1714c2c9c36SKrasimir Georgiev "\n" 1724c2c9c36SKrasimir Georgiev "\n" 1734c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1744c2c9c36SKrasimir Georgiev 1759d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 1764c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1774c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1784c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1794c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1804c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1814c2c9c36SKrasimir Georgiev "\n" 1824c2c9c36SKrasimir Georgiev "\n" 1834c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1844c2c9c36SKrasimir Georgiev } 1854c2c9c36SKrasimir Georgiev 1869b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1879b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1889b8c7c72SDaniel Jasper "#include <b>\n" 1899b8c7c72SDaniel Jasper "#include <c>\n" 1909b8c7c72SDaniel Jasper "// clang-format off\n" 1919b8c7c72SDaniel Jasper "#include <b>\n" 1929b8c7c72SDaniel Jasper "#include <a>\n" 1939b8c7c72SDaniel Jasper "#include <c>\n" 1949b8c7c72SDaniel Jasper "// clang-format on\n", 1959b8c7c72SDaniel Jasper sort("#include <b>\n" 1969b8c7c72SDaniel Jasper "#include <a>\n" 1979b8c7c72SDaniel Jasper "#include <c>\n" 1989b8c7c72SDaniel Jasper "// clang-format off\n" 1999b8c7c72SDaniel Jasper "#include <b>\n" 2009b8c7c72SDaniel Jasper "#include <a>\n" 2019b8c7c72SDaniel Jasper "#include <c>\n" 2029b8c7c72SDaniel Jasper "// clang-format on\n")); 2039b8c7c72SDaniel Jasper } 2049b8c7c72SDaniel Jasper 2059b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 2069b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2079b468c0bSPaul Hoad "#include <b>\n" 2089b468c0bSPaul Hoad "#include <c>\n" 2099b468c0bSPaul Hoad "/* clang-format off */\n" 2109b468c0bSPaul Hoad "#include <b>\n" 2119b468c0bSPaul Hoad "#include <a>\n" 2129b468c0bSPaul Hoad "#include <c>\n" 2139b468c0bSPaul Hoad "/* clang-format on */\n", 2149b468c0bSPaul Hoad sort("#include <b>\n" 2159b468c0bSPaul Hoad "#include <a>\n" 2169b468c0bSPaul Hoad "#include <c>\n" 2179b468c0bSPaul Hoad "/* clang-format off */\n" 2189b468c0bSPaul Hoad "#include <b>\n" 2199b468c0bSPaul Hoad "#include <a>\n" 2209b468c0bSPaul Hoad "#include <c>\n" 2219b468c0bSPaul Hoad "/* clang-format on */\n")); 2229b468c0bSPaul Hoad 2239b468c0bSPaul Hoad // Not really turning it off 2249b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2259b468c0bSPaul Hoad "#include <b>\n" 2269b468c0bSPaul Hoad "#include <c>\n" 2279b468c0bSPaul Hoad "/* clang-format offically */\n" 2289b468c0bSPaul Hoad "#include <a>\n" 2299b468c0bSPaul Hoad "#include <b>\n" 2309b468c0bSPaul Hoad "#include <c>\n" 2319b468c0bSPaul Hoad "/* clang-format onwards */\n", 2329b468c0bSPaul Hoad sort("#include <b>\n" 2339b468c0bSPaul Hoad "#include <a>\n" 2349b468c0bSPaul Hoad "#include <c>\n" 2359b468c0bSPaul Hoad "/* clang-format offically */\n" 2369b468c0bSPaul Hoad "#include <b>\n" 2379b468c0bSPaul Hoad "#include <a>\n" 2389b468c0bSPaul Hoad "#include <c>\n" 239ece7e95fSmydeveloperday "/* clang-format onwards */\n", 240ece7e95fSmydeveloperday "input.h", 2)); 2419b468c0bSPaul Hoad } 2429b468c0bSPaul Hoad 243da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 2449d92c027SEric Liu FmtStyle.SortIncludes = false; 245da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 246da446770SDaniel Jasper "#include \"c.h\"\n" 247da446770SDaniel Jasper "#include \"b.h\"\n", 248da446770SDaniel Jasper sort("#include \"a.h\"\n" 249da446770SDaniel Jasper "#include \"c.h\"\n" 250925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 251925bb20cSKrasimir Georgiev "input.h", 0)); 252da446770SDaniel Jasper } 253da446770SDaniel Jasper 254ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 255ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 256ff06370eSNico Weber "#import \"b.h\"\n" 257ff06370eSNico Weber "#include \"c.h\"\n", 258ff06370eSNico Weber sort("#include \"a.h\"\n" 259ff06370eSNico Weber "#include \"c.h\"\n" 260ff06370eSNico Weber "#import \"b.h\"\n")); 261ff06370eSNico Weber } 262ff06370eSNico Weber 263d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 264d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 265d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 266d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 267d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 268d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 269d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 270d89ae9d3SDaniel Jasper } 271d89ae9d3SDaniel Jasper 272d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 273d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 274d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 275d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 276d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 277d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 278d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 279d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 280d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 281d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 282d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 283d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 284d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 285d89ae9d3SDaniel Jasper } 286d89ae9d3SDaniel Jasper 287d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 288d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 289d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 290d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 291d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 292d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 293d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 294d89ae9d3SDaniel Jasper } 295d89ae9d3SDaniel Jasper 296d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 297d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 298d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 299d89ae9d3SDaniel Jasper "\n" 300d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 30185c472dcSDaniel Jasper sort("#include \"a.h\"\n" 30285c472dcSDaniel Jasper "#include \"c.h\"\n" 303d89ae9d3SDaniel Jasper "\n" 304ece7e95fSmydeveloperday "#include \"b.h\"\n", 305ece7e95fSmydeveloperday "input.h", 0)); 306d89ae9d3SDaniel Jasper } 307d89ae9d3SDaniel Jasper 3084c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 3099d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3104c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3114c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3124c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3134c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 3144c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3154c2c9c36SKrasimir Georgiev "\n" 3164c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3174c2c9c36SKrasimir Georgiev } 3184c2c9c36SKrasimir Georgiev 3194c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 3204c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3214c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3224c2c9c36SKrasimir Georgiev "// comment\n" 3234c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3244c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3254c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3264c2c9c36SKrasimir Georgiev "// comment\n" 3274c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3284c2c9c36SKrasimir Georgiev 3299d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3304c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3314c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3324c2c9c36SKrasimir Georgiev "// comment\n" 3334c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3344c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3354c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3364c2c9c36SKrasimir Georgiev "// comment\n" 3374c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3384c2c9c36SKrasimir Georgiev 3399d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3404c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3414c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3424c2c9c36SKrasimir Georgiev "// comment\n" 3434c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3444c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3454c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3464c2c9c36SKrasimir Georgiev "// comment\n" 3474c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3484c2c9c36SKrasimir Georgiev } 3494c2c9c36SKrasimir Georgiev 350d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 35185c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 35285c472dcSDaniel Jasper "#include \"c.h\"\n" 3530f4d5f85SEric Liu "#include <array>\n" 35485c472dcSDaniel Jasper "#include <b.h>\n" 3550f4d5f85SEric Liu "#include <d.h>\n" 3560f4d5f85SEric Liu "#include <vector>\n", 3570f4d5f85SEric Liu sort("#include <vector>\n" 3580f4d5f85SEric Liu "#include <d.h>\n" 3590f4d5f85SEric Liu "#include <array>\n" 36085c472dcSDaniel Jasper "#include <b.h>\n" 36185c472dcSDaniel Jasper "#include \"c.h\"\n" 36285c472dcSDaniel Jasper "#include \"a.h\"\n")); 36385c472dcSDaniel Jasper 3649d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 365d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 366d89ae9d3SDaniel Jasper "#include <d.h>\n" 3670f4d5f85SEric Liu "\n" 3680f4d5f85SEric Liu "#include <array>\n" 3690f4d5f85SEric Liu "#include <vector>\n" 3700f4d5f85SEric Liu "\n" 371d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 372d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 3730f4d5f85SEric Liu sort("#include <vector>\n" 3740f4d5f85SEric Liu "#include <d.h>\n" 3750f4d5f85SEric Liu "#include <array>\n" 376d89ae9d3SDaniel Jasper "#include <b.h>\n" 377d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 378d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 379d89ae9d3SDaniel Jasper } 380d89ae9d3SDaniel Jasper 3814c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 3829d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3834c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3844c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3854c2c9c36SKrasimir Georgiev "\n" 3864c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3874c2c9c36SKrasimir Georgiev "#include <d.h>\n", 3884c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 3894c2c9c36SKrasimir Georgiev "#include <b.h>\n" 3904c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3914c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 3924c2c9c36SKrasimir Georgiev } 3934c2c9c36SKrasimir Georgiev 394d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 395d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 396d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 397d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 398d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 399d89ae9d3SDaniel Jasper "#include \\\n" 400d89ae9d3SDaniel Jasper "\"c.h\"\n" 401d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 402d89ae9d3SDaniel Jasper } 403d89ae9d3SDaniel Jasper 40485c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 4059c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 40685c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 40785c472dcSDaniel Jasper "#include \"b.h\"\n" 40885c472dcSDaniel Jasper "#include \"c.h\"\n", 40985c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 41085c472dcSDaniel Jasper "#include \"c.h\"\n" 4110bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 4120bfdeb4bSDaniel Jasper "a.cc")); 413afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 414afa62faeSNico Weber "#include \"b.h\"\n" 415afa62faeSNico Weber "#include \"c.h\"\n", 416afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 417afa62faeSNico Weber "#include \"c.h\"\n" 418afa62faeSNico Weber "#include \"b.h\"\n", 4199c8ff355SDaniel Jasper "a_test.cc")); 4200bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 4210bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 4220bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 4230bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 4240bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 4250bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 426afa62faeSNico Weber "input.mm")); 42785c472dcSDaniel Jasper 4289c8ff355SDaniel Jasper // Don't allow prefixes. 4299c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4309c8ff355SDaniel Jasper "#include \"c.h\"\n" 4319c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 4329c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 4339c8ff355SDaniel Jasper "#include \"c.h\"\n" 4349c8ff355SDaniel Jasper "#include \"b.h\"\n", 4359c8ff355SDaniel Jasper "a.cc")); 4369c8ff355SDaniel Jasper 4379c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 4389c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4399c8ff355SDaniel Jasper "#include \"c.h\"\n" 4409c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 4419c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 4429c8ff355SDaniel Jasper "#include \"c.h\"\n" 4439c8ff355SDaniel Jasper "#include \"b.h\"\n", 4449c8ff355SDaniel Jasper "a_main.cc")); 4459c8ff355SDaniel Jasper 44685c472dcSDaniel Jasper // Don't do this in headers. 44785c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 44885c472dcSDaniel Jasper "#include \"c.h\"\n" 44985c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 45085c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 45185c472dcSDaniel Jasper "#include \"c.h\"\n" 45285c472dcSDaniel Jasper "#include \"b.h\"\n", 4530bfdeb4bSDaniel Jasper "a.h")); 45432d75fa2SDaniel Jasper 45532d75fa2SDaniel Jasper // Only do this in the first #include block. 45632d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 45732d75fa2SDaniel Jasper "\n" 45832d75fa2SDaniel Jasper "#include \"b.h\"\n" 45932d75fa2SDaniel Jasper "#include \"c.h\"\n" 46032d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 46132d75fa2SDaniel Jasper sort("#include <a>\n" 46232d75fa2SDaniel Jasper "\n" 46332d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 46432d75fa2SDaniel Jasper "#include \"c.h\"\n" 46532d75fa2SDaniel Jasper "#include \"b.h\"\n", 46632d75fa2SDaniel Jasper "a.cc")); 467a252f5d5SDaniel Jasper 468a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 469a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 470a252f5d5SDaniel Jasper "#include \"b.h\"\n" 471a252f5d5SDaniel Jasper "#include \"c.h\"\n" 472a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 473a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 474a252f5d5SDaniel Jasper "#include \"a.h\"\n" 475a252f5d5SDaniel Jasper "#include \"c.h\"\n" 476a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 477a252f5d5SDaniel Jasper "a.cc")); 47885c472dcSDaniel Jasper } 47985c472dcSDaniel Jasper 480335ac2ebSmydeveloperday TEST_F(SortIncludesTest, LeavesMainHeaderFirstInAdditionalExtensions) { 481335ac2ebSmydeveloperday Style.IncludeIsMainRegex = "([-_](test|unittest))?|(Impl)?$"; 482335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 483335ac2ebSmydeveloperday "#include \"c.h\"\n" 484335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 485335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 486335ac2ebSmydeveloperday "#include \"c.h\"\n" 487335ac2ebSmydeveloperday "#include \"b.h\"\n", 488335ac2ebSmydeveloperday "a_test.xxx")); 489335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 490335ac2ebSmydeveloperday "#include \"c.h\"\n" 491335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 492335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 493335ac2ebSmydeveloperday "#include \"c.h\"\n" 494335ac2ebSmydeveloperday "#include \"b.h\"\n", 495335ac2ebSmydeveloperday "aImpl.hpp")); 496335ac2ebSmydeveloperday 497335ac2ebSmydeveloperday // .cpp extension is considered "main" by default 498335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 499335ac2ebSmydeveloperday "#include \"b.h\"\n" 500335ac2ebSmydeveloperday "#include \"c.h\"\n", 501335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 502335ac2ebSmydeveloperday "#include \"c.h\"\n" 503335ac2ebSmydeveloperday "#include \"b.h\"\n", 504335ac2ebSmydeveloperday "aImpl.cpp")); 505335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 506335ac2ebSmydeveloperday "#include \"b.h\"\n" 507335ac2ebSmydeveloperday "#include \"c.h\"\n", 508335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 509335ac2ebSmydeveloperday "#include \"c.h\"\n" 510335ac2ebSmydeveloperday "#include \"b.h\"\n", 511335ac2ebSmydeveloperday "a_test.cpp")); 512335ac2ebSmydeveloperday 513335ac2ebSmydeveloperday // Allow additional filenames / extensions 514335ac2ebSmydeveloperday Style.IncludeIsMainSourceRegex = "(Impl\\.hpp)|(\\.xxx)$"; 515335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 516335ac2ebSmydeveloperday "#include \"b.h\"\n" 517335ac2ebSmydeveloperday "#include \"c.h\"\n", 518335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 519335ac2ebSmydeveloperday "#include \"c.h\"\n" 520335ac2ebSmydeveloperday "#include \"b.h\"\n", 521335ac2ebSmydeveloperday "a_test.xxx")); 522335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 523335ac2ebSmydeveloperday "#include \"b.h\"\n" 524335ac2ebSmydeveloperday "#include \"c.h\"\n", 525335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 526335ac2ebSmydeveloperday "#include \"c.h\"\n" 527335ac2ebSmydeveloperday "#include \"b.h\"\n", 528335ac2ebSmydeveloperday "aImpl.hpp")); 529335ac2ebSmydeveloperday } 530335ac2ebSmydeveloperday 5314c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 5324c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5339d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5344c2c9c36SKrasimir Georgiev 5354c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 5364c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5374c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 5384c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5394c2c9c36SKrasimir Georgiev "\n" 5404c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5414c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5424c2c9c36SKrasimir Georgiev "c.cc")); 5434c2c9c36SKrasimir Georgiev } 5444c2c9c36SKrasimir Georgiev 5454c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 5464c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5479d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5484c2c9c36SKrasimir Georgiev 5494c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 5504c2c9c36SKrasimir Georgiev "\n" 5514c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 5524c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5534c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5544c2c9c36SKrasimir Georgiev "\n" 5554c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5564c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5574c2c9c36SKrasimir Georgiev "a.cc")); 5584c2c9c36SKrasimir Georgiev } 5594c2c9c36SKrasimir Georgiev 560d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 561d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 562d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 563d676ab13SChandler Carruth 564d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 565d676ab13SChandler Carruth // manner. 566d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 567d676ab13SChandler Carruth "#include \"b.h\"\n" 568d676ab13SChandler Carruth "#include \"c.h\"\n" 569d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 570d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 571d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 572d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 573d676ab13SChandler Carruth sort("#include \"c.h\"\n" 574d676ab13SChandler Carruth "#include \"b.h\"\n" 575d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 576d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 577d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 578d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 579d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 580d676ab13SChandler Carruth "a_TEST.cc")); 581d676ab13SChandler Carruth } 582d676ab13SChandler Carruth 583d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 58443fd14caSMikael Holmen Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; 585d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 5860bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5870bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 5880bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 5890bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 5900bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 5910bfdeb4bSDaniel Jasper "c_main.cc")); 5920bfdeb4bSDaniel Jasper 5930bfdeb4bSDaniel Jasper // check stable when re-run 5940bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 5950bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5960bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 5970bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 5980bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 5990bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 600925bb20cSKrasimir Georgiev "c_main.cc", 0)); 601d2629dc8SDaniel Jasper } 602d2629dc8SDaniel Jasper 6034c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 60443fd14caSMikael Holmen Style.IncludeCategories = {{".*important_os_header.*", -1, 0}, {".*", 1, 0}}; 6059d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6064c2c9c36SKrasimir Georgiev 6074c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 6084c2c9c36SKrasimir Georgiev "\n" 6094c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6104c2c9c36SKrasimir Georgiev "\n" 6114c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 6124c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 6134c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 6144c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 6154c2c9c36SKrasimir Georgiev "c_main.cc")); 6164c2c9c36SKrasimir Georgiev 6174c2c9c36SKrasimir Georgiev // check stable when re-run 6184c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 6194c2c9c36SKrasimir Georgiev "\n" 6204c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6214c2c9c36SKrasimir Georgiev "\n" 6224c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 6234c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 6244c2c9c36SKrasimir Georgiev "\n" 6254c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6264c2c9c36SKrasimir Georgiev "\n" 6274c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 628925bb20cSKrasimir Georgiev "c_main.cc", 0)); 6294c2c9c36SKrasimir Georgiev } 6304c2c9c36SKrasimir Georgiev 631b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 632b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 633b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 634b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 635b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 636b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 637b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 638b68aabf7SDaniel Jasper 639b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 640b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 641b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 642b68aabf7SDaniel Jasper } 643b68aabf7SDaniel Jasper 644a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 645a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 646a992afe8SEric Liu "#include <b>\n" 647a992afe8SEric Liu "#include <c>\n", 648a992afe8SEric Liu sort("#include <a>\n" 649a992afe8SEric Liu "#include <b>\n" 650a992afe8SEric Liu "#include <b>\n" 651a992afe8SEric Liu "#include <b>\n" 652a992afe8SEric Liu "#include <b>\n" 653a992afe8SEric Liu "#include <c>\n")); 6544c2c9c36SKrasimir Georgiev 6559d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 6564c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6574c2c9c36SKrasimir Georgiev "#include <b>\n" 6584c2c9c36SKrasimir Georgiev "#include <c>\n", 6594c2c9c36SKrasimir Georgiev sort("#include <a>\n" 6604c2c9c36SKrasimir Georgiev "#include <b>\n" 6614c2c9c36SKrasimir Georgiev "\n" 6624c2c9c36SKrasimir Georgiev "#include <b>\n" 6634c2c9c36SKrasimir Georgiev "\n" 6644c2c9c36SKrasimir Georgiev "#include <b>\n" 6654c2c9c36SKrasimir Georgiev "#include <c>\n")); 6664c2c9c36SKrasimir Georgiev 6679d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6684c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6694c2c9c36SKrasimir Georgiev "#include <b>\n" 6704c2c9c36SKrasimir Georgiev "#include <c>\n", 6714c2c9c36SKrasimir Georgiev sort("#include <a>\n" 6724c2c9c36SKrasimir Georgiev "#include <b>\n" 6734c2c9c36SKrasimir Georgiev "\n" 6744c2c9c36SKrasimir Georgiev "#include <b>\n" 6754c2c9c36SKrasimir Georgiev "\n" 6764c2c9c36SKrasimir Georgiev "#include <b>\n" 6774c2c9c36SKrasimir Georgiev "#include <c>\n")); 678a992afe8SEric Liu } 679a992afe8SEric Liu 680a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 681a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 682a992afe8SEric Liu "#include <b>\n" 683a992afe8SEric Liu "#include <c>\n", 684a992afe8SEric Liu sort("#include <b>\n" 685a992afe8SEric Liu "#include <a>\n" 686a992afe8SEric Liu "#include <b>\n" 687a992afe8SEric Liu "#include <b>\n" 688a992afe8SEric Liu "#include <c>\n" 689a992afe8SEric Liu "#include <b>\n")); 6904c2c9c36SKrasimir Georgiev 6919d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 6924c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 6934c2c9c36SKrasimir Georgiev "#include <b>\n" 6944c2c9c36SKrasimir Georgiev "#include <c>\n", 6954c2c9c36SKrasimir Georgiev sort("#include <b>\n" 6964c2c9c36SKrasimir Georgiev "#include <a>\n" 6974c2c9c36SKrasimir Georgiev "\n" 6984c2c9c36SKrasimir Georgiev "#include <b>\n" 6994c2c9c36SKrasimir Georgiev "\n" 7004c2c9c36SKrasimir Georgiev "#include <c>\n" 7014c2c9c36SKrasimir Georgiev "#include <b>\n")); 7024c2c9c36SKrasimir Georgiev 7039d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7044c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7054c2c9c36SKrasimir Georgiev "#include <b>\n" 7064c2c9c36SKrasimir Georgiev "#include <c>\n", 7074c2c9c36SKrasimir Georgiev sort("#include <b>\n" 7084c2c9c36SKrasimir Georgiev "#include <a>\n" 7094c2c9c36SKrasimir Georgiev "\n" 7104c2c9c36SKrasimir Georgiev "#include <b>\n" 7114c2c9c36SKrasimir Georgiev "\n" 7124c2c9c36SKrasimir Georgiev "#include <c>\n" 7134c2c9c36SKrasimir Georgiev "#include <b>\n")); 714a992afe8SEric Liu } 715a992afe8SEric Liu 716a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 717a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 718a992afe8SEric Liu "#include <a>\n" // Start of line: 13 719a992afe8SEric Liu "#include <b>\n" // Start of line: 26 720a992afe8SEric Liu "#include <b>\n" // Start of line: 39 721a992afe8SEric Liu "#include <c>\n" // Start of line: 52 722a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 723a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 724a992afe8SEric Liu "#include <b>\n" // Start of line: 13 725a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 726a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 727a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 728a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 729a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 730a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 731a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 732a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 733a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 734a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 735a992afe8SEric Liu // Cursor on '#' in "#include <c>". 736a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 737a992afe8SEric Liu } 738a992afe8SEric Liu 739a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 740a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 741a992afe8SEric Liu "#include <b>\n" 742a992afe8SEric Liu "\n" 743a992afe8SEric Liu "#include <b>\n" 744a992afe8SEric Liu "#include <c>\n", 745a992afe8SEric Liu sort("#include <a>\n" 746a992afe8SEric Liu "#include <b>\n" 747a992afe8SEric Liu "\n" 748a992afe8SEric Liu "#include <c>\n" 749a992afe8SEric Liu "#include <b>\n" 750a992afe8SEric Liu "#include <b>\n")); 751a992afe8SEric Liu } 752a992afe8SEric Liu 753a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 754a992afe8SEric Liu std::string Code = "#include <a>\n" 755a992afe8SEric Liu "#include <b>\n" 756a992afe8SEric Liu "#include <a>\n" 757a992afe8SEric Liu "#include <a>\n" 758a992afe8SEric Liu "\n" 759a992afe8SEric Liu " int x ;"; 760a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 7619d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 762a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 763a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 764a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 765a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 766a992afe8SEric Liu } 767a992afe8SEric Liu 768a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 769a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 770a2e7d0deSKrasimir Georgiev "#include <b>\n" 771a2e7d0deSKrasimir Georgiev "#include <a>\n" 772a2e7d0deSKrasimir Georgiev "-->", 773a2e7d0deSKrasimir Georgiev sort("<!--;\n" 774a2e7d0deSKrasimir Georgiev "#include <b>\n" 775a2e7d0deSKrasimir Georgiev "#include <a>\n" 776ece7e95fSmydeveloperday "-->", 777ece7e95fSmydeveloperday "input.h", 0)); 778925bb20cSKrasimir Georgiev } 779925bb20cSKrasimir Georgiev 780925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 781925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 782925bb20cSKrasimir Georgiev std::string Code = R"( 783925bb20cSKrasimir Georgiev #include "b.h" 784925bb20cSKrasimir Georgiev 785925bb20cSKrasimir Georgiev #include <a.h> 786925bb20cSKrasimir Georgiev )"; 787925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 788a2e7d0deSKrasimir Georgiev } 789a2e7d0deSKrasimir Georgiev 79060365021SPaul Hoad TEST_F(SortIncludesTest, 79160365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 79260365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 79360365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 79460365021SPaul Hoad "\r\n" 79560365021SPaul Hoad "#include <a.h>\r\n"; 79660365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 79760365021SPaul Hoad } 79800e7ae9fSKrasimir Georgiev 79900e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 80000e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 80100e7ae9fSKrasimir Georgiev 80200e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 80300e7ae9fSKrasimir Georgiev "#include <b.h>\n" 80400e7ae9fSKrasimir Georgiev "#include \"a.h\"", 80500e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 80600e7ae9fSKrasimir Georgiev "#include <a.h>\n" 80700e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 80800e7ae9fSKrasimir Georgiev } 80900e7ae9fSKrasimir Georgiev 810d89ae9d3SDaniel Jasper } // end namespace 811d89ae9d3SDaniel Jasper } // end namespace format 812d89ae9d3SDaniel Jasper } // end namespace clang 813