SortIncludesTest.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. //===- unittest/Format/SortIncludesTest.cpp - Include sort unit tests -----===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "FormatTestUtils.h"
  10. #include "clang/Format/Format.h"
  11. #include "llvm/Support/Debug.h"
  12. #include "gtest/gtest.h"
  13. #define DEBUG_TYPE "format-test"
  14. namespace clang {
  15. namespace format {
  16. namespace {
  17. class SortIncludesTest : public ::testing::Test {
  18. protected:
  19. std::string sort(llvm::StringRef Code, StringRef FileName = "input.cpp") {
  20. std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
  21. std::string Sorted =
  22. applyAllReplacements(Code, sortIncludes(Style, Code, Ranges, FileName));
  23. return applyAllReplacements(Sorted,
  24. reformat(Style, Sorted, Ranges, FileName));
  25. }
  26. FormatStyle Style = getLLVMStyle();
  27. };
  28. TEST_F(SortIncludesTest, BasicSorting) {
  29. EXPECT_EQ("#include \"a.h\"\n"
  30. "#include \"b.h\"\n"
  31. "#include \"c.h\"\n",
  32. sort("#include \"a.h\"\n"
  33. "#include \"c.h\"\n"
  34. "#include \"b.h\"\n"));
  35. }
  36. TEST_F(SortIncludesTest, SupportClangFormatOff) {
  37. EXPECT_EQ("#include <a>\n"
  38. "#include <b>\n"
  39. "#include <c>\n"
  40. "// clang-format off\n"
  41. "#include <b>\n"
  42. "#include <a>\n"
  43. "#include <c>\n"
  44. "// clang-format on\n",
  45. sort("#include <b>\n"
  46. "#include <a>\n"
  47. "#include <c>\n"
  48. "// clang-format off\n"
  49. "#include <b>\n"
  50. "#include <a>\n"
  51. "#include <c>\n"
  52. "// clang-format on\n"));
  53. }
  54. TEST_F(SortIncludesTest, IncludeSortingCanBeDisabled) {
  55. Style.SortIncludes = false;
  56. EXPECT_EQ("#include \"a.h\"\n"
  57. "#include \"c.h\"\n"
  58. "#include \"b.h\"\n",
  59. sort("#include \"a.h\"\n"
  60. "#include \"c.h\"\n"
  61. "#include \"b.h\"\n"));
  62. }
  63. TEST_F(SortIncludesTest, MixIncludeAndImport) {
  64. EXPECT_EQ("#include \"a.h\"\n"
  65. "#import \"b.h\"\n"
  66. "#include \"c.h\"\n",
  67. sort("#include \"a.h\"\n"
  68. "#include \"c.h\"\n"
  69. "#import \"b.h\"\n"));
  70. }
  71. TEST_F(SortIncludesTest, FixTrailingComments) {
  72. EXPECT_EQ("#include \"a.h\" // comment\n"
  73. "#include \"bb.h\" // comment\n"
  74. "#include \"ccc.h\"\n",
  75. sort("#include \"a.h\" // comment\n"
  76. "#include \"ccc.h\"\n"
  77. "#include \"bb.h\" // comment\n"));
  78. }
  79. TEST_F(SortIncludesTest, LeadingWhitespace) {
  80. EXPECT_EQ("#include \"a.h\"\n"
  81. "#include \"b.h\"\n"
  82. "#include \"c.h\"\n",
  83. sort(" #include \"a.h\"\n"
  84. " #include \"c.h\"\n"
  85. " #include \"b.h\"\n"));
  86. EXPECT_EQ("#include \"a.h\"\n"
  87. "#include \"b.h\"\n"
  88. "#include \"c.h\"\n",
  89. sort("# include \"a.h\"\n"
  90. "# include \"c.h\"\n"
  91. "# include \"b.h\"\n"));
  92. }
  93. TEST_F(SortIncludesTest, GreaterInComment) {
  94. EXPECT_EQ("#include \"a.h\"\n"
  95. "#include \"b.h\" // >\n"
  96. "#include \"c.h\"\n",
  97. sort("#include \"a.h\"\n"
  98. "#include \"c.h\"\n"
  99. "#include \"b.h\" // >\n"));
  100. }
  101. TEST_F(SortIncludesTest, SortsLocallyInEachBlock) {
  102. EXPECT_EQ("#include \"a.h\"\n"
  103. "#include \"c.h\"\n"
  104. "\n"
  105. "#include \"b.h\"\n",
  106. sort("#include \"a.h\"\n"
  107. "#include \"c.h\"\n"
  108. "\n"
  109. "#include \"b.h\"\n"));
  110. }
  111. TEST_F(SortIncludesTest, HandlesAngledIncludesAsSeparateBlocks) {
  112. EXPECT_EQ("#include \"a.h\"\n"
  113. "#include \"c.h\"\n"
  114. "#include <b.h>\n"
  115. "#include <d.h>\n",
  116. sort("#include <d.h>\n"
  117. "#include <b.h>\n"
  118. "#include \"c.h\"\n"
  119. "#include \"a.h\"\n"));
  120. Style = getGoogleStyle(FormatStyle::LK_Cpp);
  121. EXPECT_EQ("#include <b.h>\n"
  122. "#include <d.h>\n"
  123. "#include \"a.h\"\n"
  124. "#include \"c.h\"\n",
  125. sort("#include <d.h>\n"
  126. "#include <b.h>\n"
  127. "#include \"c.h\"\n"
  128. "#include \"a.h\"\n"));
  129. }
  130. TEST_F(SortIncludesTest, HandlesMultilineIncludes) {
  131. EXPECT_EQ("#include \"a.h\"\n"
  132. "#include \"b.h\"\n"
  133. "#include \"c.h\"\n",
  134. sort("#include \"a.h\"\n"
  135. "#include \\\n"
  136. "\"c.h\"\n"
  137. "#include \"b.h\"\n"));
  138. }
  139. TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
  140. EXPECT_EQ("#include \"llvm/a.h\"\n"
  141. "#include \"b.h\"\n"
  142. "#include \"c.h\"\n",
  143. sort("#include \"llvm/a.h\"\n"
  144. "#include \"c.h\"\n"
  145. "#include \"b.h\"\n"));
  146. EXPECT_EQ("#include \"llvm/a.h\"\n"
  147. "#include \"b.h\"\n"
  148. "#include \"c.h\"\n",
  149. sort("#include \"llvm/a.h\"\n"
  150. "#include \"c.h\"\n"
  151. "#include \"b.h\"\n",
  152. "input.mm"));
  153. // Don't do this in headers.
  154. EXPECT_EQ("#include \"b.h\"\n"
  155. "#include \"c.h\"\n"
  156. "#include \"llvm/a.h\"\n",
  157. sort("#include \"llvm/a.h\"\n"
  158. "#include \"c.h\"\n"
  159. "#include \"b.h\"\n",
  160. "some_header.h"));
  161. }
  162. } // end namespace
  163. } // end namespace format
  164. } // end namespace clang