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 461*d46fa023SKonrad Kleine TEST_F(SortIncludesTest, SupportAtImportLines) { 462*d46fa023SKonrad Kleine // Test from https://github.com/llvm/llvm-project/issues/38995 463*d46fa023SKonrad Kleine EXPECT_EQ("#import \"a.h\"\n" 464*d46fa023SKonrad Kleine "#import \"b.h\"\n" 465*d46fa023SKonrad Kleine "#import \"c.h\"\n" 466*d46fa023SKonrad Kleine "#import <d/e.h>\n" 467*d46fa023SKonrad Kleine "@import Foundation;\n", 468*d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 469*d46fa023SKonrad Kleine "#import \"c.h\"\n" 470*d46fa023SKonrad Kleine "#import <d/e.h>\n" 471*d46fa023SKonrad Kleine "@import Foundation;\n" 472*d46fa023SKonrad Kleine "#import \"a.h\"\n")); 473*d46fa023SKonrad Kleine 474*d46fa023SKonrad Kleine // Slightly more complicated test that shows sorting in each priorities still 475*d46fa023SKonrad Kleine // works. 476*d46fa023SKonrad Kleine EXPECT_EQ("#import \"a.h\"\n" 477*d46fa023SKonrad Kleine "#import \"b.h\"\n" 478*d46fa023SKonrad Kleine "#import \"c.h\"\n" 479*d46fa023SKonrad Kleine "#import <d/e.h>\n" 480*d46fa023SKonrad Kleine "@import Base;\n" 481*d46fa023SKonrad Kleine "@import Foundation;\n" 482*d46fa023SKonrad Kleine "@import base;\n" 483*d46fa023SKonrad Kleine "@import foundation;\n", 484*d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 485*d46fa023SKonrad Kleine "#import \"c.h\"\n" 486*d46fa023SKonrad Kleine "@import Base;\n" 487*d46fa023SKonrad Kleine "#import <d/e.h>\n" 488*d46fa023SKonrad Kleine "@import foundation;\n" 489*d46fa023SKonrad Kleine "@import Foundation;\n" 490*d46fa023SKonrad Kleine "@import base;\n" 491*d46fa023SKonrad Kleine "#import \"a.h\"\n")); 492*d46fa023SKonrad Kleine 493*d46fa023SKonrad Kleine // Test that shows main headers in two groups are still found and sorting 494*d46fa023SKonrad Kleine // still works. The @import's are kept in their respective group but are 495*d46fa023SKonrad Kleine // put at the end of each group. 496*d46fa023SKonrad Kleine FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Preserve; 497*d46fa023SKonrad Kleine EXPECT_EQ("#import \"foo.hpp\"\n" 498*d46fa023SKonrad Kleine "#import \"b.h\"\n" 499*d46fa023SKonrad Kleine "#import \"c.h\"\n" 500*d46fa023SKonrad Kleine "#import <d/e.h>\n" 501*d46fa023SKonrad Kleine "@import Base;\n" 502*d46fa023SKonrad Kleine "@import Foundation;\n" 503*d46fa023SKonrad Kleine "@import foundation;\n" 504*d46fa023SKonrad Kleine "\n" 505*d46fa023SKonrad Kleine "#import \"foo.h\"\n" 506*d46fa023SKonrad Kleine "#include \"foobar\"\n" 507*d46fa023SKonrad Kleine "#import <f/g.h>\n" 508*d46fa023SKonrad Kleine "@import AAAA;\n" 509*d46fa023SKonrad Kleine "@import aaaa;\n", 510*d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 511*d46fa023SKonrad Kleine "@import Foundation;\n" 512*d46fa023SKonrad Kleine "@import foundation;\n" 513*d46fa023SKonrad Kleine "#import \"c.h\"\n" 514*d46fa023SKonrad Kleine "#import <d/e.h>\n" 515*d46fa023SKonrad Kleine "@import Base;\n" 516*d46fa023SKonrad Kleine "#import \"foo.hpp\"\n" 517*d46fa023SKonrad Kleine "\n" 518*d46fa023SKonrad Kleine "@import aaaa;\n" 519*d46fa023SKonrad Kleine "#import <f/g.h>\n" 520*d46fa023SKonrad Kleine "@import AAAA;\n" 521*d46fa023SKonrad Kleine "#include \"foobar\"\n" 522*d46fa023SKonrad Kleine "#import \"foo.h\"\n", 523*d46fa023SKonrad Kleine "foo.c", 2)); 524*d46fa023SKonrad Kleine 525*d46fa023SKonrad Kleine // Regrouping and putting @import's in the very last group 526*d46fa023SKonrad Kleine FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 527*d46fa023SKonrad Kleine EXPECT_EQ("#import \"foo.hpp\"\n" 528*d46fa023SKonrad Kleine "\n" 529*d46fa023SKonrad Kleine "#import \"b.h\"\n" 530*d46fa023SKonrad Kleine "#import \"c.h\"\n" 531*d46fa023SKonrad Kleine "#import \"foo.h\"\n" 532*d46fa023SKonrad Kleine "#include \"foobar\"\n" 533*d46fa023SKonrad Kleine "\n" 534*d46fa023SKonrad Kleine "#import <d/e.h>\n" 535*d46fa023SKonrad Kleine "#import <f/g.h>\n" 536*d46fa023SKonrad Kleine "\n" 537*d46fa023SKonrad Kleine "@import AAAA;\n" 538*d46fa023SKonrad Kleine "@import Base;\n" 539*d46fa023SKonrad Kleine "@import Foundation;\n" 540*d46fa023SKonrad Kleine "@import aaaa;\n" 541*d46fa023SKonrad Kleine "@import foundation;\n", 542*d46fa023SKonrad Kleine sort("#import \"b.h\"\n" 543*d46fa023SKonrad Kleine "@import Foundation;\n" 544*d46fa023SKonrad Kleine "@import foundation;\n" 545*d46fa023SKonrad Kleine "#import \"c.h\"\n" 546*d46fa023SKonrad Kleine "#import <d/e.h>\n" 547*d46fa023SKonrad Kleine "@import Base;\n" 548*d46fa023SKonrad Kleine "#import \"foo.hpp\"\n" 549*d46fa023SKonrad Kleine "\n" 550*d46fa023SKonrad Kleine "@import aaaa;\n" 551*d46fa023SKonrad Kleine "#import <f/g.h>\n" 552*d46fa023SKonrad Kleine "@import AAAA;\n" 553*d46fa023SKonrad Kleine "#include \"foobar\"\n" 554*d46fa023SKonrad Kleine "#import \"foo.h\"\n", 555*d46fa023SKonrad Kleine "foo.c")); 556*d46fa023SKonrad Kleine } 557*d46fa023SKonrad 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 893a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 894a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 895a992afe8SEric Liu "#include <b>\n" 896a992afe8SEric Liu "#include <c>\n", 897a992afe8SEric Liu sort("#include <a>\n" 898a992afe8SEric Liu "#include <b>\n" 899a992afe8SEric Liu "#include <b>\n" 900a992afe8SEric Liu "#include <b>\n" 901a992afe8SEric Liu "#include <b>\n" 902a992afe8SEric Liu "#include <c>\n")); 9034c2c9c36SKrasimir Georgiev 9049d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 9054c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9064c2c9c36SKrasimir Georgiev "#include <b>\n" 9074c2c9c36SKrasimir Georgiev "#include <c>\n", 9084c2c9c36SKrasimir Georgiev sort("#include <a>\n" 9094c2c9c36SKrasimir Georgiev "#include <b>\n" 9104c2c9c36SKrasimir Georgiev "\n" 9114c2c9c36SKrasimir Georgiev "#include <b>\n" 9124c2c9c36SKrasimir Georgiev "\n" 9134c2c9c36SKrasimir Georgiev "#include <b>\n" 9144c2c9c36SKrasimir Georgiev "#include <c>\n")); 9154c2c9c36SKrasimir Georgiev 9169d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 9174c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9184c2c9c36SKrasimir Georgiev "#include <b>\n" 9194c2c9c36SKrasimir Georgiev "#include <c>\n", 9204c2c9c36SKrasimir Georgiev sort("#include <a>\n" 9214c2c9c36SKrasimir Georgiev "#include <b>\n" 9224c2c9c36SKrasimir Georgiev "\n" 9234c2c9c36SKrasimir Georgiev "#include <b>\n" 9244c2c9c36SKrasimir Georgiev "\n" 9254c2c9c36SKrasimir Georgiev "#include <b>\n" 9264c2c9c36SKrasimir Georgiev "#include <c>\n")); 927a992afe8SEric Liu } 928a992afe8SEric Liu 929a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 930a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 931a992afe8SEric Liu "#include <b>\n" 932a992afe8SEric Liu "#include <c>\n", 933a992afe8SEric Liu sort("#include <b>\n" 934a992afe8SEric Liu "#include <a>\n" 935a992afe8SEric Liu "#include <b>\n" 936a992afe8SEric Liu "#include <b>\n" 937a992afe8SEric Liu "#include <c>\n" 938a992afe8SEric Liu "#include <b>\n")); 9394c2c9c36SKrasimir Georgiev 9409d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 9414c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9424c2c9c36SKrasimir Georgiev "#include <b>\n" 9434c2c9c36SKrasimir Georgiev "#include <c>\n", 9444c2c9c36SKrasimir Georgiev sort("#include <b>\n" 9454c2c9c36SKrasimir Georgiev "#include <a>\n" 9464c2c9c36SKrasimir Georgiev "\n" 9474c2c9c36SKrasimir Georgiev "#include <b>\n" 9484c2c9c36SKrasimir Georgiev "\n" 9494c2c9c36SKrasimir Georgiev "#include <c>\n" 9504c2c9c36SKrasimir Georgiev "#include <b>\n")); 9514c2c9c36SKrasimir Georgiev 9529d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 9534c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 9544c2c9c36SKrasimir Georgiev "#include <b>\n" 9554c2c9c36SKrasimir Georgiev "#include <c>\n", 9564c2c9c36SKrasimir Georgiev sort("#include <b>\n" 9574c2c9c36SKrasimir Georgiev "#include <a>\n" 9584c2c9c36SKrasimir Georgiev "\n" 9594c2c9c36SKrasimir Georgiev "#include <b>\n" 9604c2c9c36SKrasimir Georgiev "\n" 9614c2c9c36SKrasimir Georgiev "#include <c>\n" 9624c2c9c36SKrasimir Georgiev "#include <b>\n")); 963a992afe8SEric Liu } 964a992afe8SEric Liu 965a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 966a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 967a992afe8SEric Liu "#include <a>\n" // Start of line: 13 968a992afe8SEric Liu "#include <b>\n" // Start of line: 26 969a992afe8SEric Liu "#include <b>\n" // Start of line: 39 970a992afe8SEric Liu "#include <c>\n" // Start of line: 52 971a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 972a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 973a992afe8SEric Liu "#include <b>\n" // Start of line: 13 974a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 975a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 976a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 977a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 978a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 979a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 980a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 981a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 982a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 983a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 984a992afe8SEric Liu // Cursor on '#' in "#include <c>". 985a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 986a992afe8SEric Liu } 987a992afe8SEric Liu 988a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 989a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 990a992afe8SEric Liu "#include <b>\n" 991a992afe8SEric Liu "\n" 992a992afe8SEric Liu "#include <b>\n" 993a992afe8SEric Liu "#include <c>\n", 994a992afe8SEric Liu sort("#include <a>\n" 995a992afe8SEric Liu "#include <b>\n" 996a992afe8SEric Liu "\n" 997a992afe8SEric Liu "#include <c>\n" 998a992afe8SEric Liu "#include <b>\n" 999a992afe8SEric Liu "#include <b>\n")); 1000a992afe8SEric Liu } 1001a992afe8SEric Liu 1002a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 1003a992afe8SEric Liu std::string Code = "#include <a>\n" 1004a992afe8SEric Liu "#include <b>\n" 1005a992afe8SEric Liu "#include <a>\n" 1006a992afe8SEric Liu "#include <a>\n" 1007a992afe8SEric Liu "\n" 1008a992afe8SEric Liu " int x ;"; 1009a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 10109d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 1011a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 1012a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 1013a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 1014a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 1015a992afe8SEric Liu } 1016a992afe8SEric Liu 1017a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 1018a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 1019a2e7d0deSKrasimir Georgiev "#include <b>\n" 1020a2e7d0deSKrasimir Georgiev "#include <a>\n" 1021a2e7d0deSKrasimir Georgiev "-->", 1022a2e7d0deSKrasimir Georgiev sort("<!--;\n" 1023a2e7d0deSKrasimir Georgiev "#include <b>\n" 1024a2e7d0deSKrasimir Georgiev "#include <a>\n" 1025ece7e95fSmydeveloperday "-->", 1026ece7e95fSmydeveloperday "input.h", 0)); 1027925bb20cSKrasimir Georgiev } 1028925bb20cSKrasimir Georgiev 1029925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 1030925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 1031925bb20cSKrasimir Georgiev std::string Code = R"( 1032925bb20cSKrasimir Georgiev #include "b.h" 1033925bb20cSKrasimir Georgiev 1034925bb20cSKrasimir Georgiev #include <a.h> 1035925bb20cSKrasimir Georgiev )"; 1036925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 1037a2e7d0deSKrasimir Georgiev } 1038a2e7d0deSKrasimir Georgiev 103960365021SPaul Hoad TEST_F(SortIncludesTest, 104060365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 104160365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 104260365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 104360365021SPaul Hoad "\r\n" 104460365021SPaul Hoad "#include <a.h>\r\n"; 104560365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 104660365021SPaul Hoad } 104700e7ae9fSKrasimir Georgiev 104800e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 104900e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 105000e7ae9fSKrasimir Georgiev 105100e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 105200e7ae9fSKrasimir Georgiev "#include <b.h>\n" 105300e7ae9fSKrasimir Georgiev "#include \"a.h\"", 105400e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 105500e7ae9fSKrasimir Georgiev "#include <a.h>\n" 105600e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 105700e7ae9fSKrasimir Georgiev } 105800e7ae9fSKrasimir Georgiev 105989878e8cSRafał Jelonek TEST_F(SortIncludesTest, DoNotTreatPrecompiledHeadersAsFirstBlock) { 106089878e8cSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 106189878e8cSRafał Jelonek std::string Code = "#include \"d.h\"\r\n" 106289878e8cSRafał Jelonek "#include \"b.h\"\r\n" 106389878e8cSRafał Jelonek "#pragma hdrstop\r\n" 106489878e8cSRafał Jelonek "\r\n" 106589878e8cSRafał Jelonek "#include \"c.h\"\r\n" 106689878e8cSRafał Jelonek "#include \"a.h\"\r\n" 106789878e8cSRafał Jelonek "#include \"e.h\"\r\n"; 106889878e8cSRafał Jelonek 106989878e8cSRafał Jelonek std::string Expected = "#include \"b.h\"\r\n" 107089878e8cSRafał Jelonek "#include \"d.h\"\r\n" 107189878e8cSRafał Jelonek "#pragma hdrstop\r\n" 107289878e8cSRafał Jelonek "\r\n" 107389878e8cSRafał Jelonek "#include \"e.h\"\r\n" 107489878e8cSRafał Jelonek "#include \"a.h\"\r\n" 107589878e8cSRafał Jelonek "#include \"c.h\"\r\n"; 107689878e8cSRafał Jelonek 107789878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 107889878e8cSRafał Jelonek 107989878e8cSRafał Jelonek Code = "#include \"d.h\"\n" 108089878e8cSRafał Jelonek "#include \"b.h\"\n" 108189878e8cSRafał Jelonek "#pragma hdrstop( \"c:\\projects\\include\\myinc.pch\" )\n" 108289878e8cSRafał Jelonek "\n" 108389878e8cSRafał Jelonek "#include \"c.h\"\n" 108489878e8cSRafał Jelonek "#include \"a.h\"\n" 108589878e8cSRafał Jelonek "#include \"e.h\"\n"; 108689878e8cSRafał Jelonek 108789878e8cSRafał Jelonek Expected = "#include \"b.h\"\n" 108889878e8cSRafał Jelonek "#include \"d.h\"\n" 108989878e8cSRafał Jelonek "#pragma hdrstop(\"c:\\projects\\include\\myinc.pch\")\n" 109089878e8cSRafał Jelonek "\n" 109189878e8cSRafał Jelonek "#include \"e.h\"\n" 109289878e8cSRafał Jelonek "#include \"a.h\"\n" 109389878e8cSRafał Jelonek "#include \"c.h\"\n"; 109489878e8cSRafał Jelonek 109589878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 109689878e8cSRafał Jelonek } 109789878e8cSRafał Jelonek 1098ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkMerge) { 1099ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 1100ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1101ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1102ee27c767SRafał Jelonek "\r\n" 1103ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1104ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1105ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1106ee27c767SRafał Jelonek 1107ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"e.h\"\r\n" 1108ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1109ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1110ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1111ee27c767SRafał Jelonek "#include \"d.h\"\r\n"; 1112ee27c767SRafał Jelonek 1113ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 1114ee27c767SRafał Jelonek } 1115ee27c767SRafał Jelonek 1116ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkPreserve) { 1117ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Preserve; 1118ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1119ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1120ee27c767SRafał Jelonek "\r\n" 1121ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1122ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1123ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1124ee27c767SRafał Jelonek 1125ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"b.h\"\r\n" 1126ee27c767SRafał Jelonek "#include \"d.h\"\r\n" 1127ee27c767SRafał Jelonek "\r\n" 1128ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1129ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1130ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1131ee27c767SRafał Jelonek 1132ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 1133ee27c767SRafał Jelonek } 11347473940bSRafał Jelonek 11357473940bSRafał Jelonek TEST_F(SortIncludesTest, MergeLines) { 11367473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 11377473940bSRafał Jelonek std::string Code = "#include \"c.h\"\r\n" 11387473940bSRafał Jelonek "#include \"b\\\r\n" 11397473940bSRafał Jelonek ".h\"\r\n" 11407473940bSRafał Jelonek "#include \"a.h\"\r\n"; 11417473940bSRafał Jelonek 11427473940bSRafał Jelonek std::string Expected = "#include \"a.h\"\r\n" 11437473940bSRafał Jelonek "#include \"b\\\r\n" 11447473940bSRafał Jelonek ".h\"\r\n" 11457473940bSRafał Jelonek "#include \"c.h\"\r\n"; 11467473940bSRafał Jelonek 11477473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "a.cpp", 1)); 11487473940bSRafał Jelonek } 11497473940bSRafał Jelonek 115061dc0f2bSNathan James TEST_F(SortIncludesTest, DisableFormatDisablesIncludeSorting) { 115161dc0f2bSNathan James StringRef Sorted = "#include <a.h>\n" 115261dc0f2bSNathan James "#include <b.h>\n"; 115361dc0f2bSNathan James StringRef Unsorted = "#include <b.h>\n" 115461dc0f2bSNathan James "#include <a.h>\n"; 115561dc0f2bSNathan James EXPECT_EQ(Sorted, sort(Unsorted)); 115661dc0f2bSNathan James FmtStyle.DisableFormat = true; 115761dc0f2bSNathan James EXPECT_EQ(Unsorted, sort(Unsorted, "input.cpp", 0)); 115861dc0f2bSNathan James } 115961dc0f2bSNathan James 116005bea533Smydeveloperday TEST_F(SortIncludesTest, DisableRawStringLiteralSorting) { 116105bea533Smydeveloperday 116205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"(\n" 116305bea533Smydeveloperday "#include <b.h>\n" 116405bea533Smydeveloperday "#include <a.h>\n" 116505bea533Smydeveloperday ")\";", 116605bea533Smydeveloperday sort("const char *t = R\"(\n" 116705bea533Smydeveloperday "#include <b.h>\n" 116805bea533Smydeveloperday "#include <a.h>\n" 116905bea533Smydeveloperday ")\";", 117005bea533Smydeveloperday "test.cxx", 0)); 117105bea533Smydeveloperday EXPECT_EQ("const char *t = R\"x(\n" 117205bea533Smydeveloperday "#include <b.h>\n" 117305bea533Smydeveloperday "#include <a.h>\n" 117405bea533Smydeveloperday ")x\";", 117505bea533Smydeveloperday sort("const char *t = R\"x(\n" 117605bea533Smydeveloperday "#include <b.h>\n" 117705bea533Smydeveloperday "#include <a.h>\n" 117805bea533Smydeveloperday ")x\";", 117905bea533Smydeveloperday "test.cxx", 0)); 118005bea533Smydeveloperday EXPECT_EQ("const char *t = R\"xyz(\n" 118105bea533Smydeveloperday "#include <b.h>\n" 118205bea533Smydeveloperday "#include <a.h>\n" 118305bea533Smydeveloperday ")xyz\";", 118405bea533Smydeveloperday sort("const char *t = R\"xyz(\n" 118505bea533Smydeveloperday "#include <b.h>\n" 118605bea533Smydeveloperday "#include <a.h>\n" 118705bea533Smydeveloperday ")xyz\";", 118805bea533Smydeveloperday "test.cxx", 0)); 118905bea533Smydeveloperday 119005bea533Smydeveloperday EXPECT_EQ("#include <a.h>\n" 119105bea533Smydeveloperday "#include <b.h>\n" 119205bea533Smydeveloperday "const char *t = R\"(\n" 119305bea533Smydeveloperday "#include <b.h>\n" 119405bea533Smydeveloperday "#include <a.h>\n" 119505bea533Smydeveloperday ")\";\n" 119605bea533Smydeveloperday "#include <c.h>\n" 119705bea533Smydeveloperday "#include <d.h>\n" 119805bea533Smydeveloperday "const char *t = R\"x(\n" 119905bea533Smydeveloperday "#include <f.h>\n" 120005bea533Smydeveloperday "#include <e.h>\n" 120105bea533Smydeveloperday ")x\";\n" 120205bea533Smydeveloperday "#include <g.h>\n" 120305bea533Smydeveloperday "#include <h.h>\n" 120405bea533Smydeveloperday "const char *t = R\"xyz(\n" 120505bea533Smydeveloperday "#include <j.h>\n" 120605bea533Smydeveloperday "#include <i.h>\n" 120705bea533Smydeveloperday ")xyz\";\n" 120805bea533Smydeveloperday "#include <k.h>\n" 120905bea533Smydeveloperday "#include <l.h>", 121005bea533Smydeveloperday sort("#include <b.h>\n" 121105bea533Smydeveloperday "#include <a.h>\n" 121205bea533Smydeveloperday "const char *t = R\"(\n" 121305bea533Smydeveloperday "#include <b.h>\n" 121405bea533Smydeveloperday "#include <a.h>\n" 121505bea533Smydeveloperday ")\";\n" 121605bea533Smydeveloperday "#include <d.h>\n" 121705bea533Smydeveloperday "#include <c.h>\n" 121805bea533Smydeveloperday "const char *t = R\"x(\n" 121905bea533Smydeveloperday "#include <f.h>\n" 122005bea533Smydeveloperday "#include <e.h>\n" 122105bea533Smydeveloperday ")x\";\n" 122205bea533Smydeveloperday "#include <h.h>\n" 122305bea533Smydeveloperday "#include <g.h>\n" 122405bea533Smydeveloperday "const char *t = R\"xyz(\n" 122505bea533Smydeveloperday "#include <j.h>\n" 122605bea533Smydeveloperday "#include <i.h>\n" 122705bea533Smydeveloperday ")xyz\";\n" 122805bea533Smydeveloperday "#include <l.h>\n" 122905bea533Smydeveloperday "#include <k.h>", 123005bea533Smydeveloperday "test.cc", 4)); 123105bea533Smydeveloperday 123205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz(\n" 123305bea533Smydeveloperday "#include <b.h>\n" 123405bea533Smydeveloperday "#include <a.h>\n" 123505bea533Smydeveloperday ")AMZ029amz\";", 123605bea533Smydeveloperday sort("const char *t = R\"AMZ029amz(\n" 123705bea533Smydeveloperday "#include <b.h>\n" 123805bea533Smydeveloperday "#include <a.h>\n" 123905bea533Smydeveloperday ")AMZ029amz\";", 124005bea533Smydeveloperday "test.cxx", 0)); 124105bea533Smydeveloperday 124205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"-AMZ029amz(\n" 124305bea533Smydeveloperday "#include <b.h>\n" 124405bea533Smydeveloperday "#include <a.h>\n" 124505bea533Smydeveloperday ")-AMZ029amz\";", 124605bea533Smydeveloperday sort("const char *t = R\"-AMZ029amz(\n" 124705bea533Smydeveloperday "#include <b.h>\n" 124805bea533Smydeveloperday "#include <a.h>\n" 124905bea533Smydeveloperday ")-AMZ029amz\";", 125005bea533Smydeveloperday "test.cxx", 0)); 125105bea533Smydeveloperday 125205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz-(\n" 125305bea533Smydeveloperday "#include <b.h>\n" 125405bea533Smydeveloperday "#include <a.h>\n" 125505bea533Smydeveloperday ")AMZ029amz-\";", 125605bea533Smydeveloperday sort("const char *t = R\"AMZ029amz-(\n" 125705bea533Smydeveloperday "#include <b.h>\n" 125805bea533Smydeveloperday "#include <a.h>\n" 125905bea533Smydeveloperday ")AMZ029amz-\";", 126005bea533Smydeveloperday "test.cxx", 0)); 126105bea533Smydeveloperday 126205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM|029amz-(\n" 126305bea533Smydeveloperday "#include <b.h>\n" 126405bea533Smydeveloperday "#include <a.h>\n" 126505bea533Smydeveloperday ")AM|029amz-\";", 126605bea533Smydeveloperday sort("const char *t = R\"AM|029amz-(\n" 126705bea533Smydeveloperday "#include <b.h>\n" 126805bea533Smydeveloperday "#include <a.h>\n" 126905bea533Smydeveloperday ")AM|029amz-\";", 127005bea533Smydeveloperday "test.cxx", 0)); 127105bea533Smydeveloperday 127205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM[029amz-(\n" 127305bea533Smydeveloperday "#include <b.h>\n" 127405bea533Smydeveloperday "#include <a.h>\n" 127505bea533Smydeveloperday ")AM[029amz-\";", 127605bea533Smydeveloperday sort("const char *t = R\"AM[029amz-(\n" 127705bea533Smydeveloperday "#include <b.h>\n" 127805bea533Smydeveloperday "#include <a.h>\n" 127905bea533Smydeveloperday ")AM[029amz-\";", 128005bea533Smydeveloperday "test.cxx", 0)); 128105bea533Smydeveloperday 128205bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM]029amz-(\n" 128305bea533Smydeveloperday "#include <b.h>\n" 128405bea533Smydeveloperday "#include <a.h>\n" 128505bea533Smydeveloperday ")AM]029amz-\";", 128605bea533Smydeveloperday sort("const char *t = R\"AM]029amz-(\n" 128705bea533Smydeveloperday "#include <b.h>\n" 128805bea533Smydeveloperday "#include <a.h>\n" 128905bea533Smydeveloperday ")AM]029amz-\";", 129005bea533Smydeveloperday "test.cxx", 0)); 129105bea533Smydeveloperday 129205bea533Smydeveloperday #define X "AMZ029amz{}+!%*=_:;',.<>|/?#~-$" 129305bea533Smydeveloperday 129405bea533Smydeveloperday EXPECT_EQ("const char *t = R\"" X "(\n" 129505bea533Smydeveloperday "#include <b.h>\n" 129605bea533Smydeveloperday "#include <a.h>\n" 129705bea533Smydeveloperday ")" X "\";", 129805bea533Smydeveloperday sort("const char *t = R\"" X "(\n" 129905bea533Smydeveloperday "#include <b.h>\n" 130005bea533Smydeveloperday "#include <a.h>\n" 130105bea533Smydeveloperday ")" X "\";", 130205bea533Smydeveloperday "test.cxx", 0)); 130305bea533Smydeveloperday 130405bea533Smydeveloperday #undef X 130505bea533Smydeveloperday } 130605bea533Smydeveloperday 1307d89ae9d3SDaniel Jasper } // end namespace 1308d89ae9d3SDaniel Jasper } // end namespace format 1309d89ae9d3SDaniel Jasper } // end namespace clang 1310