UsingDeclarationsSorterTest.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. //===- UsingDeclarationsSorterTest.cpp - Formatting unit tests ------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "clang/Format/Format.h"
  9. #include "llvm/Support/Debug.h"
  10. #include "gtest/gtest.h"
  11. #define DEBUG_TYPE "using-declarations-sorter-test"
  12. namespace clang {
  13. namespace format {
  14. namespace {
  15. class UsingDeclarationsSorterTest : public ::testing::Test {
  16. protected:
  17. std::string sortUsingDeclarations(llvm::StringRef Code,
  18. const std::vector<tooling::Range> &Ranges,
  19. const FormatStyle &Style = getLLVMStyle()) {
  20. LLVM_DEBUG(llvm::errs() << "---\n");
  21. LLVM_DEBUG(llvm::errs() << Code << "\n\n");
  22. tooling::Replacements Replaces =
  23. clang::format::sortUsingDeclarations(Style, Code, Ranges, "<stdin>");
  24. auto Result = applyAllReplacements(Code, Replaces);
  25. EXPECT_TRUE(static_cast<bool>(Result));
  26. LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
  27. return *Result;
  28. }
  29. std::string sortUsingDeclarations(llvm::StringRef Code,
  30. const FormatStyle &Style = getLLVMStyle()) {
  31. return sortUsingDeclarations(Code,
  32. /*Ranges=*/{1, tooling::Range(0, Code.size())},
  33. Style);
  34. }
  35. };
  36. TEST_F(UsingDeclarationsSorterTest, SwapsTwoConsecutiveUsingDeclarations) {
  37. EXPECT_EQ("using a;\n"
  38. "using b;",
  39. sortUsingDeclarations("using a;\n"
  40. "using b;"));
  41. EXPECT_EQ("using a;\n"
  42. "using aa;",
  43. sortUsingDeclarations("using aa;\n"
  44. "using a;"));
  45. EXPECT_EQ("using a;\n"
  46. "using ::a;",
  47. sortUsingDeclarations("using a;\n"
  48. "using ::a;"));
  49. EXPECT_EQ("using a::bcd;\n"
  50. "using a::cd;",
  51. sortUsingDeclarations("using a::cd;\n"
  52. "using a::bcd;"));
  53. EXPECT_EQ("using a;\n"
  54. "using a::a;",
  55. sortUsingDeclarations("using a::a;\n"
  56. "using a;"));
  57. EXPECT_EQ("using a::ba::aa;\n"
  58. "using a::bb::ccc;",
  59. sortUsingDeclarations("using a::bb::ccc;\n"
  60. "using a::ba::aa;"));
  61. EXPECT_EQ("using a;\n"
  62. "using typename a;",
  63. sortUsingDeclarations("using typename a;\n"
  64. "using a;"));
  65. EXPECT_EQ("using typename z;\n"
  66. "using typenamea;",
  67. sortUsingDeclarations("using typenamea;\n"
  68. "using typename z;"));
  69. EXPECT_EQ("using a, b;\n"
  70. "using aa;",
  71. sortUsingDeclarations("using aa;\n"
  72. "using a, b;"));
  73. }
  74. TEST_F(UsingDeclarationsSorterTest, UsingDeclarationOrder) {
  75. EXPECT_EQ("using A;\n"
  76. "using a;",
  77. sortUsingDeclarations("using A;\n"
  78. "using a;"));
  79. EXPECT_EQ("using a;\n"
  80. "using A;",
  81. sortUsingDeclarations("using a;\n"
  82. "using A;"));
  83. EXPECT_EQ("using a;\n"
  84. "using B;",
  85. sortUsingDeclarations("using B;\n"
  86. "using a;"));
  87. // Ignores leading '::'.
  88. EXPECT_EQ("using ::a;\n"
  89. "using A;",
  90. sortUsingDeclarations("using ::a;\n"
  91. "using A;"));
  92. EXPECT_EQ("using ::A;\n"
  93. "using a;",
  94. sortUsingDeclarations("using ::A;\n"
  95. "using a;"));
  96. // Sorts '_' before 'a' and 'A'.
  97. EXPECT_EQ("using _;\n"
  98. "using A;",
  99. sortUsingDeclarations("using A;\n"
  100. "using _;"));
  101. EXPECT_EQ("using _;\n"
  102. "using a;",
  103. sortUsingDeclarations("using a;\n"
  104. "using _;"));
  105. EXPECT_EQ("using a::_;\n"
  106. "using a::a;",
  107. sortUsingDeclarations("using a::a;\n"
  108. "using a::_;"));
  109. // Sorts non-namespace names before namespace names at the same level.
  110. EXPECT_EQ("using ::testing::_;\n"
  111. "using ::testing::Aardvark;\n"
  112. "using ::testing::kMax;\n"
  113. "using ::testing::Xylophone;\n"
  114. "using ::testing::apple::Honeycrisp;\n"
  115. "using ::testing::zebra::Stripes;",
  116. sortUsingDeclarations("using ::testing::Aardvark;\n"
  117. "using ::testing::Xylophone;\n"
  118. "using ::testing::kMax;\n"
  119. "using ::testing::_;\n"
  120. "using ::testing::apple::Honeycrisp;\n"
  121. "using ::testing::zebra::Stripes;"));
  122. }
  123. TEST_F(UsingDeclarationsSorterTest, SortsStably) {
  124. EXPECT_EQ("using a;\n"
  125. "using A;\n"
  126. "using a;\n"
  127. "using A;\n"
  128. "using a;\n"
  129. "using A;\n"
  130. "using a;\n"
  131. "using B;\n"
  132. "using b;\n"
  133. "using B;\n"
  134. "using b;\n"
  135. "using B;\n"
  136. "using b;",
  137. sortUsingDeclarations("using a;\n"
  138. "using B;\n"
  139. "using a;\n"
  140. "using b;\n"
  141. "using A;\n"
  142. "using a;\n"
  143. "using b;\n"
  144. "using B;\n"
  145. "using b;\n"
  146. "using A;\n"
  147. "using a;\n"
  148. "using b;\n"
  149. "using b;\n"
  150. "using B;\n"
  151. "using b;\n"
  152. "using A;\n"
  153. "using a;"));
  154. }
  155. TEST_F(UsingDeclarationsSorterTest, SortsMultipleTopLevelDeclarations) {
  156. EXPECT_EQ("using a;\n"
  157. "using b;\n"
  158. "using c;\n"
  159. "using d;\n"
  160. "using e;",
  161. sortUsingDeclarations("using d;\n"
  162. "using b;\n"
  163. "using e;\n"
  164. "using a;\n"
  165. "using c;"));
  166. EXPECT_EQ("#include <iostream>\n"
  167. "using std::cin;\n"
  168. "using std::cout;\n"
  169. "using ::std::endl;\n"
  170. "int main();",
  171. sortUsingDeclarations("#include <iostream>\n"
  172. "using std::cout;\n"
  173. "using ::std::endl;\n"
  174. "using std::cin;\n"
  175. "int main();"));
  176. }
  177. TEST_F(UsingDeclarationsSorterTest, BreaksOnEmptyLines) {
  178. EXPECT_EQ("using b;\n"
  179. "using c;\n"
  180. "\n"
  181. "using a;\n"
  182. "using d;",
  183. sortUsingDeclarations("using c;\n"
  184. "using b;\n"
  185. "\n"
  186. "using d;\n"
  187. "using a;"));
  188. }
  189. TEST_F(UsingDeclarationsSorterTest, BreaksOnUsingNamespace) {
  190. EXPECT_EQ("using b;\n"
  191. "using namespace std;\n"
  192. "using a;",
  193. sortUsingDeclarations("using b;\n"
  194. "using namespace std;\n"
  195. "using a;"));
  196. }
  197. TEST_F(UsingDeclarationsSorterTest, KeepsUsingDeclarationsInPPDirectives) {
  198. EXPECT_EQ("#define A \\\n"
  199. "using b;\\\n"
  200. "using a;",
  201. sortUsingDeclarations("#define A \\\n"
  202. "using b;\\\n"
  203. "using a;"));
  204. }
  205. TEST_F(UsingDeclarationsSorterTest, KeepsTypeAliases) {
  206. auto Code = "struct C { struct B { struct A; }; };\n"
  207. "using B = C::B;\n"
  208. "using A = B::A;";
  209. EXPECT_EQ(Code, sortUsingDeclarations(Code));
  210. }
  211. TEST_F(UsingDeclarationsSorterTest, MovesTrailingCommentsWithDeclarations) {
  212. EXPECT_EQ("using a; // line a1\n"
  213. "using b; /* line b1\n"
  214. " * line b2\n"
  215. " * line b3 */\n"
  216. "using c; // line c1\n"
  217. " // line c2",
  218. sortUsingDeclarations("using c; // line c1\n"
  219. " // line c2\n"
  220. "using b; /* line b1\n"
  221. " * line b2\n"
  222. " * line b3 */\n"
  223. "using a; // line a1"));
  224. }
  225. TEST_F(UsingDeclarationsSorterTest, SortsInStructScope) {
  226. EXPECT_EQ("struct pt3 : pt2 {\n"
  227. " using pt2::x;\n"
  228. " using pt2::y;\n"
  229. " float z;\n"
  230. "};",
  231. sortUsingDeclarations("struct pt3 : pt2 {\n"
  232. " using pt2::y;\n"
  233. " using pt2::x;\n"
  234. " float z;\n"
  235. "};"));
  236. }
  237. TEST_F(UsingDeclarationsSorterTest, KeepsOperators) {
  238. EXPECT_EQ("using a::operator();\n"
  239. "using a::operator-;\n"
  240. "using a::operator+;",
  241. sortUsingDeclarations("using a::operator();\n"
  242. "using a::operator-;\n"
  243. "using a::operator+;"));
  244. }
  245. TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsInsideNamespaces) {
  246. EXPECT_EQ("namespace A {\n"
  247. "struct B;\n"
  248. "struct C;\n"
  249. "}\n"
  250. "namespace X {\n"
  251. "using A::B;\n"
  252. "using A::C;\n"
  253. "}",
  254. sortUsingDeclarations("namespace A {\n"
  255. "struct B;\n"
  256. "struct C;\n"
  257. "}\n"
  258. "namespace X {\n"
  259. "using A::C;\n"
  260. "using A::B;\n"
  261. "}"));
  262. }
  263. TEST_F(UsingDeclarationsSorterTest, SupportsClangFormatOff) {
  264. EXPECT_EQ("// clang-format off\n"
  265. "using b;\n"
  266. "using a;\n"
  267. "// clang-format on\n"
  268. "using c;\n"
  269. "using d;",
  270. sortUsingDeclarations("// clang-format off\n"
  271. "using b;\n"
  272. "using a;\n"
  273. "// clang-format on\n"
  274. "using d;\n"
  275. "using c;"));
  276. }
  277. TEST_F(UsingDeclarationsSorterTest, SortsPartialRangeOfUsingDeclarations) {
  278. // Sorts the whole block of using declarations surrounding the range.
  279. EXPECT_EQ("using a;\n"
  280. "using b;\n"
  281. "using c;",
  282. sortUsingDeclarations("using b;\n"
  283. "using c;\n" // starts at offset 10
  284. "using a;",
  285. {tooling::Range(10, 15)}));
  286. EXPECT_EQ("using a;\n"
  287. "using b;\n"
  288. "using c;\n"
  289. "using A = b;",
  290. sortUsingDeclarations("using b;\n"
  291. "using c;\n" // starts at offset 10
  292. "using a;\n"
  293. "using A = b;",
  294. {tooling::Range(10, 15)}));
  295. EXPECT_EQ("using d;\n"
  296. "using c;\n"
  297. "\n"
  298. "using a;\n"
  299. "using b;\n"
  300. "\n"
  301. "using f;\n"
  302. "using e;",
  303. sortUsingDeclarations("using d;\n"
  304. "using c;\n"
  305. "\n"
  306. "using b;\n" // starts at offset 19
  307. "using a;\n"
  308. "\n"
  309. "using f;\n"
  310. "using e;",
  311. {tooling::Range(19, 1)}));
  312. }
  313. TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsWithLeadingkComments) {
  314. EXPECT_EQ("/* comment */ using a;\n"
  315. "/* comment */ using b;",
  316. sortUsingDeclarations("/* comment */ using b;\n"
  317. "/* comment */ using a;"));
  318. }
  319. TEST_F(UsingDeclarationsSorterTest, DeduplicatesUsingDeclarations) {
  320. EXPECT_EQ("using a;\n"
  321. "using b;\n"
  322. "using c;\n"
  323. "\n"
  324. "using a;\n"
  325. "using e;",
  326. sortUsingDeclarations("using c;\n"
  327. "using a;\n"
  328. "using b;\n"
  329. "using a;\n"
  330. "using b;\n"
  331. "\n"
  332. "using e;\n"
  333. "using a;\n"
  334. "using e;"));
  335. }
  336. } // end namespace
  337. } // end namespace format
  338. } // end namespace clang