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" 1261dc0f2bSNathan James #include "llvm/ADT/StringRef.h" 13d89ae9d3SDaniel Jasper #include "llvm/Support/Debug.h" 14d89ae9d3SDaniel Jasper #include "gtest/gtest.h" 15d89ae9d3SDaniel Jasper 16d89ae9d3SDaniel Jasper #define DEBUG_TYPE "format-test" 17d89ae9d3SDaniel Jasper 18d89ae9d3SDaniel Jasper namespace clang { 19d89ae9d3SDaniel Jasper namespace format { 20d89ae9d3SDaniel Jasper namespace { 21d89ae9d3SDaniel Jasper 22d89ae9d3SDaniel Jasper class SortIncludesTest : public ::testing::Test { 23d89ae9d3SDaniel Jasper protected: 2494a96fceSDaniel Jasper std::vector<tooling::Range> GetCodeRange(StringRef Code) { 2594a96fceSDaniel Jasper return std::vector<tooling::Range>(1, tooling::Range(0, Code.size())); 2694a96fceSDaniel Jasper } 2794a96fceSDaniel Jasper 28d6a00780SDaniel Jasper std::string sort(StringRef Code, std::vector<tooling::Range> Ranges, 29925bb20cSKrasimir Georgiev StringRef FileName = "input.cc", 30925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 319d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName); 32a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 33925bb20cSKrasimir Georgiev EXPECT_EQ(ExpectedNumRanges, Replaces.size()); 34a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 354f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 364f8d9943SEric Liu auto Result = applyAllReplacements( 379d92c027SEric Liu *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName)); 384f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 394f8d9943SEric Liu return *Result; 40d89ae9d3SDaniel Jasper } 4185c472dcSDaniel Jasper 42ece7e95fSmydeveloperday std::string sort(StringRef Code, StringRef FileName = "input.cpp", 43925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 44925bb20cSKrasimir Georgiev return sort(Code, GetCodeRange(Code), FileName, ExpectedNumRanges); 45d6a00780SDaniel Jasper } 46d6a00780SDaniel Jasper 47b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 489d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 49b68aabf7SDaniel Jasper return Cursor; 50b68aabf7SDaniel Jasper } 51b68aabf7SDaniel Jasper 529d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 539d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 54d89ae9d3SDaniel Jasper }; 55d89ae9d3SDaniel Jasper 56d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 57d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 59d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 60d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 61d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 62d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 63d6a00780SDaniel Jasper 64d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 65d6a00780SDaniel Jasper "#include <a>\n" 66d6a00780SDaniel Jasper "#include <b>\n", 67d6a00780SDaniel Jasper sort("// comment\n" 68d6a00780SDaniel Jasper "#include <b>\n" 69d6a00780SDaniel Jasper "#include <a>\n", 70d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 71d89ae9d3SDaniel Jasper } 72d89ae9d3SDaniel Jasper 7395bf0a9eSMarek Kurdej TEST_F(SortIncludesTest, TrailingComments) { 7495bf0a9eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n" 7595bf0a9eSMarek Kurdej "#include \"b.h\" /* long\n" 7695bf0a9eSMarek Kurdej " * long\n" 7795bf0a9eSMarek Kurdej " * comment*/\n" 7895bf0a9eSMarek Kurdej "#include \"c.h\"\n" 7995bf0a9eSMarek Kurdej "#include \"d.h\"\n", 8095bf0a9eSMarek Kurdej sort("#include \"a.h\"\n" 8195bf0a9eSMarek Kurdej "#include \"c.h\"\n" 8295bf0a9eSMarek Kurdej "#include \"b.h\" /* long\n" 8395bf0a9eSMarek Kurdej " * long\n" 8495bf0a9eSMarek Kurdej " * comment*/\n" 8595bf0a9eSMarek Kurdej "#include \"d.h\"\n")); 8695bf0a9eSMarek Kurdej } 8795bf0a9eSMarek Kurdej 8852e44b14SPaul Hoad TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) { 8952e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 9052e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeCategories = { 918668eae2Smydeveloperday {"^<sys/param\\.h>", 1, 0, false}, 928668eae2Smydeveloperday {"^<sys/types\\.h>", 1, 1, false}, 938668eae2Smydeveloperday {"^<sys.*/", 1, 2, false}, 948668eae2Smydeveloperday {"^<uvm/", 2, 3, false}, 958668eae2Smydeveloperday {"^<machine/", 3, 4, false}, 968668eae2Smydeveloperday {"^<dev/", 4, 5, false}, 978668eae2Smydeveloperday {"^<net.*/", 5, 6, false}, 988668eae2Smydeveloperday {"^<protocols/", 5, 7, false}, 998668eae2Smydeveloperday {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8, false}, 1008668eae2Smydeveloperday {"^<(x86|amd64|i386|xen)/", 7, 8, false}, 1018668eae2Smydeveloperday {"<path", 9, 11, false}, 1028668eae2Smydeveloperday {"^<[^/].*\\.h>", 8, 10, false}, 1038668eae2Smydeveloperday {"^\".*\\.h\"", 10, 12, false}}; 10452e44b14SPaul Hoad EXPECT_EQ("#include <sys/param.h>\n" 10552e44b14SPaul Hoad "#include <sys/types.h>\n" 10652e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 10752e44b14SPaul Hoad "#include <sys/socket.h>\n" 10852e44b14SPaul Hoad "#include <sys/stat.h>\n" 10952e44b14SPaul Hoad "#include <sys/wait.h>\n" 11052e44b14SPaul Hoad "\n" 11152e44b14SPaul Hoad "#include <net/if.h>\n" 11252e44b14SPaul Hoad "#include <net/if_dl.h>\n" 11352e44b14SPaul Hoad "#include <net/route.h>\n" 11452e44b14SPaul Hoad "#include <netinet/in.h>\n" 11552e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 11652e44b14SPaul Hoad "\n" 11752e44b14SPaul Hoad "#include <assert.h>\n" 11852e44b14SPaul Hoad "#include <errno.h>\n" 11952e44b14SPaul Hoad "#include <inttypes.h>\n" 12052e44b14SPaul Hoad "#include <stdio.h>\n" 12152e44b14SPaul Hoad "#include <stdlib.h>\n" 12252e44b14SPaul Hoad "\n" 12352e44b14SPaul Hoad "#include <paths.h>\n" 12452e44b14SPaul Hoad "\n" 12552e44b14SPaul Hoad "#include \"pathnames.h\"\n", 12652e44b14SPaul Hoad sort("#include <sys/param.h>\n" 12752e44b14SPaul Hoad "#include <sys/types.h>\n" 12852e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 12952e44b14SPaul Hoad "#include <net/if_dl.h>\n" 13052e44b14SPaul Hoad "#include <net/route.h>\n" 13152e44b14SPaul Hoad "#include <netinet/in.h>\n" 13252e44b14SPaul Hoad "#include <sys/socket.h>\n" 13352e44b14SPaul Hoad "#include <sys/stat.h>\n" 13452e44b14SPaul Hoad "#include <sys/wait.h>\n" 13552e44b14SPaul Hoad "#include <net/if.h>\n" 13652e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 13752e44b14SPaul Hoad "#include <assert.h>\n" 13852e44b14SPaul Hoad "#include <paths.h>\n" 13952e44b14SPaul Hoad "#include \"pathnames.h\"\n" 14052e44b14SPaul Hoad "#include <errno.h>\n" 14152e44b14SPaul Hoad "#include <inttypes.h>\n" 14252e44b14SPaul Hoad "#include <stdio.h>\n" 14352e44b14SPaul Hoad "#include <stdlib.h>\n")); 14452e44b14SPaul Hoad } 14552e44b14SPaul Hoad TEST_F(SortIncludesTest, SortPriorityNotDefined) { 14652e44b14SPaul Hoad FmtStyle = getLLVMStyle(); 14752e44b14SPaul Hoad EXPECT_EQ("#include \"FormatTestUtils.h\"\n" 14852e44b14SPaul Hoad "#include \"clang/Format/Format.h\"\n" 14952e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 15052e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n" 15152e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n", 15252e44b14SPaul Hoad sort("#include \"clang/Format/Format.h\"\n" 15352e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 15452e44b14SPaul Hoad "#include \"FormatTestUtils.h\"\n" 15552e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n" 15652e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n")); 15752e44b14SPaul Hoad } 15852e44b14SPaul Hoad 15994a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 16094a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 16194a96fceSDaniel Jasper std::string Code = "#include <a>\n" 16294a96fceSDaniel Jasper "#include <b>\n" 163a992afe8SEric Liu "#include <c>\n" 164a992afe8SEric Liu "#include <d>\n" 165a992afe8SEric Liu "#include <e>\n" 166a992afe8SEric Liu "#include <f>\n"; 1679d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 16894a96fceSDaniel Jasper } 16994a96fceSDaniel Jasper 17084048e23SHaojian Wu TEST_F(SortIncludesTest, MainFileHeader) { 171c1b209ccSHaojian Wu std::string Code = "#include <string>\n" 172c1b209ccSHaojian Wu "\n" 173c1b209ccSHaojian Wu "#include \"a/extra_action.proto.h\"\n"; 174c1b209ccSHaojian Wu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 175c1b209ccSHaojian Wu EXPECT_TRUE( 176c1b209ccSHaojian Wu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a/extra_action.cc") 177c1b209ccSHaojian Wu .empty()); 17884048e23SHaojian Wu 17984048e23SHaojian Wu EXPECT_EQ("#include \"foo.bar.h\"\n" 18084048e23SHaojian Wu "\n" 18184048e23SHaojian Wu "#include \"a.h\"\n", 18284048e23SHaojian Wu sort("#include \"a.h\"\n" 18384048e23SHaojian Wu "#include \"foo.bar.h\"\n", 18484048e23SHaojian Wu "foo.bar.cc")); 185c1b209ccSHaojian Wu } 186c1b209ccSHaojian Wu 1874c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 1889d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1894c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1904c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1914c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1924c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1934c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1944c2c9c36SKrasimir Georgiev "\n" 1954c2c9c36SKrasimir Georgiev "\n" 1964c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1974c2c9c36SKrasimir Georgiev 1989d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 1994c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2004c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 2014c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 2024c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 2034c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2044c2c9c36SKrasimir Georgiev "\n" 2054c2c9c36SKrasimir Georgiev "\n" 2064c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2074c2c9c36SKrasimir Georgiev } 2084c2c9c36SKrasimir Georgiev 2099b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 2109b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 2119b8c7c72SDaniel Jasper "#include <b>\n" 2129b8c7c72SDaniel Jasper "#include <c>\n" 2139b8c7c72SDaniel Jasper "// clang-format off\n" 2149b8c7c72SDaniel Jasper "#include <b>\n" 2159b8c7c72SDaniel Jasper "#include <a>\n" 2169b8c7c72SDaniel Jasper "#include <c>\n" 2179b8c7c72SDaniel Jasper "// clang-format on\n", 2189b8c7c72SDaniel Jasper sort("#include <b>\n" 2199b8c7c72SDaniel Jasper "#include <a>\n" 2209b8c7c72SDaniel Jasper "#include <c>\n" 2219b8c7c72SDaniel Jasper "// clang-format off\n" 2229b8c7c72SDaniel Jasper "#include <b>\n" 2239b8c7c72SDaniel Jasper "#include <a>\n" 2249b8c7c72SDaniel Jasper "#include <c>\n" 2259b8c7c72SDaniel Jasper "// clang-format on\n")); 2267473940bSRafał Jelonek 2277473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 2287473940bSRafał Jelonek std::string Code = "// clang-format off\r\n" 2297473940bSRafał Jelonek "#include \"d.h\"\r\n" 2307473940bSRafał Jelonek "#include \"b.h\"\r\n" 2317473940bSRafał Jelonek "// clang-format on\r\n" 2327473940bSRafał Jelonek "\r\n" 2337473940bSRafał Jelonek "#include \"c.h\"\r\n" 2347473940bSRafał Jelonek "#include \"a.h\"\r\n" 2357473940bSRafał Jelonek "#include \"e.h\"\r\n"; 2367473940bSRafał Jelonek 2377473940bSRafał Jelonek std::string Expected = "// clang-format off\r\n" 2387473940bSRafał Jelonek "#include \"d.h\"\r\n" 2397473940bSRafał Jelonek "#include \"b.h\"\r\n" 2407473940bSRafał Jelonek "// clang-format on\r\n" 2417473940bSRafał Jelonek "\r\n" 2427473940bSRafał Jelonek "#include \"e.h\"\r\n" 2437473940bSRafał Jelonek "#include \"a.h\"\r\n" 2447473940bSRafał Jelonek "#include \"c.h\"\r\n"; 2457473940bSRafał Jelonek 2467473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 2479b8c7c72SDaniel Jasper } 2489b8c7c72SDaniel Jasper 2499b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 2509b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2519b468c0bSPaul Hoad "#include <b>\n" 2529b468c0bSPaul Hoad "#include <c>\n" 2539b468c0bSPaul Hoad "/* clang-format off */\n" 2549b468c0bSPaul Hoad "#include <b>\n" 2559b468c0bSPaul Hoad "#include <a>\n" 2569b468c0bSPaul Hoad "#include <c>\n" 2579b468c0bSPaul Hoad "/* clang-format on */\n", 2589b468c0bSPaul Hoad sort("#include <b>\n" 2599b468c0bSPaul Hoad "#include <a>\n" 2609b468c0bSPaul Hoad "#include <c>\n" 2619b468c0bSPaul Hoad "/* clang-format off */\n" 2629b468c0bSPaul Hoad "#include <b>\n" 2639b468c0bSPaul Hoad "#include <a>\n" 2649b468c0bSPaul Hoad "#include <c>\n" 2659b468c0bSPaul Hoad "/* clang-format on */\n")); 2669b468c0bSPaul Hoad 2679b468c0bSPaul Hoad // Not really turning it off 2689b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2699b468c0bSPaul Hoad "#include <b>\n" 2709b468c0bSPaul Hoad "#include <c>\n" 2719b468c0bSPaul Hoad "/* clang-format offically */\n" 2729b468c0bSPaul Hoad "#include <a>\n" 2739b468c0bSPaul Hoad "#include <b>\n" 2749b468c0bSPaul Hoad "#include <c>\n" 2759b468c0bSPaul Hoad "/* clang-format onwards */\n", 2769b468c0bSPaul Hoad sort("#include <b>\n" 2779b468c0bSPaul Hoad "#include <a>\n" 2789b468c0bSPaul Hoad "#include <c>\n" 2799b468c0bSPaul Hoad "/* clang-format offically */\n" 2809b468c0bSPaul Hoad "#include <b>\n" 2819b468c0bSPaul Hoad "#include <a>\n" 2829b468c0bSPaul Hoad "#include <c>\n" 283ece7e95fSmydeveloperday "/* clang-format onwards */\n", 284ece7e95fSmydeveloperday "input.h", 2)); 2859b468c0bSPaul Hoad } 2869b468c0bSPaul Hoad 287da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 288a8105b37SKent Sommer FmtStyle.SortIncludes = FormatStyle::SI_Never; 289da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 290da446770SDaniel Jasper "#include \"c.h\"\n" 291da446770SDaniel Jasper "#include \"b.h\"\n", 292da446770SDaniel Jasper sort("#include \"a.h\"\n" 293da446770SDaniel Jasper "#include \"c.h\"\n" 294925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 295925bb20cSKrasimir Georgiev "input.h", 0)); 296da446770SDaniel Jasper } 297da446770SDaniel Jasper 298ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 299ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 300ff06370eSNico Weber "#import \"b.h\"\n" 301ff06370eSNico Weber "#include \"c.h\"\n", 302ff06370eSNico Weber sort("#include \"a.h\"\n" 303ff06370eSNico Weber "#include \"c.h\"\n" 304ff06370eSNico Weber "#import \"b.h\"\n")); 305ff06370eSNico Weber } 306ff06370eSNico Weber 307d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 308d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 309d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 310d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 311d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 312d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 313d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 314d89ae9d3SDaniel Jasper } 315d89ae9d3SDaniel Jasper 316d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 317d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 318d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 319d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 320d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 321d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 322d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 323d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 324d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 325d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 326d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 327d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 328d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 329fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 330fe21c86eSMarek Kurdej " #include \"a.h\"\n")); 331fe21c86eSMarek Kurdej } 332fe21c86eSMarek Kurdej 333fe21c86eSMarek Kurdej TEST_F(SortIncludesTest, TrailingWhitespace) { 334fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n" 335fe21c86eSMarek Kurdej "#include \"b.h\"\n" 336fe21c86eSMarek Kurdej "#include \"c.h\"\n", 337fe21c86eSMarek Kurdej sort("#include \"a.h\" \n" 338fe21c86eSMarek Kurdej "#include \"c.h\" \n" 339fe21c86eSMarek Kurdej "#include \"b.h\" \n")); 340fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 341fe21c86eSMarek Kurdej "#include \"a.h\" \n")); 342d89ae9d3SDaniel Jasper } 343d89ae9d3SDaniel Jasper 344d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 345d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 346d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 347d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 348d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 349d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 350d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 351d89ae9d3SDaniel Jasper } 352d89ae9d3SDaniel Jasper 353d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 354d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 355d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 356d89ae9d3SDaniel Jasper "\n" 357d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 35885c472dcSDaniel Jasper sort("#include \"a.h\"\n" 35985c472dcSDaniel Jasper "#include \"c.h\"\n" 360d89ae9d3SDaniel Jasper "\n" 361ece7e95fSmydeveloperday "#include \"b.h\"\n", 362ece7e95fSmydeveloperday "input.h", 0)); 363d89ae9d3SDaniel Jasper } 364d89ae9d3SDaniel Jasper 3654c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 3669d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3674c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3684c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3694c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3704c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 3714c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3724c2c9c36SKrasimir Georgiev "\n" 3734c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3744c2c9c36SKrasimir Georgiev } 3754c2c9c36SKrasimir Georgiev 3764c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 3774c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3784c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3794c2c9c36SKrasimir Georgiev "// comment\n" 3804c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3814c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3824c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3834c2c9c36SKrasimir Georgiev "// comment\n" 3844c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3854c2c9c36SKrasimir Georgiev 3869d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3874c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3884c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3894c2c9c36SKrasimir Georgiev "// comment\n" 3904c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3914c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3924c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3934c2c9c36SKrasimir Georgiev "// comment\n" 3944c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3954c2c9c36SKrasimir Georgiev 3969d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3974c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3984c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3994c2c9c36SKrasimir Georgiev "// comment\n" 4004c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 4014c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 4024c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 4034c2c9c36SKrasimir Georgiev "// comment\n" 4044c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 4054c2c9c36SKrasimir Georgiev } 4064c2c9c36SKrasimir Georgiev 407d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 40885c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 40985c472dcSDaniel Jasper "#include \"c.h\"\n" 4100f4d5f85SEric Liu "#include <array>\n" 41185c472dcSDaniel Jasper "#include <b.h>\n" 4120f4d5f85SEric Liu "#include <d.h>\n" 4130f4d5f85SEric Liu "#include <vector>\n", 4140f4d5f85SEric Liu sort("#include <vector>\n" 4150f4d5f85SEric Liu "#include <d.h>\n" 4160f4d5f85SEric Liu "#include <array>\n" 41785c472dcSDaniel Jasper "#include <b.h>\n" 41885c472dcSDaniel Jasper "#include \"c.h\"\n" 41985c472dcSDaniel Jasper "#include \"a.h\"\n")); 42085c472dcSDaniel Jasper 4219d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 422d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 423d89ae9d3SDaniel Jasper "#include <d.h>\n" 4240f4d5f85SEric Liu "\n" 4250f4d5f85SEric Liu "#include <array>\n" 4260f4d5f85SEric Liu "#include <vector>\n" 4270f4d5f85SEric Liu "\n" 428d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 429d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 4300f4d5f85SEric Liu sort("#include <vector>\n" 4310f4d5f85SEric Liu "#include <d.h>\n" 4320f4d5f85SEric Liu "#include <array>\n" 433d89ae9d3SDaniel Jasper "#include <b.h>\n" 434d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 435d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 436d89ae9d3SDaniel Jasper } 437d89ae9d3SDaniel Jasper 4384c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 4399d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4404c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4414c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4424c2c9c36SKrasimir Georgiev "\n" 4434c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4444c2c9c36SKrasimir Georgiev "#include <d.h>\n", 4454c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 4464c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4474c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4484c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 4494c2c9c36SKrasimir Georgiev } 4504c2c9c36SKrasimir Georgiev 451d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 452d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 453d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 454d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 455d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 456d89ae9d3SDaniel Jasper "#include \\\n" 457d89ae9d3SDaniel Jasper "\"c.h\"\n" 458d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 459d89ae9d3SDaniel Jasper } 460d89ae9d3SDaniel Jasper 461d46fa023SKonrad Kleine TEST_F(SortIncludesTest, SupportAtImportLines) { 462d46fa023SKonrad Kleine // Test from https://github.com/llvm/llvm-project/issues/38995 463d46fa023SKonrad Kleine EXPECT_EQ("#import \"a.h\"\n" 464d46fa023SKonrad Kleine "#import \"b.h\"\n" 465d46fa023SKonrad Kleine "#import \"c.h\"\n" 466d46fa023SKonrad Kleine "#import <d/e.h>\n" 467d46fa023SKonrad Kleine "@import Foundation;\n", 468d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 469d46fa023SKonrad Kleine "#import \"c.h\"\n" 470d46fa023SKonrad Kleine "#import <d/e.h>\n" 471d46fa023SKonrad Kleine "@import Foundation;\n" 472d46fa023SKonrad Kleine "#import \"a.h\"\n")); 473d46fa023SKonrad Kleine 474d46fa023SKonrad Kleine // Slightly more complicated test that shows sorting in each priorities still 475d46fa023SKonrad Kleine // works. 476d46fa023SKonrad Kleine EXPECT_EQ("#import \"a.h\"\n" 477d46fa023SKonrad Kleine "#import \"b.h\"\n" 478d46fa023SKonrad Kleine "#import \"c.h\"\n" 479d46fa023SKonrad Kleine "#import <d/e.h>\n" 480d46fa023SKonrad Kleine "@import Base;\n" 481d46fa023SKonrad Kleine "@import Foundation;\n" 482d46fa023SKonrad Kleine "@import base;\n" 483d46fa023SKonrad Kleine "@import foundation;\n", 484d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 485d46fa023SKonrad Kleine "#import \"c.h\"\n" 486d46fa023SKonrad Kleine "@import Base;\n" 487d46fa023SKonrad Kleine "#import <d/e.h>\n" 488d46fa023SKonrad Kleine "@import foundation;\n" 489d46fa023SKonrad Kleine "@import Foundation;\n" 490d46fa023SKonrad Kleine "@import base;\n" 491d46fa023SKonrad Kleine "#import \"a.h\"\n")); 492d46fa023SKonrad Kleine 493d46fa023SKonrad Kleine // Test that shows main headers in two groups are still found and sorting 494d46fa023SKonrad Kleine // still works. The @import's are kept in their respective group but are 495d46fa023SKonrad Kleine // put at the end of each group. 496d46fa023SKonrad Kleine FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Preserve; 497d46fa023SKonrad Kleine EXPECT_EQ("#import \"foo.hpp\"\n" 498d46fa023SKonrad Kleine "#import \"b.h\"\n" 499d46fa023SKonrad Kleine "#import \"c.h\"\n" 500d46fa023SKonrad Kleine "#import <d/e.h>\n" 501d46fa023SKonrad Kleine "@import Base;\n" 502d46fa023SKonrad Kleine "@import Foundation;\n" 503d46fa023SKonrad Kleine "@import foundation;\n" 504d46fa023SKonrad Kleine "\n" 505d46fa023SKonrad Kleine "#import \"foo.h\"\n" 506d46fa023SKonrad Kleine "#include \"foobar\"\n" 507d46fa023SKonrad Kleine "#import <f/g.h>\n" 508d46fa023SKonrad Kleine "@import AAAA;\n" 509d46fa023SKonrad Kleine "@import aaaa;\n", 510d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 511d46fa023SKonrad Kleine "@import Foundation;\n" 512d46fa023SKonrad Kleine "@import foundation;\n" 513d46fa023SKonrad Kleine "#import \"c.h\"\n" 514d46fa023SKonrad Kleine "#import <d/e.h>\n" 515d46fa023SKonrad Kleine "@import Base;\n" 516d46fa023SKonrad Kleine "#import \"foo.hpp\"\n" 517d46fa023SKonrad Kleine "\n" 518d46fa023SKonrad Kleine "@import aaaa;\n" 519d46fa023SKonrad Kleine "#import <f/g.h>\n" 520d46fa023SKonrad Kleine "@import AAAA;\n" 521d46fa023SKonrad Kleine "#include \"foobar\"\n" 522d46fa023SKonrad Kleine "#import \"foo.h\"\n", 523d46fa023SKonrad Kleine "foo.c", 2)); 524d46fa023SKonrad Kleine 525d46fa023SKonrad Kleine // Regrouping and putting @import's in the very last group 526d46fa023SKonrad Kleine FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 527d46fa023SKonrad Kleine EXPECT_EQ("#import \"foo.hpp\"\n" 528d46fa023SKonrad Kleine "\n" 529d46fa023SKonrad Kleine "#import \"b.h\"\n" 530d46fa023SKonrad Kleine "#import \"c.h\"\n" 531d46fa023SKonrad Kleine "#import \"foo.h\"\n" 532d46fa023SKonrad Kleine "#include \"foobar\"\n" 533d46fa023SKonrad Kleine "\n" 534d46fa023SKonrad Kleine "#import <d/e.h>\n" 535d46fa023SKonrad Kleine "#import <f/g.h>\n" 536d46fa023SKonrad Kleine "\n" 537d46fa023SKonrad Kleine "@import AAAA;\n" 538d46fa023SKonrad Kleine "@import Base;\n" 539d46fa023SKonrad Kleine "@import Foundation;\n" 540d46fa023SKonrad Kleine "@import aaaa;\n" 541d46fa023SKonrad Kleine "@import foundation;\n", 542d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 543d46fa023SKonrad Kleine "@import Foundation;\n" 544d46fa023SKonrad Kleine "@import foundation;\n" 545d46fa023SKonrad Kleine "#import \"c.h\"\n" 546d46fa023SKonrad Kleine "#import <d/e.h>\n" 547d46fa023SKonrad Kleine "@import Base;\n" 548d46fa023SKonrad Kleine "#import \"foo.hpp\"\n" 549d46fa023SKonrad Kleine "\n" 550d46fa023SKonrad Kleine "@import aaaa;\n" 551d46fa023SKonrad Kleine "#import <f/g.h>\n" 552d46fa023SKonrad Kleine "@import AAAA;\n" 553d46fa023SKonrad Kleine "#include \"foobar\"\n" 554d46fa023SKonrad Kleine "#import \"foo.h\"\n", 555d46fa023SKonrad Kleine "foo.c")); 556d46fa023SKonrad Kleine } 557d46fa023SKonrad Kleine 55885c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 5599c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 56085c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 56185c472dcSDaniel Jasper "#include \"b.h\"\n" 56285c472dcSDaniel Jasper "#include \"c.h\"\n", 56385c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 56485c472dcSDaniel Jasper "#include \"c.h\"\n" 5650bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 5660bfdeb4bSDaniel Jasper "a.cc")); 567afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 568afa62faeSNico Weber "#include \"b.h\"\n" 569afa62faeSNico Weber "#include \"c.h\"\n", 570afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 571afa62faeSNico Weber "#include \"c.h\"\n" 572afa62faeSNico Weber "#include \"b.h\"\n", 5739c8ff355SDaniel Jasper "a_test.cc")); 5740bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 5750bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 5760bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 5770bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 5780bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 5790bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 580afa62faeSNico Weber "input.mm")); 58185c472dcSDaniel Jasper 5829c8ff355SDaniel Jasper // Don't allow prefixes. 5839c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 5849c8ff355SDaniel Jasper "#include \"c.h\"\n" 5859c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 5869c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 5879c8ff355SDaniel Jasper "#include \"c.h\"\n" 5889c8ff355SDaniel Jasper "#include \"b.h\"\n", 5899c8ff355SDaniel Jasper "a.cc")); 5909c8ff355SDaniel Jasper 5919c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 5929c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 5939c8ff355SDaniel Jasper "#include \"c.h\"\n" 5949c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 5959c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 5969c8ff355SDaniel Jasper "#include \"c.h\"\n" 5979c8ff355SDaniel Jasper "#include \"b.h\"\n", 5989c8ff355SDaniel Jasper "a_main.cc")); 5999c8ff355SDaniel Jasper 60085c472dcSDaniel Jasper // Don't do this in headers. 60185c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 60285c472dcSDaniel Jasper "#include \"c.h\"\n" 60385c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 60485c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 60585c472dcSDaniel Jasper "#include \"c.h\"\n" 60685c472dcSDaniel Jasper "#include \"b.h\"\n", 6070bfdeb4bSDaniel Jasper "a.h")); 60832d75fa2SDaniel Jasper 60932d75fa2SDaniel Jasper // Only do this in the first #include block. 61032d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 61132d75fa2SDaniel Jasper "\n" 61232d75fa2SDaniel Jasper "#include \"b.h\"\n" 61332d75fa2SDaniel Jasper "#include \"c.h\"\n" 61432d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 61532d75fa2SDaniel Jasper sort("#include <a>\n" 61632d75fa2SDaniel Jasper "\n" 61732d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 61832d75fa2SDaniel Jasper "#include \"c.h\"\n" 61932d75fa2SDaniel Jasper "#include \"b.h\"\n", 62032d75fa2SDaniel Jasper "a.cc")); 621a252f5d5SDaniel Jasper 622a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 623a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 624a252f5d5SDaniel Jasper "#include \"b.h\"\n" 625a252f5d5SDaniel Jasper "#include \"c.h\"\n" 626a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 627a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 628a252f5d5SDaniel Jasper "#include \"a.h\"\n" 629a252f5d5SDaniel Jasper "#include \"c.h\"\n" 630a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 631a252f5d5SDaniel Jasper "a.cc")); 63285c472dcSDaniel Jasper } 63385c472dcSDaniel Jasper 634335ac2ebSmydeveloperday TEST_F(SortIncludesTest, LeavesMainHeaderFirstInAdditionalExtensions) { 635335ac2ebSmydeveloperday Style.IncludeIsMainRegex = "([-_](test|unittest))?|(Impl)?$"; 636335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 637335ac2ebSmydeveloperday "#include \"c.h\"\n" 638335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 639335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 640335ac2ebSmydeveloperday "#include \"c.h\"\n" 641335ac2ebSmydeveloperday "#include \"b.h\"\n", 642335ac2ebSmydeveloperday "a_test.xxx")); 643335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 644335ac2ebSmydeveloperday "#include \"c.h\"\n" 645335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 646335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 647335ac2ebSmydeveloperday "#include \"c.h\"\n" 648335ac2ebSmydeveloperday "#include \"b.h\"\n", 649335ac2ebSmydeveloperday "aImpl.hpp")); 650335ac2ebSmydeveloperday 651335ac2ebSmydeveloperday // .cpp extension is considered "main" by default 652335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 653335ac2ebSmydeveloperday "#include \"b.h\"\n" 654335ac2ebSmydeveloperday "#include \"c.h\"\n", 655335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 656335ac2ebSmydeveloperday "#include \"c.h\"\n" 657335ac2ebSmydeveloperday "#include \"b.h\"\n", 658335ac2ebSmydeveloperday "aImpl.cpp")); 659335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 660335ac2ebSmydeveloperday "#include \"b.h\"\n" 661335ac2ebSmydeveloperday "#include \"c.h\"\n", 662335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 663335ac2ebSmydeveloperday "#include \"c.h\"\n" 664335ac2ebSmydeveloperday "#include \"b.h\"\n", 665335ac2ebSmydeveloperday "a_test.cpp")); 666335ac2ebSmydeveloperday 667335ac2ebSmydeveloperday // Allow additional filenames / extensions 668335ac2ebSmydeveloperday Style.IncludeIsMainSourceRegex = "(Impl\\.hpp)|(\\.xxx)$"; 669335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 670335ac2ebSmydeveloperday "#include \"b.h\"\n" 671335ac2ebSmydeveloperday "#include \"c.h\"\n", 672335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 673335ac2ebSmydeveloperday "#include \"c.h\"\n" 674335ac2ebSmydeveloperday "#include \"b.h\"\n", 675335ac2ebSmydeveloperday "a_test.xxx")); 676335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 677335ac2ebSmydeveloperday "#include \"b.h\"\n" 678335ac2ebSmydeveloperday "#include \"c.h\"\n", 679335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 680335ac2ebSmydeveloperday "#include \"c.h\"\n" 681335ac2ebSmydeveloperday "#include \"b.h\"\n", 682335ac2ebSmydeveloperday "aImpl.hpp")); 683335ac2ebSmydeveloperday } 684335ac2ebSmydeveloperday 6854c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 6864c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 6879d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 6884c2c9c36SKrasimir Georgiev 6894c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 6904c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 6914c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 6924c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 6934c2c9c36SKrasimir Georgiev "\n" 6944c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 6954c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 6964c2c9c36SKrasimir Georgiev "c.cc")); 6974c2c9c36SKrasimir Georgiev } 6984c2c9c36SKrasimir Georgiev 6994c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 7004c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 7019d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7024c2c9c36SKrasimir Georgiev 7034c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 7044c2c9c36SKrasimir Georgiev "\n" 7054c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 7064c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 7074c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 7084c2c9c36SKrasimir Georgiev "\n" 7094c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 7104c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 7114c2c9c36SKrasimir Georgiev "a.cc")); 7124c2c9c36SKrasimir Georgiev } 7134c2c9c36SKrasimir Georgiev 714a8105b37SKent Sommer TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveSorting) { 7157b02794fSBjörn Schäpers EXPECT_FALSE(FmtStyle.SortIncludes == FormatStyle::SI_CaseInsensitive); 716a8105b37SKent Sommer 7177b02794fSBjörn Schäpers FmtStyle.SortIncludes = FormatStyle::SI_CaseInsensitive; 718a8105b37SKent Sommer 719a8105b37SKent Sommer EXPECT_EQ("#include \"A/B.h\"\n" 720a8105b37SKent Sommer "#include \"A/b.h\"\n" 721a8105b37SKent Sommer "#include \"a/b.h\"\n" 722a8105b37SKent Sommer "#include \"B/A.h\"\n" 723a8105b37SKent Sommer "#include \"B/a.h\"\n", 724a8105b37SKent Sommer sort("#include \"B/a.h\"\n" 725a8105b37SKent Sommer "#include \"B/A.h\"\n" 726a8105b37SKent Sommer "#include \"A/B.h\"\n" 727a8105b37SKent Sommer "#include \"a/b.h\"\n" 728a8105b37SKent Sommer "#include \"A/b.h\"\n", 729a8105b37SKent Sommer "a.h")); 730a8105b37SKent Sommer 731a8105b37SKent Sommer Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 732a8105b37SKent Sommer Style.IncludeCategories = { 733a8105b37SKent Sommer {"^\"", 1, 0, false}, {"^<.*\\.h>$", 2, 0, false}, {"^<", 3, 0, false}}; 734a8105b37SKent Sommer 735a8105b37SKent Sommer StringRef UnsortedCode = "#include \"qt.h\"\n" 736a8105b37SKent Sommer "#include <algorithm>\n" 737a8105b37SKent Sommer "#include <qtwhatever.h>\n" 738a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 739a8105b37SKent Sommer "#include <Algorithm>\n" 740a8105b37SKent Sommer "#include \"vlib.h\"\n" 741a8105b37SKent Sommer "#include \"Vlib.h\"\n" 742a8105b37SKent Sommer "#include \"AST.h\"\n"; 743a8105b37SKent Sommer 744a8105b37SKent Sommer EXPECT_EQ("#include \"AST.h\"\n" 745a8105b37SKent Sommer "#include \"qt.h\"\n" 746a8105b37SKent Sommer "#include \"Vlib.h\"\n" 747a8105b37SKent Sommer "#include \"vlib.h\"\n" 748a8105b37SKent Sommer "\n" 749a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 750a8105b37SKent Sommer "#include <qtwhatever.h>\n" 751a8105b37SKent Sommer "\n" 752a8105b37SKent Sommer "#include <Algorithm>\n" 753a8105b37SKent Sommer "#include <algorithm>\n", 754a8105b37SKent Sommer sort(UnsortedCode)); 755a8105b37SKent Sommer } 756a8105b37SKent Sommer 757d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 758d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 759d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 760d676ab13SChandler Carruth 761d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 762d676ab13SChandler Carruth // manner. 763d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 764d676ab13SChandler Carruth "#include \"b.h\"\n" 765d676ab13SChandler Carruth "#include \"c.h\"\n" 766d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 767d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 768d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 769d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 770d676ab13SChandler Carruth sort("#include \"c.h\"\n" 771d676ab13SChandler Carruth "#include \"b.h\"\n" 772d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 773d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 774d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 775d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 776d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 777d676ab13SChandler Carruth "a_TEST.cc")); 778d676ab13SChandler Carruth } 779d676ab13SChandler Carruth 7808668eae2Smydeveloperday TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveMachting) { 7818668eae2Smydeveloperday Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 7828668eae2Smydeveloperday Style.IncludeCategories = {{"^\"", 1, 0, false}, 7838668eae2Smydeveloperday {"^<.*\\.h>$", 2, 0, false}, 7848668eae2Smydeveloperday {"^<Q[A-Z][^\\.]*>", 3, 0, false}, 7858668eae2Smydeveloperday {"^<Qt[^\\.]*>", 4, 0, false}, 7868668eae2Smydeveloperday {"^<", 5, 0, false}}; 7878668eae2Smydeveloperday 7888668eae2Smydeveloperday StringRef UnsortedCode = "#include <QWidget>\n" 7898668eae2Smydeveloperday "#include \"qt.h\"\n" 7908668eae2Smydeveloperday "#include <algorithm>\n" 7918668eae2Smydeveloperday "#include <windows.h>\n" 7928668eae2Smydeveloperday "#include <QLabel>\n" 7938668eae2Smydeveloperday "#include \"qa.h\"\n" 7948668eae2Smydeveloperday "#include <queue>\n" 7958668eae2Smydeveloperday "#include <qtwhatever.h>\n" 7968668eae2Smydeveloperday "#include <QtGlobal>\n"; 7978668eae2Smydeveloperday 7988668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 7998668eae2Smydeveloperday "#include \"qt.h\"\n" 8008668eae2Smydeveloperday "\n" 8018668eae2Smydeveloperday "#include <qtwhatever.h>\n" 8028668eae2Smydeveloperday "#include <windows.h>\n" 8038668eae2Smydeveloperday "\n" 8048668eae2Smydeveloperday "#include <QLabel>\n" 8058668eae2Smydeveloperday "#include <QWidget>\n" 8068668eae2Smydeveloperday "#include <QtGlobal>\n" 8078668eae2Smydeveloperday "#include <queue>\n" 8088668eae2Smydeveloperday "\n" 8098668eae2Smydeveloperday "#include <algorithm>\n", 8108668eae2Smydeveloperday sort(UnsortedCode)); 8118668eae2Smydeveloperday 8128668eae2Smydeveloperday Style.IncludeCategories[2].RegexIsCaseSensitive = true; 8138668eae2Smydeveloperday Style.IncludeCategories[3].RegexIsCaseSensitive = true; 8148668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 8158668eae2Smydeveloperday "#include \"qt.h\"\n" 8168668eae2Smydeveloperday "\n" 8178668eae2Smydeveloperday "#include <qtwhatever.h>\n" 8188668eae2Smydeveloperday "#include <windows.h>\n" 8198668eae2Smydeveloperday "\n" 8208668eae2Smydeveloperday "#include <QLabel>\n" 8218668eae2Smydeveloperday "#include <QWidget>\n" 8228668eae2Smydeveloperday "\n" 8238668eae2Smydeveloperday "#include <QtGlobal>\n" 8248668eae2Smydeveloperday "\n" 8258668eae2Smydeveloperday "#include <algorithm>\n" 8268668eae2Smydeveloperday "#include <queue>\n", 8278668eae2Smydeveloperday sort(UnsortedCode)); 8288668eae2Smydeveloperday } 8298668eae2Smydeveloperday 830d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 8318668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 8328668eae2Smydeveloperday {".*", 1, 0, false}}; 833d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 8340bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 8350bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 8360bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 8370bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 8380bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 8390bfdeb4bSDaniel Jasper "c_main.cc")); 8400bfdeb4bSDaniel Jasper 8410bfdeb4bSDaniel Jasper // check stable when re-run 8420bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 8430bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 8440bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 8450bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 8460bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 8470bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 848925bb20cSKrasimir Georgiev "c_main.cc", 0)); 849d2629dc8SDaniel Jasper } 850d2629dc8SDaniel Jasper 8514c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 8528668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 8538668eae2Smydeveloperday {".*", 1, 0, false}}; 8549d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 8554c2c9c36SKrasimir Georgiev 8564c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 8574c2c9c36SKrasimir Georgiev "\n" 8584c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 8594c2c9c36SKrasimir Georgiev "\n" 8604c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 8614c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 8624c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 8634c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 8644c2c9c36SKrasimir Georgiev "c_main.cc")); 8654c2c9c36SKrasimir Georgiev 8664c2c9c36SKrasimir Georgiev // check stable when re-run 8674c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 8684c2c9c36SKrasimir Georgiev "\n" 8694c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 8704c2c9c36SKrasimir Georgiev "\n" 8714c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 8724c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 8734c2c9c36SKrasimir Georgiev "\n" 8744c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 8754c2c9c36SKrasimir Georgiev "\n" 8764c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 877925bb20cSKrasimir Georgiev "c_main.cc", 0)); 8784c2c9c36SKrasimir Georgiev } 8794c2c9c36SKrasimir Georgiev 880b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 881b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 882b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 883b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 884b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 885b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 886b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 887b68aabf7SDaniel Jasper 888b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 889b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 890b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 891b68aabf7SDaniel Jasper } 892b68aabf7SDaniel Jasper 893*db57acffSowenca TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionWithRegrouping) { 894*db57acffSowenca Style.IncludeBlocks = Style.IBS_Regroup; 895*db57acffSowenca std::string Code = "#include \"b\"\n" // Start of line: 0 896*db57acffSowenca "\n" // Start of line: 13 897*db57acffSowenca "#include \"aa\"\n" // Start of line: 14 898*db57acffSowenca "int i;"; // Start of line: 28 899*db57acffSowenca std::string Expected = "#include \"aa\"\n" // Start of line: 0 900*db57acffSowenca "#include \"b\"\n" // Start of line: 14 901*db57acffSowenca "int i;"; // Start of line: 27 902*db57acffSowenca EXPECT_EQ(Expected, sort(Code)); 903*db57acffSowenca EXPECT_EQ(12u, newCursor(Code, 26)); // Closing quote of "aa" 904*db57acffSowenca EXPECT_EQ(26u, newCursor(Code, 27)); // Newline after "aa" 905*db57acffSowenca EXPECT_EQ(27u, newCursor(Code, 28)); // Start of last line 906*db57acffSowenca } 907*db57acffSowenca 908a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 909a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 910a992afe8SEric Liu "#include <b>\n" 911a992afe8SEric Liu "#include <c>\n", 912a992afe8SEric Liu sort("#include <a>\n" 913a992afe8SEric Liu "#include <b>\n" 914a992afe8SEric Liu "#include <b>\n" 915a992afe8SEric Liu "#include <b>\n" 916a992afe8SEric Liu "#include <b>\n" 917a992afe8SEric Liu "#include <c>\n")); 9184c2c9c36SKrasimir Georgiev 9199d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 9204c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9214c2c9c36SKrasimir Georgiev "#include <b>\n" 9224c2c9c36SKrasimir Georgiev "#include <c>\n", 9234c2c9c36SKrasimir Georgiev sort("#include <a>\n" 9244c2c9c36SKrasimir Georgiev "#include <b>\n" 9254c2c9c36SKrasimir Georgiev "\n" 9264c2c9c36SKrasimir Georgiev "#include <b>\n" 9274c2c9c36SKrasimir Georgiev "\n" 9284c2c9c36SKrasimir Georgiev "#include <b>\n" 9294c2c9c36SKrasimir Georgiev "#include <c>\n")); 9304c2c9c36SKrasimir Georgiev 9319d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 9324c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9334c2c9c36SKrasimir Georgiev "#include <b>\n" 9344c2c9c36SKrasimir Georgiev "#include <c>\n", 9354c2c9c36SKrasimir Georgiev sort("#include <a>\n" 9364c2c9c36SKrasimir Georgiev "#include <b>\n" 9374c2c9c36SKrasimir Georgiev "\n" 9384c2c9c36SKrasimir Georgiev "#include <b>\n" 9394c2c9c36SKrasimir Georgiev "\n" 9404c2c9c36SKrasimir Georgiev "#include <b>\n" 9414c2c9c36SKrasimir Georgiev "#include <c>\n")); 942a992afe8SEric Liu } 943a992afe8SEric Liu 944a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 945a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 946a992afe8SEric Liu "#include <b>\n" 947a992afe8SEric Liu "#include <c>\n", 948a992afe8SEric Liu sort("#include <b>\n" 949a992afe8SEric Liu "#include <a>\n" 950a992afe8SEric Liu "#include <b>\n" 951a992afe8SEric Liu "#include <b>\n" 952a992afe8SEric Liu "#include <c>\n" 953a992afe8SEric Liu "#include <b>\n")); 9544c2c9c36SKrasimir Georgiev 9559d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 9564c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9574c2c9c36SKrasimir Georgiev "#include <b>\n" 9584c2c9c36SKrasimir Georgiev "#include <c>\n", 9594c2c9c36SKrasimir Georgiev sort("#include <b>\n" 9604c2c9c36SKrasimir Georgiev "#include <a>\n" 9614c2c9c36SKrasimir Georgiev "\n" 9624c2c9c36SKrasimir Georgiev "#include <b>\n" 9634c2c9c36SKrasimir Georgiev "\n" 9644c2c9c36SKrasimir Georgiev "#include <c>\n" 9654c2c9c36SKrasimir Georgiev "#include <b>\n")); 9664c2c9c36SKrasimir Georgiev 9679d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 9684c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9694c2c9c36SKrasimir Georgiev "#include <b>\n" 9704c2c9c36SKrasimir Georgiev "#include <c>\n", 9714c2c9c36SKrasimir Georgiev sort("#include <b>\n" 9724c2c9c36SKrasimir Georgiev "#include <a>\n" 9734c2c9c36SKrasimir Georgiev "\n" 9744c2c9c36SKrasimir Georgiev "#include <b>\n" 9754c2c9c36SKrasimir Georgiev "\n" 9764c2c9c36SKrasimir Georgiev "#include <c>\n" 9774c2c9c36SKrasimir Georgiev "#include <b>\n")); 978a992afe8SEric Liu } 979a992afe8SEric Liu 980a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 981a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 982a992afe8SEric Liu "#include <a>\n" // Start of line: 13 983a992afe8SEric Liu "#include <b>\n" // Start of line: 26 984a992afe8SEric Liu "#include <b>\n" // Start of line: 39 985a992afe8SEric Liu "#include <c>\n" // Start of line: 52 986a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 987a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 988a992afe8SEric Liu "#include <b>\n" // Start of line: 13 989a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 990a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 991a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 992a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 993a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 994a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 995a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 996a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 997a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 998a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 999a992afe8SEric Liu // Cursor on '#' in "#include <c>". 1000a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 1001a992afe8SEric Liu } 1002a992afe8SEric Liu 1003a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 1004a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 1005a992afe8SEric Liu "#include <b>\n" 1006a992afe8SEric Liu "\n" 1007a992afe8SEric Liu "#include <b>\n" 1008a992afe8SEric Liu "#include <c>\n", 1009a992afe8SEric Liu sort("#include <a>\n" 1010a992afe8SEric Liu "#include <b>\n" 1011a992afe8SEric Liu "\n" 1012a992afe8SEric Liu "#include <c>\n" 1013a992afe8SEric Liu "#include <b>\n" 1014a992afe8SEric Liu "#include <b>\n")); 1015a992afe8SEric Liu } 1016a992afe8SEric Liu 1017a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 1018a992afe8SEric Liu std::string Code = "#include <a>\n" 1019a992afe8SEric Liu "#include <b>\n" 1020a992afe8SEric Liu "#include <a>\n" 1021a992afe8SEric Liu "#include <a>\n" 1022a992afe8SEric Liu "\n" 1023a992afe8SEric Liu " int x ;"; 1024a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 10259d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 1026a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 1027a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 1028a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 1029a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 1030a992afe8SEric Liu } 1031a992afe8SEric Liu 1032a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 1033a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 1034a2e7d0deSKrasimir Georgiev "#include <b>\n" 1035a2e7d0deSKrasimir Georgiev "#include <a>\n" 1036a2e7d0deSKrasimir Georgiev "-->", 1037a2e7d0deSKrasimir Georgiev sort("<!--;\n" 1038a2e7d0deSKrasimir Georgiev "#include <b>\n" 1039a2e7d0deSKrasimir Georgiev "#include <a>\n" 1040ece7e95fSmydeveloperday "-->", 1041ece7e95fSmydeveloperday "input.h", 0)); 1042925bb20cSKrasimir Georgiev } 1043925bb20cSKrasimir Georgiev 1044925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 1045925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 1046925bb20cSKrasimir Georgiev std::string Code = R"( 1047925bb20cSKrasimir Georgiev #include "b.h" 1048925bb20cSKrasimir Georgiev 1049925bb20cSKrasimir Georgiev #include <a.h> 1050925bb20cSKrasimir Georgiev )"; 1051925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 1052a2e7d0deSKrasimir Georgiev } 1053a2e7d0deSKrasimir Georgiev 105460365021SPaul Hoad TEST_F(SortIncludesTest, 105560365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 105660365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 105760365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 105860365021SPaul Hoad "\r\n" 105960365021SPaul Hoad "#include <a.h>\r\n"; 106060365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 106160365021SPaul Hoad } 106200e7ae9fSKrasimir Georgiev 106300e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 106400e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 106500e7ae9fSKrasimir Georgiev 106600e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 106700e7ae9fSKrasimir Georgiev "#include <b.h>\n" 106800e7ae9fSKrasimir Georgiev "#include \"a.h\"", 106900e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 107000e7ae9fSKrasimir Georgiev "#include <a.h>\n" 107100e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 107200e7ae9fSKrasimir Georgiev } 107300e7ae9fSKrasimir Georgiev 107489878e8cSRafał Jelonek TEST_F(SortIncludesTest, DoNotTreatPrecompiledHeadersAsFirstBlock) { 107589878e8cSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 107689878e8cSRafał Jelonek std::string Code = "#include \"d.h\"\r\n" 107789878e8cSRafał Jelonek "#include \"b.h\"\r\n" 107889878e8cSRafał Jelonek "#pragma hdrstop\r\n" 107989878e8cSRafał Jelonek "\r\n" 108089878e8cSRafał Jelonek "#include \"c.h\"\r\n" 108189878e8cSRafał Jelonek "#include \"a.h\"\r\n" 108289878e8cSRafał Jelonek "#include \"e.h\"\r\n"; 108389878e8cSRafał Jelonek 108489878e8cSRafał Jelonek std::string Expected = "#include \"b.h\"\r\n" 108589878e8cSRafał Jelonek "#include \"d.h\"\r\n" 108689878e8cSRafał Jelonek "#pragma hdrstop\r\n" 108789878e8cSRafał Jelonek "\r\n" 108889878e8cSRafał Jelonek "#include \"e.h\"\r\n" 108989878e8cSRafał Jelonek "#include \"a.h\"\r\n" 109089878e8cSRafał Jelonek "#include \"c.h\"\r\n"; 109189878e8cSRafał Jelonek 109289878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 109389878e8cSRafał Jelonek 109489878e8cSRafał Jelonek Code = "#include \"d.h\"\n" 109589878e8cSRafał Jelonek "#include \"b.h\"\n" 109689878e8cSRafał Jelonek "#pragma hdrstop( \"c:\\projects\\include\\myinc.pch\" )\n" 109789878e8cSRafał Jelonek "\n" 109889878e8cSRafał Jelonek "#include \"c.h\"\n" 109989878e8cSRafał Jelonek "#include \"a.h\"\n" 110089878e8cSRafał Jelonek "#include \"e.h\"\n"; 110189878e8cSRafał Jelonek 110289878e8cSRafał Jelonek Expected = "#include \"b.h\"\n" 110389878e8cSRafał Jelonek "#include \"d.h\"\n" 110489878e8cSRafał Jelonek "#pragma hdrstop(\"c:\\projects\\include\\myinc.pch\")\n" 110589878e8cSRafał Jelonek "\n" 110689878e8cSRafał Jelonek "#include \"e.h\"\n" 110789878e8cSRafał Jelonek "#include \"a.h\"\n" 110889878e8cSRafał Jelonek "#include \"c.h\"\n"; 110989878e8cSRafał Jelonek 111089878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 111189878e8cSRafał Jelonek } 111289878e8cSRafał Jelonek 1113ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkMerge) { 1114ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 1115ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1116ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1117ee27c767SRafał Jelonek "\r\n" 1118ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1119ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1120ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1121ee27c767SRafał Jelonek 1122ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"e.h\"\r\n" 1123ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1124ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1125ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1126ee27c767SRafał Jelonek "#include \"d.h\"\r\n"; 1127ee27c767SRafał Jelonek 1128ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 1129ee27c767SRafał Jelonek } 1130ee27c767SRafał Jelonek 1131ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkPreserve) { 1132ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Preserve; 1133ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1134ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1135ee27c767SRafał Jelonek "\r\n" 1136ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1137ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1138ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1139ee27c767SRafał Jelonek 1140ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"b.h\"\r\n" 1141ee27c767SRafał Jelonek "#include \"d.h\"\r\n" 1142ee27c767SRafał Jelonek "\r\n" 1143ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1144ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1145ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1146ee27c767SRafał Jelonek 1147ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 1148ee27c767SRafał Jelonek } 11497473940bSRafał Jelonek 11507473940bSRafał Jelonek TEST_F(SortIncludesTest, MergeLines) { 11517473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 11527473940bSRafał Jelonek std::string Code = "#include \"c.h\"\r\n" 11537473940bSRafał Jelonek "#include \"b\\\r\n" 11547473940bSRafał Jelonek ".h\"\r\n" 11557473940bSRafał Jelonek "#include \"a.h\"\r\n"; 11567473940bSRafał Jelonek 11577473940bSRafał Jelonek std::string Expected = "#include \"a.h\"\r\n" 11587473940bSRafał Jelonek "#include \"b\\\r\n" 11597473940bSRafał Jelonek ".h\"\r\n" 11607473940bSRafał Jelonek "#include \"c.h\"\r\n"; 11617473940bSRafał Jelonek 11627473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "a.cpp", 1)); 11637473940bSRafał Jelonek } 11647473940bSRafał Jelonek 116561dc0f2bSNathan James TEST_F(SortIncludesTest, DisableFormatDisablesIncludeSorting) { 116661dc0f2bSNathan James StringRef Sorted = "#include <a.h>\n" 116761dc0f2bSNathan James "#include <b.h>\n"; 116861dc0f2bSNathan James StringRef Unsorted = "#include <b.h>\n" 116961dc0f2bSNathan James "#include <a.h>\n"; 117061dc0f2bSNathan James EXPECT_EQ(Sorted, sort(Unsorted)); 117161dc0f2bSNathan James FmtStyle.DisableFormat = true; 117261dc0f2bSNathan James EXPECT_EQ(Unsorted, sort(Unsorted, "input.cpp", 0)); 117361dc0f2bSNathan James } 117461dc0f2bSNathan James 117505bea533Smydeveloperday TEST_F(SortIncludesTest, DisableRawStringLiteralSorting) { 117605bea533Smydeveloperday 117705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"(\n" 117805bea533Smydeveloperday "#include <b.h>\n" 117905bea533Smydeveloperday "#include <a.h>\n" 118005bea533Smydeveloperday ")\";", 118105bea533Smydeveloperday sort("const char *t = R\"(\n" 118205bea533Smydeveloperday "#include <b.h>\n" 118305bea533Smydeveloperday "#include <a.h>\n" 118405bea533Smydeveloperday ")\";", 118505bea533Smydeveloperday "test.cxx", 0)); 118605bea533Smydeveloperday EXPECT_EQ("const char *t = R\"x(\n" 118705bea533Smydeveloperday "#include <b.h>\n" 118805bea533Smydeveloperday "#include <a.h>\n" 118905bea533Smydeveloperday ")x\";", 119005bea533Smydeveloperday sort("const char *t = R\"x(\n" 119105bea533Smydeveloperday "#include <b.h>\n" 119205bea533Smydeveloperday "#include <a.h>\n" 119305bea533Smydeveloperday ")x\";", 119405bea533Smydeveloperday "test.cxx", 0)); 119505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"xyz(\n" 119605bea533Smydeveloperday "#include <b.h>\n" 119705bea533Smydeveloperday "#include <a.h>\n" 119805bea533Smydeveloperday ")xyz\";", 119905bea533Smydeveloperday sort("const char *t = R\"xyz(\n" 120005bea533Smydeveloperday "#include <b.h>\n" 120105bea533Smydeveloperday "#include <a.h>\n" 120205bea533Smydeveloperday ")xyz\";", 120305bea533Smydeveloperday "test.cxx", 0)); 120405bea533Smydeveloperday 120505bea533Smydeveloperday EXPECT_EQ("#include <a.h>\n" 120605bea533Smydeveloperday "#include <b.h>\n" 120705bea533Smydeveloperday "const char *t = R\"(\n" 120805bea533Smydeveloperday "#include <b.h>\n" 120905bea533Smydeveloperday "#include <a.h>\n" 121005bea533Smydeveloperday ")\";\n" 121105bea533Smydeveloperday "#include <c.h>\n" 121205bea533Smydeveloperday "#include <d.h>\n" 121305bea533Smydeveloperday "const char *t = R\"x(\n" 121405bea533Smydeveloperday "#include <f.h>\n" 121505bea533Smydeveloperday "#include <e.h>\n" 121605bea533Smydeveloperday ")x\";\n" 121705bea533Smydeveloperday "#include <g.h>\n" 121805bea533Smydeveloperday "#include <h.h>\n" 121905bea533Smydeveloperday "const char *t = R\"xyz(\n" 122005bea533Smydeveloperday "#include <j.h>\n" 122105bea533Smydeveloperday "#include <i.h>\n" 122205bea533Smydeveloperday ")xyz\";\n" 122305bea533Smydeveloperday "#include <k.h>\n" 122405bea533Smydeveloperday "#include <l.h>", 122505bea533Smydeveloperday sort("#include <b.h>\n" 122605bea533Smydeveloperday "#include <a.h>\n" 122705bea533Smydeveloperday "const char *t = R\"(\n" 122805bea533Smydeveloperday "#include <b.h>\n" 122905bea533Smydeveloperday "#include <a.h>\n" 123005bea533Smydeveloperday ")\";\n" 123105bea533Smydeveloperday "#include <d.h>\n" 123205bea533Smydeveloperday "#include <c.h>\n" 123305bea533Smydeveloperday "const char *t = R\"x(\n" 123405bea533Smydeveloperday "#include <f.h>\n" 123505bea533Smydeveloperday "#include <e.h>\n" 123605bea533Smydeveloperday ")x\";\n" 123705bea533Smydeveloperday "#include <h.h>\n" 123805bea533Smydeveloperday "#include <g.h>\n" 123905bea533Smydeveloperday "const char *t = R\"xyz(\n" 124005bea533Smydeveloperday "#include <j.h>\n" 124105bea533Smydeveloperday "#include <i.h>\n" 124205bea533Smydeveloperday ")xyz\";\n" 124305bea533Smydeveloperday "#include <l.h>\n" 124405bea533Smydeveloperday "#include <k.h>", 124505bea533Smydeveloperday "test.cc", 4)); 124605bea533Smydeveloperday 124705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz(\n" 124805bea533Smydeveloperday "#include <b.h>\n" 124905bea533Smydeveloperday "#include <a.h>\n" 125005bea533Smydeveloperday ")AMZ029amz\";", 125105bea533Smydeveloperday sort("const char *t = R\"AMZ029amz(\n" 125205bea533Smydeveloperday "#include <b.h>\n" 125305bea533Smydeveloperday "#include <a.h>\n" 125405bea533Smydeveloperday ")AMZ029amz\";", 125505bea533Smydeveloperday "test.cxx", 0)); 125605bea533Smydeveloperday 125705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"-AMZ029amz(\n" 125805bea533Smydeveloperday "#include <b.h>\n" 125905bea533Smydeveloperday "#include <a.h>\n" 126005bea533Smydeveloperday ")-AMZ029amz\";", 126105bea533Smydeveloperday sort("const char *t = R\"-AMZ029amz(\n" 126205bea533Smydeveloperday "#include <b.h>\n" 126305bea533Smydeveloperday "#include <a.h>\n" 126405bea533Smydeveloperday ")-AMZ029amz\";", 126505bea533Smydeveloperday "test.cxx", 0)); 126605bea533Smydeveloperday 126705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz-(\n" 126805bea533Smydeveloperday "#include <b.h>\n" 126905bea533Smydeveloperday "#include <a.h>\n" 127005bea533Smydeveloperday ")AMZ029amz-\";", 127105bea533Smydeveloperday sort("const char *t = R\"AMZ029amz-(\n" 127205bea533Smydeveloperday "#include <b.h>\n" 127305bea533Smydeveloperday "#include <a.h>\n" 127405bea533Smydeveloperday ")AMZ029amz-\";", 127505bea533Smydeveloperday "test.cxx", 0)); 127605bea533Smydeveloperday 127705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM|029amz-(\n" 127805bea533Smydeveloperday "#include <b.h>\n" 127905bea533Smydeveloperday "#include <a.h>\n" 128005bea533Smydeveloperday ")AM|029amz-\";", 128105bea533Smydeveloperday sort("const char *t = R\"AM|029amz-(\n" 128205bea533Smydeveloperday "#include <b.h>\n" 128305bea533Smydeveloperday "#include <a.h>\n" 128405bea533Smydeveloperday ")AM|029amz-\";", 128505bea533Smydeveloperday "test.cxx", 0)); 128605bea533Smydeveloperday 128705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM[029amz-(\n" 128805bea533Smydeveloperday "#include <b.h>\n" 128905bea533Smydeveloperday "#include <a.h>\n" 129005bea533Smydeveloperday ")AM[029amz-\";", 129105bea533Smydeveloperday sort("const char *t = R\"AM[029amz-(\n" 129205bea533Smydeveloperday "#include <b.h>\n" 129305bea533Smydeveloperday "#include <a.h>\n" 129405bea533Smydeveloperday ")AM[029amz-\";", 129505bea533Smydeveloperday "test.cxx", 0)); 129605bea533Smydeveloperday 129705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM]029amz-(\n" 129805bea533Smydeveloperday "#include <b.h>\n" 129905bea533Smydeveloperday "#include <a.h>\n" 130005bea533Smydeveloperday ")AM]029amz-\";", 130105bea533Smydeveloperday sort("const char *t = R\"AM]029amz-(\n" 130205bea533Smydeveloperday "#include <b.h>\n" 130305bea533Smydeveloperday "#include <a.h>\n" 130405bea533Smydeveloperday ")AM]029amz-\";", 130505bea533Smydeveloperday "test.cxx", 0)); 130605bea533Smydeveloperday 130705bea533Smydeveloperday #define X "AMZ029amz{}+!%*=_:;',.<>|/?#~-$" 130805bea533Smydeveloperday 130905bea533Smydeveloperday EXPECT_EQ("const char *t = R\"" X "(\n" 131005bea533Smydeveloperday "#include <b.h>\n" 131105bea533Smydeveloperday "#include <a.h>\n" 131205bea533Smydeveloperday ")" X "\";", 131305bea533Smydeveloperday sort("const char *t = R\"" X "(\n" 131405bea533Smydeveloperday "#include <b.h>\n" 131505bea533Smydeveloperday "#include <a.h>\n" 131605bea533Smydeveloperday ")" X "\";", 131705bea533Smydeveloperday "test.cxx", 0)); 131805bea533Smydeveloperday 131905bea533Smydeveloperday #undef X 132005bea533Smydeveloperday } 132105bea533Smydeveloperday 1322d89ae9d3SDaniel Jasper } // end namespace 1323d89ae9d3SDaniel Jasper } // end namespace format 1324d89ae9d3SDaniel Jasper } // end namespace clang 1325