1 //===- unittest/Format/FormatTestSelective.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
10 #include "FormatTestUtils.h"
11 #include "clang/Format/Format.h"
12 #include "llvm/Support/Debug.h"
13 #include "gtest/gtest.h"
14
15 #define DEBUG_TYPE "format-test"
16
17 namespace clang {
18 namespace format {
19 namespace {
20
21 class FormatTestSelective : public ::testing::Test {
22 protected:
format(llvm::StringRef Code,unsigned Offset,unsigned Length)23 std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
24 DEBUG(llvm::errs() << "---\n");
25 DEBUG(llvm::errs() << Code << "\n\n");
26 std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27 bool IncompleteFormat = false;
28 tooling::Replacements Replaces =
29 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
30 EXPECT_FALSE(IncompleteFormat) << Code << "\n\n";
31 auto Result = applyAllReplacements(Code, Replaces);
32 EXPECT_TRUE(static_cast<bool>(Result));
33 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
34 return *Result;
35 }
36
37 FormatStyle Style = getLLVMStyle();
38 };
39
TEST_F(FormatTestSelective,RemovesTrailingWhitespaceOfFormattedLine)40 TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
41 EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
42 EXPECT_EQ("int a;", format("int a; ", 0, 0));
43 EXPECT_EQ("int a;\n", format("int a; \n \n \n ", 0, 0));
44 EXPECT_EQ("int a;\nint b; ", format("int a; \nint b; ", 0, 0));
45 }
46
TEST_F(FormatTestSelective,FormatsCorrectRegionForLeadingWhitespace)47 TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
48 EXPECT_EQ("{int b;\n"
49 " int a;\n"
50 "}",
51 format("{int b;\n int a;}", 8, 0));
52 EXPECT_EQ("{\n"
53 " int b;\n"
54 " int a;}",
55 format("{int b;\n int a;}", 7, 0));
56
57 Style.ColumnLimit = 12;
58 EXPECT_EQ("#define A \\\n"
59 " int a; \\\n"
60 " int b;",
61 format("#define A \\\n"
62 " int a; \\\n"
63 " int b;",
64 26, 0));
65 EXPECT_EQ("#define A \\\n"
66 " int a; \\\n"
67 " int b;",
68 format("#define A \\\n"
69 " int a; \\\n"
70 " int b;",
71 25, 0));
72 }
73
TEST_F(FormatTestSelective,FormatLineWhenInvokedOnTrailingNewline)74 TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
75 EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 8, 0));
76 EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 7, 0));
77
78 // This might not strictly be correct, but is likely good in all practical
79 // cases.
80 EXPECT_EQ("int b;\nint a;", format("int b;int a;", 7, 0));
81 }
82
TEST_F(FormatTestSelective,RemovesWhitespaceWhenTriggeredOnEmptyLine)83 TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
84 EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 8, 0));
85 EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 9, 0));
86 }
87
TEST_F(FormatTestSelective,ReformatsMovedLines)88 TEST_F(FormatTestSelective, ReformatsMovedLines) {
89 EXPECT_EQ(
90 "template <typename T> T *getFETokenInfo() const {\n"
91 " return static_cast<T *>(FETokenInfo);\n"
92 "}\n"
93 "int a; // <- Should not be formatted",
94 format(
95 "template<typename T>\n"
96 "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
97 "int a; // <- Should not be formatted",
98 9, 5));
99 }
100
TEST_F(FormatTestSelective,FormatsIfWithoutCompoundStatement)101 TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
102 Style.AllowShortIfStatementsOnASingleLine = true;
103 EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
104 EXPECT_EQ("if (a) return; // comment",
105 format("if(a)\nreturn; // comment", 20, 1));
106 }
107
TEST_F(FormatTestSelective,FormatsCommentsLocally)108 TEST_F(FormatTestSelective, FormatsCommentsLocally) {
109 EXPECT_EQ("int a; // comment\n"
110 "int b; // comment",
111 format("int a; // comment\n"
112 "int b; // comment",
113 0, 0));
114 EXPECT_EQ("int a; // comment\n"
115 " // line 2\n"
116 "int b;",
117 format("int a; // comment\n"
118 " // line 2\n"
119 "int b;",
120 28, 0));
121 EXPECT_EQ("int aaaaaa; // comment\n"
122 "int b;\n"
123 "int c; // unrelated comment",
124 format("int aaaaaa; // comment\n"
125 "int b;\n"
126 "int c; // unrelated comment",
127 31, 0));
128
129 EXPECT_EQ("int a; // This\n"
130 " // is\n"
131 " // a",
132 format("int a; // This\n"
133 " // is\n"
134 " // a",
135 0, 0));
136 EXPECT_EQ("int a; // This\n"
137 " // is\n"
138 " // a\n"
139 "// This is b\n"
140 "int b;",
141 format("int a; // This\n"
142 " // is\n"
143 " // a\n"
144 "// This is b\n"
145 "int b;",
146 0, 0));
147 EXPECT_EQ("int a; // This\n"
148 " // is\n"
149 " // a\n"
150 "\n"
151 "//This is unrelated",
152 format("int a; // This\n"
153 " // is\n"
154 " // a\n"
155 "\n"
156 "//This is unrelated",
157 0, 0));
158 EXPECT_EQ("int a;\n"
159 "// This is\n"
160 "// not formatted. ",
161 format("int a;\n"
162 "// This is\n"
163 "// not formatted. ",
164 0, 0));
165 EXPECT_EQ("int x; // Format this line.\n"
166 "int xx; //\n"
167 "int xxxxx; //",
168 format("int x; // Format this line.\n"
169 "int xx; //\n"
170 "int xxxxx; //",
171 0, 0));
172 }
173
TEST_F(FormatTestSelective,IndividualStatementsOfNestedBlocks)174 TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
175 EXPECT_EQ("DEBUG({\n"
176 " int i;\n"
177 " int j;\n"
178 "});",
179 format("DEBUG( {\n"
180 " int i;\n"
181 " int j;\n"
182 "} ) ;",
183 20, 1));
184 EXPECT_EQ("DEBUG( {\n"
185 " int i;\n"
186 " int j;\n"
187 "} ) ;",
188 format("DEBUG( {\n"
189 " int i;\n"
190 " int j;\n"
191 "} ) ;",
192 41, 1));
193 EXPECT_EQ("DEBUG( {\n"
194 " int i;\n"
195 " int j;\n"
196 "} ) ;",
197 format("DEBUG( {\n"
198 " int i;\n"
199 " int j;\n"
200 "} ) ;",
201 41, 1));
202 EXPECT_EQ("DEBUG({\n"
203 " int i;\n"
204 " int j;\n"
205 "});",
206 format("DEBUG( {\n"
207 " int i;\n"
208 " int j;\n"
209 "} ) ;",
210 20, 1));
211
212 EXPECT_EQ("Debug({\n"
213 " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
214 " return;\n"
215 " },\n"
216 " a);",
217 format("Debug({\n"
218 " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
219 " return;\n"
220 " },\n"
221 " a);",
222 50, 1));
223 EXPECT_EQ("DEBUG({\n"
224 " DEBUG({\n"
225 " int a;\n"
226 " int b;\n"
227 " }) ;\n"
228 "});",
229 format("DEBUG({\n"
230 " DEBUG({\n"
231 " int a;\n"
232 " int b;\n" // Format this line only.
233 " }) ;\n" // Don't touch this line.
234 "});",
235 35, 0));
236 EXPECT_EQ("DEBUG({\n"
237 " int a; //\n"
238 "});",
239 format("DEBUG({\n"
240 " int a; //\n"
241 "});",
242 0, 0));
243 EXPECT_EQ("someFunction(\n"
244 " [] {\n"
245 " // Only with this comment.\n"
246 " int i; // invoke formatting here.\n"
247 " }, // force line break\n"
248 " aaa);",
249 format("someFunction(\n"
250 " [] {\n"
251 " // Only with this comment.\n"
252 " int i; // invoke formatting here.\n"
253 " }, // force line break\n"
254 " aaa);",
255 63, 1));
256
257 EXPECT_EQ("int longlongname; // comment\n"
258 "int x = f({\n"
259 " int x; // comment\n"
260 " int y; // comment\n"
261 "});",
262 format("int longlongname; // comment\n"
263 "int x = f({\n"
264 " int x; // comment\n"
265 " int y; // comment\n"
266 "});",
267 65, 0));
268 EXPECT_EQ("int s = f({\n"
269 " class X {\n"
270 " public:\n"
271 " void f();\n"
272 " };\n"
273 "});",
274 format("int s = f({\n"
275 " class X {\n"
276 " public:\n"
277 " void f();\n"
278 " };\n"
279 "});",
280 0, 0));
281 EXPECT_EQ("SomeFunction(\n"
282 " [] {\n"
283 " int i;\n"
284 " return i;\n" // Format this line.
285 " },\n"
286 " [] {\n"
287 " return 2;\n" // Don't fix this.
288 " });",
289 format("SomeFunction(\n"
290 " [] {\n"
291 " int i;\n"
292 " return i;\n" // Format this line.
293 " },\n"
294 " [] {\n"
295 " return 2;\n" // Don't fix this.
296 " });",
297 40, 0));
298 }
299
TEST_F(FormatTestSelective,WrongIndent)300 TEST_F(FormatTestSelective, WrongIndent) {
301 EXPECT_EQ("namespace {\n"
302 "int i;\n"
303 "int j;\n"
304 "}",
305 format("namespace {\n"
306 " int i;\n" // Format here.
307 " int j;\n"
308 "}",
309 15, 0));
310 EXPECT_EQ("namespace {\n"
311 " int i;\n"
312 " int j;\n"
313 "}",
314 format("namespace {\n"
315 " int i;\n"
316 " int j;\n" // Format here.
317 "}",
318 24, 0));
319 }
320
TEST_F(FormatTestSelective,AlwaysFormatsEntireMacroDefinitions)321 TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
322 Style.AlignEscapedNewlinesLeft = true;
323 EXPECT_EQ("int i;\n"
324 "#define A \\\n"
325 " int i; \\\n"
326 " int j\n"
327 "int k;",
328 format("int i;\n"
329 "#define A \\\n"
330 " int i ; \\\n"
331 " int j\n"
332 "int k;",
333 8, 0)); // 8: position of "#define".
334 EXPECT_EQ("int i;\n"
335 "#define A \\\n"
336 " int i; \\\n"
337 " int j\n"
338 "int k;",
339 format("int i;\n"
340 "#define A \\\n"
341 " int i ; \\\n"
342 " int j\n"
343 "int k;",
344 45, 0)); // 45: position of "j".
345 }
346
TEST_F(FormatTestSelective,ReformatRegionAdjustsIndent)347 TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
348 EXPECT_EQ("{\n"
349 "{\n"
350 "a;\n"
351 "b;\n"
352 "}\n"
353 "}",
354 format("{\n"
355 "{\n"
356 "a;\n"
357 " b;\n"
358 "}\n"
359 "}",
360 13, 2));
361 EXPECT_EQ("{\n"
362 "{\n"
363 " a;\n"
364 " b;\n"
365 " c;\n"
366 " d;\n"
367 "}\n"
368 "}",
369 format("{\n"
370 "{\n"
371 " a;\n"
372 " b;\n"
373 " c;\n"
374 " d;\n"
375 "}\n"
376 "}",
377 9, 2));
378 EXPECT_EQ("{\n"
379 "{\n"
380 "public:\n"
381 " b;\n"
382 "}\n"
383 "}",
384 format("{\n"
385 "{\n"
386 "public:\n"
387 " b;\n"
388 "}\n"
389 "}",
390 17, 2));
391 EXPECT_EQ("{\n"
392 "{\n"
393 "a;\n"
394 "}\n"
395 "{\n"
396 " b; //\n"
397 "}\n"
398 "}",
399 format("{\n"
400 "{\n"
401 "a;\n"
402 "}\n"
403 "{\n"
404 " b; //\n"
405 "}\n"
406 "}",
407 22, 2));
408 EXPECT_EQ(" {\n"
409 " a; //\n"
410 " }",
411 format(" {\n"
412 "a; //\n"
413 " }",
414 4, 2));
415 EXPECT_EQ("void f() {}\n"
416 "void g() {}",
417 format("void f() {}\n"
418 "void g() {}",
419 13, 0));
420 EXPECT_EQ("int a; // comment\n"
421 " // line 2\n"
422 "int b;",
423 format("int a; // comment\n"
424 " // line 2\n"
425 " int b;",
426 35, 0));
427
428 EXPECT_EQ(" void f() {\n"
429 "#define A 1\n"
430 " }",
431 format(" void f() {\n"
432 " #define A 1\n" // Format this line.
433 " }",
434 20, 0));
435 EXPECT_EQ(" void f() {\n"
436 " int i;\n"
437 "#define A \\\n"
438 " int i; \\\n"
439 " int j;\n"
440 " int k;\n"
441 " }",
442 format(" void f() {\n"
443 " int i;\n"
444 "#define A \\\n"
445 " int i; \\\n"
446 " int j;\n"
447 " int k;\n" // Format this line.
448 " }",
449 67, 0));
450
451 Style.ColumnLimit = 11;
452 EXPECT_EQ(" int a;\n"
453 " void\n"
454 " ffffff() {\n"
455 " }",
456 format(" int a;\n"
457 "void ffffff() {}",
458 11, 0));
459 }
460
TEST_F(FormatTestSelective,UnderstandsTabs)461 TEST_F(FormatTestSelective, UnderstandsTabs) {
462 Style.IndentWidth = 8;
463 Style.UseTab = FormatStyle::UT_Always;
464 Style.AlignEscapedNewlinesLeft = true;
465 EXPECT_EQ("void f() {\n"
466 "\tf();\n"
467 "\tg();\n"
468 "}",
469 format("void f() {\n"
470 "\tf();\n"
471 "\tg();\n"
472 "}",
473 0, 0));
474 EXPECT_EQ("void f() {\n"
475 "\tf();\n"
476 "\tg();\n"
477 "}",
478 format("void f() {\n"
479 "\tf();\n"
480 "\tg();\n"
481 "}",
482 16, 0));
483 EXPECT_EQ("void f() {\n"
484 " \tf();\n"
485 "\tg();\n"
486 "}",
487 format("void f() {\n"
488 " \tf();\n"
489 " \tg();\n"
490 "}",
491 21, 0));
492 }
493
TEST_F(FormatTestSelective,StopFormattingWhenLeavingScope)494 TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
495 EXPECT_EQ(
496 "void f() {\n"
497 " if (a) {\n"
498 " g();\n"
499 " h();\n"
500 "}\n"
501 "\n"
502 "void g() {\n"
503 "}",
504 format("void f() {\n"
505 " if (a) {\n" // Assume this was added without the closing brace.
506 " g();\n"
507 " h();\n"
508 "}\n"
509 "\n"
510 "void g() {\n" // Make sure not to format this.
511 "}",
512 15, 0));
513 }
514
TEST_F(FormatTestSelective,SelectivelyRequoteJavaScript)515 TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
516 Style = getGoogleStyle(FormatStyle::LK_JavaScript);
517 EXPECT_EQ(
518 "var x = \"a\";\n"
519 "var x = 'a';\n"
520 "var x = \"a\";",
521 format("var x = \"a\";\n"
522 "var x = \"a\";\n"
523 "var x = \"a\";",
524 20, 0));
525 }
526
527 } // end namespace
528 } // end namespace format
529 } // end namespace clang
530