1d89ae9d3SDaniel Jasper //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===// 2d89ae9d3SDaniel Jasper // 3d89ae9d3SDaniel Jasper // The LLVM Compiler Infrastructure 4d89ae9d3SDaniel Jasper // 5d89ae9d3SDaniel Jasper // This file is distributed under the University of Illinois Open Source 6d89ae9d3SDaniel Jasper // License. See LICENSE.TXT for details. 7d89ae9d3SDaniel Jasper // 8d89ae9d3SDaniel Jasper //===----------------------------------------------------------------------===// 9d89ae9d3SDaniel Jasper 10d89ae9d3SDaniel Jasper #include "FormatTestUtils.h" 11d89ae9d3SDaniel Jasper #include "clang/Format/Format.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, 28d6a00780SDaniel Jasper StringRef FileName = "input.cc") { 29a992afe8SEric Liu auto Replaces = sortIncludes(Style, Code, Ranges, FileName); 30a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 31a992afe8SEric Liu auto Sorted = applyAllReplacements(Code, Replaces); 324f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Sorted)); 334f8d9943SEric Liu auto Result = applyAllReplacements( 344f8d9943SEric Liu *Sorted, reformat(Style, *Sorted, Ranges, FileName)); 354f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 364f8d9943SEric Liu return *Result; 37d89ae9d3SDaniel Jasper } 3885c472dcSDaniel Jasper 39d6a00780SDaniel Jasper std::string sort(StringRef Code, StringRef FileName = "input.cpp") { 40d6a00780SDaniel Jasper return sort(Code, GetCodeRange(Code), FileName); 41d6a00780SDaniel Jasper } 42d6a00780SDaniel Jasper 43b68aabf7SDaniel Jasper unsigned newCursor(llvm::StringRef Code, unsigned Cursor) { 4494a96fceSDaniel Jasper sortIncludes(Style, Code, GetCodeRange(Code), "input.cpp", &Cursor); 45b68aabf7SDaniel Jasper return Cursor; 46b68aabf7SDaniel Jasper } 47b68aabf7SDaniel Jasper 4885c472dcSDaniel Jasper FormatStyle Style = getLLVMStyle(); 49b68aabf7SDaniel Jasper 50d89ae9d3SDaniel Jasper }; 51d89ae9d3SDaniel Jasper 52d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 53d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 54d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 55d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 56d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 57d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 59d6a00780SDaniel Jasper 60d6a00780SDaniel Jasper EXPECT_EQ("// comment\n" 61d6a00780SDaniel Jasper "#include <a>\n" 62d6a00780SDaniel Jasper "#include <b>\n", 63d6a00780SDaniel Jasper sort("// comment\n" 64d6a00780SDaniel Jasper "#include <b>\n" 65d6a00780SDaniel Jasper "#include <a>\n", 66d6a00780SDaniel Jasper {tooling::Range(25, 1)})); 67d89ae9d3SDaniel Jasper } 68d89ae9d3SDaniel Jasper 6994a96fceSDaniel Jasper TEST_F(SortIncludesTest, NoReplacementsForValidIncludes) { 7094a96fceSDaniel Jasper // Identical #includes have led to a failure with an unstable sort. 7194a96fceSDaniel Jasper std::string Code = "#include <a>\n" 7294a96fceSDaniel Jasper "#include <b>\n" 73a992afe8SEric Liu "#include <c>\n" 74a992afe8SEric Liu "#include <d>\n" 75a992afe8SEric Liu "#include <e>\n" 76a992afe8SEric Liu "#include <f>\n"; 7794a96fceSDaniel Jasper EXPECT_TRUE(sortIncludes(Style, Code, GetCodeRange(Code), "a.cc").empty()); 7894a96fceSDaniel Jasper } 7994a96fceSDaniel Jasper 80*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortedIncludesInMultipleBlocksAreMerged) { 81*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 82*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 83*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 84*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 85*4c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 86*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 87*4c2c9c36SKrasimir Georgiev "\n" 88*4c2c9c36SKrasimir Georgiev "\n" 89*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 90*4c2c9c36SKrasimir Georgiev 91*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 92*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 93*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 94*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 95*4c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 96*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 97*4c2c9c36SKrasimir Georgiev "\n" 98*4c2c9c36SKrasimir Georgiev "\n" 99*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 100*4c2c9c36SKrasimir Georgiev } 101*4c2c9c36SKrasimir Georgiev 1029b8c7c72SDaniel Jasper TEST_F(SortIncludesTest, SupportClangFormatOff) { 1039b8c7c72SDaniel Jasper EXPECT_EQ("#include <a>\n" 1049b8c7c72SDaniel Jasper "#include <b>\n" 1059b8c7c72SDaniel Jasper "#include <c>\n" 1069b8c7c72SDaniel Jasper "// clang-format off\n" 1079b8c7c72SDaniel Jasper "#include <b>\n" 1089b8c7c72SDaniel Jasper "#include <a>\n" 1099b8c7c72SDaniel Jasper "#include <c>\n" 1109b8c7c72SDaniel Jasper "// clang-format on\n", 1119b8c7c72SDaniel Jasper sort("#include <b>\n" 1129b8c7c72SDaniel Jasper "#include <a>\n" 1139b8c7c72SDaniel Jasper "#include <c>\n" 1149b8c7c72SDaniel Jasper "// clang-format off\n" 1159b8c7c72SDaniel Jasper "#include <b>\n" 1169b8c7c72SDaniel Jasper "#include <a>\n" 1179b8c7c72SDaniel Jasper "#include <c>\n" 1189b8c7c72SDaniel Jasper "// clang-format on\n")); 1199b8c7c72SDaniel Jasper } 1209b8c7c72SDaniel Jasper 121da446770SDaniel Jasper TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) { 122da446770SDaniel Jasper Style.SortIncludes = false; 123da446770SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 124da446770SDaniel Jasper "#include \"c.h\"\n" 125da446770SDaniel Jasper "#include \"b.h\"\n", 126da446770SDaniel Jasper sort("#include \"a.h\"\n" 127da446770SDaniel Jasper "#include \"c.h\"\n" 128da446770SDaniel Jasper "#include \"b.h\"\n")); 129da446770SDaniel Jasper } 130da446770SDaniel Jasper 131ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 132ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 133ff06370eSNico Weber "#import \"b.h\"\n" 134ff06370eSNico Weber "#include \"c.h\"\n", 135ff06370eSNico Weber sort("#include \"a.h\"\n" 136ff06370eSNico Weber "#include \"c.h\"\n" 137ff06370eSNico Weber "#import \"b.h\"\n")); 138ff06370eSNico Weber } 139ff06370eSNico Weber 140d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 141d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 142d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 143d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 144d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 145d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 146d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 147d89ae9d3SDaniel Jasper } 148d89ae9d3SDaniel Jasper 149d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 150d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 151d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 152d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 153d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 154d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 155d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 156d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 157d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 158d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 159d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 160d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 161d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 162d89ae9d3SDaniel Jasper } 163d89ae9d3SDaniel Jasper 164d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 165d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 166d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 167d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 168d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 169d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 170d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 171d89ae9d3SDaniel Jasper } 172d89ae9d3SDaniel Jasper 173d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 174d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 175d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 176d89ae9d3SDaniel Jasper "\n" 177d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 17885c472dcSDaniel Jasper sort("#include \"a.h\"\n" 17985c472dcSDaniel Jasper "#include \"c.h\"\n" 180d89ae9d3SDaniel Jasper "\n" 181d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 182d89ae9d3SDaniel Jasper } 183d89ae9d3SDaniel Jasper 184*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, SortsAllBlocksWhenMerging) { 185*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 186*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 187*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 188*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 189*4c2c9c36SKrasimir Georgiev sort("#include \"a.h\"\n" 190*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 191*4c2c9c36SKrasimir Georgiev "\n" 192*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 193*4c2c9c36SKrasimir Georgiev } 194*4c2c9c36SKrasimir Georgiev 195*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, CommentsAlwaysSeparateGroups) { 196*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 197*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 198*4c2c9c36SKrasimir Georgiev "// comment\n" 199*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 200*4c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 201*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 202*4c2c9c36SKrasimir Georgiev "// comment\n" 203*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 204*4c2c9c36SKrasimir Georgiev 205*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 206*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 207*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 208*4c2c9c36SKrasimir Georgiev "// comment\n" 209*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 210*4c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 211*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 212*4c2c9c36SKrasimir Georgiev "// comment\n" 213*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 214*4c2c9c36SKrasimir Georgiev 215*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 216*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 217*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 218*4c2c9c36SKrasimir Georgiev "// comment\n" 219*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 220*4c2c9c36SKrasimir Georgiev sort("#include \"c.h\"\n" 221*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 222*4c2c9c36SKrasimir Georgiev "// comment\n" 223*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n")); 224*4c2c9c36SKrasimir Georgiev } 225*4c2c9c36SKrasimir Georgiev 226d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 22785c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 22885c472dcSDaniel Jasper "#include \"c.h\"\n" 22985c472dcSDaniel Jasper "#include <b.h>\n" 23085c472dcSDaniel Jasper "#include <d.h>\n", 23185c472dcSDaniel Jasper sort("#include <d.h>\n" 23285c472dcSDaniel Jasper "#include <b.h>\n" 23385c472dcSDaniel Jasper "#include \"c.h\"\n" 23485c472dcSDaniel Jasper "#include \"a.h\"\n")); 23585c472dcSDaniel Jasper 23685c472dcSDaniel Jasper Style = getGoogleStyle(FormatStyle::LK_Cpp); 237d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 238d89ae9d3SDaniel Jasper "#include <d.h>\n" 239d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 240d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 241d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 242d89ae9d3SDaniel Jasper "#include <b.h>\n" 243d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 244d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 245d89ae9d3SDaniel Jasper } 246d89ae9d3SDaniel Jasper 247*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RegroupsAngledIncludesInSeparateBlocks) { 248*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 249*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 250*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 251*4c2c9c36SKrasimir Georgiev "\n" 252*4c2c9c36SKrasimir Georgiev "#include <b.h>\n" 253*4c2c9c36SKrasimir Georgiev "#include <d.h>\n", 254*4c2c9c36SKrasimir Georgiev sort("#include <d.h>\n" 255*4c2c9c36SKrasimir Georgiev "#include <b.h>\n" 256*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n" 257*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n")); 258*4c2c9c36SKrasimir Georgiev } 259*4c2c9c36SKrasimir Georgiev 260d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 261d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 262d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 263d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 264d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 265d89ae9d3SDaniel Jasper "#include \\\n" 266d89ae9d3SDaniel Jasper "\"c.h\"\n" 267d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 268d89ae9d3SDaniel Jasper } 269d89ae9d3SDaniel Jasper 27085c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 2719c8ff355SDaniel Jasper Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 27285c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 27385c472dcSDaniel Jasper "#include \"b.h\"\n" 27485c472dcSDaniel Jasper "#include \"c.h\"\n", 27585c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 27685c472dcSDaniel Jasper "#include \"c.h\"\n" 2770bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 2780bfdeb4bSDaniel Jasper "a.cc")); 279afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 280afa62faeSNico Weber "#include \"b.h\"\n" 281afa62faeSNico Weber "#include \"c.h\"\n", 282afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 283afa62faeSNico Weber "#include \"c.h\"\n" 284afa62faeSNico Weber "#include \"b.h\"\n", 2859c8ff355SDaniel Jasper "a_test.cc")); 2860bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"llvm/input.h\"\n" 2870bfdeb4bSDaniel Jasper "#include \"b.h\"\n" 2880bfdeb4bSDaniel Jasper "#include \"c.h\"\n", 2890bfdeb4bSDaniel Jasper sort("#include \"llvm/input.h\"\n" 2900bfdeb4bSDaniel Jasper "#include \"c.h\"\n" 2910bfdeb4bSDaniel Jasper "#include \"b.h\"\n", 292afa62faeSNico Weber "input.mm")); 29385c472dcSDaniel Jasper 2949c8ff355SDaniel Jasper // Don't allow prefixes. 2959c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 2969c8ff355SDaniel Jasper "#include \"c.h\"\n" 2979c8ff355SDaniel Jasper "#include \"llvm/not_a.h\"\n", 2989c8ff355SDaniel Jasper sort("#include \"llvm/not_a.h\"\n" 2999c8ff355SDaniel Jasper "#include \"c.h\"\n" 3009c8ff355SDaniel Jasper "#include \"b.h\"\n", 3019c8ff355SDaniel Jasper "a.cc")); 3029c8ff355SDaniel Jasper 3039c8ff355SDaniel Jasper // Don't do this for _main and other suffixes. 3049c8ff355SDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 3059c8ff355SDaniel Jasper "#include \"c.h\"\n" 3069c8ff355SDaniel Jasper "#include \"llvm/a.h\"\n", 3079c8ff355SDaniel Jasper sort("#include \"llvm/a.h\"\n" 3089c8ff355SDaniel Jasper "#include \"c.h\"\n" 3099c8ff355SDaniel Jasper "#include \"b.h\"\n", 3109c8ff355SDaniel Jasper "a_main.cc")); 3119c8ff355SDaniel Jasper 31285c472dcSDaniel Jasper // Don't do this in headers. 31385c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 31485c472dcSDaniel Jasper "#include \"c.h\"\n" 31585c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 31685c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 31785c472dcSDaniel Jasper "#include \"c.h\"\n" 31885c472dcSDaniel Jasper "#include \"b.h\"\n", 3190bfdeb4bSDaniel Jasper "a.h")); 32032d75fa2SDaniel Jasper 32132d75fa2SDaniel Jasper // Only do this in the first #include block. 32232d75fa2SDaniel Jasper EXPECT_EQ("#include <a>\n" 32332d75fa2SDaniel Jasper "\n" 32432d75fa2SDaniel Jasper "#include \"b.h\"\n" 32532d75fa2SDaniel Jasper "#include \"c.h\"\n" 32632d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n", 32732d75fa2SDaniel Jasper sort("#include <a>\n" 32832d75fa2SDaniel Jasper "\n" 32932d75fa2SDaniel Jasper "#include \"llvm/a.h\"\n" 33032d75fa2SDaniel Jasper "#include \"c.h\"\n" 33132d75fa2SDaniel Jasper "#include \"b.h\"\n", 33232d75fa2SDaniel Jasper "a.cc")); 333a252f5d5SDaniel Jasper 334a252f5d5SDaniel Jasper // Only recognize the first #include with a matching basename as main include. 335a252f5d5SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 336a252f5d5SDaniel Jasper "#include \"b.h\"\n" 337a252f5d5SDaniel Jasper "#include \"c.h\"\n" 338a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 339a252f5d5SDaniel Jasper sort("#include \"b.h\"\n" 340a252f5d5SDaniel Jasper "#include \"a.h\"\n" 341a252f5d5SDaniel Jasper "#include \"c.h\"\n" 342a252f5d5SDaniel Jasper "#include \"llvm/a.h\"\n", 343a252f5d5SDaniel Jasper "a.cc")); 34485c472dcSDaniel Jasper } 34585c472dcSDaniel Jasper 346*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, RecognizeMainHeaderInAllGroups) { 347*4c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 348*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 349*4c2c9c36SKrasimir Georgiev 350*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"c.h\"\n" 351*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 352*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n", 353*4c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 354*4c2c9c36SKrasimir Georgiev "\n" 355*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 356*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 357*4c2c9c36SKrasimir Georgiev "c.cc")); 358*4c2c9c36SKrasimir Georgiev } 359*4c2c9c36SKrasimir Georgiev 360*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, MainHeaderIsSeparatedWhenRegroupping) { 361*4c2c9c36SKrasimir Georgiev Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 362*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 363*4c2c9c36SKrasimir Georgiev 364*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"a.h\"\n" 365*4c2c9c36SKrasimir Georgiev "\n" 366*4c2c9c36SKrasimir Georgiev "#include \"b.h\"\n" 367*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 368*4c2c9c36SKrasimir Georgiev sort("#include \"b.h\"\n" 369*4c2c9c36SKrasimir Georgiev "\n" 370*4c2c9c36SKrasimir Georgiev "#include \"a.h\"\n" 371*4c2c9c36SKrasimir Georgiev "#include \"c.h\"\n", 372*4c2c9c36SKrasimir Georgiev "a.cc")); 373*4c2c9c36SKrasimir Georgiev } 374*4c2c9c36SKrasimir Georgiev 375d676ab13SChandler Carruth TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) { 376d676ab13SChandler Carruth // Setup an regex for main includes so we can cover those as well. 377d676ab13SChandler Carruth Style.IncludeIsMainRegex = "([-_](test|unittest))?$"; 378d676ab13SChandler Carruth 379d676ab13SChandler Carruth // Ensure both main header detection and grouping work in a case insensitive 380d676ab13SChandler Carruth // manner. 381d676ab13SChandler Carruth EXPECT_EQ("#include \"llvm/A.h\"\n" 382d676ab13SChandler Carruth "#include \"b.h\"\n" 383d676ab13SChandler Carruth "#include \"c.h\"\n" 384d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n" 385d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 386d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 387d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n", 388d676ab13SChandler Carruth sort("#include \"c.h\"\n" 389d676ab13SChandler Carruth "#include \"b.h\"\n" 390d676ab13SChandler Carruth "#include \"GTest/GTest.h\"\n" 391d676ab13SChandler Carruth "#include \"llvm/A.h\"\n" 392d676ab13SChandler Carruth "#include \"gmock/gmock.h\"\n" 393d676ab13SChandler Carruth "#include \"llvm/X.h\"\n" 394d676ab13SChandler Carruth "#include \"LLVM/z.h\"\n", 395d676ab13SChandler Carruth "a_TEST.cc")); 396d676ab13SChandler Carruth } 397d676ab13SChandler Carruth 398d2629dc8SDaniel Jasper TEST_F(SortIncludesTest, NegativePriorities) { 399d2629dc8SDaniel Jasper Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 400d2629dc8SDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4010bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4020bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4030bfdeb4bSDaniel Jasper sort("#include \"c_main.h\"\n" 4040bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n" 4050bfdeb4bSDaniel Jasper "#include \"important_os_header.h\"\n", 4060bfdeb4bSDaniel Jasper "c_main.cc")); 4070bfdeb4bSDaniel Jasper 4080bfdeb4bSDaniel Jasper // check stable when re-run 4090bfdeb4bSDaniel Jasper EXPECT_EQ("#include \"important_os_header.h\"\n" 4100bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4110bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4120bfdeb4bSDaniel Jasper sort("#include \"important_os_header.h\"\n" 4130bfdeb4bSDaniel Jasper "#include \"c_main.h\"\n" 4140bfdeb4bSDaniel Jasper "#include \"a_other.h\"\n", 4150bfdeb4bSDaniel Jasper "c_main.cc")); 416d2629dc8SDaniel Jasper } 417d2629dc8SDaniel Jasper 418*4c2c9c36SKrasimir Georgiev TEST_F(SortIncludesTest, PriorityGroupsAreSeparatedWhenRegroupping) { 419*4c2c9c36SKrasimir Georgiev Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}}; 420*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 421*4c2c9c36SKrasimir Georgiev 422*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 423*4c2c9c36SKrasimir Georgiev "\n" 424*4c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 425*4c2c9c36SKrasimir Georgiev "\n" 426*4c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 427*4c2c9c36SKrasimir Georgiev sort("#include \"c_main.h\"\n" 428*4c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n" 429*4c2c9c36SKrasimir Georgiev "#include \"important_os_header.h\"\n", 430*4c2c9c36SKrasimir Georgiev "c_main.cc")); 431*4c2c9c36SKrasimir Georgiev 432*4c2c9c36SKrasimir Georgiev // check stable when re-run 433*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include \"important_os_header.h\"\n" 434*4c2c9c36SKrasimir Georgiev "\n" 435*4c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 436*4c2c9c36SKrasimir Georgiev "\n" 437*4c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 438*4c2c9c36SKrasimir Georgiev sort("#include \"important_os_header.h\"\n" 439*4c2c9c36SKrasimir Georgiev "\n" 440*4c2c9c36SKrasimir Georgiev "#include \"c_main.h\"\n" 441*4c2c9c36SKrasimir Georgiev "\n" 442*4c2c9c36SKrasimir Georgiev "#include \"a_other.h\"\n", 443*4c2c9c36SKrasimir Georgiev "c_main.cc")); 444*4c2c9c36SKrasimir Georgiev } 445*4c2c9c36SKrasimir Georgiev 446b68aabf7SDaniel Jasper TEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) { 447b68aabf7SDaniel Jasper std::string Code = "#include <ccc>\n" // Start of line: 0 448b68aabf7SDaniel Jasper "#include <bbbbbb>\n" // Start of line: 15 449b68aabf7SDaniel Jasper "#include <a>\n"; // Start of line: 33 450b68aabf7SDaniel Jasper EXPECT_EQ(31u, newCursor(Code, 0)); 451b68aabf7SDaniel Jasper EXPECT_EQ(13u, newCursor(Code, 15)); 452b68aabf7SDaniel Jasper EXPECT_EQ(0u, newCursor(Code, 33)); 453b68aabf7SDaniel Jasper 454b68aabf7SDaniel Jasper EXPECT_EQ(41u, newCursor(Code, 10)); 455b68aabf7SDaniel Jasper EXPECT_EQ(23u, newCursor(Code, 25)); 456b68aabf7SDaniel Jasper EXPECT_EQ(10u, newCursor(Code, 43)); 457b68aabf7SDaniel Jasper } 458b68aabf7SDaniel Jasper 459a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateIncludes) { 460a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 461a992afe8SEric Liu "#include <b>\n" 462a992afe8SEric Liu "#include <c>\n", 463a992afe8SEric Liu sort("#include <a>\n" 464a992afe8SEric Liu "#include <b>\n" 465a992afe8SEric Liu "#include <b>\n" 466a992afe8SEric Liu "#include <b>\n" 467a992afe8SEric Liu "#include <b>\n" 468a992afe8SEric Liu "#include <c>\n")); 469*4c2c9c36SKrasimir Georgiev 470*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 471*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 472*4c2c9c36SKrasimir Georgiev "#include <b>\n" 473*4c2c9c36SKrasimir Georgiev "#include <c>\n", 474*4c2c9c36SKrasimir Georgiev sort("#include <a>\n" 475*4c2c9c36SKrasimir Georgiev "#include <b>\n" 476*4c2c9c36SKrasimir Georgiev "\n" 477*4c2c9c36SKrasimir Georgiev "#include <b>\n" 478*4c2c9c36SKrasimir Georgiev "\n" 479*4c2c9c36SKrasimir Georgiev "#include <b>\n" 480*4c2c9c36SKrasimir Georgiev "#include <c>\n")); 481*4c2c9c36SKrasimir Georgiev 482*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 483*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 484*4c2c9c36SKrasimir Georgiev "#include <b>\n" 485*4c2c9c36SKrasimir Georgiev "#include <c>\n", 486*4c2c9c36SKrasimir Georgiev sort("#include <a>\n" 487*4c2c9c36SKrasimir Georgiev "#include <b>\n" 488*4c2c9c36SKrasimir Georgiev "\n" 489*4c2c9c36SKrasimir Georgiev "#include <b>\n" 490*4c2c9c36SKrasimir Georgiev "\n" 491*4c2c9c36SKrasimir Georgiev "#include <b>\n" 492*4c2c9c36SKrasimir Georgiev "#include <c>\n")); 493a992afe8SEric Liu } 494a992afe8SEric Liu 495a992afe8SEric Liu TEST_F(SortIncludesTest, SortAndDeduplicateIncludes) { 496a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 497a992afe8SEric Liu "#include <b>\n" 498a992afe8SEric Liu "#include <c>\n", 499a992afe8SEric Liu sort("#include <b>\n" 500a992afe8SEric Liu "#include <a>\n" 501a992afe8SEric Liu "#include <b>\n" 502a992afe8SEric Liu "#include <b>\n" 503a992afe8SEric Liu "#include <c>\n" 504a992afe8SEric Liu "#include <b>\n")); 505*4c2c9c36SKrasimir Georgiev 506*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Merge; 507*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 508*4c2c9c36SKrasimir Georgiev "#include <b>\n" 509*4c2c9c36SKrasimir Georgiev "#include <c>\n", 510*4c2c9c36SKrasimir Georgiev sort("#include <b>\n" 511*4c2c9c36SKrasimir Georgiev "#include <a>\n" 512*4c2c9c36SKrasimir Georgiev "\n" 513*4c2c9c36SKrasimir Georgiev "#include <b>\n" 514*4c2c9c36SKrasimir Georgiev "\n" 515*4c2c9c36SKrasimir Georgiev "#include <c>\n" 516*4c2c9c36SKrasimir Georgiev "#include <b>\n")); 517*4c2c9c36SKrasimir Georgiev 518*4c2c9c36SKrasimir Georgiev Style.IncludeBlocks = FormatStyle::IBS_Regroup; 519*4c2c9c36SKrasimir Georgiev EXPECT_EQ("#include <a>\n" 520*4c2c9c36SKrasimir Georgiev "#include <b>\n" 521*4c2c9c36SKrasimir Georgiev "#include <c>\n", 522*4c2c9c36SKrasimir Georgiev sort("#include <b>\n" 523*4c2c9c36SKrasimir Georgiev "#include <a>\n" 524*4c2c9c36SKrasimir Georgiev "\n" 525*4c2c9c36SKrasimir Georgiev "#include <b>\n" 526*4c2c9c36SKrasimir Georgiev "\n" 527*4c2c9c36SKrasimir Georgiev "#include <c>\n" 528*4c2c9c36SKrasimir Georgiev "#include <b>\n")); 529a992afe8SEric Liu } 530a992afe8SEric Liu 531a992afe8SEric Liu TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionAfterDeduplicate) { 532a992afe8SEric Liu std::string Code = "#include <b>\n" // Start of line: 0 533a992afe8SEric Liu "#include <a>\n" // Start of line: 13 534a992afe8SEric Liu "#include <b>\n" // Start of line: 26 535a992afe8SEric Liu "#include <b>\n" // Start of line: 39 536a992afe8SEric Liu "#include <c>\n" // Start of line: 52 537a992afe8SEric Liu "#include <b>\n"; // Start of line: 65 538a992afe8SEric Liu std::string Expected = "#include <a>\n" // Start of line: 0 539a992afe8SEric Liu "#include <b>\n" // Start of line: 13 540a992afe8SEric Liu "#include <c>\n"; // Start of line: 26 541a992afe8SEric Liu EXPECT_EQ(Expected, sort(Code)); 542a992afe8SEric Liu // Cursor on 'i' in "#include <a>". 543a992afe8SEric Liu EXPECT_EQ(1u, newCursor(Code, 14)); 544a992afe8SEric Liu // Cursor on 'b' in "#include <b>". 545a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 10)); 546a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 547a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 49)); 548a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 36)); 549a992afe8SEric Liu EXPECT_EQ(23u, newCursor(Code, 75)); 550a992afe8SEric Liu // Cursor on '#' in "#include <c>". 551a992afe8SEric Liu EXPECT_EQ(26u, newCursor(Code, 52)); 552a992afe8SEric Liu } 553a992afe8SEric Liu 554a992afe8SEric Liu TEST_F(SortIncludesTest, DeduplicateLocallyInEachBlock) { 555a992afe8SEric Liu EXPECT_EQ("#include <a>\n" 556a992afe8SEric Liu "#include <b>\n" 557a992afe8SEric Liu "\n" 558a992afe8SEric Liu "#include <b>\n" 559a992afe8SEric Liu "#include <c>\n", 560a992afe8SEric Liu sort("#include <a>\n" 561a992afe8SEric Liu "#include <b>\n" 562a992afe8SEric Liu "\n" 563a992afe8SEric Liu "#include <c>\n" 564a992afe8SEric Liu "#include <b>\n" 565a992afe8SEric Liu "#include <b>\n")); 566a992afe8SEric Liu } 567a992afe8SEric Liu 568a992afe8SEric Liu TEST_F(SortIncludesTest, ValidAffactedRangesAfterDeduplicatingIncludes) { 569a992afe8SEric Liu std::string Code = "#include <a>\n" 570a992afe8SEric Liu "#include <b>\n" 571a992afe8SEric Liu "#include <a>\n" 572a992afe8SEric Liu "#include <a>\n" 573a992afe8SEric Liu "\n" 574a992afe8SEric Liu " int x ;"; 575a992afe8SEric Liu std::vector<tooling::Range> Ranges = {tooling::Range(0, 52)}; 576a992afe8SEric Liu auto Replaces = sortIncludes(Style, Code, Ranges, "input.cpp"); 577a992afe8SEric Liu Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges); 578a992afe8SEric Liu EXPECT_EQ(1u, Ranges.size()); 579a992afe8SEric Liu EXPECT_EQ(0u, Ranges[0].getOffset()); 580a992afe8SEric Liu EXPECT_EQ(26u, Ranges[0].getLength()); 581a992afe8SEric Liu } 582a992afe8SEric Liu 583a2e7d0deSKrasimir Georgiev TEST_F(SortIncludesTest, DoNotSortLikelyXml) { 584a2e7d0deSKrasimir Georgiev EXPECT_EQ("<!--;\n" 585a2e7d0deSKrasimir Georgiev "#include <b>\n" 586a2e7d0deSKrasimir Georgiev "#include <a>\n" 587a2e7d0deSKrasimir Georgiev "-->", 588a2e7d0deSKrasimir Georgiev sort("<!--;\n" 589a2e7d0deSKrasimir Georgiev "#include <b>\n" 590a2e7d0deSKrasimir Georgiev "#include <a>\n" 591a2e7d0deSKrasimir Georgiev "-->")); 592a2e7d0deSKrasimir Georgiev } 593a2e7d0deSKrasimir Georgiev 594d89ae9d3SDaniel Jasper } // end namespace 595d89ae9d3SDaniel Jasper } // end namespace format 596d89ae9d3SDaniel Jasper } // end namespace clang 597