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 73*95bf0a9eSMarek Kurdej TEST_F(SortIncludesTest, TrailingComments) { 74*95bf0a9eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n" 75*95bf0a9eSMarek Kurdej "#include \"b.h\" /* long\n" 76*95bf0a9eSMarek Kurdej " * long\n" 77*95bf0a9eSMarek Kurdej " * comment*/\n" 78*95bf0a9eSMarek Kurdej "#include \"c.h\"\n" 79*95bf0a9eSMarek Kurdej "#include \"d.h\"\n", 80*95bf0a9eSMarek Kurdej sort("#include \"a.h\"\n" 81*95bf0a9eSMarek Kurdej "#include \"c.h\"\n" 82*95bf0a9eSMarek Kurdej "#include \"b.h\" /* long\n" 83*95bf0a9eSMarek Kurdej " * long\n" 84*95bf0a9eSMarek Kurdej " * comment*/\n" 85*95bf0a9eSMarek Kurdej "#include \"d.h\"\n")); 86*95bf0a9eSMarek Kurdej } 87*95bf0a9eSMarek 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 46185c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 4629c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 46385c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 46485c472dcSDaniel Jasper "#include \"b.h\"\n" 46585c472dcSDaniel Jasper "#include \"c.h\"\n", 46685c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 46785c472dcSDaniel Jasper "#include \"c.h\"\n" 4680bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 4690bfdeb4bSDaniel Jasper "a.cc")); 470afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 471afa62faeSNico Weber "#include \"b.h\"\n" 472afa62faeSNico Weber "#include \"c.h\"\n", 473afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 474afa62faeSNico Weber "#include \"c.h\"\n" 475afa62faeSNico Weber "#include \"b.h\"\n", 4769c8ff355SDaniel Jasper "a_test.cc")); 4770bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 4780bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 4790bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 4800bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 4810bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 4820bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 483afa62faeSNico Weber "input.mm")); 48485c472dcSDaniel Jasper 4859c8ff355SDaniel Jasper // Don't allow prefixes. 4869c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4879c8ff355SDaniel Jasper "#include \"c.h\"\n" 4889c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 4899c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 4909c8ff355SDaniel Jasper "#include \"c.h\"\n" 4919c8ff355SDaniel Jasper "#include \"b.h\"\n", 4929c8ff355SDaniel Jasper "a.cc")); 4939c8ff355SDaniel Jasper 4949c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 4959c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4969c8ff355SDaniel Jasper "#include \"c.h\"\n" 4979c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 4989c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 4999c8ff355SDaniel Jasper "#include \"c.h\"\n" 5009c8ff355SDaniel Jasper "#include \"b.h\"\n", 5019c8ff355SDaniel Jasper "a_main.cc")); 5029c8ff355SDaniel Jasper 50385c472dcSDaniel Jasper // Don't do this in headers. 50485c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 50585c472dcSDaniel Jasper "#include \"c.h\"\n" 50685c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 50785c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 50885c472dcSDaniel Jasper "#include \"c.h\"\n" 50985c472dcSDaniel Jasper "#include \"b.h\"\n", 5100bfdeb4bSDaniel Jasper "a.h")); 51132d75fa2SDaniel Jasper 51232d75fa2SDaniel Jasper // Only do this in the first #include block. 51332d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 51432d75fa2SDaniel Jasper "\n" 51532d75fa2SDaniel Jasper "#include \"b.h\"\n" 51632d75fa2SDaniel Jasper "#include \"c.h\"\n" 51732d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 51832d75fa2SDaniel Jasper sort("#include <a>\n" 51932d75fa2SDaniel Jasper "\n" 52032d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 52132d75fa2SDaniel Jasper "#include \"c.h\"\n" 52232d75fa2SDaniel Jasper "#include \"b.h\"\n", 52332d75fa2SDaniel Jasper "a.cc")); 524a252f5d5SDaniel Jasper 525a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 526a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 527a252f5d5SDaniel Jasper "#include \"b.h\"\n" 528a252f5d5SDaniel Jasper "#include \"c.h\"\n" 529a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 530a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 531a252f5d5SDaniel Jasper "#include \"a.h\"\n" 532a252f5d5SDaniel Jasper "#include \"c.h\"\n" 533a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 534a252f5d5SDaniel Jasper "a.cc")); 53585c472dcSDaniel Jasper } 53685c472dcSDaniel Jasper 537335ac2ebSmydeveloperday TEST_F(SortIncludesTest, LeavesMainHeaderFirstInAdditionalExtensions) { 538335ac2ebSmydeveloperday Style.IncludeIsMainRegex = "([-_](test|unittest))?|(Impl)?$"; 539335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 540335ac2ebSmydeveloperday "#include \"c.h\"\n" 541335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 542335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 543335ac2ebSmydeveloperday "#include \"c.h\"\n" 544335ac2ebSmydeveloperday "#include \"b.h\"\n", 545335ac2ebSmydeveloperday "a_test.xxx")); 546335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 547335ac2ebSmydeveloperday "#include \"c.h\"\n" 548335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 549335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 550335ac2ebSmydeveloperday "#include \"c.h\"\n" 551335ac2ebSmydeveloperday "#include \"b.h\"\n", 552335ac2ebSmydeveloperday "aImpl.hpp")); 553335ac2ebSmydeveloperday 554335ac2ebSmydeveloperday // .cpp extension is considered "main" by default 555335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 556335ac2ebSmydeveloperday "#include \"b.h\"\n" 557335ac2ebSmydeveloperday "#include \"c.h\"\n", 558335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 559335ac2ebSmydeveloperday "#include \"c.h\"\n" 560335ac2ebSmydeveloperday "#include \"b.h\"\n", 561335ac2ebSmydeveloperday "aImpl.cpp")); 562335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 563335ac2ebSmydeveloperday "#include \"b.h\"\n" 564335ac2ebSmydeveloperday "#include \"c.h\"\n", 565335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 566335ac2ebSmydeveloperday "#include \"c.h\"\n" 567335ac2ebSmydeveloperday "#include \"b.h\"\n", 568335ac2ebSmydeveloperday "a_test.cpp")); 569335ac2ebSmydeveloperday 570335ac2ebSmydeveloperday // Allow additional filenames / extensions 571335ac2ebSmydeveloperday Style.IncludeIsMainSourceRegex = "(Impl\\.hpp)|(\\.xxx)$"; 572335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 573335ac2ebSmydeveloperday "#include \"b.h\"\n" 574335ac2ebSmydeveloperday "#include \"c.h\"\n", 575335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 576335ac2ebSmydeveloperday "#include \"c.h\"\n" 577335ac2ebSmydeveloperday "#include \"b.h\"\n", 578335ac2ebSmydeveloperday "a_test.xxx")); 579335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 580335ac2ebSmydeveloperday "#include \"b.h\"\n" 581335ac2ebSmydeveloperday "#include \"c.h\"\n", 582335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 583335ac2ebSmydeveloperday "#include \"c.h\"\n" 584335ac2ebSmydeveloperday "#include \"b.h\"\n", 585335ac2ebSmydeveloperday "aImpl.hpp")); 586335ac2ebSmydeveloperday } 587335ac2ebSmydeveloperday 5884c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 5894c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5909d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5914c2c9c36SKrasimir Georgiev 5924c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 5934c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5944c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 5954c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5964c2c9c36SKrasimir Georgiev "\n" 5974c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5984c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5994c2c9c36SKrasimir Georgiev "c.cc")); 6004c2c9c36SKrasimir Georgiev } 6014c2c9c36SKrasimir Georgiev 6024c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 6034c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 6049d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6054c2c9c36SKrasimir Georgiev 6064c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 6074c2c9c36SKrasimir Georgiev "\n" 6084c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 6094c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 6104c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 6114c2c9c36SKrasimir Georgiev "\n" 6124c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 6134c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 6144c2c9c36SKrasimir Georgiev "a.cc")); 6154c2c9c36SKrasimir Georgiev } 6164c2c9c36SKrasimir Georgiev 617a8105b37SKent Sommer TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveSorting) { 6187b02794fSBjörn Schäpers EXPECT_FALSE(FmtStyle.SortIncludes == FormatStyle::SI_CaseInsensitive); 619a8105b37SKent Sommer 6207b02794fSBjörn Schäpers FmtStyle.SortIncludes = FormatStyle::SI_CaseInsensitive; 621a8105b37SKent Sommer 622a8105b37SKent Sommer EXPECT_EQ("#include \"A/B.h\"\n" 623a8105b37SKent Sommer "#include \"A/b.h\"\n" 624a8105b37SKent Sommer "#include \"a/b.h\"\n" 625a8105b37SKent Sommer "#include \"B/A.h\"\n" 626a8105b37SKent Sommer "#include \"B/a.h\"\n", 627a8105b37SKent Sommer sort("#include \"B/a.h\"\n" 628a8105b37SKent Sommer "#include \"B/A.h\"\n" 629a8105b37SKent Sommer "#include \"A/B.h\"\n" 630a8105b37SKent Sommer "#include \"a/b.h\"\n" 631a8105b37SKent Sommer "#include \"A/b.h\"\n", 632a8105b37SKent Sommer "a.h")); 633a8105b37SKent Sommer 634a8105b37SKent Sommer Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 635a8105b37SKent Sommer Style.IncludeCategories = { 636a8105b37SKent Sommer {"^\"", 1, 0, false}, {"^<.*\\.h>$", 2, 0, false}, {"^<", 3, 0, false}}; 637a8105b37SKent Sommer 638a8105b37SKent Sommer StringRef UnsortedCode = "#include \"qt.h\"\n" 639a8105b37SKent Sommer "#include <algorithm>\n" 640a8105b37SKent Sommer "#include <qtwhatever.h>\n" 641a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 642a8105b37SKent Sommer "#include <Algorithm>\n" 643a8105b37SKent Sommer "#include \"vlib.h\"\n" 644a8105b37SKent Sommer "#include \"Vlib.h\"\n" 645a8105b37SKent Sommer "#include \"AST.h\"\n"; 646a8105b37SKent Sommer 647a8105b37SKent Sommer EXPECT_EQ("#include \"AST.h\"\n" 648a8105b37SKent Sommer "#include \"qt.h\"\n" 649a8105b37SKent Sommer "#include \"Vlib.h\"\n" 650a8105b37SKent Sommer "#include \"vlib.h\"\n" 651a8105b37SKent Sommer "\n" 652a8105b37SKent Sommer "#include <Qtwhatever.h>\n" 653a8105b37SKent Sommer "#include <qtwhatever.h>\n" 654a8105b37SKent Sommer "\n" 655a8105b37SKent Sommer "#include <Algorithm>\n" 656a8105b37SKent Sommer "#include <algorithm>\n", 657a8105b37SKent Sommer sort(UnsortedCode)); 658a8105b37SKent Sommer } 659a8105b37SKent Sommer 660d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 661d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 662d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 663d676ab13SChandler Carruth 664d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 665d676ab13SChandler Carruth // manner. 666d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 667d676ab13SChandler Carruth "#include \"b.h\"\n" 668d676ab13SChandler Carruth "#include \"c.h\"\n" 669d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 670d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 671d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 672d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 673d676ab13SChandler Carruth sort("#include \"c.h\"\n" 674d676ab13SChandler Carruth "#include \"b.h\"\n" 675d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 676d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 677d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 678d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 679d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 680d676ab13SChandler Carruth "a_TEST.cc")); 681d676ab13SChandler Carruth } 682d676ab13SChandler Carruth 6838668eae2Smydeveloperday TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveMachting) { 6848668eae2Smydeveloperday Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 6858668eae2Smydeveloperday Style.IncludeCategories = {{"^\"", 1, 0, false}, 6868668eae2Smydeveloperday {"^<.*\\.h>$", 2, 0, false}, 6878668eae2Smydeveloperday {"^<Q[A-Z][^\\.]*>", 3, 0, false}, 6888668eae2Smydeveloperday {"^<Qt[^\\.]*>", 4, 0, false}, 6898668eae2Smydeveloperday {"^<", 5, 0, false}}; 6908668eae2Smydeveloperday 6918668eae2Smydeveloperday StringRef UnsortedCode = "#include <QWidget>\n" 6928668eae2Smydeveloperday "#include \"qt.h\"\n" 6938668eae2Smydeveloperday "#include <algorithm>\n" 6948668eae2Smydeveloperday "#include <windows.h>\n" 6958668eae2Smydeveloperday "#include <QLabel>\n" 6968668eae2Smydeveloperday "#include \"qa.h\"\n" 6978668eae2Smydeveloperday "#include <queue>\n" 6988668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6998668eae2Smydeveloperday "#include <QtGlobal>\n"; 7008668eae2Smydeveloperday 7018668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 7028668eae2Smydeveloperday "#include \"qt.h\"\n" 7038668eae2Smydeveloperday "\n" 7048668eae2Smydeveloperday "#include <qtwhatever.h>\n" 7058668eae2Smydeveloperday "#include <windows.h>\n" 7068668eae2Smydeveloperday "\n" 7078668eae2Smydeveloperday "#include <QLabel>\n" 7088668eae2Smydeveloperday "#include <QWidget>\n" 7098668eae2Smydeveloperday "#include <QtGlobal>\n" 7108668eae2Smydeveloperday "#include <queue>\n" 7118668eae2Smydeveloperday "\n" 7128668eae2Smydeveloperday "#include <algorithm>\n", 7138668eae2Smydeveloperday sort(UnsortedCode)); 7148668eae2Smydeveloperday 7158668eae2Smydeveloperday Style.IncludeCategories[2].RegexIsCaseSensitive = true; 7168668eae2Smydeveloperday Style.IncludeCategories[3].RegexIsCaseSensitive = true; 7178668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 7188668eae2Smydeveloperday "#include \"qt.h\"\n" 7198668eae2Smydeveloperday "\n" 7208668eae2Smydeveloperday "#include <qtwhatever.h>\n" 7218668eae2Smydeveloperday "#include <windows.h>\n" 7228668eae2Smydeveloperday "\n" 7238668eae2Smydeveloperday "#include <QLabel>\n" 7248668eae2Smydeveloperday "#include <QWidget>\n" 7258668eae2Smydeveloperday "\n" 7268668eae2Smydeveloperday "#include <QtGlobal>\n" 7278668eae2Smydeveloperday "\n" 7288668eae2Smydeveloperday "#include <algorithm>\n" 7298668eae2Smydeveloperday "#include <queue>\n", 7308668eae2Smydeveloperday sort(UnsortedCode)); 7318668eae2Smydeveloperday } 7328668eae2Smydeveloperday 733d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 7348668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 7358668eae2Smydeveloperday {".*", 1, 0, false}}; 736d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 7370bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7380bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 7390bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 7400bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 7410bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 7420bfdeb4bSDaniel Jasper "c_main.cc")); 7430bfdeb4bSDaniel Jasper 7440bfdeb4bSDaniel Jasper // check stable when re-run 7450bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 7460bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7470bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 7480bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 7490bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 7500bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 751925bb20cSKrasimir Georgiev "c_main.cc", 0)); 752d2629dc8SDaniel Jasper } 753d2629dc8SDaniel Jasper 7544c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 7558668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 7568668eae2Smydeveloperday {".*", 1, 0, false}}; 7579d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7584c2c9c36SKrasimir Georgiev 7594c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 7604c2c9c36SKrasimir Georgiev "\n" 7614c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7624c2c9c36SKrasimir Georgiev "\n" 7634c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 7644c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 7654c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 7664c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 7674c2c9c36SKrasimir Georgiev "c_main.cc")); 7684c2c9c36SKrasimir Georgiev 7694c2c9c36SKrasimir Georgiev // check stable when re-run 7704c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 7714c2c9c36SKrasimir Georgiev "\n" 7724c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7734c2c9c36SKrasimir Georgiev "\n" 7744c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 7754c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 7764c2c9c36SKrasimir Georgiev "\n" 7774c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 7784c2c9c36SKrasimir Georgiev "\n" 7794c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 780925bb20cSKrasimir Georgiev "c_main.cc", 0)); 7814c2c9c36SKrasimir Georgiev } 7824c2c9c36SKrasimir Georgiev 783b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 784b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 785b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 786b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 787b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 788b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 789b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 790b68aabf7SDaniel Jasper 791b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 792b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 793b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 794b68aabf7SDaniel Jasper } 795b68aabf7SDaniel Jasper 796a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 797a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 798a992afe8SEric Liu "#include <b>\n" 799a992afe8SEric Liu "#include <c>\n", 800a992afe8SEric Liu sort("#include <a>\n" 801a992afe8SEric Liu "#include <b>\n" 802a992afe8SEric Liu "#include <b>\n" 803a992afe8SEric Liu "#include <b>\n" 804a992afe8SEric Liu "#include <b>\n" 805a992afe8SEric Liu "#include <c>\n")); 8064c2c9c36SKrasimir Georgiev 8079d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 8084c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8094c2c9c36SKrasimir Georgiev "#include <b>\n" 8104c2c9c36SKrasimir Georgiev "#include <c>\n", 8114c2c9c36SKrasimir Georgiev sort("#include <a>\n" 8124c2c9c36SKrasimir Georgiev "#include <b>\n" 8134c2c9c36SKrasimir Georgiev "\n" 8144c2c9c36SKrasimir Georgiev "#include <b>\n" 8154c2c9c36SKrasimir Georgiev "\n" 8164c2c9c36SKrasimir Georgiev "#include <b>\n" 8174c2c9c36SKrasimir Georgiev "#include <c>\n")); 8184c2c9c36SKrasimir Georgiev 8199d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 8204c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8214c2c9c36SKrasimir Georgiev "#include <b>\n" 8224c2c9c36SKrasimir Georgiev "#include <c>\n", 8234c2c9c36SKrasimir Georgiev sort("#include <a>\n" 8244c2c9c36SKrasimir Georgiev "#include <b>\n" 8254c2c9c36SKrasimir Georgiev "\n" 8264c2c9c36SKrasimir Georgiev "#include <b>\n" 8274c2c9c36SKrasimir Georgiev "\n" 8284c2c9c36SKrasimir Georgiev "#include <b>\n" 8294c2c9c36SKrasimir Georgiev "#include <c>\n")); 830a992afe8SEric Liu } 831a992afe8SEric Liu 832a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 833a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 834a992afe8SEric Liu "#include <b>\n" 835a992afe8SEric Liu "#include <c>\n", 836a992afe8SEric Liu sort("#include <b>\n" 837a992afe8SEric Liu "#include <a>\n" 838a992afe8SEric Liu "#include <b>\n" 839a992afe8SEric Liu "#include <b>\n" 840a992afe8SEric Liu "#include <c>\n" 841a992afe8SEric Liu "#include <b>\n")); 8424c2c9c36SKrasimir Georgiev 8439d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 8444c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8454c2c9c36SKrasimir Georgiev "#include <b>\n" 8464c2c9c36SKrasimir Georgiev "#include <c>\n", 8474c2c9c36SKrasimir Georgiev sort("#include <b>\n" 8484c2c9c36SKrasimir Georgiev "#include <a>\n" 8494c2c9c36SKrasimir Georgiev "\n" 8504c2c9c36SKrasimir Georgiev "#include <b>\n" 8514c2c9c36SKrasimir Georgiev "\n" 8524c2c9c36SKrasimir Georgiev "#include <c>\n" 8534c2c9c36SKrasimir Georgiev "#include <b>\n")); 8544c2c9c36SKrasimir Georgiev 8559d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 8564c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 8574c2c9c36SKrasimir Georgiev "#include <b>\n" 8584c2c9c36SKrasimir Georgiev "#include <c>\n", 8594c2c9c36SKrasimir Georgiev sort("#include <b>\n" 8604c2c9c36SKrasimir Georgiev "#include <a>\n" 8614c2c9c36SKrasimir Georgiev "\n" 8624c2c9c36SKrasimir Georgiev "#include <b>\n" 8634c2c9c36SKrasimir Georgiev "\n" 8644c2c9c36SKrasimir Georgiev "#include <c>\n" 8654c2c9c36SKrasimir Georgiev "#include <b>\n")); 866a992afe8SEric Liu } 867a992afe8SEric Liu 868a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 869a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 870a992afe8SEric Liu "#include <a>\n" // Start of line: 13 871a992afe8SEric Liu "#include <b>\n" // Start of line: 26 872a992afe8SEric Liu "#include <b>\n" // Start of line: 39 873a992afe8SEric Liu "#include <c>\n" // Start of line: 52 874a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 875a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 876a992afe8SEric Liu "#include <b>\n" // Start of line: 13 877a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 878a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 879a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 880a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 881a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 882a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 883a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 884a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 885a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 886a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 887a992afe8SEric Liu // Cursor on '#' in "#include <c>". 888a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 889a992afe8SEric Liu } 890a992afe8SEric Liu 891a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 892a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 893a992afe8SEric Liu "#include <b>\n" 894a992afe8SEric Liu "\n" 895a992afe8SEric Liu "#include <b>\n" 896a992afe8SEric Liu "#include <c>\n", 897a992afe8SEric Liu sort("#include <a>\n" 898a992afe8SEric Liu "#include <b>\n" 899a992afe8SEric Liu "\n" 900a992afe8SEric Liu "#include <c>\n" 901a992afe8SEric Liu "#include <b>\n" 902a992afe8SEric Liu "#include <b>\n")); 903a992afe8SEric Liu } 904a992afe8SEric Liu 905a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 906a992afe8SEric Liu std::string Code = "#include <a>\n" 907a992afe8SEric Liu "#include <b>\n" 908a992afe8SEric Liu "#include <a>\n" 909a992afe8SEric Liu "#include <a>\n" 910a992afe8SEric Liu "\n" 911a992afe8SEric Liu " int x ;"; 912a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 9139d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 914a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 915a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 916a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 917a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 918a992afe8SEric Liu } 919a992afe8SEric Liu 920a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 921a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 922a2e7d0deSKrasimir Georgiev "#include <b>\n" 923a2e7d0deSKrasimir Georgiev "#include <a>\n" 924a2e7d0deSKrasimir Georgiev "-->", 925a2e7d0deSKrasimir Georgiev sort("<!--;\n" 926a2e7d0deSKrasimir Georgiev "#include <b>\n" 927a2e7d0deSKrasimir Georgiev "#include <a>\n" 928ece7e95fSmydeveloperday "-->", 929ece7e95fSmydeveloperday "input.h", 0)); 930925bb20cSKrasimir Georgiev } 931925bb20cSKrasimir Georgiev 932925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 933925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 934925bb20cSKrasimir Georgiev std::string Code = R"( 935925bb20cSKrasimir Georgiev #include "b.h" 936925bb20cSKrasimir Georgiev 937925bb20cSKrasimir Georgiev #include <a.h> 938925bb20cSKrasimir Georgiev )"; 939925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 940a2e7d0deSKrasimir Georgiev } 941a2e7d0deSKrasimir Georgiev 94260365021SPaul Hoad TEST_F(SortIncludesTest, 94360365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 94460365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 94560365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 94660365021SPaul Hoad "\r\n" 94760365021SPaul Hoad "#include <a.h>\r\n"; 94860365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 94960365021SPaul Hoad } 95000e7ae9fSKrasimir Georgiev 95100e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 95200e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 95300e7ae9fSKrasimir Georgiev 95400e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 95500e7ae9fSKrasimir Georgiev "#include <b.h>\n" 95600e7ae9fSKrasimir Georgiev "#include \"a.h\"", 95700e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 95800e7ae9fSKrasimir Georgiev "#include <a.h>\n" 95900e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 96000e7ae9fSKrasimir Georgiev } 96100e7ae9fSKrasimir Georgiev 96289878e8cSRafał Jelonek TEST_F(SortIncludesTest, DoNotTreatPrecompiledHeadersAsFirstBlock) { 96389878e8cSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 96489878e8cSRafał Jelonek std::string Code = "#include \"d.h\"\r\n" 96589878e8cSRafał Jelonek "#include \"b.h\"\r\n" 96689878e8cSRafał Jelonek "#pragma hdrstop\r\n" 96789878e8cSRafał Jelonek "\r\n" 96889878e8cSRafał Jelonek "#include \"c.h\"\r\n" 96989878e8cSRafał Jelonek "#include \"a.h\"\r\n" 97089878e8cSRafał Jelonek "#include \"e.h\"\r\n"; 97189878e8cSRafał Jelonek 97289878e8cSRafał Jelonek std::string Expected = "#include \"b.h\"\r\n" 97389878e8cSRafał Jelonek "#include \"d.h\"\r\n" 97489878e8cSRafał Jelonek "#pragma hdrstop\r\n" 97589878e8cSRafał Jelonek "\r\n" 97689878e8cSRafał Jelonek "#include \"e.h\"\r\n" 97789878e8cSRafał Jelonek "#include \"a.h\"\r\n" 97889878e8cSRafał Jelonek "#include \"c.h\"\r\n"; 97989878e8cSRafał Jelonek 98089878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 98189878e8cSRafał Jelonek 98289878e8cSRafał Jelonek Code = "#include \"d.h\"\n" 98389878e8cSRafał Jelonek "#include \"b.h\"\n" 98489878e8cSRafał Jelonek "#pragma hdrstop( \"c:\\projects\\include\\myinc.pch\" )\n" 98589878e8cSRafał Jelonek "\n" 98689878e8cSRafał Jelonek "#include \"c.h\"\n" 98789878e8cSRafał Jelonek "#include \"a.h\"\n" 98889878e8cSRafał Jelonek "#include \"e.h\"\n"; 98989878e8cSRafał Jelonek 99089878e8cSRafał Jelonek Expected = "#include \"b.h\"\n" 99189878e8cSRafał Jelonek "#include \"d.h\"\n" 99289878e8cSRafał Jelonek "#pragma hdrstop(\"c:\\projects\\include\\myinc.pch\")\n" 99389878e8cSRafał Jelonek "\n" 99489878e8cSRafał Jelonek "#include \"e.h\"\n" 99589878e8cSRafał Jelonek "#include \"a.h\"\n" 99689878e8cSRafał Jelonek "#include \"c.h\"\n"; 99789878e8cSRafał Jelonek 99889878e8cSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 99989878e8cSRafał Jelonek } 100089878e8cSRafał Jelonek 1001ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkMerge) { 1002ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 1003ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1004ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1005ee27c767SRafał Jelonek "\r\n" 1006ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1007ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1008ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1009ee27c767SRafał Jelonek 1010ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"e.h\"\r\n" 1011ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1012ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1013ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1014ee27c767SRafał Jelonek "#include \"d.h\"\r\n"; 1015ee27c767SRafał Jelonek 1016ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 1017ee27c767SRafał Jelonek } 1018ee27c767SRafał Jelonek 1019ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkPreserve) { 1020ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Preserve; 1021ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 1022ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 1023ee27c767SRafał Jelonek "\r\n" 1024ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1025ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1026ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1027ee27c767SRafał Jelonek 1028ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"b.h\"\r\n" 1029ee27c767SRafał Jelonek "#include \"d.h\"\r\n" 1030ee27c767SRafał Jelonek "\r\n" 1031ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 1032ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 1033ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 1034ee27c767SRafał Jelonek 1035ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 1036ee27c767SRafał Jelonek } 10377473940bSRafał Jelonek 10387473940bSRafał Jelonek TEST_F(SortIncludesTest, MergeLines) { 10397473940bSRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 10407473940bSRafał Jelonek std::string Code = "#include \"c.h\"\r\n" 10417473940bSRafał Jelonek "#include \"b\\\r\n" 10427473940bSRafał Jelonek ".h\"\r\n" 10437473940bSRafał Jelonek "#include \"a.h\"\r\n"; 10447473940bSRafał Jelonek 10457473940bSRafał Jelonek std::string Expected = "#include \"a.h\"\r\n" 10467473940bSRafał Jelonek "#include \"b\\\r\n" 10477473940bSRafał Jelonek ".h\"\r\n" 10487473940bSRafał Jelonek "#include \"c.h\"\r\n"; 10497473940bSRafał Jelonek 10507473940bSRafał Jelonek EXPECT_EQ(Expected, sort(Code, "a.cpp", 1)); 10517473940bSRafał Jelonek } 10527473940bSRafał Jelonek 105361dc0f2bSNathan James TEST_F(SortIncludesTest, DisableFormatDisablesIncludeSorting) { 105461dc0f2bSNathan James StringRef Sorted = "#include <a.h>\n" 105561dc0f2bSNathan James "#include <b.h>\n"; 105661dc0f2bSNathan James StringRef Unsorted = "#include <b.h>\n" 105761dc0f2bSNathan James "#include <a.h>\n"; 105861dc0f2bSNathan James EXPECT_EQ(Sorted, sort(Unsorted)); 105961dc0f2bSNathan James FmtStyle.DisableFormat = true; 106061dc0f2bSNathan James EXPECT_EQ(Unsorted, sort(Unsorted, "input.cpp", 0)); 106161dc0f2bSNathan James } 106261dc0f2bSNathan James 106305bea533Smydeveloperday TEST_F(SortIncludesTest, DisableRawStringLiteralSorting) { 106405bea533Smydeveloperday 106505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"(\n" 106605bea533Smydeveloperday "#include <b.h>\n" 106705bea533Smydeveloperday "#include <a.h>\n" 106805bea533Smydeveloperday ")\";", 106905bea533Smydeveloperday sort("const char *t = R\"(\n" 107005bea533Smydeveloperday "#include <b.h>\n" 107105bea533Smydeveloperday "#include <a.h>\n" 107205bea533Smydeveloperday ")\";", 107305bea533Smydeveloperday "test.cxx", 0)); 107405bea533Smydeveloperday EXPECT_EQ("const char *t = R\"x(\n" 107505bea533Smydeveloperday "#include <b.h>\n" 107605bea533Smydeveloperday "#include <a.h>\n" 107705bea533Smydeveloperday ")x\";", 107805bea533Smydeveloperday sort("const char *t = R\"x(\n" 107905bea533Smydeveloperday "#include <b.h>\n" 108005bea533Smydeveloperday "#include <a.h>\n" 108105bea533Smydeveloperday ")x\";", 108205bea533Smydeveloperday "test.cxx", 0)); 108305bea533Smydeveloperday EXPECT_EQ("const char *t = R\"xyz(\n" 108405bea533Smydeveloperday "#include <b.h>\n" 108505bea533Smydeveloperday "#include <a.h>\n" 108605bea533Smydeveloperday ")xyz\";", 108705bea533Smydeveloperday sort("const char *t = R\"xyz(\n" 108805bea533Smydeveloperday "#include <b.h>\n" 108905bea533Smydeveloperday "#include <a.h>\n" 109005bea533Smydeveloperday ")xyz\";", 109105bea533Smydeveloperday "test.cxx", 0)); 109205bea533Smydeveloperday 109305bea533Smydeveloperday EXPECT_EQ("#include <a.h>\n" 109405bea533Smydeveloperday "#include <b.h>\n" 109505bea533Smydeveloperday "const char *t = R\"(\n" 109605bea533Smydeveloperday "#include <b.h>\n" 109705bea533Smydeveloperday "#include <a.h>\n" 109805bea533Smydeveloperday ")\";\n" 109905bea533Smydeveloperday "#include <c.h>\n" 110005bea533Smydeveloperday "#include <d.h>\n" 110105bea533Smydeveloperday "const char *t = R\"x(\n" 110205bea533Smydeveloperday "#include <f.h>\n" 110305bea533Smydeveloperday "#include <e.h>\n" 110405bea533Smydeveloperday ")x\";\n" 110505bea533Smydeveloperday "#include <g.h>\n" 110605bea533Smydeveloperday "#include <h.h>\n" 110705bea533Smydeveloperday "const char *t = R\"xyz(\n" 110805bea533Smydeveloperday "#include <j.h>\n" 110905bea533Smydeveloperday "#include <i.h>\n" 111005bea533Smydeveloperday ")xyz\";\n" 111105bea533Smydeveloperday "#include <k.h>\n" 111205bea533Smydeveloperday "#include <l.h>", 111305bea533Smydeveloperday sort("#include <b.h>\n" 111405bea533Smydeveloperday "#include <a.h>\n" 111505bea533Smydeveloperday "const char *t = R\"(\n" 111605bea533Smydeveloperday "#include <b.h>\n" 111705bea533Smydeveloperday "#include <a.h>\n" 111805bea533Smydeveloperday ")\";\n" 111905bea533Smydeveloperday "#include <d.h>\n" 112005bea533Smydeveloperday "#include <c.h>\n" 112105bea533Smydeveloperday "const char *t = R\"x(\n" 112205bea533Smydeveloperday "#include <f.h>\n" 112305bea533Smydeveloperday "#include <e.h>\n" 112405bea533Smydeveloperday ")x\";\n" 112505bea533Smydeveloperday "#include <h.h>\n" 112605bea533Smydeveloperday "#include <g.h>\n" 112705bea533Smydeveloperday "const char *t = R\"xyz(\n" 112805bea533Smydeveloperday "#include <j.h>\n" 112905bea533Smydeveloperday "#include <i.h>\n" 113005bea533Smydeveloperday ")xyz\";\n" 113105bea533Smydeveloperday "#include <l.h>\n" 113205bea533Smydeveloperday "#include <k.h>", 113305bea533Smydeveloperday "test.cc", 4)); 113405bea533Smydeveloperday 113505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz(\n" 113605bea533Smydeveloperday "#include <b.h>\n" 113705bea533Smydeveloperday "#include <a.h>\n" 113805bea533Smydeveloperday ")AMZ029amz\";", 113905bea533Smydeveloperday sort("const char *t = R\"AMZ029amz(\n" 114005bea533Smydeveloperday "#include <b.h>\n" 114105bea533Smydeveloperday "#include <a.h>\n" 114205bea533Smydeveloperday ")AMZ029amz\";", 114305bea533Smydeveloperday "test.cxx", 0)); 114405bea533Smydeveloperday 114505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"-AMZ029amz(\n" 114605bea533Smydeveloperday "#include <b.h>\n" 114705bea533Smydeveloperday "#include <a.h>\n" 114805bea533Smydeveloperday ")-AMZ029amz\";", 114905bea533Smydeveloperday sort("const char *t = R\"-AMZ029amz(\n" 115005bea533Smydeveloperday "#include <b.h>\n" 115105bea533Smydeveloperday "#include <a.h>\n" 115205bea533Smydeveloperday ")-AMZ029amz\";", 115305bea533Smydeveloperday "test.cxx", 0)); 115405bea533Smydeveloperday 115505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AMZ029amz-(\n" 115605bea533Smydeveloperday "#include <b.h>\n" 115705bea533Smydeveloperday "#include <a.h>\n" 115805bea533Smydeveloperday ")AMZ029amz-\";", 115905bea533Smydeveloperday sort("const char *t = R\"AMZ029amz-(\n" 116005bea533Smydeveloperday "#include <b.h>\n" 116105bea533Smydeveloperday "#include <a.h>\n" 116205bea533Smydeveloperday ")AMZ029amz-\";", 116305bea533Smydeveloperday "test.cxx", 0)); 116405bea533Smydeveloperday 116505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM|029amz-(\n" 116605bea533Smydeveloperday "#include <b.h>\n" 116705bea533Smydeveloperday "#include <a.h>\n" 116805bea533Smydeveloperday ")AM|029amz-\";", 116905bea533Smydeveloperday sort("const char *t = R\"AM|029amz-(\n" 117005bea533Smydeveloperday "#include <b.h>\n" 117105bea533Smydeveloperday "#include <a.h>\n" 117205bea533Smydeveloperday ")AM|029amz-\";", 117305bea533Smydeveloperday "test.cxx", 0)); 117405bea533Smydeveloperday 117505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM[029amz-(\n" 117605bea533Smydeveloperday "#include <b.h>\n" 117705bea533Smydeveloperday "#include <a.h>\n" 117805bea533Smydeveloperday ")AM[029amz-\";", 117905bea533Smydeveloperday sort("const char *t = R\"AM[029amz-(\n" 118005bea533Smydeveloperday "#include <b.h>\n" 118105bea533Smydeveloperday "#include <a.h>\n" 118205bea533Smydeveloperday ")AM[029amz-\";", 118305bea533Smydeveloperday "test.cxx", 0)); 118405bea533Smydeveloperday 118505bea533Smydeveloperday EXPECT_EQ("const char *t = R\"AM]029amz-(\n" 118605bea533Smydeveloperday "#include <b.h>\n" 118705bea533Smydeveloperday "#include <a.h>\n" 118805bea533Smydeveloperday ")AM]029amz-\";", 118905bea533Smydeveloperday sort("const char *t = R\"AM]029amz-(\n" 119005bea533Smydeveloperday "#include <b.h>\n" 119105bea533Smydeveloperday "#include <a.h>\n" 119205bea533Smydeveloperday ")AM]029amz-\";", 119305bea533Smydeveloperday "test.cxx", 0)); 119405bea533Smydeveloperday 119505bea533Smydeveloperday #define X "AMZ029amz{}+!%*=_:;',.<>|/?#~-$" 119605bea533Smydeveloperday 119705bea533Smydeveloperday EXPECT_EQ("const char *t = R\"" X "(\n" 119805bea533Smydeveloperday "#include <b.h>\n" 119905bea533Smydeveloperday "#include <a.h>\n" 120005bea533Smydeveloperday ")" X "\";", 120105bea533Smydeveloperday sort("const char *t = R\"" X "(\n" 120205bea533Smydeveloperday "#include <b.h>\n" 120305bea533Smydeveloperday "#include <a.h>\n" 120405bea533Smydeveloperday ")" X "\";", 120505bea533Smydeveloperday "test.cxx", 0)); 120605bea533Smydeveloperday 120705bea533Smydeveloperday #undef X 120805bea533Smydeveloperday } 120905bea533Smydeveloperday 1210d89ae9d3SDaniel Jasper } // end namespace 1211d89ae9d3SDaniel Jasper } // end namespace format 1212d89ae9d3SDaniel Jasper } // end namespace clang 1213