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: 2385c472dcSDaniel Jasper std::string sort(llvm::StringRef Code, StringRef FileName = "input.cpp") { 24d89ae9d3SDaniel Jasper std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 2585c472dcSDaniel Jasper std::string Sorted = 2685c472dcSDaniel Jasper applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName)); 2785c472dcSDaniel Jasper return applyAllReplacements(Sorted, 2885c472dcSDaniel Jasper reformat(Style, Sorted, Ranges, FileName)); 29d89ae9d3SDaniel Jasper } 3085c472dcSDaniel Jasper 3185c472dcSDaniel Jasper FormatStyle Style = getLLVMStyle(); 32d89ae9d3SDaniel Jasper }; 33d89ae9d3SDaniel Jasper 34d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, BasicSorting) { 35d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 36d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 37d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 38d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 39d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 40d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 41d89ae9d3SDaniel Jasper } 42d89ae9d3SDaniel Jasper 43*ff06370eSNico Weber TEST_F(SortIncludesTest, MixIncludeAndImport) { 44*ff06370eSNico Weber EXPECT_EQ("#include \"a.h\"\n" 45*ff06370eSNico Weber "#import \"b.h\"\n" 46*ff06370eSNico Weber "#include \"c.h\"\n", 47*ff06370eSNico Weber sort("#include \"a.h\"\n" 48*ff06370eSNico Weber "#include \"c.h\"\n" 49*ff06370eSNico Weber "#import \"b.h\"\n")); 50*ff06370eSNico Weber } 51*ff06370eSNico Weber 52d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, FixTrailingComments) { 53d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\" // comment\n" 54d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n" 55d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n", 56d89ae9d3SDaniel Jasper sort("#include \"a.h\" // comment\n" 57d89ae9d3SDaniel Jasper "#include \"ccc.h\"\n" 58d89ae9d3SDaniel Jasper "#include \"bb.h\" // comment\n")); 59d89ae9d3SDaniel Jasper } 60d89ae9d3SDaniel Jasper 61d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, LeadingWhitespace) { 62d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 63d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 64d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 65d89ae9d3SDaniel Jasper sort(" #include \"a.h\"\n" 66d89ae9d3SDaniel Jasper " #include \"c.h\"\n" 67d89ae9d3SDaniel Jasper " #include \"b.h\"\n")); 68d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 69d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 70d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 71d89ae9d3SDaniel Jasper sort("# include \"a.h\"\n" 72d89ae9d3SDaniel Jasper "# include \"c.h\"\n" 73d89ae9d3SDaniel Jasper "# include \"b.h\"\n")); 74d89ae9d3SDaniel Jasper } 75d89ae9d3SDaniel Jasper 76d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, GreaterInComment) { 77d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 78d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n" 79d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 80d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 81d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 82d89ae9d3SDaniel Jasper "#include \"b.h\" // >\n")); 83d89ae9d3SDaniel Jasper } 84d89ae9d3SDaniel Jasper 85d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, SortsLocallyInEachBlock) { 86d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 87d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 88d89ae9d3SDaniel Jasper "\n" 89d89ae9d3SDaniel Jasper "#include \"b.h\"\n", 9085c472dcSDaniel Jasper sort("#include \"a.h\"\n" 9185c472dcSDaniel Jasper "#include \"c.h\"\n" 92d89ae9d3SDaniel Jasper "\n" 93d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 94d89ae9d3SDaniel Jasper } 95d89ae9d3SDaniel Jasper 96d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) { 9785c472dcSDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 9885c472dcSDaniel Jasper "#include \"c.h\"\n" 9985c472dcSDaniel Jasper "#include <b.h>\n" 10085c472dcSDaniel Jasper "#include <d.h>\n", 10185c472dcSDaniel Jasper sort("#include <d.h>\n" 10285c472dcSDaniel Jasper "#include <b.h>\n" 10385c472dcSDaniel Jasper "#include \"c.h\"\n" 10485c472dcSDaniel Jasper "#include \"a.h\"\n")); 10585c472dcSDaniel Jasper 10685c472dcSDaniel Jasper Style = getGoogleStyle(FormatStyle::LK_Cpp); 107d89ae9d3SDaniel Jasper EXPECT_EQ("#include <b.h>\n" 108d89ae9d3SDaniel Jasper "#include <d.h>\n" 109d89ae9d3SDaniel Jasper "#include \"a.h\"\n" 110d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 111d89ae9d3SDaniel Jasper sort("#include <d.h>\n" 112d89ae9d3SDaniel Jasper "#include <b.h>\n" 113d89ae9d3SDaniel Jasper "#include \"c.h\"\n" 114d89ae9d3SDaniel Jasper "#include \"a.h\"\n")); 115d89ae9d3SDaniel Jasper } 116d89ae9d3SDaniel Jasper 117d89ae9d3SDaniel Jasper TEST_F(SortIncludesTest, HandlesMultilineIncludes) { 118d89ae9d3SDaniel Jasper EXPECT_EQ("#include \"a.h\"\n" 119d89ae9d3SDaniel Jasper "#include \"b.h\"\n" 120d89ae9d3SDaniel Jasper "#include \"c.h\"\n", 121d89ae9d3SDaniel Jasper sort("#include \"a.h\"\n" 122d89ae9d3SDaniel Jasper "#include \\\n" 123d89ae9d3SDaniel Jasper "\"c.h\"\n" 124d89ae9d3SDaniel Jasper "#include \"b.h\"\n")); 125d89ae9d3SDaniel Jasper } 126d89ae9d3SDaniel Jasper 12785c472dcSDaniel Jasper TEST_F(SortIncludesTest, LeavesMainHeaderFirst) { 12885c472dcSDaniel Jasper EXPECT_EQ("#include \"llvm/a.h\"\n" 12985c472dcSDaniel Jasper "#include \"b.h\"\n" 13085c472dcSDaniel Jasper "#include \"c.h\"\n", 13185c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 13285c472dcSDaniel Jasper "#include \"c.h\"\n" 13385c472dcSDaniel Jasper "#include \"b.h\"\n")); 134afa62faeSNico Weber EXPECT_EQ("#include \"llvm/a.h\"\n" 135afa62faeSNico Weber "#include \"b.h\"\n" 136afa62faeSNico Weber "#include \"c.h\"\n", 137afa62faeSNico Weber sort("#include \"llvm/a.h\"\n" 138afa62faeSNico Weber "#include \"c.h\"\n" 139afa62faeSNico Weber "#include \"b.h\"\n", 140afa62faeSNico Weber "input.mm")); 14185c472dcSDaniel Jasper 14285c472dcSDaniel Jasper // Don't do this in headers. 14385c472dcSDaniel Jasper EXPECT_EQ("#include \"b.h\"\n" 14485c472dcSDaniel Jasper "#include \"c.h\"\n" 14585c472dcSDaniel Jasper "#include \"llvm/a.h\"\n", 14685c472dcSDaniel Jasper sort("#include \"llvm/a.h\"\n" 14785c472dcSDaniel Jasper "#include \"c.h\"\n" 14885c472dcSDaniel Jasper "#include \"b.h\"\n", 14985c472dcSDaniel Jasper "some_header.h")); 15085c472dcSDaniel Jasper } 15185c472dcSDaniel Jasper 152d89ae9d3SDaniel Jasper } // end namespace 153d89ae9d3SDaniel Jasper } // end namespace format 154d89ae9d3SDaniel Jasper } // end namespace clang 155