1 //===- UsingDeclarationsSorterTest.cpp - Formatting unit tests ------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "clang/Format/Format.h"
12 #include "llvm/Support/Debug.h"
13 #include "gtest/gtest.h"
15 #define DEBUG_TYPE "using-declarations-sorter-test"
21 class UsingDeclarationsSorterTest : public ::testing::Test {
23 std::string sortUsingDeclarations(llvm::StringRef Code,
24 const std::vector<tooling::Range> &Ranges,
25 const FormatStyle &Style = getLLVMStyle()) {
26 LLVM_DEBUG(llvm::errs() << "---\n");
27 LLVM_DEBUG(llvm::errs() << Code << "\n\n");
28 tooling::Replacements Replaces =
29 clang::format::sortUsingDeclarations(Style, Code, Ranges, "<stdin>");
30 auto Result = applyAllReplacements(Code, Replaces);
31 EXPECT_TRUE(static_cast<bool>(Result));
32 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
36 std::string sortUsingDeclarations(llvm::StringRef Code,
37 const FormatStyle &Style = getLLVMStyle()) {
38 return sortUsingDeclarations(Code,
39 /*Ranges=*/{1, tooling::Range(0, Code.size())},
44 TEST_F(UsingDeclarationsSorterTest, SwapsTwoConsecutiveUsingDeclarations) {
45 EXPECT_EQ("using a;\n"
47 sortUsingDeclarations("using a;\n"
49 EXPECT_EQ("using a;\n"
51 sortUsingDeclarations("using aa;\n"
53 EXPECT_EQ("using a;\n"
55 sortUsingDeclarations("using a;\n"
58 EXPECT_EQ("using a::bcd;\n"
60 sortUsingDeclarations("using a::cd;\n"
63 EXPECT_EQ("using a;\n"
65 sortUsingDeclarations("using a::a;\n"
68 EXPECT_EQ("using a::ba::aa;\n"
70 sortUsingDeclarations("using a::bb::ccc;\n"
73 EXPECT_EQ("using a;\n"
75 sortUsingDeclarations("using typename a;\n"
78 EXPECT_EQ("using typename z;\n"
80 sortUsingDeclarations("using typenamea;\n"
81 "using typename z;"));
83 EXPECT_EQ("using a, b;\n"
85 sortUsingDeclarations("using aa;\n"
89 TEST_F(UsingDeclarationsSorterTest, UsingDeclarationOrder) {
90 EXPECT_EQ("using A;\n"
92 sortUsingDeclarations("using A;\n"
94 EXPECT_EQ("using a;\n"
96 sortUsingDeclarations("using a;\n"
98 EXPECT_EQ("using a;\n"
100 sortUsingDeclarations("using B;\n"
103 // Ignores leading '::'.
104 EXPECT_EQ("using ::a;\n"
106 sortUsingDeclarations("using ::a;\n"
109 EXPECT_EQ("using ::A;\n"
111 sortUsingDeclarations("using ::A;\n"
114 // Sorts '_' before 'a' and 'A'.
115 EXPECT_EQ("using _;\n"
117 sortUsingDeclarations("using A;\n"
119 EXPECT_EQ("using _;\n"
121 sortUsingDeclarations("using a;\n"
123 EXPECT_EQ("using a::_;\n"
125 sortUsingDeclarations("using a::a;\n"
128 // Sorts non-namespace names before namespace names at the same level.
129 EXPECT_EQ("using ::testing::_;\n"
130 "using ::testing::Aardvark;\n"
131 "using ::testing::kMax;\n"
132 "using ::testing::Xylophone;\n"
133 "using ::testing::apple::Honeycrisp;\n"
134 "using ::testing::zebra::Stripes;",
135 sortUsingDeclarations("using ::testing::Aardvark;\n"
136 "using ::testing::Xylophone;\n"
137 "using ::testing::kMax;\n"
138 "using ::testing::_;\n"
139 "using ::testing::apple::Honeycrisp;\n"
140 "using ::testing::zebra::Stripes;"));
143 TEST_F(UsingDeclarationsSorterTest, SortsStably) {
144 EXPECT_EQ("using a;\n"
157 sortUsingDeclarations("using a;\n"
176 TEST_F(UsingDeclarationsSorterTest, SortsMultipleTopLevelDeclarations) {
177 EXPECT_EQ("using a;\n"
182 sortUsingDeclarations("using d;\n"
188 EXPECT_EQ("#include <iostream>\n"
191 "using ::std::endl;\n"
193 sortUsingDeclarations("#include <iostream>\n"
195 "using ::std::endl;\n"
200 TEST_F(UsingDeclarationsSorterTest, BreaksOnEmptyLines) {
201 EXPECT_EQ("using b;\n"
206 sortUsingDeclarations("using c;\n"
213 TEST_F(UsingDeclarationsSorterTest, BreaksOnUsingNamespace) {
214 EXPECT_EQ("using b;\n"
215 "using namespace std;\n"
217 sortUsingDeclarations("using b;\n"
218 "using namespace std;\n"
222 TEST_F(UsingDeclarationsSorterTest, KeepsUsingDeclarationsInPPDirectives) {
223 EXPECT_EQ("#define A \\\n"
226 sortUsingDeclarations("#define A \\\n"
231 TEST_F(UsingDeclarationsSorterTest, KeepsTypeAliases) {
232 auto Code = "struct C { struct B { struct A; }; };\n"
235 EXPECT_EQ(Code, sortUsingDeclarations(Code));
238 TEST_F(UsingDeclarationsSorterTest, MovesTrailingCommentsWithDeclarations) {
239 EXPECT_EQ("using a; // line a1\n"
240 "using b; /* line b1\n"
243 "using c; // line c1\n"
245 sortUsingDeclarations("using c; // line c1\n"
247 "using b; /* line b1\n"
250 "using a; // line a1"));
253 TEST_F(UsingDeclarationsSorterTest, SortsInStructScope) {
254 EXPECT_EQ("struct pt3 : pt2 {\n"
259 sortUsingDeclarations("struct pt3 : pt2 {\n"
266 TEST_F(UsingDeclarationsSorterTest, KeepsOperators) {
267 EXPECT_EQ("using a::operator();\n"
268 "using a::operator-;\n"
269 "using a::operator+;",
270 sortUsingDeclarations("using a::operator();\n"
271 "using a::operator-;\n"
272 "using a::operator+;"));
275 TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsInsideNamespaces) {
276 EXPECT_EQ("namespace A {\n"
284 sortUsingDeclarations("namespace A {\n"
294 TEST_F(UsingDeclarationsSorterTest, SupportsClangFormatOff) {
295 EXPECT_EQ("// clang-format off\n"
298 "// clang-format on\n"
301 sortUsingDeclarations("// clang-format off\n"
304 "// clang-format on\n"
309 TEST_F(UsingDeclarationsSorterTest, SortsPartialRangeOfUsingDeclarations) {
310 // Sorts the whole block of using declarations surrounding the range.
311 EXPECT_EQ("using a;\n"
314 sortUsingDeclarations("using b;\n"
315 "using c;\n" // starts at offset 10
317 {tooling::Range(10, 15)}));
318 EXPECT_EQ("using a;\n"
322 sortUsingDeclarations("using b;\n"
323 "using c;\n" // starts at offset 10
326 {tooling::Range(10, 15)}));
328 EXPECT_EQ("using d;\n"
336 sortUsingDeclarations("using d;\n"
339 "using b;\n" // starts at offset 19
344 {tooling::Range(19, 1)}));
347 TEST_F(UsingDeclarationsSorterTest, SortsUsingDeclarationsWithLeadingkComments) {
348 EXPECT_EQ("/* comment */ using a;\n"
349 "/* comment */ using b;",
350 sortUsingDeclarations("/* comment */ using b;\n"
351 "/* comment */ using a;"));
354 TEST_F(UsingDeclarationsSorterTest, DeduplicatesUsingDeclarations) {
355 EXPECT_EQ("using a;\n"
361 sortUsingDeclarations("using c;\n"
374 } // end namespace format
375 } // end namespace clang