1d89ae9d3SDaniel Jasper //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===// 2d89ae9d3SDaniel Jasper // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d89ae9d3SDaniel Jasper // 7d89ae9d3SDaniel Jasper //===----------------------------------------------------------------------===// 8d89ae9d3SDaniel Jasper 9d89ae9d3SDaniel Jasper #include "FormatTestUtils.h" 10d89ae9d3SDaniel Jasper #include "clang/Format/Format.h" 11925bb20cSKrasimir Georgiev #include "llvm/ADT/None.h" 12d89ae9d3SDaniel Jasper #include "llvm/Support/Debug.h" 13d89ae9d3SDaniel Jasper #include "gtest/gtest.h" 14d89ae9d3SDaniel Jasper 15d89ae9d3SDaniel Jasper #define DEBUG_TYPE "format-test" 16d89ae9d3SDaniel Jasper 17d89ae9d3SDaniel Jasper namespace clang { 18d89ae9d3SDaniel Jasper namespace format { 19d89ae9d3SDaniel Jasper namespace { 20d89ae9d3SDaniel Jasper 21d89ae9d3SDaniel Jasper class SortIncludesTest : public ::testing::Test { 22d89ae9d3SDaniel Jasper protected: 2394a96fceSDaniel Jasper std::vector<tooling::Range> GetCodeRange(StringRef Code) { 2494a96fceSDaniel Jasper return std::vector<tooling::Range>(1, tooling::Range(0, Code.size())); 2594a96fceSDaniel Jasper } 2694a96fceSDaniel Jasper 27d6a00780SDaniel Jasper std::string sort(StringRef Code, std::vector<tooling::Range> Ranges, 28925bb20cSKrasimir Georgiev StringRef FileName = "input.cc", 29925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 309d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName); 31a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 32925bb20cSKrasimir Georgiev EXPECT_EQ(ExpectedNumRanges, Replaces.size()); 33a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 344f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 354f8d9943SEric Liu auto Result = applyAllReplacements( 369d92c027SEric Liu *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName)); 374f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 384f8d9943SEric Liu return *Result; 39d89ae9d3SDaniel Jasper } 4085c472dcSDaniel Jasper 41ece7e95fSmydeveloperday std::string sort(StringRef Code, StringRef FileName = "input.cpp", 42925bb20cSKrasimir Georgiev unsigned ExpectedNumRanges = 1) { 43925bb20cSKrasimir Georgiev return sort(Code, GetCodeRange(Code), FileName, ExpectedNumRanges); 44d6a00780SDaniel Jasper } 45d6a00780SDaniel Jasper 46b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 479d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 48b68aabf7SDaniel Jasper return Cursor; 49b68aabf7SDaniel Jasper } 50b68aabf7SDaniel Jasper 519d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 529d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 53d89ae9d3SDaniel Jasper }; 54d89ae9d3SDaniel Jasper 55d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 56d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 57d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 59d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 60d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 61d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 62d6a00780SDaniel Jasper 63d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 64d6a00780SDaniel Jasper "#include <a>\n" 65d6a00780SDaniel Jasper "#include <b>\n", 66d6a00780SDaniel Jasper sort("// comment\n" 67d6a00780SDaniel Jasper "#include <b>\n" 68d6a00780SDaniel Jasper "#include <a>\n", 69d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 70d89ae9d3SDaniel Jasper } 71d89ae9d3SDaniel Jasper 7252e44b14SPaul Hoad TEST_F(SortIncludesTest, SortedIncludesUsingSortPriorityAttribute) { 7352e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7452e44b14SPaul Hoad FmtStyle.IncludeStyle.IncludeCategories = { 758668eae2Smydeveloperday {"^<sys/param\\.h>", 1, 0, false}, 768668eae2Smydeveloperday {"^<sys/types\\.h>", 1, 1, false}, 778668eae2Smydeveloperday {"^<sys.*/", 1, 2, false}, 788668eae2Smydeveloperday {"^<uvm/", 2, 3, false}, 798668eae2Smydeveloperday {"^<machine/", 3, 4, false}, 808668eae2Smydeveloperday {"^<dev/", 4, 5, false}, 818668eae2Smydeveloperday {"^<net.*/", 5, 6, false}, 828668eae2Smydeveloperday {"^<protocols/", 5, 7, false}, 838668eae2Smydeveloperday {"^<(fs|miscfs|msdosfs|nfs|ntfs|ufs)/", 6, 8, false}, 848668eae2Smydeveloperday {"^<(x86|amd64|i386|xen)/", 7, 8, false}, 858668eae2Smydeveloperday {"<path", 9, 11, false}, 868668eae2Smydeveloperday {"^<[^/].*\\.h>", 8, 10, false}, 878668eae2Smydeveloperday {"^\".*\\.h\"", 10, 12, false}}; 8852e44b14SPaul Hoad EXPECT_EQ("#include <sys/param.h>\n" 8952e44b14SPaul Hoad "#include <sys/types.h>\n" 9052e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 9152e44b14SPaul Hoad "#include <sys/socket.h>\n" 9252e44b14SPaul Hoad "#include <sys/stat.h>\n" 9352e44b14SPaul Hoad "#include <sys/wait.h>\n" 9452e44b14SPaul Hoad "\n" 9552e44b14SPaul Hoad "#include <net/if.h>\n" 9652e44b14SPaul Hoad "#include <net/if_dl.h>\n" 9752e44b14SPaul Hoad "#include <net/route.h>\n" 9852e44b14SPaul Hoad "#include <netinet/in.h>\n" 9952e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 10052e44b14SPaul Hoad "\n" 10152e44b14SPaul Hoad "#include <assert.h>\n" 10252e44b14SPaul Hoad "#include <errno.h>\n" 10352e44b14SPaul Hoad "#include <inttypes.h>\n" 10452e44b14SPaul Hoad "#include <stdio.h>\n" 10552e44b14SPaul Hoad "#include <stdlib.h>\n" 10652e44b14SPaul Hoad "\n" 10752e44b14SPaul Hoad "#include <paths.h>\n" 10852e44b14SPaul Hoad "\n" 10952e44b14SPaul Hoad "#include \"pathnames.h\"\n", 11052e44b14SPaul Hoad sort("#include <sys/param.h>\n" 11152e44b14SPaul Hoad "#include <sys/types.h>\n" 11252e44b14SPaul Hoad "#include <sys/ioctl.h>\n" 11352e44b14SPaul Hoad "#include <net/if_dl.h>\n" 11452e44b14SPaul Hoad "#include <net/route.h>\n" 11552e44b14SPaul Hoad "#include <netinet/in.h>\n" 11652e44b14SPaul Hoad "#include <sys/socket.h>\n" 11752e44b14SPaul Hoad "#include <sys/stat.h>\n" 11852e44b14SPaul Hoad "#include <sys/wait.h>\n" 11952e44b14SPaul Hoad "#include <net/if.h>\n" 12052e44b14SPaul Hoad "#include <protocols/rwhod.h>\n" 12152e44b14SPaul Hoad "#include <assert.h>\n" 12252e44b14SPaul Hoad "#include <paths.h>\n" 12352e44b14SPaul Hoad "#include \"pathnames.h\"\n" 12452e44b14SPaul Hoad "#include <errno.h>\n" 12552e44b14SPaul Hoad "#include <inttypes.h>\n" 12652e44b14SPaul Hoad "#include <stdio.h>\n" 12752e44b14SPaul Hoad "#include <stdlib.h>\n")); 12852e44b14SPaul Hoad } 12952e44b14SPaul Hoad TEST_F(SortIncludesTest, SortPriorityNotDefined) { 13052e44b14SPaul Hoad FmtStyle = getLLVMStyle(); 13152e44b14SPaul Hoad EXPECT_EQ("#include \"FormatTestUtils.h\"\n" 13252e44b14SPaul Hoad "#include \"clang/Format/Format.h\"\n" 13352e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13452e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n" 13552e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n", 13652e44b14SPaul Hoad sort("#include \"clang/Format/Format.h\"\n" 13752e44b14SPaul Hoad "#include \"llvm/ADT/None.h\"\n" 13852e44b14SPaul Hoad "#include \"FormatTestUtils.h\"\n" 13952e44b14SPaul Hoad "#include \"gtest/gtest.h\"\n" 14052e44b14SPaul Hoad "#include \"llvm/Support/Debug.h\"\n")); 14152e44b14SPaul Hoad } 14252e44b14SPaul Hoad 14394a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 14494a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 14594a96fceSDaniel Jasper std::string Code = "#include <a>\n" 14694a96fceSDaniel Jasper "#include <b>\n" 147a992afe8SEric Liu "#include <c>\n" 148a992afe8SEric Liu "#include <d>\n" 149a992afe8SEric Liu "#include <e>\n" 150a992afe8SEric Liu "#include <f>\n"; 1519d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 15294a96fceSDaniel Jasper } 15394a96fceSDaniel Jasper 15484048e23SHaojian Wu TEST_F(SortIncludesTest, MainFileHeader) { 155c1b209ccSHaojian Wu std::string Code = "#include <string>\n" 156c1b209ccSHaojian Wu "\n" 157c1b209ccSHaojian Wu "#include \"a/extra_action.proto.h\"\n"; 158c1b209ccSHaojian Wu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 159c1b209ccSHaojian Wu EXPECT_TRUE( 160c1b209ccSHaojian Wu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a/extra_action.cc") 161c1b209ccSHaojian Wu .empty()); 16284048e23SHaojian Wu 16384048e23SHaojian Wu EXPECT_EQ("#include \"foo.bar.h\"\n" 16484048e23SHaojian Wu "\n" 16584048e23SHaojian Wu "#include \"a.h\"\n", 16684048e23SHaojian Wu sort("#include \"a.h\"\n" 16784048e23SHaojian Wu "#include \"foo.bar.h\"\n", 16884048e23SHaojian Wu "foo.bar.cc")); 169c1b209ccSHaojian Wu } 170c1b209ccSHaojian Wu 1714c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 1729d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1734c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1744c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1754c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1764c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1774c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1784c2c9c36SKrasimir Georgiev "\n" 1794c2c9c36SKrasimir Georgiev "\n" 1804c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1814c2c9c36SKrasimir Georgiev 1829d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 1834c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1844c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1854c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1864c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1874c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1884c2c9c36SKrasimir Georgiev "\n" 1894c2c9c36SKrasimir Georgiev "\n" 1904c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1914c2c9c36SKrasimir Georgiev } 1924c2c9c36SKrasimir Georgiev 1939b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1949b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1959b8c7c72SDaniel Jasper "#include <b>\n" 1969b8c7c72SDaniel Jasper "#include <c>\n" 1979b8c7c72SDaniel Jasper "// clang-format off\n" 1989b8c7c72SDaniel Jasper "#include <b>\n" 1999b8c7c72SDaniel Jasper "#include <a>\n" 2009b8c7c72SDaniel Jasper "#include <c>\n" 2019b8c7c72SDaniel Jasper "// clang-format on\n", 2029b8c7c72SDaniel Jasper sort("#include <b>\n" 2039b8c7c72SDaniel Jasper "#include <a>\n" 2049b8c7c72SDaniel Jasper "#include <c>\n" 2059b8c7c72SDaniel Jasper "// clang-format off\n" 2069b8c7c72SDaniel Jasper "#include <b>\n" 2079b8c7c72SDaniel Jasper "#include <a>\n" 2089b8c7c72SDaniel Jasper "#include <c>\n" 2099b8c7c72SDaniel Jasper "// clang-format on\n")); 2109b8c7c72SDaniel Jasper } 2119b8c7c72SDaniel Jasper 2129b468c0bSPaul Hoad TEST_F(SortIncludesTest, SupportClangFormatOffCStyle) { 2139b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2149b468c0bSPaul Hoad "#include <b>\n" 2159b468c0bSPaul Hoad "#include <c>\n" 2169b468c0bSPaul Hoad "/* clang-format off */\n" 2179b468c0bSPaul Hoad "#include <b>\n" 2189b468c0bSPaul Hoad "#include <a>\n" 2199b468c0bSPaul Hoad "#include <c>\n" 2209b468c0bSPaul Hoad "/* clang-format on */\n", 2219b468c0bSPaul Hoad sort("#include <b>\n" 2229b468c0bSPaul Hoad "#include <a>\n" 2239b468c0bSPaul Hoad "#include <c>\n" 2249b468c0bSPaul Hoad "/* clang-format off */\n" 2259b468c0bSPaul Hoad "#include <b>\n" 2269b468c0bSPaul Hoad "#include <a>\n" 2279b468c0bSPaul Hoad "#include <c>\n" 2289b468c0bSPaul Hoad "/* clang-format on */\n")); 2299b468c0bSPaul Hoad 2309b468c0bSPaul Hoad // Not really turning it off 2319b468c0bSPaul Hoad EXPECT_EQ("#include <a>\n" 2329b468c0bSPaul Hoad "#include <b>\n" 2339b468c0bSPaul Hoad "#include <c>\n" 2349b468c0bSPaul Hoad "/* clang-format offically */\n" 2359b468c0bSPaul Hoad "#include <a>\n" 2369b468c0bSPaul Hoad "#include <b>\n" 2379b468c0bSPaul Hoad "#include <c>\n" 2389b468c0bSPaul Hoad "/* clang-format onwards */\n", 2399b468c0bSPaul Hoad sort("#include <b>\n" 2409b468c0bSPaul Hoad "#include <a>\n" 2419b468c0bSPaul Hoad "#include <c>\n" 2429b468c0bSPaul Hoad "/* clang-format offically */\n" 2439b468c0bSPaul Hoad "#include <b>\n" 2449b468c0bSPaul Hoad "#include <a>\n" 2459b468c0bSPaul Hoad "#include <c>\n" 246ece7e95fSmydeveloperday "/* clang-format onwards */\n", 247ece7e95fSmydeveloperday "input.h", 2)); 2489b468c0bSPaul Hoad } 2499b468c0bSPaul Hoad 250da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 2519d92c027SEric Liu FmtStyle.SortIncludes = false; 252da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 253da446770SDaniel Jasper "#include \"c.h\"\n" 254da446770SDaniel Jasper "#include \"b.h\"\n", 255da446770SDaniel Jasper sort("#include \"a.h\"\n" 256da446770SDaniel Jasper "#include \"c.h\"\n" 257925bb20cSKrasimir Georgiev "#include \"b.h\"\n", 258925bb20cSKrasimir Georgiev "input.h", 0)); 259da446770SDaniel Jasper } 260da446770SDaniel Jasper 261ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 262ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 263ff06370eSNico Weber "#import \"b.h\"\n" 264ff06370eSNico Weber "#include \"c.h\"\n", 265ff06370eSNico Weber sort("#include \"a.h\"\n" 266ff06370eSNico Weber "#include \"c.h\"\n" 267ff06370eSNico Weber "#import \"b.h\"\n")); 268ff06370eSNico Weber } 269ff06370eSNico Weber 270d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 271d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 272d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 273d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 274d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 275d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 276d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 277d89ae9d3SDaniel Jasper } 278d89ae9d3SDaniel Jasper 279d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 280d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 281d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 282d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 283d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 284d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 285d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 286d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 287d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 288d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 289d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 290d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 291d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 292fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 293fe21c86eSMarek Kurdej " #include \"a.h\"\n")); 294fe21c86eSMarek Kurdej } 295fe21c86eSMarek Kurdej 296fe21c86eSMarek Kurdej TEST_F(SortIncludesTest, TrailingWhitespace) { 297fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n" 298fe21c86eSMarek Kurdej "#include \"b.h\"\n" 299fe21c86eSMarek Kurdej "#include \"c.h\"\n", 300fe21c86eSMarek Kurdej sort("#include \"a.h\" \n" 301fe21c86eSMarek Kurdej "#include \"c.h\" \n" 302fe21c86eSMarek Kurdej "#include \"b.h\" \n")); 303fe21c86eSMarek Kurdej EXPECT_EQ("#include \"a.h\"\n", sort("#include \"a.h\"\n" 304fe21c86eSMarek Kurdej "#include \"a.h\" \n")); 305d89ae9d3SDaniel Jasper } 306d89ae9d3SDaniel Jasper 307d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 308d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 309d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 310d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 311d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 312d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 313d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 314d89ae9d3SDaniel Jasper } 315d89ae9d3SDaniel Jasper 316d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 317d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 318d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 319d89ae9d3SDaniel Jasper "\n" 320d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 32185c472dcSDaniel Jasper sort("#include \"a.h\"\n" 32285c472dcSDaniel Jasper "#include \"c.h\"\n" 323d89ae9d3SDaniel Jasper "\n" 324ece7e95fSmydeveloperday "#include \"b.h\"\n", 325ece7e95fSmydeveloperday "input.h", 0)); 326d89ae9d3SDaniel Jasper } 327d89ae9d3SDaniel Jasper 3284c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 3299d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3304c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3314c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3324c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3334c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 3344c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3354c2c9c36SKrasimir Georgiev "\n" 3364c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3374c2c9c36SKrasimir Georgiev } 3384c2c9c36SKrasimir Georgiev 3394c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 3404c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3414c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3424c2c9c36SKrasimir Georgiev "// comment\n" 3434c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3444c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3454c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3464c2c9c36SKrasimir Georgiev "// comment\n" 3474c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3484c2c9c36SKrasimir Georgiev 3499d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3504c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3514c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3524c2c9c36SKrasimir Georgiev "// comment\n" 3534c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3544c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3554c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3564c2c9c36SKrasimir Georgiev "// comment\n" 3574c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3584c2c9c36SKrasimir Georgiev 3599d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3604c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3614c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 3624c2c9c36SKrasimir Georgiev "// comment\n" 3634c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3644c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 3654c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3664c2c9c36SKrasimir Georgiev "// comment\n" 3674c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 3684c2c9c36SKrasimir Georgiev } 3694c2c9c36SKrasimir Georgiev 370d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 37185c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 37285c472dcSDaniel Jasper "#include \"c.h\"\n" 3730f4d5f85SEric Liu "#include <array>\n" 37485c472dcSDaniel Jasper "#include <b.h>\n" 3750f4d5f85SEric Liu "#include <d.h>\n" 3760f4d5f85SEric Liu "#include <vector>\n", 3770f4d5f85SEric Liu sort("#include <vector>\n" 3780f4d5f85SEric Liu "#include <d.h>\n" 3790f4d5f85SEric Liu "#include <array>\n" 38085c472dcSDaniel Jasper "#include <b.h>\n" 38185c472dcSDaniel Jasper "#include \"c.h\"\n" 38285c472dcSDaniel Jasper "#include \"a.h\"\n")); 38385c472dcSDaniel Jasper 3849d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 385d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 386d89ae9d3SDaniel Jasper "#include <d.h>\n" 3870f4d5f85SEric Liu "\n" 3880f4d5f85SEric Liu "#include <array>\n" 3890f4d5f85SEric Liu "#include <vector>\n" 3900f4d5f85SEric Liu "\n" 391d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 392d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 3930f4d5f85SEric Liu sort("#include <vector>\n" 3940f4d5f85SEric Liu "#include <d.h>\n" 3950f4d5f85SEric Liu "#include <array>\n" 396d89ae9d3SDaniel Jasper "#include <b.h>\n" 397d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 398d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 399d89ae9d3SDaniel Jasper } 400d89ae9d3SDaniel Jasper 4014c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 4029d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4034c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 4044c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4054c2c9c36SKrasimir Georgiev "\n" 4064c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4074c2c9c36SKrasimir Georgiev "#include <d.h>\n", 4084c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 4094c2c9c36SKrasimir Georgiev "#include <b.h>\n" 4104c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 4114c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 4124c2c9c36SKrasimir Georgiev } 4134c2c9c36SKrasimir Georgiev 414d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 415d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 416d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 417d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 418d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 419d89ae9d3SDaniel Jasper "#include \\\n" 420d89ae9d3SDaniel Jasper "\"c.h\"\n" 421d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 422d89ae9d3SDaniel Jasper } 423d89ae9d3SDaniel Jasper 42485c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 4259c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 42685c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 42785c472dcSDaniel Jasper "#include \"b.h\"\n" 42885c472dcSDaniel Jasper "#include \"c.h\"\n", 42985c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 43085c472dcSDaniel Jasper "#include \"c.h\"\n" 4310bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 4320bfdeb4bSDaniel Jasper "a.cc")); 433afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 434afa62faeSNico Weber "#include \"b.h\"\n" 435afa62faeSNico Weber "#include \"c.h\"\n", 436afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 437afa62faeSNico Weber "#include \"c.h\"\n" 438afa62faeSNico Weber "#include \"b.h\"\n", 4399c8ff355SDaniel Jasper "a_test.cc")); 4400bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 4410bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 4420bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 4430bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 4440bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 4450bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 446afa62faeSNico Weber "input.mm")); 44785c472dcSDaniel Jasper 4489c8ff355SDaniel Jasper // Don't allow prefixes. 4499c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4509c8ff355SDaniel Jasper "#include \"c.h\"\n" 4519c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 4529c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 4539c8ff355SDaniel Jasper "#include \"c.h\"\n" 4549c8ff355SDaniel Jasper "#include \"b.h\"\n", 4559c8ff355SDaniel Jasper "a.cc")); 4569c8ff355SDaniel Jasper 4579c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 4589c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 4599c8ff355SDaniel Jasper "#include \"c.h\"\n" 4609c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 4619c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 4629c8ff355SDaniel Jasper "#include \"c.h\"\n" 4639c8ff355SDaniel Jasper "#include \"b.h\"\n", 4649c8ff355SDaniel Jasper "a_main.cc")); 4659c8ff355SDaniel Jasper 46685c472dcSDaniel Jasper // Don't do this in headers. 46785c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 46885c472dcSDaniel Jasper "#include \"c.h\"\n" 46985c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 47085c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 47185c472dcSDaniel Jasper "#include \"c.h\"\n" 47285c472dcSDaniel Jasper "#include \"b.h\"\n", 4730bfdeb4bSDaniel Jasper "a.h")); 47432d75fa2SDaniel Jasper 47532d75fa2SDaniel Jasper // Only do this in the first #include block. 47632d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 47732d75fa2SDaniel Jasper "\n" 47832d75fa2SDaniel Jasper "#include \"b.h\"\n" 47932d75fa2SDaniel Jasper "#include \"c.h\"\n" 48032d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 48132d75fa2SDaniel Jasper sort("#include <a>\n" 48232d75fa2SDaniel Jasper "\n" 48332d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 48432d75fa2SDaniel Jasper "#include \"c.h\"\n" 48532d75fa2SDaniel Jasper "#include \"b.h\"\n", 48632d75fa2SDaniel Jasper "a.cc")); 487a252f5d5SDaniel Jasper 488a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 489a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 490a252f5d5SDaniel Jasper "#include \"b.h\"\n" 491a252f5d5SDaniel Jasper "#include \"c.h\"\n" 492a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 493a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 494a252f5d5SDaniel Jasper "#include \"a.h\"\n" 495a252f5d5SDaniel Jasper "#include \"c.h\"\n" 496a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 497a252f5d5SDaniel Jasper "a.cc")); 49885c472dcSDaniel Jasper } 49985c472dcSDaniel Jasper 500335ac2ebSmydeveloperday TEST_F(SortIncludesTest, LeavesMainHeaderFirstInAdditionalExtensions) { 501335ac2ebSmydeveloperday Style.IncludeIsMainRegex = "([-_](test|unittest))?|(Impl)?$"; 502335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 503335ac2ebSmydeveloperday "#include \"c.h\"\n" 504335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 505335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 506335ac2ebSmydeveloperday "#include \"c.h\"\n" 507335ac2ebSmydeveloperday "#include \"b.h\"\n", 508335ac2ebSmydeveloperday "a_test.xxx")); 509335ac2ebSmydeveloperday EXPECT_EQ("#include \"b.h\"\n" 510335ac2ebSmydeveloperday "#include \"c.h\"\n" 511335ac2ebSmydeveloperday "#include \"llvm/a.h\"\n", 512335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 513335ac2ebSmydeveloperday "#include \"c.h\"\n" 514335ac2ebSmydeveloperday "#include \"b.h\"\n", 515335ac2ebSmydeveloperday "aImpl.hpp")); 516335ac2ebSmydeveloperday 517335ac2ebSmydeveloperday // .cpp extension is considered "main" by default 518335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 519335ac2ebSmydeveloperday "#include \"b.h\"\n" 520335ac2ebSmydeveloperday "#include \"c.h\"\n", 521335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 522335ac2ebSmydeveloperday "#include \"c.h\"\n" 523335ac2ebSmydeveloperday "#include \"b.h\"\n", 524335ac2ebSmydeveloperday "aImpl.cpp")); 525335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 526335ac2ebSmydeveloperday "#include \"b.h\"\n" 527335ac2ebSmydeveloperday "#include \"c.h\"\n", 528335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 529335ac2ebSmydeveloperday "#include \"c.h\"\n" 530335ac2ebSmydeveloperday "#include \"b.h\"\n", 531335ac2ebSmydeveloperday "a_test.cpp")); 532335ac2ebSmydeveloperday 533335ac2ebSmydeveloperday // Allow additional filenames / extensions 534335ac2ebSmydeveloperday Style.IncludeIsMainSourceRegex = "(Impl\\.hpp)|(\\.xxx)$"; 535335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 536335ac2ebSmydeveloperday "#include \"b.h\"\n" 537335ac2ebSmydeveloperday "#include \"c.h\"\n", 538335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 539335ac2ebSmydeveloperday "#include \"c.h\"\n" 540335ac2ebSmydeveloperday "#include \"b.h\"\n", 541335ac2ebSmydeveloperday "a_test.xxx")); 542335ac2ebSmydeveloperday EXPECT_EQ("#include \"llvm/a.h\"\n" 543335ac2ebSmydeveloperday "#include \"b.h\"\n" 544335ac2ebSmydeveloperday "#include \"c.h\"\n", 545335ac2ebSmydeveloperday sort("#include \"llvm/a.h\"\n" 546335ac2ebSmydeveloperday "#include \"c.h\"\n" 547335ac2ebSmydeveloperday "#include \"b.h\"\n", 548335ac2ebSmydeveloperday "aImpl.hpp")); 549335ac2ebSmydeveloperday } 550335ac2ebSmydeveloperday 5514c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 5524c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5539d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5544c2c9c36SKrasimir Georgiev 5554c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 5564c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5574c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 5584c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5594c2c9c36SKrasimir Georgiev "\n" 5604c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5614c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5624c2c9c36SKrasimir Georgiev "c.cc")); 5634c2c9c36SKrasimir Georgiev } 5644c2c9c36SKrasimir Georgiev 5654c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 5664c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 5679d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5684c2c9c36SKrasimir Georgiev 5694c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 5704c2c9c36SKrasimir Georgiev "\n" 5714c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 5724c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5734c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 5744c2c9c36SKrasimir Georgiev "\n" 5754c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 5764c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 5774c2c9c36SKrasimir Georgiev "a.cc")); 5784c2c9c36SKrasimir Georgiev } 5794c2c9c36SKrasimir Georgiev 580d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 581d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 582d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 583d676ab13SChandler Carruth 584d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 585d676ab13SChandler Carruth // manner. 586d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 587d676ab13SChandler Carruth "#include \"b.h\"\n" 588d676ab13SChandler Carruth "#include \"c.h\"\n" 589d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 590d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 591d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 592d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 593d676ab13SChandler Carruth sort("#include \"c.h\"\n" 594d676ab13SChandler Carruth "#include \"b.h\"\n" 595d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 596d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 597d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 598d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 599d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 600d676ab13SChandler Carruth "a_TEST.cc")); 601d676ab13SChandler Carruth } 602d676ab13SChandler Carruth 6038668eae2Smydeveloperday TEST_F(SortIncludesTest, SupportOptionalCaseSensitiveMachting) { 6048668eae2Smydeveloperday Style.IncludeBlocks = clang::tooling::IncludeStyle::IBS_Regroup; 6058668eae2Smydeveloperday Style.IncludeCategories = {{"^\"", 1, 0, false}, 6068668eae2Smydeveloperday {"^<.*\\.h>$", 2, 0, false}, 6078668eae2Smydeveloperday {"^<Q[A-Z][^\\.]*>", 3, 0, false}, 6088668eae2Smydeveloperday {"^<Qt[^\\.]*>", 4, 0, false}, 6098668eae2Smydeveloperday {"^<", 5, 0, false}}; 6108668eae2Smydeveloperday 6118668eae2Smydeveloperday StringRef UnsortedCode = "#include <QWidget>\n" 6128668eae2Smydeveloperday "#include \"qt.h\"\n" 6138668eae2Smydeveloperday "#include <algorithm>\n" 6148668eae2Smydeveloperday "#include <windows.h>\n" 6158668eae2Smydeveloperday "#include <QLabel>\n" 6168668eae2Smydeveloperday "#include \"qa.h\"\n" 6178668eae2Smydeveloperday "#include <queue>\n" 6188668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6198668eae2Smydeveloperday "#include <QtGlobal>\n"; 6208668eae2Smydeveloperday 6218668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 6228668eae2Smydeveloperday "#include \"qt.h\"\n" 6238668eae2Smydeveloperday "\n" 6248668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6258668eae2Smydeveloperday "#include <windows.h>\n" 6268668eae2Smydeveloperday "\n" 6278668eae2Smydeveloperday "#include <QLabel>\n" 6288668eae2Smydeveloperday "#include <QWidget>\n" 6298668eae2Smydeveloperday "#include <QtGlobal>\n" 6308668eae2Smydeveloperday "#include <queue>\n" 6318668eae2Smydeveloperday "\n" 6328668eae2Smydeveloperday "#include <algorithm>\n", 6338668eae2Smydeveloperday sort(UnsortedCode)); 6348668eae2Smydeveloperday 6358668eae2Smydeveloperday Style.IncludeCategories[2].RegexIsCaseSensitive = true; 6368668eae2Smydeveloperday Style.IncludeCategories[3].RegexIsCaseSensitive = true; 6378668eae2Smydeveloperday EXPECT_EQ("#include \"qa.h\"\n" 6388668eae2Smydeveloperday "#include \"qt.h\"\n" 6398668eae2Smydeveloperday "\n" 6408668eae2Smydeveloperday "#include <qtwhatever.h>\n" 6418668eae2Smydeveloperday "#include <windows.h>\n" 6428668eae2Smydeveloperday "\n" 6438668eae2Smydeveloperday "#include <QLabel>\n" 6448668eae2Smydeveloperday "#include <QWidget>\n" 6458668eae2Smydeveloperday "\n" 6468668eae2Smydeveloperday "#include <QtGlobal>\n" 6478668eae2Smydeveloperday "\n" 6488668eae2Smydeveloperday "#include <algorithm>\n" 6498668eae2Smydeveloperday "#include <queue>\n", 6508668eae2Smydeveloperday sort(UnsortedCode)); 6518668eae2Smydeveloperday } 6528668eae2Smydeveloperday 653d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 6548668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 6558668eae2Smydeveloperday {".*", 1, 0, false}}; 656d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 6570bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 6580bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 6590bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 6600bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 6610bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 6620bfdeb4bSDaniel Jasper "c_main.cc")); 6630bfdeb4bSDaniel Jasper 6640bfdeb4bSDaniel Jasper // check stable when re-run 6650bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 6660bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 6670bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 6680bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 6690bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 6700bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 671925bb20cSKrasimir Georgiev "c_main.cc", 0)); 672d2629dc8SDaniel Jasper } 673d2629dc8SDaniel Jasper 6744c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 6758668eae2Smydeveloperday Style.IncludeCategories = {{".*important_os_header.*", -1, 0, false}, 6768668eae2Smydeveloperday {".*", 1, 0, false}}; 6779d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 6784c2c9c36SKrasimir Georgiev 6794c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 6804c2c9c36SKrasimir Georgiev "\n" 6814c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6824c2c9c36SKrasimir Georgiev "\n" 6834c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 6844c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 6854c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 6864c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 6874c2c9c36SKrasimir Georgiev "c_main.cc")); 6884c2c9c36SKrasimir Georgiev 6894c2c9c36SKrasimir Georgiev // check stable when re-run 6904c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 6914c2c9c36SKrasimir Georgiev "\n" 6924c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6934c2c9c36SKrasimir Georgiev "\n" 6944c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 6954c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 6964c2c9c36SKrasimir Georgiev "\n" 6974c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 6984c2c9c36SKrasimir Georgiev "\n" 6994c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 700925bb20cSKrasimir Georgiev "c_main.cc", 0)); 7014c2c9c36SKrasimir Georgiev } 7024c2c9c36SKrasimir Georgiev 703b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 704b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 705b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 706b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 707b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 708b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 709b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 710b68aabf7SDaniel Jasper 711b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 712b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 713b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 714b68aabf7SDaniel Jasper } 715b68aabf7SDaniel Jasper 716a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 717a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 718a992afe8SEric Liu "#include <b>\n" 719a992afe8SEric Liu "#include <c>\n", 720a992afe8SEric Liu sort("#include <a>\n" 721a992afe8SEric Liu "#include <b>\n" 722a992afe8SEric Liu "#include <b>\n" 723a992afe8SEric Liu "#include <b>\n" 724a992afe8SEric Liu "#include <b>\n" 725a992afe8SEric Liu "#include <c>\n")); 7264c2c9c36SKrasimir Georgiev 7279d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 7284c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7294c2c9c36SKrasimir Georgiev "#include <b>\n" 7304c2c9c36SKrasimir Georgiev "#include <c>\n", 7314c2c9c36SKrasimir Georgiev sort("#include <a>\n" 7324c2c9c36SKrasimir Georgiev "#include <b>\n" 7334c2c9c36SKrasimir Georgiev "\n" 7344c2c9c36SKrasimir Georgiev "#include <b>\n" 7354c2c9c36SKrasimir Georgiev "\n" 7364c2c9c36SKrasimir Georgiev "#include <b>\n" 7374c2c9c36SKrasimir Georgiev "#include <c>\n")); 7384c2c9c36SKrasimir Georgiev 7399d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7404c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7414c2c9c36SKrasimir Georgiev "#include <b>\n" 7424c2c9c36SKrasimir Georgiev "#include <c>\n", 7434c2c9c36SKrasimir Georgiev sort("#include <a>\n" 7444c2c9c36SKrasimir Georgiev "#include <b>\n" 7454c2c9c36SKrasimir Georgiev "\n" 7464c2c9c36SKrasimir Georgiev "#include <b>\n" 7474c2c9c36SKrasimir Georgiev "\n" 7484c2c9c36SKrasimir Georgiev "#include <b>\n" 7494c2c9c36SKrasimir Georgiev "#include <c>\n")); 750a992afe8SEric Liu } 751a992afe8SEric Liu 752a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 753a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 754a992afe8SEric Liu "#include <b>\n" 755a992afe8SEric Liu "#include <c>\n", 756a992afe8SEric Liu sort("#include <b>\n" 757a992afe8SEric Liu "#include <a>\n" 758a992afe8SEric Liu "#include <b>\n" 759a992afe8SEric Liu "#include <b>\n" 760a992afe8SEric Liu "#include <c>\n" 761a992afe8SEric Liu "#include <b>\n")); 7624c2c9c36SKrasimir Georgiev 7639d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 7644c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7654c2c9c36SKrasimir Georgiev "#include <b>\n" 7664c2c9c36SKrasimir Georgiev "#include <c>\n", 7674c2c9c36SKrasimir Georgiev sort("#include <b>\n" 7684c2c9c36SKrasimir Georgiev "#include <a>\n" 7694c2c9c36SKrasimir Georgiev "\n" 7704c2c9c36SKrasimir Georgiev "#include <b>\n" 7714c2c9c36SKrasimir Georgiev "\n" 7724c2c9c36SKrasimir Georgiev "#include <c>\n" 7734c2c9c36SKrasimir Georgiev "#include <b>\n")); 7744c2c9c36SKrasimir Georgiev 7759d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 7764c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 7774c2c9c36SKrasimir Georgiev "#include <b>\n" 7784c2c9c36SKrasimir Georgiev "#include <c>\n", 7794c2c9c36SKrasimir Georgiev sort("#include <b>\n" 7804c2c9c36SKrasimir Georgiev "#include <a>\n" 7814c2c9c36SKrasimir Georgiev "\n" 7824c2c9c36SKrasimir Georgiev "#include <b>\n" 7834c2c9c36SKrasimir Georgiev "\n" 7844c2c9c36SKrasimir Georgiev "#include <c>\n" 7854c2c9c36SKrasimir Georgiev "#include <b>\n")); 786a992afe8SEric Liu } 787a992afe8SEric Liu 788a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 789a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 790a992afe8SEric Liu "#include <a>\n" // Start of line: 13 791a992afe8SEric Liu "#include <b>\n" // Start of line: 26 792a992afe8SEric Liu "#include <b>\n" // Start of line: 39 793a992afe8SEric Liu "#include <c>\n" // Start of line: 52 794a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 795a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 796a992afe8SEric Liu "#include <b>\n" // Start of line: 13 797a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 798a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 799a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 800a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 801a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 802a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 803a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 804a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 805a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 806a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 807a992afe8SEric Liu // Cursor on '#' in "#include <c>". 808a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 809a992afe8SEric Liu } 810a992afe8SEric Liu 811a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 812a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 813a992afe8SEric Liu "#include <b>\n" 814a992afe8SEric Liu "\n" 815a992afe8SEric Liu "#include <b>\n" 816a992afe8SEric Liu "#include <c>\n", 817a992afe8SEric Liu sort("#include <a>\n" 818a992afe8SEric Liu "#include <b>\n" 819a992afe8SEric Liu "\n" 820a992afe8SEric Liu "#include <c>\n" 821a992afe8SEric Liu "#include <b>\n" 822a992afe8SEric Liu "#include <b>\n")); 823a992afe8SEric Liu } 824a992afe8SEric Liu 825a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 826a992afe8SEric Liu std::string Code = "#include <a>\n" 827a992afe8SEric Liu "#include <b>\n" 828a992afe8SEric Liu "#include <a>\n" 829a992afe8SEric Liu "#include <a>\n" 830a992afe8SEric Liu "\n" 831a992afe8SEric Liu " int x ;"; 832a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 8339d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 834a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 835a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 836a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 837a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 838a992afe8SEric Liu } 839a992afe8SEric Liu 840a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 841a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 842a2e7d0deSKrasimir Georgiev "#include <b>\n" 843a2e7d0deSKrasimir Georgiev "#include <a>\n" 844a2e7d0deSKrasimir Georgiev "-->", 845a2e7d0deSKrasimir Georgiev sort("<!--;\n" 846a2e7d0deSKrasimir Georgiev "#include <b>\n" 847a2e7d0deSKrasimir Georgiev "#include <a>\n" 848ece7e95fSmydeveloperday "-->", 849ece7e95fSmydeveloperday "input.h", 0)); 850925bb20cSKrasimir Georgiev } 851925bb20cSKrasimir Georgiev 852925bb20cSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotOutputReplacementsForSortedBlocksWithRegrouping) { 853925bb20cSKrasimir Georgiev Style.IncludeBlocks = Style.IBS_Regroup; 854925bb20cSKrasimir Georgiev std::string Code = R"( 855925bb20cSKrasimir Georgiev #include "b.h" 856925bb20cSKrasimir Georgiev 857925bb20cSKrasimir Georgiev #include <a.h> 858925bb20cSKrasimir Georgiev )"; 859925bb20cSKrasimir Georgiev EXPECT_EQ(Code, sort(Code, "input.h", 0)); 860a2e7d0deSKrasimir Georgiev } 861a2e7d0deSKrasimir Georgiev 86260365021SPaul Hoad TEST_F(SortIncludesTest, 86360365021SPaul Hoad DoNotOutputReplacementsForSortedBlocksWithRegroupingWindows) { 86460365021SPaul Hoad Style.IncludeBlocks = Style.IBS_Regroup; 86560365021SPaul Hoad std::string Code = "#include \"b.h\"\r\n" 86660365021SPaul Hoad "\r\n" 86760365021SPaul Hoad "#include <a.h>\r\n"; 86860365021SPaul Hoad EXPECT_EQ(Code, sort(Code, "input.h", 0)); 86960365021SPaul Hoad } 87000e7ae9fSKrasimir Georgiev 87100e7ae9fSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotRegroupGroupsInGoogleObjCStyle) { 87200e7ae9fSKrasimir Georgiev FmtStyle = getGoogleStyle(FormatStyle::LK_ObjC); 87300e7ae9fSKrasimir Georgiev 87400e7ae9fSKrasimir Georgiev EXPECT_EQ("#include <a.h>\n" 87500e7ae9fSKrasimir Georgiev "#include <b.h>\n" 87600e7ae9fSKrasimir Georgiev "#include \"a.h\"", 87700e7ae9fSKrasimir Georgiev sort("#include <b.h>\n" 87800e7ae9fSKrasimir Georgiev "#include <a.h>\n" 87900e7ae9fSKrasimir Georgiev "#include \"a.h\"")); 88000e7ae9fSKrasimir Georgiev } 88100e7ae9fSKrasimir Georgiev 882*ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkMerge) { 883*ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Merge; 884*ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 885*ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 886*ee27c767SRafał Jelonek "\r\n" 887*ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 888*ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 889*ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 890*ee27c767SRafał Jelonek 891*ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"e.h\"\r\n" 892*ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 893*ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 894*ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 895*ee27c767SRafał Jelonek "#include \"d.h\"\r\n"; 896*ee27c767SRafał Jelonek 897*ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 1)); 898*ee27c767SRafał Jelonek } 899*ee27c767SRafał Jelonek 900*ee27c767SRafał Jelonek TEST_F(SortIncludesTest, skipUTF8ByteOrderMarkPreserve) { 901*ee27c767SRafał Jelonek Style.IncludeBlocks = Style.IBS_Preserve; 902*ee27c767SRafał Jelonek std::string Code = "\xEF\xBB\xBF#include \"d.h\"\r\n" 903*ee27c767SRafał Jelonek "#include \"b.h\"\r\n" 904*ee27c767SRafał Jelonek "\r\n" 905*ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 906*ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 907*ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 908*ee27c767SRafał Jelonek 909*ee27c767SRafał Jelonek std::string Expected = "\xEF\xBB\xBF#include \"b.h\"\r\n" 910*ee27c767SRafał Jelonek "#include \"d.h\"\r\n" 911*ee27c767SRafał Jelonek "\r\n" 912*ee27c767SRafał Jelonek "#include \"a.h\"\r\n" 913*ee27c767SRafał Jelonek "#include \"c.h\"\r\n" 914*ee27c767SRafał Jelonek "#include \"e.h\"\r\n"; 915*ee27c767SRafał Jelonek 916*ee27c767SRafał Jelonek EXPECT_EQ(Expected, sort(Code, "e.cpp", 2)); 917*ee27c767SRafał Jelonek } 918d89ae9d3SDaniel Jasper } // end namespace 919d89ae9d3SDaniel Jasper } // end namespace format 920d89ae9d3SDaniel Jasper } // end namespace clang 921