UsingDeclarationsSorterTest.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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, UsingDeclarationOrder) {
  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 a;\n"
  85. "using B;",
  86. sortUsingDeclarations("using B;\n"
  87. "using a;"));
  88. // Ignores leading '::'.
  89. EXPECT_EQ("using ::a;\n"
  90. "using A;",
  91. sortUsingDeclarations("using ::a;\n"
  92. "using A;"));
  93. EXPECT_EQ("using ::A;\n"
  94. "using a;",
  95. sortUsingDeclarations("using ::A;\n"
  96. "using a;"));
  97. // Sorts '_' before 'a' and 'A'.
  98. EXPECT_EQ("using _;\n"
  99. "using A;",
  100. sortUsingDeclarations("using A;\n"
  101. "using _;"));
  102. EXPECT_EQ("using _;\n"
  103. "using a;",
  104. sortUsingDeclarations("using a;\n"
  105. "using _;"));
  106. EXPECT_EQ("using a::_;\n"
  107. "using a::a;",
  108. sortUsingDeclarations("using a::a;\n"
  109. "using a::_;"));
  110. // Sorts non-namespace names before namespace names at the same level.
  111. EXPECT_EQ("using ::testing::_;\n"
  112. "using ::testing::Aardvark;\n"
  113. "using ::testing::kMax;\n"
  114. "using ::testing::Xylophone;\n"
  115. "using ::testing::apple::Honeycrisp;\n"
  116. "using ::testing::zebra::Stripes;",
  117. sortUsingDeclarations("using ::testing::Aardvark;\n"
  118. "using ::testing::Xylophone;\n"
  119. "using ::testing::kMax;\n"
  120. "using ::testing::_;\n"
  121. "using ::testing::apple::Honeycrisp;\n"
  122. "using ::testing::zebra::Stripes;"));
  123. }
  124. TEST_F(UsingDeclarationsSorterTest, SortsStably) {
  125. EXPECT_EQ("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 A;\n"
  132. "using a;\n"
  133. "using B;\n"
  134. "using b;\n"
  135. "using b;\n"
  136. "using B;\n"
  137. "using b;\n"
  138. "using b;\n"
  139. "using b;\n"
  140. "using B;\n"
  141. "using b;",
  142. sortUsingDeclarations("using a;\n"
  143. "using B;\n"
  144. "using a;\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 A;\n"
  152. "using a;\n"
  153. "using b;\n"
  154. "using b;\n"
  155. "using B;\n"
  156. "using b;\n"
  157. "using A;\n"
  158. "using a;"));
  159. }
  160. TEST_F(UsingDeclarationsSorterTest, SortsMultipleTopLevelDeclarations) {
  161. EXPECT_EQ("using a;\n"
  162. "using b;\n"
  163. "using c;\n"
  164. "using d;\n"
  165. "using e;",
  166. sortUsingDeclarations("using d;\n"
  167. "using b;\n"
  168. "using e;\n"
  169. "using a;\n"
  170. "using c;"));
  171. EXPECT_EQ("#include <iostream>\n"
  172. "using std::cin;\n"
  173. "using std::cout;\n"
  174. "using ::std::endl;\n"
  175. "int main();",
  176. sortUsingDeclarations("#include <iostream>\n"
  177. "using std::cout;\n"
  178. "using ::std::endl;\n"
  179. "using std::cin;\n"
  180. "int main();"));
  181. }
  182. TEST_F(UsingDeclarationsSorterTest, BreaksOnEmptyLines) {
  183. EXPECT_EQ("using b;\n"
  184. "using c;\n"
  185. "\n"
  186. "using a;\n"
  187. "using d;",
  188. sortUsingDeclarations("using c;\n"
  189. "using b;\n"
  190. "\n"
  191. "using d;\n"
  192. "using a;"));
  193. }
  194. TEST_F(UsingDeclarationsSorterTest, BreaksOnUsingNamespace) {
  195. EXPECT_EQ("using b;\n"
  196. "using namespace std;\n"
  197. "using a;",
  198. sortUsingDeclarations("using b;\n"
  199. "using namespace std;\n"
  200. "using a;"));
  201. }
  202. TEST_F(UsingDeclarationsSorterTest, KeepsUsingDeclarationsInPPDirectives) {
  203. EXPECT_EQ("#define A \\\n"
  204. "using b;\\\n"
  205. "using a;",
  206. sortUsingDeclarations("#define A \\\n"
  207. "using b;\\\n"
  208. "using a;"));
  209. }
  210. TEST_F(UsingDeclarationsSorterTest, KeepsTypeAliases) {
  211. auto Code = "struct C { struct B { struct A; }; };\n"
  212. "using B = C::B;\n"
  213. "using A = B::A;";
  214. EXPECT_EQ(Code, sortUsingDeclarations(Code));
  215. }
  216. TEST_F(UsingDeclarationsSorterTest, MovesTrailingCommentsWithDeclarations) {
  217. EXPECT_EQ("using a; // line a1\n"
  218. "using b; /* line b1\n"
  219. " * line b2\n"
  220. " * line b3 */\n"
  221. "using c; // line c1\n"
  222. " // line c2",
  223. sortUsingDeclarations("using c; // line c1\n"
  224. " // line c2\n"
  225. "using b; /* line b1\n"
  226. " * line b2\n"
  227. " * line b3 */\n"
  228. "using a; // line a1"));
  229. }
  230. TEST_F(UsingDeclarationsSorterTest, SortsInStructScope) {
  231. EXPECT_EQ("struct pt3 : pt2 {\n"
  232. " using pt2::x;\n"
  233. " using pt2::y;\n"
  234. " float z;\n"
  235. "};",
  236. sortUsingDeclarations("struct pt3 : pt2 {\n"
  237. " using pt2::y;\n"
  238. " using pt2::x;\n"
  239. " float z;\n"
  240. "};"));
  241. }
  242. TEST_F(UsingDeclarationsSorterTest, KeepsOperators) {
  243. EXPECT_EQ("using a::operator();\n"
  244. "using a::operator-;\n"
  245. "using a::operator+;",
  246. sortUsingDeclarations("using a::operator();\n"
  247. "using a::operator-;\n"
  248. "using a::operator+;"));
  249. }
  250. TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsInsideNamespaces) {
  251. EXPECT_EQ("namespace A {\n"
  252. "struct B;\n"
  253. "struct C;\n"
  254. "}\n"
  255. "namespace X {\n"
  256. "using A::B;\n"
  257. "using A::C;\n"
  258. "}",
  259. sortUsingDeclarations("namespace A {\n"
  260. "struct B;\n"
  261. "struct C;\n"
  262. "}\n"
  263. "namespace X {\n"
  264. "using A::C;\n"
  265. "using A::B;\n"
  266. "}"));
  267. }
  268. TEST_F(UsingDeclarationsSorterTest, SupportsClangFormatOff) {
  269. EXPECT_EQ("// clang-format off\n"
  270. "using b;\n"
  271. "using a;\n"
  272. "// clang-format on\n"
  273. "using c;\n"
  274. "using d;",
  275. sortUsingDeclarations("// clang-format off\n"
  276. "using b;\n"
  277. "using a;\n"
  278. "// clang-format on\n"
  279. "using d;\n"
  280. "using c;"));
  281. }
  282. TEST_F(UsingDeclarationsSorterTest, SortsPartialRangeOfUsingDeclarations) {
  283. // Sorts the whole block of using declarations surrounding the range.
  284. EXPECT_EQ("using a;\n"
  285. "using b;\n"
  286. "using c;",
  287. sortUsingDeclarations("using b;\n"
  288. "using c;\n" // starts at offset 10
  289. "using a;",
  290. {tooling::Range(10, 15)}));
  291. EXPECT_EQ("using a;\n"
  292. "using b;\n"
  293. "using c;\n"
  294. "using A = b;",
  295. sortUsingDeclarations("using b;\n"
  296. "using c;\n" // starts at offset 10
  297. "using a;\n"
  298. "using A = b;",
  299. {tooling::Range(10, 15)}));
  300. EXPECT_EQ("using d;\n"
  301. "using c;\n"
  302. "\n"
  303. "using a;\n"
  304. "using b;\n"
  305. "\n"
  306. "using f;\n"
  307. "using e;",
  308. sortUsingDeclarations("using d;\n"
  309. "using c;\n"
  310. "\n"
  311. "using b;\n" // starts at offset 19
  312. "using a;\n"
  313. "\n"
  314. "using f;\n"
  315. "using e;",
  316. {tooling::Range(19, 1)}));
  317. }
  318. } // end namespace
  319. } // end namespace format
  320. } // end namespace clang