1d89ae9d3SDaniel Jasper //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===// 2d89ae9d3SDaniel Jasper // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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" 11d89ae9d3SDaniel Jasper #include "llvm/Support/Debug.h" 12d89ae9d3SDaniel Jasper #include "gtest/gtest.h" 13d89ae9d3SDaniel Jasper 14d89ae9d3SDaniel Jasper #define DEBUG_TYPE "format-test" 15d89ae9d3SDaniel Jasper 16d89ae9d3SDaniel Jasper namespace clang { 17d89ae9d3SDaniel Jasper namespace format { 18d89ae9d3SDaniel Jasper namespace { 19d89ae9d3SDaniel Jasper 20d89ae9d3SDaniel Jasper class SortIncludesTest : public ::testing::Test { 21d89ae9d3SDaniel Jasper protected: 2294a96fceSDaniel Jasper std::vector<tooling::Range> GetCodeRange(StringRef Code) { 2394a96fceSDaniel Jasper return std::vector<tooling::Range>(1, tooling::Range(0, Code.size())); 2494a96fceSDaniel Jasper } 2594a96fceSDaniel Jasper 26d6a00780SDaniel Jasper std::string sort(StringRef Code, std::vector<tooling::Range> Ranges, 27d6a00780SDaniel Jasper StringRef FileName = "input.cc") { 289d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, FileName); 29a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 30a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 314f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 324f8d9943SEric Liu auto Result = applyAllReplacements( 339d92c027SEric Liu *Sorted, reformat(FmtStyle, *Sorted, Ranges, FileName)); 344f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 354f8d9943SEric Liu return *Result; 36d89ae9d3SDaniel Jasper } 3785c472dcSDaniel Jasper 38d6a00780SDaniel Jasper std::string sort(StringRef Code, StringRef FileName = "input.cpp") { 39d6a00780SDaniel Jasper return sort(Code, GetCodeRange(Code), FileName); 40d6a00780SDaniel Jasper } 41d6a00780SDaniel Jasper 42b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 439d92c027SEric Liu sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.cpp", &Cursor); 44b68aabf7SDaniel Jasper return Cursor; 45b68aabf7SDaniel Jasper } 46b68aabf7SDaniel Jasper 479d92c027SEric Liu FormatStyle FmtStyle = getLLVMStyle(); 489d92c027SEric Liu tooling::IncludeStyle &Style = FmtStyle.IncludeStyle; 49d89ae9d3SDaniel Jasper }; 50d89ae9d3SDaniel Jasper 51d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 52d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 53d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 54d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 55d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 56d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 57d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 58d6a00780SDaniel Jasper 59d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 60d6a00780SDaniel Jasper "#include <a>\n" 61d6a00780SDaniel Jasper "#include <b>\n", 62d6a00780SDaniel Jasper sort("// comment\n" 63d6a00780SDaniel Jasper "#include <b>\n" 64d6a00780SDaniel Jasper "#include <a>\n", 65d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 66d89ae9d3SDaniel Jasper } 67d89ae9d3SDaniel Jasper 6894a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 6994a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 7094a96fceSDaniel Jasper std::string Code = "#include <a>\n" 7194a96fceSDaniel Jasper "#include <b>\n" 72a992afe8SEric Liu "#include <c>\n" 73a992afe8SEric Liu "#include <d>\n" 74a992afe8SEric Liu "#include <e>\n" 75a992afe8SEric Liu "#include <f>\n"; 769d92c027SEric Liu EXPECT_TRUE(sortIncludes(FmtStyle, Code, GetCodeRange(Code), "a.cc").empty()); 7794a96fceSDaniel Jasper } 7894a96fceSDaniel Jasper 794c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 809d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 814c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 824c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 834c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 844c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 854c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 864c2c9c36SKrasimir Georgiev "\n" 874c2c9c36SKrasimir Georgiev "\n" 884c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 894c2c9c36SKrasimir Georgiev 909d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 914c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 924c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 934c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 944c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 954c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 964c2c9c36SKrasimir Georgiev "\n" 974c2c9c36SKrasimir Georgiev "\n" 984c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 994c2c9c36SKrasimir Georgiev } 1004c2c9c36SKrasimir Georgiev 1019b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1029b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1039b8c7c72SDaniel Jasper "#include <b>\n" 1049b8c7c72SDaniel Jasper "#include <c>\n" 1059b8c7c72SDaniel Jasper "// clang-format off\n" 1069b8c7c72SDaniel Jasper "#include <b>\n" 1079b8c7c72SDaniel Jasper "#include <a>\n" 1089b8c7c72SDaniel Jasper "#include <c>\n" 1099b8c7c72SDaniel Jasper "// clang-format on\n", 1109b8c7c72SDaniel Jasper sort("#include <b>\n" 1119b8c7c72SDaniel Jasper "#include <a>\n" 1129b8c7c72SDaniel Jasper "#include <c>\n" 1139b8c7c72SDaniel Jasper "// clang-format off\n" 1149b8c7c72SDaniel Jasper "#include <b>\n" 1159b8c7c72SDaniel Jasper "#include <a>\n" 1169b8c7c72SDaniel Jasper "#include <c>\n" 1179b8c7c72SDaniel Jasper "// clang-format on\n")); 1189b8c7c72SDaniel Jasper } 1199b8c7c72SDaniel Jasper 120da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 1219d92c027SEric Liu FmtStyle.SortIncludes = false; 122da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 123da446770SDaniel Jasper "#include \"c.h\"\n" 124da446770SDaniel Jasper "#include \"b.h\"\n", 125da446770SDaniel Jasper sort("#include \"a.h\"\n" 126da446770SDaniel Jasper "#include \"c.h\"\n" 127da446770SDaniel Jasper "#include \"b.h\"\n")); 128da446770SDaniel Jasper } 129da446770SDaniel Jasper 130ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 131ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 132ff06370eSNico Weber "#import \"b.h\"\n" 133ff06370eSNico Weber "#include \"c.h\"\n", 134ff06370eSNico Weber sort("#include \"a.h\"\n" 135ff06370eSNico Weber "#include \"c.h\"\n" 136ff06370eSNico Weber "#import \"b.h\"\n")); 137ff06370eSNico Weber } 138ff06370eSNico Weber 139d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 140d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 141d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 142d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 143d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 144d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 145d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 146d89ae9d3SDaniel Jasper } 147d89ae9d3SDaniel Jasper 148d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 149d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 150d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 151d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 152d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 153d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 154d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 155d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 156d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 157d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 158d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 159d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 160d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 161d89ae9d3SDaniel Jasper } 162d89ae9d3SDaniel Jasper 163d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 164d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 165d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 166d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 167d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 168d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 169d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 170d89ae9d3SDaniel Jasper } 171d89ae9d3SDaniel Jasper 172d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 173d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 174d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 175d89ae9d3SDaniel Jasper "\n" 176d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 17785c472dcSDaniel Jasper sort("#include \"a.h\"\n" 17885c472dcSDaniel Jasper "#include \"c.h\"\n" 179d89ae9d3SDaniel Jasper "\n" 180d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 181d89ae9d3SDaniel Jasper } 182d89ae9d3SDaniel Jasper 1834c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 1849d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 1854c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1864c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 1874c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 1884c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 1894c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1904c2c9c36SKrasimir Georgiev "\n" 1914c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 1924c2c9c36SKrasimir Georgiev } 1934c2c9c36SKrasimir Georgiev 1944c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 1954c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 1964c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 1974c2c9c36SKrasimir Georgiev "// comment\n" 1984c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 1994c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2004c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2014c2c9c36SKrasimir Georgiev "// comment\n" 2024c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2034c2c9c36SKrasimir Georgiev 2049d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 2054c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2064c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2074c2c9c36SKrasimir Georgiev "// comment\n" 2084c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2094c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2104c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2114c2c9c36SKrasimir Georgiev "// comment\n" 2124c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2134c2c9c36SKrasimir Georgiev 2149d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 2154c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2164c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2174c2c9c36SKrasimir Georgiev "// comment\n" 2184c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 2194c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 2204c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 2214c2c9c36SKrasimir Georgiev "// comment\n" 2224c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 2234c2c9c36SKrasimir Georgiev } 2244c2c9c36SKrasimir Georgiev 225d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 22685c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 22785c472dcSDaniel Jasper "#include \"c.h\"\n" 22885c472dcSDaniel Jasper "#include <b.h>\n" 22985c472dcSDaniel Jasper "#include <d.h>\n", 23085c472dcSDaniel Jasper sort("#include <d.h>\n" 23185c472dcSDaniel Jasper "#include <b.h>\n" 23285c472dcSDaniel Jasper "#include \"c.h\"\n" 23385c472dcSDaniel Jasper "#include \"a.h\"\n")); 23485c472dcSDaniel Jasper 2359d92c027SEric Liu FmtStyle = getGoogleStyle(FormatStyle::LK_Cpp); 236d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 237d89ae9d3SDaniel Jasper "#include <d.h>\n" 238d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 239d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 240d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 241d89ae9d3SDaniel Jasper "#include <b.h>\n" 242d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 243d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 244d89ae9d3SDaniel Jasper } 245d89ae9d3SDaniel Jasper 2464c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 2479d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 2484c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 2494c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2504c2c9c36SKrasimir Georgiev "\n" 2514c2c9c36SKrasimir Georgiev "#include <b.h>\n" 2524c2c9c36SKrasimir Georgiev "#include <d.h>\n", 2534c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 2544c2c9c36SKrasimir Georgiev "#include <b.h>\n" 2554c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 2564c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 2574c2c9c36SKrasimir Georgiev } 2584c2c9c36SKrasimir Georgiev 259d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 260d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 261d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 262d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 263d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 264d89ae9d3SDaniel Jasper "#include \\\n" 265d89ae9d3SDaniel Jasper "\"c.h\"\n" 266d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 267d89ae9d3SDaniel Jasper } 268d89ae9d3SDaniel Jasper 26985c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 2709c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 27185c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 27285c472dcSDaniel Jasper "#include \"b.h\"\n" 27385c472dcSDaniel Jasper "#include \"c.h\"\n", 27485c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 27585c472dcSDaniel Jasper "#include \"c.h\"\n" 2760bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 2770bfdeb4bSDaniel Jasper "a.cc")); 278afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 279afa62faeSNico Weber "#include \"b.h\"\n" 280afa62faeSNico Weber "#include \"c.h\"\n", 281afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 282afa62faeSNico Weber "#include \"c.h\"\n" 283afa62faeSNico Weber "#include \"b.h\"\n", 2849c8ff355SDaniel Jasper "a_test.cc")); 2850bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 2860bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 2870bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 2880bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 2890bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 2900bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 291afa62faeSNico Weber "input.mm")); 29285c472dcSDaniel Jasper 2939c8ff355SDaniel Jasper // Don't allow prefixes. 2949c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 2959c8ff355SDaniel Jasper "#include \"c.h\"\n" 2969c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 2979c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 2989c8ff355SDaniel Jasper "#include \"c.h\"\n" 2999c8ff355SDaniel Jasper "#include \"b.h\"\n", 3009c8ff355SDaniel Jasper "a.cc")); 3019c8ff355SDaniel Jasper 3029c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 3039c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3049c8ff355SDaniel Jasper "#include \"c.h\"\n" 3059c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 3069c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 3079c8ff355SDaniel Jasper "#include \"c.h\"\n" 3089c8ff355SDaniel Jasper "#include \"b.h\"\n", 3099c8ff355SDaniel Jasper "a_main.cc")); 3109c8ff355SDaniel Jasper 31185c472dcSDaniel Jasper // Don't do this in headers. 31285c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 31385c472dcSDaniel Jasper "#include \"c.h\"\n" 31485c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 31585c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 31685c472dcSDaniel Jasper "#include \"c.h\"\n" 31785c472dcSDaniel Jasper "#include \"b.h\"\n", 3180bfdeb4bSDaniel Jasper "a.h")); 31932d75fa2SDaniel Jasper 32032d75fa2SDaniel Jasper // Only do this in the first #include block. 32132d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 32232d75fa2SDaniel Jasper "\n" 32332d75fa2SDaniel Jasper "#include \"b.h\"\n" 32432d75fa2SDaniel Jasper "#include \"c.h\"\n" 32532d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 32632d75fa2SDaniel Jasper sort("#include <a>\n" 32732d75fa2SDaniel Jasper "\n" 32832d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 32932d75fa2SDaniel Jasper "#include \"c.h\"\n" 33032d75fa2SDaniel Jasper "#include \"b.h\"\n", 33132d75fa2SDaniel Jasper "a.cc")); 332a252f5d5SDaniel Jasper 333a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 334a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 335a252f5d5SDaniel Jasper "#include \"b.h\"\n" 336a252f5d5SDaniel Jasper "#include \"c.h\"\n" 337a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 338a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 339a252f5d5SDaniel Jasper "#include \"a.h\"\n" 340a252f5d5SDaniel Jasper "#include \"c.h\"\n" 341a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 342a252f5d5SDaniel Jasper "a.cc")); 34385c472dcSDaniel Jasper } 34485c472dcSDaniel Jasper 3454c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 3464c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 3479d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 3484c2c9c36SKrasimir Georgiev 3494c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 3504c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3514c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 3524c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 3534c2c9c36SKrasimir Georgiev "\n" 3544c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3554c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3564c2c9c36SKrasimir Georgiev "c.cc")); 3574c2c9c36SKrasimir Georgiev } 3584c2c9c36SKrasimir Georgiev 3594c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 3604c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 3619d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 3624c2c9c36SKrasimir Georgiev 3634c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 3644c2c9c36SKrasimir Georgiev "\n" 3654c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 3664c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3674c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 3684c2c9c36SKrasimir Georgiev "\n" 3694c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 3704c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 3714c2c9c36SKrasimir Georgiev "a.cc")); 3724c2c9c36SKrasimir Georgiev } 3734c2c9c36SKrasimir Georgiev 374d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 375d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 376d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 377d676ab13SChandler Carruth 378d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 379d676ab13SChandler Carruth // manner. 380d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 381d676ab13SChandler Carruth "#include \"b.h\"\n" 382d676ab13SChandler Carruth "#include \"c.h\"\n" 383d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 384d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 385d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 386d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 387d676ab13SChandler Carruth sort("#include \"c.h\"\n" 388d676ab13SChandler Carruth "#include \"b.h\"\n" 389d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 390d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 391d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 392d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 393d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 394d676ab13SChandler Carruth "a_TEST.cc")); 395d676ab13SChandler Carruth } 396d676ab13SChandler Carruth 397d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 398d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 399d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4000bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4010bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4020bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 4030bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 4040bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 4050bfdeb4bSDaniel Jasper "c_main.cc")); 4060bfdeb4bSDaniel Jasper 4070bfdeb4bSDaniel Jasper // check stable when re-run 4080bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4090bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4100bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4110bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 4120bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4130bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4140bfdeb4bSDaniel Jasper "c_main.cc")); 415d2629dc8SDaniel Jasper } 416d2629dc8SDaniel Jasper 4174c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 4184c2c9c36SKrasimir Georgiev Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 4199d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4204c2c9c36SKrasimir Georgiev 4214c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4224c2c9c36SKrasimir Georgiev "\n" 4234c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4244c2c9c36SKrasimir Georgiev "\n" 4254c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4264c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 4274c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 4284c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 4294c2c9c36SKrasimir Georgiev "c_main.cc")); 4304c2c9c36SKrasimir Georgiev 4314c2c9c36SKrasimir Georgiev // check stable when re-run 4324c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 4334c2c9c36SKrasimir Georgiev "\n" 4344c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4354c2c9c36SKrasimir Georgiev "\n" 4364c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4374c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 4384c2c9c36SKrasimir Georgiev "\n" 4394c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 4404c2c9c36SKrasimir Georgiev "\n" 4414c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 4424c2c9c36SKrasimir Georgiev "c_main.cc")); 4434c2c9c36SKrasimir Georgiev } 4444c2c9c36SKrasimir Georgiev 445b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 446b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 447b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 448b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 449b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 450b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 451b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 452b68aabf7SDaniel Jasper 453b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 454b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 455b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 456b68aabf7SDaniel Jasper } 457b68aabf7SDaniel Jasper 458a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 459a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 460a992afe8SEric Liu "#include <b>\n" 461a992afe8SEric Liu "#include <c>\n", 462a992afe8SEric Liu sort("#include <a>\n" 463a992afe8SEric Liu "#include <b>\n" 464a992afe8SEric Liu "#include <b>\n" 465a992afe8SEric Liu "#include <b>\n" 466a992afe8SEric Liu "#include <b>\n" 467a992afe8SEric Liu "#include <c>\n")); 4684c2c9c36SKrasimir Georgiev 4699d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 4704c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 4714c2c9c36SKrasimir Georgiev "#include <b>\n" 4724c2c9c36SKrasimir Georgiev "#include <c>\n", 4734c2c9c36SKrasimir Georgiev sort("#include <a>\n" 4744c2c9c36SKrasimir Georgiev "#include <b>\n" 4754c2c9c36SKrasimir Georgiev "\n" 4764c2c9c36SKrasimir Georgiev "#include <b>\n" 4774c2c9c36SKrasimir Georgiev "\n" 4784c2c9c36SKrasimir Georgiev "#include <b>\n" 4794c2c9c36SKrasimir Georgiev "#include <c>\n")); 4804c2c9c36SKrasimir Georgiev 4819d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 4824c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 4834c2c9c36SKrasimir Georgiev "#include <b>\n" 4844c2c9c36SKrasimir Georgiev "#include <c>\n", 4854c2c9c36SKrasimir Georgiev sort("#include <a>\n" 4864c2c9c36SKrasimir Georgiev "#include <b>\n" 4874c2c9c36SKrasimir Georgiev "\n" 4884c2c9c36SKrasimir Georgiev "#include <b>\n" 4894c2c9c36SKrasimir Georgiev "\n" 4904c2c9c36SKrasimir Georgiev "#include <b>\n" 4914c2c9c36SKrasimir Georgiev "#include <c>\n")); 492a992afe8SEric Liu } 493a992afe8SEric Liu 494a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 495a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 496a992afe8SEric Liu "#include <b>\n" 497a992afe8SEric Liu "#include <c>\n", 498a992afe8SEric Liu sort("#include <b>\n" 499a992afe8SEric Liu "#include <a>\n" 500a992afe8SEric Liu "#include <b>\n" 501a992afe8SEric Liu "#include <b>\n" 502a992afe8SEric Liu "#include <c>\n" 503a992afe8SEric Liu "#include <b>\n")); 5044c2c9c36SKrasimir Georgiev 5059d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Merge; 5064c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5074c2c9c36SKrasimir Georgiev "#include <b>\n" 5084c2c9c36SKrasimir Georgiev "#include <c>\n", 5094c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5104c2c9c36SKrasimir Georgiev "#include <a>\n" 5114c2c9c36SKrasimir Georgiev "\n" 5124c2c9c36SKrasimir Georgiev "#include <b>\n" 5134c2c9c36SKrasimir Georgiev "\n" 5144c2c9c36SKrasimir Georgiev "#include <c>\n" 5154c2c9c36SKrasimir Georgiev "#include <b>\n")); 5164c2c9c36SKrasimir Georgiev 5179d92c027SEric Liu Style.IncludeBlocks = tooling::IncludeStyle::IBS_Regroup; 5184c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 5194c2c9c36SKrasimir Georgiev "#include <b>\n" 5204c2c9c36SKrasimir Georgiev "#include <c>\n", 5214c2c9c36SKrasimir Georgiev sort("#include <b>\n" 5224c2c9c36SKrasimir Georgiev "#include <a>\n" 5234c2c9c36SKrasimir Georgiev "\n" 5244c2c9c36SKrasimir Georgiev "#include <b>\n" 5254c2c9c36SKrasimir Georgiev "\n" 5264c2c9c36SKrasimir Georgiev "#include <c>\n" 5274c2c9c36SKrasimir Georgiev "#include <b>\n")); 528a992afe8SEric Liu } 529a992afe8SEric Liu 530a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 531a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 532a992afe8SEric Liu "#include <a>\n" // Start of line: 13 533a992afe8SEric Liu "#include <b>\n" // Start of line: 26 534a992afe8SEric Liu "#include <b>\n" // Start of line: 39 535a992afe8SEric Liu "#include <c>\n" // Start of line: 52 536a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 537a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 538a992afe8SEric Liu "#include <b>\n" // Start of line: 13 539a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 540a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 541a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 542a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 543a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 544a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 545a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 546a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 547a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 548a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 549a992afe8SEric Liu // Cursor on '#' in "#include <c>". 550a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 551a992afe8SEric Liu } 552a992afe8SEric Liu 553a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 554a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 555a992afe8SEric Liu "#include <b>\n" 556a992afe8SEric Liu "\n" 557a992afe8SEric Liu "#include <b>\n" 558a992afe8SEric Liu "#include <c>\n", 559a992afe8SEric Liu sort("#include <a>\n" 560a992afe8SEric Liu "#include <b>\n" 561a992afe8SEric Liu "\n" 562a992afe8SEric Liu "#include <c>\n" 563a992afe8SEric Liu "#include <b>\n" 564a992afe8SEric Liu "#include <b>\n")); 565a992afe8SEric Liu } 566a992afe8SEric Liu 567a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 568a992afe8SEric Liu std::string Code = "#include <a>\n" 569a992afe8SEric Liu "#include <b>\n" 570a992afe8SEric Liu "#include <a>\n" 571a992afe8SEric Liu "#include <a>\n" 572a992afe8SEric Liu "\n" 573a992afe8SEric Liu " int x ;"; 574a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 5759d92c027SEric Liu auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.cpp"); 576a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 577a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 578a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 579a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 580a992afe8SEric Liu } 581a992afe8SEric Liu 582a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 583a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 584a2e7d0deSKrasimir Georgiev "#include <b>\n" 585a2e7d0deSKrasimir Georgiev "#include <a>\n" 586a2e7d0deSKrasimir Georgiev "-->", 587a2e7d0deSKrasimir Georgiev sort("<!--;\n" 588a2e7d0deSKrasimir Georgiev "#include <b>\n" 589a2e7d0deSKrasimir Georgiev "#include <a>\n" 590a2e7d0deSKrasimir Georgiev "-->")); 591a2e7d0deSKrasimir Georgiev } 592a2e7d0deSKrasimir Georgiev 593d89ae9d3SDaniel Jasper } // end namespace 594d89ae9d3SDaniel Jasper } // end namespace format 595d89ae9d3SDaniel Jasper } // end namespace clang 596