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 = { 758668eae2Smydeveloperday {"^<sys/param\\.h>", 1, 0, false}, 768668eae2Smydeveloperday {"^<sys/types\\.h>", 1, 1, false}, 778668eae2Smydeveloperday {"^<sys.*/", 1, 2, false}, 788668eae2Smydeveloperday {"^<uvm/", 2, 3, false}, 798668eae2Smydeveloperday {"^<machine/", 3, 4, false}, 808668eae2Smydeveloperday {"^<dev/", 4, 5, false}, 818668eae2Smydeveloperday {"^<net.*/", 5, 6, false}, 828668eae2Smydeveloperday {"^<protocols/", 5, 7, false}, 838668eae2Smydeveloperday {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8, false}, 848668eae2Smydeveloperday {"^<(x86|amd64|i386|xen)/", 7, 8, false}, 858668eae2Smydeveloperday {"<path", 9, 11, false}, 868668eae2Smydeveloperday {"^<[^/].*\\.h>", 8, 10, false}, 878668eae2Smydeveloperday {"^\".*\\.h\"", 10, 12, false}}; 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 15484048e23SHaojian Wu TEST_F(SortIncludesTest, MainFileHeader) { 155c1b209ccSHaojian Wu std::string Code = "#include <string>\n" 156c1b209ccSHaojian Wu "\n" 157c1b209ccSHaojian Wu "#include \"a/extra_action.proto.h\"\n"; 158c1b209ccSHaojian Wu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 159c1b209ccSHaojian Wu EXPECT_TRUE( 160c1b209ccSHaojian Wu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a/extra_action.cc") 161c1b209ccSHaojian Wu .empty()); 16284048e23SHaojian Wu 16384048e23SHaojian Wu EXPECT_EQ("#include \"foo.bar.h\"\n" 16484048e23SHaojian Wu "\n" 16584048e23SHaojian Wu "#include \"a.h\"\n", 16684048e23SHaojian Wu sort("#include \"a.h\"\n" 16784048e23SHaojian Wu "#include \"foo.bar.h\"\n", 16884048e23SHaojian Wu "foo.bar.cc")); 169c1b209ccSHaojian Wu } 170c1b209ccSHaojian Wu 1714c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 1729d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1734c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1744c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1754c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1764c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1774c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1784c2c9c36SKrasimir Georgiev "\n" 1794c2c9c36SKrasimir Georgiev "\n" 1804c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1814c2c9c36SKrasimir Georgiev 1829d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 1834c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1844c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1854c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1864c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1874c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1884c2c9c36SKrasimir Georgiev "\n" 1894c2c9c36SKrasimir Georgiev "\n" 1904c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1914c2c9c36SKrasimir Georgiev } 1924c2c9c36SKrasimir Georgiev 1939b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1949b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1959b8c7c72SDaniel Jasper "#include <b>\n" 1969b8c7c72SDaniel Jasper "#include <c>\n" 1979b8c7c72SDaniel Jasper "// clang-format off\n" 1989b8c7c72SDaniel Jasper "#include <b>\n" 1999b8c7c72SDaniel Jasper "#include <a>\n" 2009b8c7c72SDaniel Jasper "#include <c>\n" 2019b8c7c72SDaniel Jasper "// clang-format on\n", 2029b8c7c72SDaniel Jasper sort("#include <b>\n" 2039b8c7c72SDaniel Jasper "#include <a>\n" 2049b8c7c72SDaniel Jasper "#include <c>\n" 2059b8c7c72SDaniel Jasper "// clang-format off\n" 2069b8c7c72SDaniel Jasper "#include <b>\n" 2079b8c7c72SDaniel Jasper "#include <a>\n" 2089b8c7c72SDaniel Jasper "#include <c>\n" 2099b8c7c72SDaniel Jasper "// clang-format on\n")); 2107473940bSRafał Jelonek 2117473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 2127473940bSRafał Jelonek std::string Code = "// clang-format off\r\n" 2137473940bSRafał Jelonek "#include \"d.h\"\r\n" 2147473940bSRafał Jelonek "#include \"b.h\"\r\n" 2157473940bSRafał Jelonek "// clang-format on\r\n" 2167473940bSRafał Jelonek "\r\n" 2177473940bSRafał Jelonek "#include \"c.h\"\r\n" 2187473940bSRafał Jelonek "#include \"a.h\"\r\n" 2197473940bSRafał Jelonek "#include \"e.h\"\r\n"; 2207473940bSRafał Jelonek 2217473940bSRafał Jelonek std::string Expected = "// clang-format off\r\n" 2227473940bSRafał Jelonek "#include \"d.h\"\r\n" 2237473940bSRafał Jelonek "#include \"b.h\"\r\n" 2247473940bSRafał Jelonek "// clang-format on\r\n" 2257473940bSRafał Jelonek "\r\n" 2267473940bSRafał Jelonek "#include \"e.h\"\r\n" 2277473940bSRafał Jelonek "#include \"a.h\"\r\n" 2287473940bSRafał Jelonek "#include \"c.h\"\r\n"; 2297473940bSRafał Jelonek 2307473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 2319b8c7c72SDaniel Jasper } 2329b8c7c72SDaniel Jasper 2339b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 2349b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2359b468c0bSPaul Hoad "#include <b>\n" 2369b468c0bSPaul Hoad "#include <c>\n" 2379b468c0bSPaul Hoad "/* clang-format off */\n" 2389b468c0bSPaul Hoad "#include <b>\n" 2399b468c0bSPaul Hoad "#include <a>\n" 2409b468c0bSPaul Hoad "#include <c>\n" 2419b468c0bSPaul Hoad "/* clang-format on */\n", 2429b468c0bSPaul Hoad sort("#include <b>\n" 2439b468c0bSPaul Hoad "#include <a>\n" 2449b468c0bSPaul Hoad "#include <c>\n" 2459b468c0bSPaul Hoad "/* clang-format off */\n" 2469b468c0bSPaul Hoad "#include <b>\n" 2479b468c0bSPaul Hoad "#include <a>\n" 2489b468c0bSPaul Hoad "#include <c>\n" 2499b468c0bSPaul Hoad "/* clang-format on */\n")); 2509b468c0bSPaul Hoad 2519b468c0bSPaul Hoad // Not really turning it off 2529b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2539b468c0bSPaul Hoad "#include <b>\n" 2549b468c0bSPaul Hoad "#include <c>\n" 2559b468c0bSPaul Hoad "/* clang-format offically */\n" 2569b468c0bSPaul Hoad "#include <a>\n" 2579b468c0bSPaul Hoad "#include <b>\n" 2589b468c0bSPaul Hoad "#include <c>\n" 2599b468c0bSPaul Hoad "/* clang-format onwards */\n", 2609b468c0bSPaul Hoad sort("#include <b>\n" 2619b468c0bSPaul Hoad "#include <a>\n" 2629b468c0bSPaul Hoad "#include <c>\n" 2639b468c0bSPaul Hoad "/* clang-format offically */\n" 2649b468c0bSPaul Hoad "#include <b>\n" 2659b468c0bSPaul Hoad "#include <a>\n" 2669b468c0bSPaul Hoad "#include <c>\n" 267ece7e95fSmydeveloperday "/* clang-format onwards */\n", 268ece7e95fSmydeveloperday "input.h", 2)); 2699b468c0bSPaul Hoad } 2709b468c0bSPaul Hoad 271da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 272a8105b37SKent Sommer FmtStyle.SortIncludes = FormatStyle::SI_Never; 273da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 274da446770SDaniel Jasper "#include \"c.h\"\n" 275da446770SDaniel Jasper "#include \"b.h\"\n", 276da446770SDaniel Jasper sort("#include \"a.h\"\n" 277da446770SDaniel Jasper "#include \"c.h\"\n" 278925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 279925bb20cSKrasimir Georgiev "input.h", 0)); 280da446770SDaniel Jasper } 281da446770SDaniel Jasper 282ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 283ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 284ff06370eSNico Weber "#import \"b.h\"\n" 285ff06370eSNico Weber "#include \"c.h\"\n", 286ff06370eSNico Weber sort("#include \"a.h\"\n" 287ff06370eSNico Weber "#include \"c.h\"\n" 288ff06370eSNico Weber "#import \"b.h\"\n")); 289ff06370eSNico Weber } 290ff06370eSNico Weber 291d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 292d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 293d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 294d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 295d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 296d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 297d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 298d89ae9d3SDaniel Jasper } 299d89ae9d3SDaniel Jasper 300d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 301d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 302d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 303d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 304d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 305d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 306d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 307d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 308d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 309d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 310d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 311d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 312d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 313fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 314fe21c86eSMarek Kurdej " #include \"a.h\"\n")); 315fe21c86eSMarek Kurdej } 316fe21c86eSMarek Kurdej 317fe21c86eSMarek Kurdej TEST_F(SortIncludesTest, TrailingWhitespace) { 318fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n" 319fe21c86eSMarek Kurdej "#include \"b.h\"\n" 320fe21c86eSMarek Kurdej "#include \"c.h\"\n", 321fe21c86eSMarek Kurdej sort("#include \"a.h\" \n" 322fe21c86eSMarek Kurdej "#include \"c.h\" \n" 323fe21c86eSMarek Kurdej "#include \"b.h\" \n")); 324fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 325fe21c86eSMarek Kurdej "#include \"a.h\" \n")); 326d89ae9d3SDaniel Jasper } 327d89ae9d3SDaniel Jasper 328d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 329d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 330d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 331d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 332d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 333d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 334d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 335d89ae9d3SDaniel Jasper } 336d89ae9d3SDaniel Jasper 337d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 338d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 339d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 340d89ae9d3SDaniel Jasper "\n" 341d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 34285c472dcSDaniel Jasper sort("#include \"a.h\"\n" 34385c472dcSDaniel Jasper "#include \"c.h\"\n" 344d89ae9d3SDaniel Jasper "\n" 345ece7e95fSmydeveloperday "#include \"b.h\"\n", 346ece7e95fSmydeveloperday "input.h", 0)); 347d89ae9d3SDaniel Jasper } 348d89ae9d3SDaniel Jasper 3494c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 3509d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3514c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3524c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3534c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3544c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 3554c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3564c2c9c36SKrasimir Georgiev "\n" 3574c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3584c2c9c36SKrasimir Georgiev } 3594c2c9c36SKrasimir Georgiev 3604c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 3614c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3624c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3634c2c9c36SKrasimir Georgiev "// comment\n" 3644c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3654c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3664c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3674c2c9c36SKrasimir Georgiev "// comment\n" 3684c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3694c2c9c36SKrasimir Georgiev 3709d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3714c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3724c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3734c2c9c36SKrasimir Georgiev "// comment\n" 3744c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3754c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3764c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3774c2c9c36SKrasimir Georgiev "// comment\n" 3784c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3794c2c9c36SKrasimir Georgiev 3809d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3814c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3824c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3834c2c9c36SKrasimir Georgiev "// comment\n" 3844c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3854c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3864c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3874c2c9c36SKrasimir Georgiev "// comment\n" 3884c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3894c2c9c36SKrasimir Georgiev } 3904c2c9c36SKrasimir Georgiev 391d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 39285c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 39385c472dcSDaniel Jasper "#include \"c.h\"\n" 3940f4d5f85SEric Liu "#include <array>\n" 39585c472dcSDaniel Jasper "#include <b.h>\n" 3960f4d5f85SEric Liu "#include <d.h>\n" 3970f4d5f85SEric Liu "#include <vector>\n", 3980f4d5f85SEric Liu sort("#include <vector>\n" 3990f4d5f85SEric Liu "#include <d.h>\n" 4000f4d5f85SEric Liu "#include <array>\n" 40185c472dcSDaniel Jasper "#include <b.h>\n" 40285c472dcSDaniel Jasper "#include \"c.h\"\n" 40385c472dcSDaniel Jasper "#include \"a.h\"\n")); 40485c472dcSDaniel Jasper 4059d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 406d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 407d89ae9d3SDaniel Jasper "#include <d.h>\n" 4080f4d5f85SEric Liu "\n" 4090f4d5f85SEric Liu "#include <array>\n" 4100f4d5f85SEric Liu "#include <vector>\n" 4110f4d5f85SEric Liu "\n" 412d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 413d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 4140f4d5f85SEric Liu sort("#include <vector>\n" 4150f4d5f85SEric Liu "#include <d.h>\n" 4160f4d5f85SEric Liu "#include <array>\n" 417d89ae9d3SDaniel Jasper "#include <b.h>\n" 418d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 419d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 420d89ae9d3SDaniel Jasper } 421d89ae9d3SDaniel Jasper 4224c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 4239d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4244c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4254c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4264c2c9c36SKrasimir Georgiev "\n" 4274c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4284c2c9c36SKrasimir Georgiev "#include <d.h>\n", 4294c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 4304c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4314c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4324c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 4334c2c9c36SKrasimir Georgiev } 4344c2c9c36SKrasimir Georgiev 435d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 436d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 437d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 438d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 439d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 440d89ae9d3SDaniel Jasper "#include \\\n" 441d89ae9d3SDaniel Jasper "\"c.h\"\n" 442d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 443d89ae9d3SDaniel Jasper } 444d89ae9d3SDaniel Jasper 44585c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 4469c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 44785c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 44885c472dcSDaniel Jasper "#include \"b.h\"\n" 44985c472dcSDaniel Jasper "#include \"c.h\"\n", 45085c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 45185c472dcSDaniel Jasper "#include \"c.h\"\n" 4520bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 4530bfdeb4bSDaniel Jasper "a.cc")); 454afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 455afa62faeSNico Weber "#include \"b.h\"\n" 456afa62faeSNico Weber "#include \"c.h\"\n", 457afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 458afa62faeSNico Weber "#include \"c.h\"\n" 459afa62faeSNico Weber "#include \"b.h\"\n", 4609c8ff355SDaniel Jasper "a_test.cc")); 4610bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 4620bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 4630bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 4640bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 4650bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 4660bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 467afa62faeSNico Weber "input.mm")); 46885c472dcSDaniel Jasper 4699c8ff355SDaniel Jasper // Don't allow prefixes. 4709c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4719c8ff355SDaniel Jasper "#include \"c.h\"\n" 4729c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 4739c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 4749c8ff355SDaniel Jasper "#include \"c.h\"\n" 4759c8ff355SDaniel Jasper "#include \"b.h\"\n", 4769c8ff355SDaniel Jasper "a.cc")); 4779c8ff355SDaniel Jasper 4789c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 4799c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4809c8ff355SDaniel Jasper "#include \"c.h\"\n" 4819c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 4829c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 4839c8ff355SDaniel Jasper "#include \"c.h\"\n" 4849c8ff355SDaniel Jasper "#include \"b.h\"\n", 4859c8ff355SDaniel Jasper "a_main.cc")); 4869c8ff355SDaniel Jasper 48785c472dcSDaniel Jasper // Don't do this in headers. 48885c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 48985c472dcSDaniel Jasper "#include \"c.h\"\n" 49085c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 49185c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 49285c472dcSDaniel Jasper "#include \"c.h\"\n" 49385c472dcSDaniel Jasper "#include \"b.h\"\n", 4940bfdeb4bSDaniel Jasper "a.h")); 49532d75fa2SDaniel Jasper 49632d75fa2SDaniel Jasper // Only do this in the first #include block. 49732d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 49832d75fa2SDaniel Jasper "\n" 49932d75fa2SDaniel Jasper "#include \"b.h\"\n" 50032d75fa2SDaniel Jasper "#include \"c.h\"\n" 50132d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 50232d75fa2SDaniel Jasper sort("#include <a>\n" 50332d75fa2SDaniel Jasper "\n" 50432d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 50532d75fa2SDaniel Jasper "#include \"c.h\"\n" 50632d75fa2SDaniel Jasper "#include \"b.h\"\n", 50732d75fa2SDaniel Jasper "a.cc")); 508a252f5d5SDaniel Jasper 509a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 510a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 511a252f5d5SDaniel Jasper "#include \"b.h\"\n" 512a252f5d5SDaniel Jasper "#include \"c.h\"\n" 513a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 514a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 515a252f5d5SDaniel Jasper "#include \"a.h\"\n" 516a252f5d5SDaniel Jasper "#include \"c.h\"\n" 517a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 518a252f5d5SDaniel Jasper "a.cc")); 51985c472dcSDaniel Jasper } 52085c472dcSDaniel Jasper 521335ac2ebSmydeveloperday TEST_F(SortIncludesTest, LeavesMainHeaderFirstInAdditionalExtensions) { 522335ac2ebSmydeveloperday Style.IncludeIsMainRegex = "([-_](test|unittest))?|(Impl)?$"; 523335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 524335ac2ebSmydeveloperday "#include \"c.h\"\n" 525335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 526335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 527335ac2ebSmydeveloperday "#include \"c.h\"\n" 528335ac2ebSmydeveloperday "#include \"b.h\"\n", 529335ac2ebSmydeveloperday "a_test.xxx")); 530335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 531335ac2ebSmydeveloperday "#include \"c.h\"\n" 532335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 533335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 534335ac2ebSmydeveloperday "#include \"c.h\"\n" 535335ac2ebSmydeveloperday "#include \"b.h\"\n", 536335ac2ebSmydeveloperday "aImpl.hpp")); 537335ac2ebSmydeveloperday 538335ac2ebSmydeveloperday // .cpp extension is considered "main" by default 539335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 540335ac2ebSmydeveloperday "#include \"b.h\"\n" 541335ac2ebSmydeveloperday "#include \"c.h\"\n", 542335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 543335ac2ebSmydeveloperday "#include \"c.h\"\n" 544335ac2ebSmydeveloperday "#include \"b.h\"\n", 545335ac2ebSmydeveloperday "aImpl.cpp")); 546335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 547335ac2ebSmydeveloperday "#include \"b.h\"\n" 548335ac2ebSmydeveloperday "#include \"c.h\"\n", 549335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 550335ac2ebSmydeveloperday "#include \"c.h\"\n" 551335ac2ebSmydeveloperday "#include \"b.h\"\n", 552335ac2ebSmydeveloperday "a_test.cpp")); 553335ac2ebSmydeveloperday 554335ac2ebSmydeveloperday // Allow additional filenames / extensions 555335ac2ebSmydeveloperday Style.IncludeIsMainSourceRegex = "(Impl\\.hpp)|(\\.xxx)$"; 556335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 557335ac2ebSmydeveloperday "#include \"b.h\"\n" 558335ac2ebSmydeveloperday "#include \"c.h\"\n", 559335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 560335ac2ebSmydeveloperday "#include \"c.h\"\n" 561335ac2ebSmydeveloperday "#include \"b.h\"\n", 562335ac2ebSmydeveloperday "a_test.xxx")); 563335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 564335ac2ebSmydeveloperday "#include \"b.h\"\n" 565335ac2ebSmydeveloperday "#include \"c.h\"\n", 566335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 567335ac2ebSmydeveloperday "#include \"c.h\"\n" 568335ac2ebSmydeveloperday "#include \"b.h\"\n", 569335ac2ebSmydeveloperday "aImpl.hpp")); 570335ac2ebSmydeveloperday } 571335ac2ebSmydeveloperday 5724c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 5734c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5749d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5754c2c9c36SKrasimir Georgiev 5764c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 5774c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5784c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 5794c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5804c2c9c36SKrasimir Georgiev "\n" 5814c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5824c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5834c2c9c36SKrasimir Georgiev "c.cc")); 5844c2c9c36SKrasimir Georgiev } 5854c2c9c36SKrasimir Georgiev 5864c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 5874c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5889d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5894c2c9c36SKrasimir Georgiev 5904c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 5914c2c9c36SKrasimir Georgiev "\n" 5924c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 5934c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5944c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5954c2c9c36SKrasimir Georgiev "\n" 5964c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5974c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5984c2c9c36SKrasimir Georgiev "a.cc")); 5994c2c9c36SKrasimir Georgiev } 6004c2c9c36SKrasimir Georgiev 601a8105b37SKent Sommer TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveSorting) { 602*7b02794fSBjörn Schäpers EXPECT_FALSE(FmtStyle.SortIncludes == FormatStyle::SI_CaseInsensitive); 603a8105b37SKent Sommer 604*7b02794fSBjörn Schäpers FmtStyle.SortIncludes = FormatStyle::SI_CaseInsensitive; 605a8105b37SKent Sommer 606a8105b37SKent Sommer EXPECT_EQ("#include \"A/B.h\"\n" 607a8105b37SKent Sommer "#include \"A/b.h\"\n" 608a8105b37SKent Sommer "#include \"a/b.h\"\n" 609a8105b37SKent Sommer "#include \"B/A.h\"\n" 610a8105b37SKent Sommer "#include \"B/a.h\"\n", 611a8105b37SKent Sommer sort("#include \"B/a.h\"\n" 612a8105b37SKent Sommer "#include \"B/A.h\"\n" 613a8105b37SKent Sommer "#include \"A/B.h\"\n" 614a8105b37SKent Sommer "#include \"a/b.h\"\n" 615a8105b37SKent Sommer "#include \"A/b.h\"\n", 616a8105b37SKent Sommer "a.h")); 617a8105b37SKent Sommer 618a8105b37SKent Sommer Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 619a8105b37SKent Sommer Style.IncludeCategories = { 620a8105b37SKent Sommer {"^\"", 1, 0, false}, {"^<.*\\.h>$", 2, 0, false}, {"^<", 3, 0, false}}; 621a8105b37SKent Sommer 622a8105b37SKent Sommer StringRef UnsortedCode = "#include \"qt.h\"\n" 623a8105b37SKent Sommer "#include <algorithm>\n" 624a8105b37SKent Sommer "#include <qtwhatever.h>\n" 625a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 626a8105b37SKent Sommer "#include <Algorithm>\n" 627a8105b37SKent Sommer "#include \"vlib.h\"\n" 628a8105b37SKent Sommer "#include \"Vlib.h\"\n" 629a8105b37SKent Sommer "#include \"AST.h\"\n"; 630a8105b37SKent Sommer 631a8105b37SKent Sommer EXPECT_EQ("#include \"AST.h\"\n" 632a8105b37SKent Sommer "#include \"qt.h\"\n" 633a8105b37SKent Sommer "#include \"Vlib.h\"\n" 634a8105b37SKent Sommer "#include \"vlib.h\"\n" 635a8105b37SKent Sommer "\n" 636a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 637a8105b37SKent Sommer "#include <qtwhatever.h>\n" 638a8105b37SKent Sommer "\n" 639a8105b37SKent Sommer "#include <Algorithm>\n" 640a8105b37SKent Sommer "#include <algorithm>\n", 641a8105b37SKent Sommer sort(UnsortedCode)); 642a8105b37SKent Sommer } 643a8105b37SKent Sommer 644d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 645d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 646d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 647d676ab13SChandler Carruth 648d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 649d676ab13SChandler Carruth // manner. 650d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 651d676ab13SChandler Carruth "#include \"b.h\"\n" 652d676ab13SChandler Carruth "#include \"c.h\"\n" 653d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 654d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 655d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 656d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 657d676ab13SChandler Carruth sort("#include \"c.h\"\n" 658d676ab13SChandler Carruth "#include \"b.h\"\n" 659d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 660d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 661d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 662d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 663d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 664d676ab13SChandler Carruth "a_TEST.cc")); 665d676ab13SChandler Carruth } 666d676ab13SChandler Carruth 6678668eae2Smydeveloperday TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveMachting) { 6688668eae2Smydeveloperday Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 6698668eae2Smydeveloperday Style.IncludeCategories = {{"^\"", 1, 0, false}, 6708668eae2Smydeveloperday {"^<.*\\.h>$", 2, 0, false}, 6718668eae2Smydeveloperday {"^<Q[A-Z][^\\.]*>", 3, 0, false}, 6728668eae2Smydeveloperday {"^<Qt[^\\.]*>", 4, 0, false}, 6738668eae2Smydeveloperday {"^<", 5, 0, false}}; 6748668eae2Smydeveloperday 6758668eae2Smydeveloperday StringRef UnsortedCode = "#include <QWidget>\n" 6768668eae2Smydeveloperday "#include \"qt.h\"\n" 6778668eae2Smydeveloperday "#include <algorithm>\n" 6788668eae2Smydeveloperday "#include <windows.h>\n" 6798668eae2Smydeveloperday "#include <QLabel>\n" 6808668eae2Smydeveloperday "#include \"qa.h\"\n" 6818668eae2Smydeveloperday "#include <queue>\n" 6828668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6838668eae2Smydeveloperday "#include <QtGlobal>\n"; 6848668eae2Smydeveloperday 6858668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 6868668eae2Smydeveloperday "#include \"qt.h\"\n" 6878668eae2Smydeveloperday "\n" 6888668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6898668eae2Smydeveloperday "#include <windows.h>\n" 6908668eae2Smydeveloperday "\n" 6918668eae2Smydeveloperday "#include <QLabel>\n" 6928668eae2Smydeveloperday "#include <QWidget>\n" 6938668eae2Smydeveloperday "#include <QtGlobal>\n" 6948668eae2Smydeveloperday "#include <queue>\n" 6958668eae2Smydeveloperday "\n" 6968668eae2Smydeveloperday "#include <algorithm>\n", 6978668eae2Smydeveloperday sort(UnsortedCode)); 6988668eae2Smydeveloperday 6998668eae2Smydeveloperday Style.IncludeCategories[2].RegexIsCaseSensitive = true; 7008668eae2Smydeveloperday Style.IncludeCategories[3].RegexIsCaseSensitive = true; 7018668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 7028668eae2Smydeveloperday "#include \"qt.h\"\n" 7038668eae2Smydeveloperday "\n" 7048668eae2Smydeveloperday "#include <qtwhatever.h>\n" 7058668eae2Smydeveloperday "#include <windows.h>\n" 7068668eae2Smydeveloperday "\n" 7078668eae2Smydeveloperday "#include <QLabel>\n" 7088668eae2Smydeveloperday "#include <QWidget>\n" 7098668eae2Smydeveloperday "\n" 7108668eae2Smydeveloperday "#include <QtGlobal>\n" 7118668eae2Smydeveloperday "\n" 7128668eae2Smydeveloperday "#include <algorithm>\n" 7138668eae2Smydeveloperday "#include <queue>\n", 7148668eae2Smydeveloperday sort(UnsortedCode)); 7158668eae2Smydeveloperday } 7168668eae2Smydeveloperday 717d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 7188668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 7198668eae2Smydeveloperday {".*", 1, 0, false}}; 720d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 7210bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7220bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 7230bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 7240bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 7250bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 7260bfdeb4bSDaniel Jasper "c_main.cc")); 7270bfdeb4bSDaniel Jasper 7280bfdeb4bSDaniel Jasper // check stable when re-run 7290bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 7300bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7310bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 7320bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 7330bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7340bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 735925bb20cSKrasimir Georgiev "c_main.cc", 0)); 736d2629dc8SDaniel Jasper } 737d2629dc8SDaniel Jasper 7384c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 7398668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 7408668eae2Smydeveloperday {".*", 1, 0, false}}; 7419d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7424c2c9c36SKrasimir Georgiev 7434c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 7444c2c9c36SKrasimir Georgiev "\n" 7454c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7464c2c9c36SKrasimir Georgiev "\n" 7474c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 7484c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 7494c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 7504c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 7514c2c9c36SKrasimir Georgiev "c_main.cc")); 7524c2c9c36SKrasimir Georgiev 7534c2c9c36SKrasimir Georgiev // check stable when re-run 7544c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 7554c2c9c36SKrasimir Georgiev "\n" 7564c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7574c2c9c36SKrasimir Georgiev "\n" 7584c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 7594c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 7604c2c9c36SKrasimir Georgiev "\n" 7614c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7624c2c9c36SKrasimir Georgiev "\n" 7634c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 764925bb20cSKrasimir Georgiev "c_main.cc", 0)); 7654c2c9c36SKrasimir Georgiev } 7664c2c9c36SKrasimir Georgiev 767b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 768b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 769b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 770b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 771b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 772b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 773b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 774b68aabf7SDaniel Jasper 775b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 776b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 777b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 778b68aabf7SDaniel Jasper } 779b68aabf7SDaniel Jasper 780a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 781a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 782a992afe8SEric Liu "#include <b>\n" 783a992afe8SEric Liu "#include <c>\n", 784a992afe8SEric Liu sort("#include <a>\n" 785a992afe8SEric Liu "#include <b>\n" 786a992afe8SEric Liu "#include <b>\n" 787a992afe8SEric Liu "#include <b>\n" 788a992afe8SEric Liu "#include <b>\n" 789a992afe8SEric Liu "#include <c>\n")); 7904c2c9c36SKrasimir Georgiev 7919d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 7924c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7934c2c9c36SKrasimir Georgiev "#include <b>\n" 7944c2c9c36SKrasimir Georgiev "#include <c>\n", 7954c2c9c36SKrasimir Georgiev sort("#include <a>\n" 7964c2c9c36SKrasimir Georgiev "#include <b>\n" 7974c2c9c36SKrasimir Georgiev "\n" 7984c2c9c36SKrasimir Georgiev "#include <b>\n" 7994c2c9c36SKrasimir Georgiev "\n" 8004c2c9c36SKrasimir Georgiev "#include <b>\n" 8014c2c9c36SKrasimir Georgiev "#include <c>\n")); 8024c2c9c36SKrasimir Georgiev 8039d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 8044c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8054c2c9c36SKrasimir Georgiev "#include <b>\n" 8064c2c9c36SKrasimir Georgiev "#include <c>\n", 8074c2c9c36SKrasimir Georgiev sort("#include <a>\n" 8084c2c9c36SKrasimir Georgiev "#include <b>\n" 8094c2c9c36SKrasimir Georgiev "\n" 8104c2c9c36SKrasimir Georgiev "#include <b>\n" 8114c2c9c36SKrasimir Georgiev "\n" 8124c2c9c36SKrasimir Georgiev "#include <b>\n" 8134c2c9c36SKrasimir Georgiev "#include <c>\n")); 814a992afe8SEric Liu } 815a992afe8SEric Liu 816a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 817a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 818a992afe8SEric Liu "#include <b>\n" 819a992afe8SEric Liu "#include <c>\n", 820a992afe8SEric Liu sort("#include <b>\n" 821a992afe8SEric Liu "#include <a>\n" 822a992afe8SEric Liu "#include <b>\n" 823a992afe8SEric Liu "#include <b>\n" 824a992afe8SEric Liu "#include <c>\n" 825a992afe8SEric Liu "#include <b>\n")); 8264c2c9c36SKrasimir Georgiev 8279d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 8284c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8294c2c9c36SKrasimir Georgiev "#include <b>\n" 8304c2c9c36SKrasimir Georgiev "#include <c>\n", 8314c2c9c36SKrasimir Georgiev sort("#include <b>\n" 8324c2c9c36SKrasimir Georgiev "#include <a>\n" 8334c2c9c36SKrasimir Georgiev "\n" 8344c2c9c36SKrasimir Georgiev "#include <b>\n" 8354c2c9c36SKrasimir Georgiev "\n" 8364c2c9c36SKrasimir Georgiev "#include <c>\n" 8374c2c9c36SKrasimir Georgiev "#include <b>\n")); 8384c2c9c36SKrasimir Georgiev 8399d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 8404c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8414c2c9c36SKrasimir Georgiev "#include <b>\n" 8424c2c9c36SKrasimir Georgiev "#include <c>\n", 8434c2c9c36SKrasimir Georgiev sort("#include <b>\n" 8444c2c9c36SKrasimir Georgiev "#include <a>\n" 8454c2c9c36SKrasimir Georgiev "\n" 8464c2c9c36SKrasimir Georgiev "#include <b>\n" 8474c2c9c36SKrasimir Georgiev "\n" 8484c2c9c36SKrasimir Georgiev "#include <c>\n" 8494c2c9c36SKrasimir Georgiev "#include <b>\n")); 850a992afe8SEric Liu } 851a992afe8SEric Liu 852a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 853a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 854a992afe8SEric Liu "#include <a>\n" // Start of line: 13 855a992afe8SEric Liu "#include <b>\n" // Start of line: 26 856a992afe8SEric Liu "#include <b>\n" // Start of line: 39 857a992afe8SEric Liu "#include <c>\n" // Start of line: 52 858a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 859a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 860a992afe8SEric Liu "#include <b>\n" // Start of line: 13 861a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 862a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 863a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 864a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 865a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 866a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 867a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 868a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 869a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 870a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 871a992afe8SEric Liu // Cursor on '#' in "#include <c>". 872a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 873a992afe8SEric Liu } 874a992afe8SEric Liu 875a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 876a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 877a992afe8SEric Liu "#include <b>\n" 878a992afe8SEric Liu "\n" 879a992afe8SEric Liu "#include <b>\n" 880a992afe8SEric Liu "#include <c>\n", 881a992afe8SEric Liu sort("#include <a>\n" 882a992afe8SEric Liu "#include <b>\n" 883a992afe8SEric Liu "\n" 884a992afe8SEric Liu "#include <c>\n" 885a992afe8SEric Liu "#include <b>\n" 886a992afe8SEric Liu "#include <b>\n")); 887a992afe8SEric Liu } 888a992afe8SEric Liu 889a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 890a992afe8SEric Liu std::string Code = "#include <a>\n" 891a992afe8SEric Liu "#include <b>\n" 892a992afe8SEric Liu "#include <a>\n" 893a992afe8SEric Liu "#include <a>\n" 894a992afe8SEric Liu "\n" 895a992afe8SEric Liu " int x ;"; 896a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 8979d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 898a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 899a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 900a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 901a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 902a992afe8SEric Liu } 903a992afe8SEric Liu 904a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 905a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 906a2e7d0deSKrasimir Georgiev "#include <b>\n" 907a2e7d0deSKrasimir Georgiev "#include <a>\n" 908a2e7d0deSKrasimir Georgiev "-->", 909a2e7d0deSKrasimir Georgiev sort("<!--;\n" 910a2e7d0deSKrasimir Georgiev "#include <b>\n" 911a2e7d0deSKrasimir Georgiev "#include <a>\n" 912ece7e95fSmydeveloperday "-->", 913ece7e95fSmydeveloperday "input.h", 0)); 914925bb20cSKrasimir Georgiev } 915925bb20cSKrasimir Georgiev 916925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 917925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 918925bb20cSKrasimir Georgiev std::string Code = R"( 919925bb20cSKrasimir Georgiev #include "b.h" 920925bb20cSKrasimir Georgiev 921925bb20cSKrasimir Georgiev #include <a.h> 922925bb20cSKrasimir Georgiev )"; 923925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 924a2e7d0deSKrasimir Georgiev } 925a2e7d0deSKrasimir Georgiev 92660365021SPaul Hoad TEST_F(SortIncludesTest, 92760365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 92860365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 92960365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 93060365021SPaul Hoad "\r\n" 93160365021SPaul Hoad "#include <a.h>\r\n"; 93260365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 93360365021SPaul Hoad } 93400e7ae9fSKrasimir Georgiev 93500e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 93600e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 93700e7ae9fSKrasimir Georgiev 93800e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 93900e7ae9fSKrasimir Georgiev "#include <b.h>\n" 94000e7ae9fSKrasimir Georgiev "#include \"a.h\"", 94100e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 94200e7ae9fSKrasimir Georgiev "#include <a.h>\n" 94300e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 94400e7ae9fSKrasimir Georgiev } 94500e7ae9fSKrasimir Georgiev 94689878e8cSRafał Jelonek TEST_F(SortIncludesTest, DoNotTreatPrecompiledHeadersAsFirstBlock) { 94789878e8cSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 94889878e8cSRafał Jelonek std::string Code = "#include \"d.h\"\r\n" 94989878e8cSRafał Jelonek "#include \"b.h\"\r\n" 95089878e8cSRafał Jelonek "#pragma hdrstop\r\n" 95189878e8cSRafał Jelonek "\r\n" 95289878e8cSRafał Jelonek "#include \"c.h\"\r\n" 95389878e8cSRafał Jelonek "#include \"a.h\"\r\n" 95489878e8cSRafał Jelonek "#include \"e.h\"\r\n"; 95589878e8cSRafał Jelonek 95689878e8cSRafał Jelonek std::string Expected = "#include \"b.h\"\r\n" 95789878e8cSRafał Jelonek "#include \"d.h\"\r\n" 95889878e8cSRafał Jelonek "#pragma hdrstop\r\n" 95989878e8cSRafał Jelonek "\r\n" 96089878e8cSRafał Jelonek "#include \"e.h\"\r\n" 96189878e8cSRafał Jelonek "#include \"a.h\"\r\n" 96289878e8cSRafał Jelonek "#include \"c.h\"\r\n"; 96389878e8cSRafał Jelonek 96489878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 96589878e8cSRafał Jelonek 96689878e8cSRafał Jelonek Code = "#include \"d.h\"\n" 96789878e8cSRafał Jelonek "#include \"b.h\"\n" 96889878e8cSRafał Jelonek "#pragma hdrstop( \"c:\\projects\\include\\myinc.pch\" )\n" 96989878e8cSRafał Jelonek "\n" 97089878e8cSRafał Jelonek "#include \"c.h\"\n" 97189878e8cSRafał Jelonek "#include \"a.h\"\n" 97289878e8cSRafał Jelonek "#include \"e.h\"\n"; 97389878e8cSRafał Jelonek 97489878e8cSRafał Jelonek Expected = "#include \"b.h\"\n" 97589878e8cSRafał Jelonek "#include \"d.h\"\n" 97689878e8cSRafał Jelonek "#pragma hdrstop(\"c:\\projects\\include\\myinc.pch\")\n" 97789878e8cSRafał Jelonek "\n" 97889878e8cSRafał Jelonek "#include \"e.h\"\n" 97989878e8cSRafał Jelonek "#include \"a.h\"\n" 98089878e8cSRafał Jelonek "#include \"c.h\"\n"; 98189878e8cSRafał Jelonek 98289878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 98389878e8cSRafał Jelonek } 98489878e8cSRafał Jelonek 985ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkMerge) { 986ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 987ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 988ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 989ee27c767SRafał Jelonek "\r\n" 990ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 991ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 992ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 993ee27c767SRafał Jelonek 994ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"e.h\"\r\n" 995ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 996ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 997ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 998ee27c767SRafał Jelonek "#include \"d.h\"\r\n"; 999ee27c767SRafał Jelonek 1000ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 1001ee27c767SRafał Jelonek } 1002ee27c767SRafał Jelonek 1003ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkPreserve) { 1004ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Preserve; 1005ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1006ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1007ee27c767SRafał Jelonek "\r\n" 1008ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1009ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1010ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1011ee27c767SRafał Jelonek 1012ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"b.h\"\r\n" 1013ee27c767SRafał Jelonek "#include \"d.h\"\r\n" 1014ee27c767SRafał Jelonek "\r\n" 1015ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1016ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1017ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1018ee27c767SRafał Jelonek 1019ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 1020ee27c767SRafał Jelonek } 10217473940bSRafał Jelonek 10227473940bSRafał Jelonek TEST_F(SortIncludesTest, MergeLines) { 10237473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 10247473940bSRafał Jelonek std::string Code = "#include \"c.h\"\r\n" 10257473940bSRafał Jelonek "#include \"b\\\r\n" 10267473940bSRafał Jelonek ".h\"\r\n" 10277473940bSRafał Jelonek "#include \"a.h\"\r\n"; 10287473940bSRafał Jelonek 10297473940bSRafał Jelonek std::string Expected = "#include \"a.h\"\r\n" 10307473940bSRafał Jelonek "#include \"b\\\r\n" 10317473940bSRafał Jelonek ".h\"\r\n" 10327473940bSRafał Jelonek "#include \"c.h\"\r\n"; 10337473940bSRafał Jelonek 10347473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "a.cpp", 1)); 10357473940bSRafał Jelonek } 10367473940bSRafał Jelonek 1037d89ae9d3SDaniel Jasper } // end namespace 1038d89ae9d3SDaniel Jasper } // end namespace format 1039d89ae9d3SDaniel Jasper } // end namespace clang 1040