blob: 9c4d1c3d2b011ad50a7026b9442afe5ad3b0700f [file] [log] [blame]
Daniel Jasperd246a5a2015-06-15 15:25:11 +00001//===- 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
17namespace clang {
18namespace format {
19namespace {
20
21class FormatTestSelective : public ::testing::Test {
22protected:
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 std::string Result = applyAllReplacements(Code, Replaces);
32 EXPECT_NE("", Result);
33 DEBUG(llvm::errs() << "\n" << Result << "\n\n");
34 return Result;
35 }
36
37 FormatStyle Style = getLLVMStyle();
38};
39
40TEST_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
47TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
Daniel Jaspera1036e52015-10-28 01:08:22 +000048 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));
Daniel Jasperd246a5a2015-06-15 15:25:11 +000056
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
74TEST_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
83TEST_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
88TEST_F(FormatTestSelective, ReformatsMovedLines) {
89 EXPECT_EQ(
90 "template <typename T> T *getFETokenInfo() const {\n"
91 " return static_cast<T *>(FETokenInfo);\n"
92 "}\n"
Daniel Jaspera1036e52015-10-28 01:08:22 +000093 "int a; // <- Should not be formatted",
Daniel Jasperd246a5a2015-06-15 15:25:11 +000094 format(
95 "template<typename T>\n"
96 "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
Daniel Jaspera1036e52015-10-28 01:08:22 +000097 "int a; // <- Should not be formatted",
Daniel Jasperd246a5a2015-06-15 15:25:11 +000098 9, 5));
99}
100
101TEST_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
108TEST_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"
Daniel Jaspera1036e52015-10-28 01:08:22 +0000151 "//This is unrelated",
Daniel Jasperd246a5a2015-06-15 15:25:11 +0000152 format("int a; // This\n"
153 " // is\n"
154 " // a\n"
155 "\n"
Daniel Jaspera1036e52015-10-28 01:08:22 +0000156 "//This is unrelated",
Daniel Jasperd246a5a2015-06-15 15:25:11 +0000157 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}
166
167TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
168 EXPECT_EQ("DEBUG({\n"
169 " int i;\n"
170 " int j;\n"
171 "});",
172 format("DEBUG( {\n"
173 " int i;\n"
174 " int j;\n"
175 "} ) ;",
176 20, 1));
177 EXPECT_EQ("DEBUG( {\n"
178 " int i;\n"
179 " int j;\n"
180 "} ) ;",
181 format("DEBUG( {\n"
182 " int i;\n"
183 " int j;\n"
184 "} ) ;",
185 41, 1));
186 EXPECT_EQ("DEBUG( {\n"
187 " int i;\n"
188 " int j;\n"
189 "} ) ;",
190 format("DEBUG( {\n"
191 " int i;\n"
192 " int j;\n"
193 "} ) ;",
194 41, 1));
195 EXPECT_EQ("DEBUG({\n"
196 " int i;\n"
197 " int j;\n"
198 "});",
199 format("DEBUG( {\n"
200 " int i;\n"
201 " int j;\n"
202 "} ) ;",
203 20, 1));
204
205 EXPECT_EQ("Debug({\n"
206 " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
207 " return;\n"
208 " },\n"
209 " a);",
210 format("Debug({\n"
211 " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
212 " return;\n"
213 " },\n"
214 " a);",
215 50, 1));
216 EXPECT_EQ("DEBUG({\n"
217 " DEBUG({\n"
218 " int a;\n"
219 " int b;\n"
220 " }) ;\n"
221 "});",
222 format("DEBUG({\n"
223 " DEBUG({\n"
224 " int a;\n"
225 " int b;\n" // Format this line only.
226 " }) ;\n" // Don't touch this line.
227 "});",
228 35, 0));
229 EXPECT_EQ("DEBUG({\n"
230 " int a; //\n"
231 "});",
232 format("DEBUG({\n"
233 " int a; //\n"
234 "});",
235 0, 0));
236 EXPECT_EQ("someFunction(\n"
237 " [] {\n"
238 " // Only with this comment.\n"
239 " int i; // invoke formatting here.\n"
240 " }, // force line break\n"
241 " aaa);",
242 format("someFunction(\n"
243 " [] {\n"
244 " // Only with this comment.\n"
245 " int i; // invoke formatting here.\n"
246 " }, // force line break\n"
247 " aaa);",
248 63, 1));
249
250 EXPECT_EQ("int longlongname; // comment\n"
251 "int x = f({\n"
252 " int x; // comment\n"
253 " int y; // comment\n"
254 "});",
255 format("int longlongname; // comment\n"
256 "int x = f({\n"
257 " int x; // comment\n"
258 " int y; // comment\n"
259 "});",
260 65, 0));
261 EXPECT_EQ("int s = f({\n"
262 " class X {\n"
263 " public:\n"
264 " void f();\n"
265 " };\n"
266 "});",
267 format("int s = f({\n"
268 " class X {\n"
269 " public:\n"
270 " void f();\n"
271 " };\n"
272 "});",
273 0, 0));
274}
275
276TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
277 Style.AlignEscapedNewlinesLeft = true;
278 EXPECT_EQ("int i;\n"
279 "#define A \\\n"
280 " int i; \\\n"
281 " int j\n"
282 "int k;",
283 format("int i;\n"
284 "#define A \\\n"
285 " int i ; \\\n"
286 " int j\n"
287 "int k;",
288 8, 0)); // 8: position of "#define".
289 EXPECT_EQ("int i;\n"
290 "#define A \\\n"
291 " int i; \\\n"
292 " int j\n"
293 "int k;",
294 format("int i;\n"
295 "#define A \\\n"
296 " int i ; \\\n"
297 " int j\n"
298 "int k;",
299 45, 0)); // 45: position of "j".
300}
301
302TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
303 EXPECT_EQ("{\n"
304 "{\n"
305 "a;\n"
306 "b;\n"
307 "}\n"
308 "}",
309 format("{\n"
310 "{\n"
311 "a;\n"
312 " b;\n"
313 "}\n"
314 "}",
315 13, 2));
316 EXPECT_EQ("{\n"
317 "{\n"
318 " a;\n"
Daniel Jaspera1036e52015-10-28 01:08:22 +0000319 " b;\n"
320 " c;\n"
321 " d;\n"
Daniel Jasperd246a5a2015-06-15 15:25:11 +0000322 "}\n"
323 "}",
324 format("{\n"
325 "{\n"
326 " a;\n"
Daniel Jaspera1036e52015-10-28 01:08:22 +0000327 " b;\n"
328 " c;\n"
329 " d;\n"
Daniel Jasperd246a5a2015-06-15 15:25:11 +0000330 "}\n"
331 "}",
332 9, 2));
333 EXPECT_EQ("{\n"
334 "{\n"
335 "public:\n"
336 " b;\n"
337 "}\n"
338 "}",
339 format("{\n"
340 "{\n"
341 "public:\n"
342 " b;\n"
343 "}\n"
344 "}",
345 17, 2));
346 EXPECT_EQ("{\n"
347 "{\n"
348 "a;\n"
349 "}\n"
350 "{\n"
351 " b; //\n"
352 "}\n"
353 "}",
354 format("{\n"
355 "{\n"
356 "a;\n"
357 "}\n"
358 "{\n"
359 " b; //\n"
360 "}\n"
361 "}",
362 22, 2));
363 EXPECT_EQ(" {\n"
364 " a; //\n"
365 " }",
366 format(" {\n"
367 "a; //\n"
368 " }",
369 4, 2));
370 EXPECT_EQ("void f() {}\n"
371 "void g() {}",
372 format("void f() {}\n"
373 "void g() {}",
374 13, 0));
375 EXPECT_EQ("int a; // comment\n"
376 " // line 2\n"
377 "int b;",
378 format("int a; // comment\n"
379 " // line 2\n"
380 " int b;",
381 35, 0));
382
383 EXPECT_EQ(" void f() {\n"
384 "#define A 1\n"
385 " }",
386 format(" void f() {\n"
387 " #define A 1\n" // Format this line.
388 " }",
389 20, 0));
390 EXPECT_EQ(" void f() {\n"
391 " int i;\n"
392 "#define A \\\n"
393 " int i; \\\n"
394 " int j;\n"
395 " int k;\n"
396 " }",
397 format(" void f() {\n"
398 " int i;\n"
399 "#define A \\\n"
400 " int i; \\\n"
401 " int j;\n"
402 " int k;\n" // Format this line.
403 " }",
404 67, 0));
405
406 Style.ColumnLimit = 11;
407 EXPECT_EQ(" int a;\n"
408 " void\n"
409 " ffffff() {\n"
410 " }",
411 format(" int a;\n"
412 "void ffffff() {}",
413 11, 0));
414}
415
416TEST_F(FormatTestSelective, UnderstandsTabs) {
417 Style.IndentWidth = 8;
418 Style.UseTab = FormatStyle::UT_Always;
419 Style.AlignEscapedNewlinesLeft = true;
420 EXPECT_EQ("void f() {\n"
421 "\tf();\n"
422 "\tg();\n"
423 "}",
424 format("void f() {\n"
425 "\tf();\n"
426 "\tg();\n"
427 "}",
428 0, 0));
429 EXPECT_EQ("void f() {\n"
430 "\tf();\n"
431 "\tg();\n"
432 "}",
433 format("void f() {\n"
434 "\tf();\n"
435 "\tg();\n"
436 "}",
437 16, 0));
438 EXPECT_EQ("void f() {\n"
439 " \tf();\n"
440 "\tg();\n"
441 "}",
442 format("void f() {\n"
443 " \tf();\n"
444 " \tg();\n"
445 "}",
446 21, 0));
447}
448
Daniel Jasperf67c3242015-11-01 00:27:35 +0000449TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
450 EXPECT_EQ(
451 "void f() {\n"
452 " if (a) {\n"
453 " g();\n"
454 " h();\n"
455 "}\n"
456 "\n"
457 "void g() {\n"
458 "}",
459 format("void f() {\n"
460 " if (a) {\n" // Assume this was added without the closing brace.
461 " g();\n"
462 " h();\n"
463 "}\n"
464 "\n"
465 "void g() {\n" // Make sure not to format this.
466 "}",
467 15, 0));
468}
469
Daniel Jasperd246a5a2015-06-15 15:25:11 +0000470} // end namespace
471} // end namespace format
472} // end namespace clang