187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===//
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// License. See LICENSE.TXT for details.
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "FormatTestUtils.h"
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Format/Format.h"
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Support/Debug.h"
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "gtest/gtest.h"
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define DEBUG_TYPE "format-test"
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace clang {
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace format {
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace {
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass SortIncludesTest : public ::testing::Test {
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarprotected:
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> GetCodeRange(StringRef Code) {
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string sort(StringRef Code, StringRef FileName = "input.cpp") {
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Ranges = GetCodeRange(Code);
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Sorted =
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName));
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Sorted));
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Result = applyAllReplacements(
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        *Sorted, reformat(Style, *Sorted, Ranges, FileName));
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Result));
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return *Result;
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned newCursor(llvm::StringRef Code, unsigned Cursor) {
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    sortIncludes(Style, Code, GetCodeRange(Code), "input.cpp", &Cursor);
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Cursor;
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  FormatStyle Style = getLLVMStyle();
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, BasicSorting) {
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n"));
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(SortIncludesTest, NoReplacementsForValidIncludes) {
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Identical #includes have led to a failure with an unstable sort.
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include <a>\n"
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <b>\n"
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <b>\n"
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <b>\n"
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <b>\n"
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <c>\n";
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(sortIncludes(Style, Code, GetCodeRange(Code), "a.cc").empty());
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, SupportClangFormatOff) {
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include <a>\n"
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <b>\n"
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <c>\n"
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "// clang-format off\n"
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <b>\n"
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <a>\n"
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <c>\n"
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "// clang-format on\n",
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include <b>\n"
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <a>\n"
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <c>\n"
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "// clang-format off\n"
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <b>\n"
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <a>\n"
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <c>\n"
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "// clang-format on\n"));
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Style.SortIncludes = false;
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n",
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n"));
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, MixIncludeAndImport) {
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#import \"b.h\"\n"
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#import \"b.h\"\n"));
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, FixTrailingComments) {
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"  // comment\n"
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"bb.h\" // comment\n"
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"ccc.h\"\n",
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\" // comment\n"
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"ccc.h\"\n"
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"bb.h\" // comment\n"));
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, LeadingWhitespace) {
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort(" #include \"a.h\"\n"
11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "  #include \"c.h\"\n"
12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "   #include \"b.h\"\n"));
12187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("# include \"a.h\"\n"
12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#  include \"c.h\"\n"
12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#   include \"b.h\"\n"));
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, GreaterInComment) {
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\" // >\n"
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
13387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
13487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
13587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\" // >\n"));
13687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
13787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "\n"
14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n",
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "\n"
14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n"));
14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
14887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
15087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
15187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
15287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <b.h>\n"
15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <d.h>\n",
15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include <d.h>\n"
15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <b.h>\n"
15687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"a.h\"\n"));
15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Style = getGoogleStyle(FormatStyle::LK_Cpp);
16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include <b.h>\n"
16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include <d.h>\n"
16287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"a.h\"\n"
16387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
16487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include <d.h>\n"
16587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include <b.h>\n"
16687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
16787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"a.h\"\n"));
16887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
16987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
17087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, HandlesMultilineIncludes) {
17187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
17487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"a.h\"\n"
17587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \\\n"
17687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "\"c.h\"\n"
17787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n"));
17887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
18087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"llvm/a.h\"\n"
18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"llvm/a.h\"\n"
18687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n",
18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "a.cc"));
18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"llvm/a.h\"\n"
19087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
19187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"llvm/a.h\"\n"
19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
19487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n",
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "a_test.cc"));
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"llvm/input.h\"\n"
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
19887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n",
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"llvm/input.h\"\n"
20087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n",
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "input.mm"));
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Don't allow prefixes.
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ("#include \"b.h\"\n"
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "#include \"c.h\"\n"
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "#include \"llvm/not_a.h\"\n",
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            sort("#include \"llvm/not_a.h\"\n"
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "#include \"c.h\"\n"
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "#include \"b.h\"\n",
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "a.cc"));
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Don't do this for _main and other suffixes.
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ("#include \"b.h\"\n"
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "#include \"c.h\"\n"
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "#include \"llvm/a.h\"\n",
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            sort("#include \"llvm/a.h\"\n"
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "#include \"c.h\"\n"
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "#include \"b.h\"\n",
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "a_main.cc"));
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Don't do this in headers.
22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"b.h\"\n"
22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"llvm/a.h\"\n",
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"llvm/a.h\"\n"
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
22887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n",
22987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "a.h"));
23087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Only do this in the first #include block.
23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include <a>\n"
23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "\n"
23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"llvm/a.h\"\n",
23787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include <a>\n"
23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "\n"
23987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"llvm/a.h\"\n"
24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
24187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"b.h\"\n",
24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "a.cc"));
24387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
24487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Only recognize the first #include with a matching basename as main include.
24587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"a.h\"\n"
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"b.h\"\n"
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c.h\"\n"
24887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"llvm/a.h\"\n",
24987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"b.h\"\n"
25087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"a.h\"\n"
25187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c.h\"\n"
25287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"llvm/a.h\"\n",
25387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "a.cc"));
25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, NegativePriorities) {
25787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}};
25887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"important_os_header.h\"\n"
25987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c_main.h\"\n"
26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"a_other.h\"\n",
26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"c_main.h\"\n"
26287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"a_other.h\"\n"
26387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"important_os_header.h\"\n",
26487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "c_main.cc"));
26587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
26687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // check stable when re-run
26787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("#include \"important_os_header.h\"\n"
26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"c_main.h\"\n"
26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "#include \"a_other.h\"\n",
27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            sort("#include \"important_os_header.h\"\n"
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"c_main.h\"\n"
27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "#include \"a_other.h\"\n",
27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 "c_main.cc"));
27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(SortIncludesTest, CalculatesCorrectCursorPosition) {
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::string Code = "#include <ccc>\n"    // Start of line: 0
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                     "#include <bbbbbb>\n" // Start of line: 15
27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                     "#include <a>\n";     // Start of line: 33
28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(31u, newCursor(Code, 0));
28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(13u, newCursor(Code, 15));
28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(0u, newCursor(Code, 33));
28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(41u, newCursor(Code, 10));
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(23u, newCursor(Code, 25));
28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(10u, newCursor(Code, 43));
28787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end namespace
29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end namespace format
29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end namespace clang
292