UsingDeclarationsSorterTest.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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, SortsCaseSensitively) {
  76. EXPECT_EQ("using A;\n"
  77. "using a;",
  78. sortUsingDeclarations("using A;\n"
  79. "using a;"));
  80. EXPECT_EQ("using A;\n"
  81. "using a;",
  82. sortUsingDeclarations("using a;\n"
  83. "using A;"));
  84. EXPECT_EQ("using B;\n"
  85. "using a;",
  86. sortUsingDeclarations("using B;\n"
  87. "using a;"));
  88. // Sorts '_' right before 'A'.
  89. EXPECT_EQ("using _;\n"
  90. "using A;",
  91. sortUsingDeclarations("using A;\n"
  92. "using _;"));
  93. EXPECT_EQ("using _;\n"
  94. "using a;",
  95. sortUsingDeclarations("using a;\n"
  96. "using _;"));
  97. EXPECT_EQ("using a::_;\n"
  98. "using a::a;",
  99. sortUsingDeclarations("using a::a;\n"
  100. "using a::_;"));
  101. EXPECT_EQ("using ::testing::_;\n"
  102. "using ::testing::Aardvark;\n"
  103. "using ::testing::Xylophone;\n"
  104. "using ::testing::apple::Honeycrisp;\n"
  105. "using ::testing::zebra::Stripes;",
  106. sortUsingDeclarations("using ::testing::Aardvark;\n"
  107. "using ::testing::Xylophone;\n"
  108. "using ::testing::_;\n"
  109. "using ::testing::apple::Honeycrisp;\n"
  110. "using ::testing::zebra::Stripes;"));
  111. }
  112. TEST_F(UsingDeclarationsSorterTest, SortsMultipleTopLevelDeclarations) {
  113. EXPECT_EQ("using a;\n"
  114. "using b;\n"
  115. "using c;\n"
  116. "using d;\n"
  117. "using e;",
  118. sortUsingDeclarations("using d;\n"
  119. "using b;\n"
  120. "using e;\n"
  121. "using a;\n"
  122. "using c;"));
  123. EXPECT_EQ("#include <iostream>\n"
  124. "using ::std::endl;\n"
  125. "using std::cin;\n"
  126. "using std::cout;\n"
  127. "int main();",
  128. sortUsingDeclarations("#include <iostream>\n"
  129. "using std::cout;\n"
  130. "using std::cin;\n"
  131. "using ::std::endl;\n"
  132. "int main();"));
  133. }
  134. TEST_F(UsingDeclarationsSorterTest, BreaksOnEmptyLines) {
  135. EXPECT_EQ("using b;\n"
  136. "using c;\n"
  137. "\n"
  138. "using a;\n"
  139. "using d;",
  140. sortUsingDeclarations("using c;\n"
  141. "using b;\n"
  142. "\n"
  143. "using d;\n"
  144. "using a;"));
  145. }
  146. TEST_F(UsingDeclarationsSorterTest, BreaksOnUsingNamespace) {
  147. EXPECT_EQ("using b;\n"
  148. "using namespace std;\n"
  149. "using a;",
  150. sortUsingDeclarations("using b;\n"
  151. "using namespace std;\n"
  152. "using a;"));
  153. }
  154. TEST_F(UsingDeclarationsSorterTest, KeepsUsingDeclarationsInPPDirectives) {
  155. EXPECT_EQ("#define A \\\n"
  156. "using b;\\\n"
  157. "using a;",
  158. sortUsingDeclarations("#define A \\\n"
  159. "using b;\\\n"
  160. "using a;"));
  161. }
  162. TEST_F(UsingDeclarationsSorterTest, KeepsTypeAliases) {
  163. auto Code = "struct C { struct B { struct A; }; };\n"
  164. "using B = C::B;\n"
  165. "using A = B::A;";
  166. EXPECT_EQ(Code, sortUsingDeclarations(Code));
  167. }
  168. TEST_F(UsingDeclarationsSorterTest, MovesTrailingCommentsWithDeclarations) {
  169. EXPECT_EQ("using a; // line a1\n"
  170. "using b; /* line b1\n"
  171. " * line b2\n"
  172. " * line b3 */\n"
  173. "using c; // line c1\n"
  174. " // line c2",
  175. sortUsingDeclarations("using c; // line c1\n"
  176. " // line c2\n"
  177. "using b; /* line b1\n"
  178. " * line b2\n"
  179. " * line b3 */\n"
  180. "using a; // line a1"));
  181. }
  182. TEST_F(UsingDeclarationsSorterTest, SortsInStructScope) {
  183. EXPECT_EQ("struct pt3 : pt2 {\n"
  184. " using pt2::x;\n"
  185. " using pt2::y;\n"
  186. " float z;\n"
  187. "};",
  188. sortUsingDeclarations("struct pt3 : pt2 {\n"
  189. " using pt2::y;\n"
  190. " using pt2::x;\n"
  191. " float z;\n"
  192. "};"));
  193. }
  194. TEST_F(UsingDeclarationsSorterTest, KeepsOperators) {
  195. EXPECT_EQ("using a::operator();\n"
  196. "using a::operator-;\n"
  197. "using a::operator+;",
  198. sortUsingDeclarations("using a::operator();\n"
  199. "using a::operator-;\n"
  200. "using a::operator+;"));
  201. }
  202. TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsInsideNamespaces) {
  203. EXPECT_EQ("namespace A {\n"
  204. "struct B;\n"
  205. "struct C;\n"
  206. "}\n"
  207. "namespace X {\n"
  208. "using A::B;\n"
  209. "using A::C;\n"
  210. "}",
  211. sortUsingDeclarations("namespace A {\n"
  212. "struct B;\n"
  213. "struct C;\n"
  214. "}\n"
  215. "namespace X {\n"
  216. "using A::C;\n"
  217. "using A::B;\n"
  218. "}"));
  219. }
  220. TEST_F(UsingDeclarationsSorterTest, SupportsClangFormatOff) {
  221. EXPECT_EQ("// clang-format off\n"
  222. "using b;\n"
  223. "using a;\n"
  224. "// clang-format on\n"
  225. "using c;\n"
  226. "using d;",
  227. sortUsingDeclarations("// clang-format off\n"
  228. "using b;\n"
  229. "using a;\n"
  230. "// clang-format on\n"
  231. "using d;\n"
  232. "using c;"));
  233. }
  234. TEST_F(UsingDeclarationsSorterTest, SortsPartialRangeOfUsingDeclarations) {
  235. // Sorts the whole block of using declarations surrounding the range.
  236. EXPECT_EQ("using a;\n"
  237. "using b;\n"
  238. "using c;",
  239. sortUsingDeclarations("using b;\n"
  240. "using c;\n" // starts at offset 10
  241. "using a;",
  242. {tooling::Range(10, 15)}));
  243. EXPECT_EQ("using a;\n"
  244. "using b;\n"
  245. "using c;\n"
  246. "using A = b;",
  247. sortUsingDeclarations("using b;\n"
  248. "using c;\n" // starts at offset 10
  249. "using a;\n"
  250. "using A = b;",
  251. {tooling::Range(10, 15)}));
  252. EXPECT_EQ("using d;\n"
  253. "using c;\n"
  254. "\n"
  255. "using a;\n"
  256. "using b;\n"
  257. "\n"
  258. "using f;\n"
  259. "using e;",
  260. sortUsingDeclarations("using d;\n"
  261. "using c;\n"
  262. "\n"
  263. "using b;\n" // starts at offset 19
  264. "using a;\n"
  265. "\n"
  266. "using f;\n"
  267. "using e;",
  268. {tooling::Range(19, 1)}));
  269. }
  270. } // end namespace
  271. } // end namespace format
  272. } // end namespace clang