UsingDeclarationsSorterTest.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //===- UsingDeclarationsSorterTest.cpp - Formatting 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 "clang/Format/Format.h"
  10. #include "llvm/Support/Debug.h"
  11. #include "gtest/gtest.h"
  12. #define DEBUG_TYPE "using-declarations-sorter-test"
  13. namespace clang {
  14. namespace format {
  15. namespace {
  16. class UsingDeclarationsSorterTest : public ::testing::Test {
  17. protected:
  18. std::string sortUsingDeclarations(llvm::StringRef Code,
  19. const std::vector<tooling::Range> &Ranges,
  20. const FormatStyle &Style = getLLVMStyle()) {
  21. DEBUG(llvm::errs() << "---\n");
  22. DEBUG(llvm::errs() << Code << "\n\n");
  23. tooling::Replacements Replaces =
  24. clang::format::sortUsingDeclarations(Style, Code, Ranges, "<stdin>");
  25. auto Result = applyAllReplacements(Code, Replaces);
  26. EXPECT_TRUE(static_cast<bool>(Result));
  27. DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  28. return *Result;
  29. }
  30. std::string sortUsingDeclarations(llvm::StringRef Code,
  31. const FormatStyle &Style = getLLVMStyle()) {
  32. return sortUsingDeclarations(Code,
  33. /*Ranges=*/{1, tooling::Range(0, Code.size())},
  34. Style);
  35. }
  36. };
  37. TEST_F(UsingDeclarationsSorterTest, SwapsTwoConsecutiveUsingDeclarations) {
  38. EXPECT_EQ("using a;\n"
  39. "using b;",
  40. sortUsingDeclarations("using a;\n"
  41. "using b;"));
  42. EXPECT_EQ("using a;\n"
  43. "using aa;",
  44. sortUsingDeclarations("using aa;\n"
  45. "using a;"));
  46. EXPECT_EQ("using ::a;\n"
  47. "using a;",
  48. sortUsingDeclarations("using a;\n"
  49. "using ::a;"));
  50. EXPECT_EQ("using a::bcd;\n"
  51. "using a::cd;",
  52. sortUsingDeclarations("using a::cd;\n"
  53. "using a::bcd;"));
  54. EXPECT_EQ("using a;\n"
  55. "using a::a;",
  56. sortUsingDeclarations("using a::a;\n"
  57. "using a;"));
  58. EXPECT_EQ("using a::ba::aa;\n"
  59. "using a::bb::ccc;",
  60. sortUsingDeclarations("using a::bb::ccc;\n"
  61. "using a::ba::aa;"));
  62. EXPECT_EQ("using a;\n"
  63. "using typename a;",
  64. sortUsingDeclarations("using typename a;\n"
  65. "using a;"));
  66. EXPECT_EQ("using typename z;\n"
  67. "using typenamea;",
  68. sortUsingDeclarations("using typenamea;\n"
  69. "using typename z;"));
  70. EXPECT_EQ("using a, b;\n"
  71. "using aa;",
  72. sortUsingDeclarations("using aa;\n"
  73. "using a, b;"));
  74. }
  75. TEST_F(UsingDeclarationsSorterTest, SortsMultipleTopLevelDeclarations) {
  76. EXPECT_EQ("using a;\n"
  77. "using b;\n"
  78. "using c;\n"
  79. "using d;\n"
  80. "using e;",
  81. sortUsingDeclarations("using d;\n"
  82. "using b;\n"
  83. "using e;\n"
  84. "using a;\n"
  85. "using c;"));
  86. EXPECT_EQ("#include <iostream>\n"
  87. "using ::std::endl;\n"
  88. "using std::cin;\n"
  89. "using std::cout;\n"
  90. "int main();",
  91. sortUsingDeclarations("#include <iostream>\n"
  92. "using std::cout;\n"
  93. "using std::cin;\n"
  94. "using ::std::endl;\n"
  95. "int main();"));
  96. }
  97. TEST_F(UsingDeclarationsSorterTest, BreaksOnEmptyLines) {
  98. EXPECT_EQ("using b;\n"
  99. "using c;\n"
  100. "\n"
  101. "using a;\n"
  102. "using d;",
  103. sortUsingDeclarations("using c;\n"
  104. "using b;\n"
  105. "\n"
  106. "using d;\n"
  107. "using a;"));
  108. }
  109. TEST_F(UsingDeclarationsSorterTest, BreaksOnUsingNamespace) {
  110. EXPECT_EQ("using b;\n"
  111. "using namespace std;\n"
  112. "using a;",
  113. sortUsingDeclarations("using b;\n"
  114. "using namespace std;\n"
  115. "using a;"));
  116. }
  117. TEST_F(UsingDeclarationsSorterTest, KeepsUsingDeclarationsInPPDirectives) {
  118. EXPECT_EQ("#define A \\\n"
  119. "using b;\\\n"
  120. "using a;",
  121. sortUsingDeclarations("#define A \\\n"
  122. "using b;\\\n"
  123. "using a;"));
  124. }
  125. TEST_F(UsingDeclarationsSorterTest, KeepsTypeAliases) {
  126. auto Code = "struct C { struct B { struct A; }; };\n"
  127. "using B = C::B;\n"
  128. "using A = B::A;";
  129. EXPECT_EQ(Code, sortUsingDeclarations(Code));
  130. }
  131. TEST_F(UsingDeclarationsSorterTest, MovesTrailingCommentsWithDeclarations) {
  132. EXPECT_EQ("using a; // line a1\n"
  133. "using b; /* line b1\n"
  134. " * line b2\n"
  135. " * line b3 */\n"
  136. "using c; // line c1\n"
  137. " // line c2",
  138. sortUsingDeclarations("using c; // line c1\n"
  139. " // line c2\n"
  140. "using b; /* line b1\n"
  141. " * line b2\n"
  142. " * line b3 */\n"
  143. "using a; // line a1"));
  144. }
  145. TEST_F(UsingDeclarationsSorterTest, SortsInStructScope) {
  146. EXPECT_EQ("struct pt3 : pt2 {\n"
  147. " using pt2::x;\n"
  148. " using pt2::y;\n"
  149. " float z;\n"
  150. "};",
  151. sortUsingDeclarations("struct pt3 : pt2 {\n"
  152. " using pt2::y;\n"
  153. " using pt2::x;\n"
  154. " float z;\n"
  155. "};"));
  156. }
  157. TEST_F(UsingDeclarationsSorterTest, KeepsOperators) {
  158. EXPECT_EQ("using a::operator();\n"
  159. "using a::operator-;\n"
  160. "using a::operator+;",
  161. sortUsingDeclarations("using a::operator();\n"
  162. "using a::operator-;\n"
  163. "using a::operator+;"));
  164. }
  165. TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsInsideNamespaces) {
  166. EXPECT_EQ("namespace A {\n"
  167. "struct B;\n"
  168. "struct C;\n"
  169. "}\n"
  170. "namespace X {\n"
  171. "using A::B;\n"
  172. "using A::C;\n"
  173. "}",
  174. sortUsingDeclarations("namespace A {\n"
  175. "struct B;\n"
  176. "struct C;\n"
  177. "}\n"
  178. "namespace X {\n"
  179. "using A::C;\n"
  180. "using A::B;\n"
  181. "}"));
  182. }
  183. TEST_F(UsingDeclarationsSorterTest, SupportsClangFormatOff) {
  184. EXPECT_EQ("// clang-format off\n"
  185. "using b;\n"
  186. "using a;\n"
  187. "// clang-format on\n"
  188. "using c;\n"
  189. "using d;",
  190. sortUsingDeclarations("// clang-format off\n"
  191. "using b;\n"
  192. "using a;\n"
  193. "// clang-format on\n"
  194. "using d;\n"
  195. "using c;"));
  196. }
  197. TEST_F(UsingDeclarationsSorterTest, SortsPartialRangeOfUsingDeclarations) {
  198. EXPECT_EQ("using b;\n"
  199. "using a;\n"
  200. "using c;",
  201. sortUsingDeclarations("using b;\n"
  202. "using c;\n" // starts at offset 10
  203. "using a;",
  204. {tooling::Range(10, 15)}));
  205. }
  206. } // end namespace
  207. } // end namespace format
  208. } // end namespace clang