FormatTest.cpp revision c74e2794bebaab41213f23b27c09c21cb1e1f81b
1//===- unittest/Format/FormatTest.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 "clang/Format/Format.h"
11#include "../Tooling/RewriterTestContext.h"
12#include "clang/Lex/Lexer.h"
13#include "gtest/gtest.h"
14
15namespace clang {
16namespace format {
17
18class FormatTest : public ::testing::Test {
19protected:
20  std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length,
21                     const FormatStyle &Style) {
22    RewriterTestContext Context;
23    FileID ID = Context.createInMemoryFile("input.cc", Code);
24    SourceLocation Start =
25        Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset);
26    std::vector<CharSourceRange> Ranges(
27        1,
28        CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length)));
29    LangOptions LangOpts;
30    LangOpts.CPlusPlus = 1;
31    Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts);
32    tooling::Replacements Replace =
33        reformat(Style, Lex, Context.Sources, Ranges);
34    EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite));
35    return Context.getRewrittenText(ID);
36  }
37
38  std::string format(llvm::StringRef Code,
39                     const FormatStyle &Style = getLLVMStyle()) {
40    return format(Code, 0, Code.size(), Style);
41  }
42
43  void verifyFormat(llvm::StringRef Code) {
44    std::string WithoutFormat(Code.str());
45    for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) {
46      if (WithoutFormat[i] == '\n')
47        WithoutFormat[i] = ' ';
48    }
49    EXPECT_EQ(Code.str(), format(WithoutFormat));
50  }
51
52  void verifyGoogleFormat(llvm::StringRef Code) {
53    std::string WithoutFormat(Code.str());
54    for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) {
55      if (WithoutFormat[i] == '\n')
56        WithoutFormat[i] = ' ';
57    }
58    EXPECT_EQ(Code.str(), format(WithoutFormat, getGoogleStyle()));
59  }
60};
61
62//===----------------------------------------------------------------------===//
63// Basic function tests.
64//===----------------------------------------------------------------------===//
65
66TEST_F(FormatTest, DoesNotChangeCorrectlyFormatedCode) {
67  EXPECT_EQ(";", format(";"));
68}
69
70TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
71  EXPECT_EQ("int i;", format("  int i;"));
72  EXPECT_EQ("\nint i;", format(" \n\t \r  int i;"));
73  EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
74  EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
75}
76
77TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
78  EXPECT_EQ("int i;", format("int\ni;"));
79}
80
81TEST_F(FormatTest, FormatsNestedBlockStatements) {
82  EXPECT_EQ("{\n  {\n    {\n    }\n  }\n}", format("{{{}}}"));
83}
84
85TEST_F(FormatTest, FormatsNestedCall) {
86  verifyFormat("Method(f1, f2(f3));");
87  verifyFormat("Method(f1(f2, f3()));");
88}
89
90
91//===----------------------------------------------------------------------===//
92// Tests for control statements.
93//===----------------------------------------------------------------------===//
94
95TEST_F(FormatTest, FormatIfWithoutCompountStatement) {
96  verifyFormat("if (true)\n  f();\ng();");
97  verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
98  verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
99  EXPECT_EQ("if (a)\n  // comment\n  f();", format("if(a)\n// comment\nf();"));
100}
101
102TEST_F(FormatTest, ParseIfElse) {
103  verifyFormat("if (true)\n"
104               "  if (true)\n"
105               "    if (true)\n"
106               "      f();\n"
107               "    else\n"
108               "      g();\n"
109               "  else\n"
110               "    h();\n"
111               "else\n"
112               "  i();");
113  verifyFormat("if (true)\n"
114               "  if (true)\n"
115               "    if (true) {\n"
116               "      if (true)\n"
117               "        f();\n"
118               "    } else {\n"
119               "      g();\n"
120               "    }\n"
121               "  else\n"
122               "    h();\n"
123               "else {\n"
124               "  i();\n"
125               "}");
126}
127
128TEST_F(FormatTest, ElseIf) {
129  verifyFormat("if (a) {\n"
130               "} else if (b) {\n"
131               "}");
132  verifyFormat("if (a)\n"
133               "  f();\n"
134               "else if (b)\n"
135               "  g();\n"
136               "else\n"
137               "  h();");
138}
139
140TEST_F(FormatTest, FormatsForLoop) {
141  verifyFormat(
142      "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
143      "     ++VeryVeryLongLoopVariable)\n"
144      "  ;");
145  verifyFormat("for (;;)\n"
146               "  f();");
147  verifyFormat("for (;;) {\n"
148               "}");
149  verifyFormat("for (;;) {\n"
150               "  f();\n"
151               "}");
152}
153
154TEST_F(FormatTest, FormatsWhileLoop) {
155  verifyFormat("while (true) {\n}");
156  verifyFormat("while (true)\n"
157               "  f();");
158  verifyFormat("while () {\n"
159               "}");
160  verifyFormat("while () {\n"
161               "  f();\n"
162               "}");
163}
164
165TEST_F(FormatTest, FormatsDoWhile) {
166  verifyFormat("do {\n"
167               "  do_something();\n"
168               "} while (something());");
169  verifyFormat("do\n"
170               "  do_something();\n"
171               "while (something());");
172}
173
174TEST_F(FormatTest, FormatsSwitchStatement) {
175  verifyFormat("switch (x) {\n"
176               "case 1:\n"
177               "  f();\n"
178               "  break;\n"
179               "case kFoo:\n"
180               "case ns::kBar:\n"
181               "case kBaz:\n"
182               "  break;\n"
183               "default:\n"
184               "  g();\n"
185               "  break;\n"
186               "}");
187  verifyFormat("switch (x) {\n"
188               "case 1: {\n"
189               "  f();\n"
190               "  break;\n"
191               "}\n"
192               "}");
193  verifyFormat("switch (test)\n"
194               "  ;");
195  verifyGoogleFormat("switch (x) {\n"
196                     "  case 1:\n"
197                     "    f();\n"
198                     "    break;\n"
199                     "  case kFoo:\n"
200                     "  case ns::kBar:\n"
201                     "  case kBaz:\n"
202                     "    break;\n"
203                     "  default:\n"
204                     "    g();\n"
205                     "    break;\n"
206                     "}");
207  verifyGoogleFormat("switch (x) {\n"
208                     "  case 1: {\n"
209                     "    f();\n"
210                     "    break;\n"
211                     "  }\n"
212                     "}");
213  verifyGoogleFormat("switch (test)\n"
214                     "    ;");
215}
216
217TEST_F(FormatTest, FormatsLabels) {
218  verifyFormat("void f() {\n"
219               "  some_code();\n"
220               "test_label:\n"
221               "  some_other_code();\n"
222               "  {\n"
223               "    some_more_code();\n"
224               "  another_label:\n"
225               "    some_more_code();\n"
226               "  }\n"
227               "}");
228  verifyFormat("some_code();\n"
229               "test_label:\n"
230               "some_other_code();");
231}
232
233
234//===----------------------------------------------------------------------===//
235// Tests for comments.
236//===----------------------------------------------------------------------===//
237
238TEST_F(FormatTest, UnderstandsSingleLineComments) {
239  EXPECT_EQ("// line 1\n// line 2\nvoid f() {\n}\n",
240            format("// line 1\n// line 2\nvoid f() {}\n"));
241
242  EXPECT_EQ("void f() {\n  // Doesn't do anything\n}",
243            format("void f() {\n// Doesn't do anything\n}"));
244
245  EXPECT_EQ("int i  // This is a fancy variable\n    = 5;",
246            format("int i  // This is a fancy variable\n= 5;"));
247
248  verifyFormat("f(/*test=*/ true);");
249}
250
251
252//===----------------------------------------------------------------------===//
253// Tests for classes, namespaces, etc.
254//===----------------------------------------------------------------------===//
255
256TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
257  verifyFormat("class A {\n};");
258}
259
260TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
261  verifyFormat("class A {\n"
262               "public:\n"
263               "protected:\n"
264               "private:\n"
265               "  void f() {\n"
266               "  }\n"
267               "};");
268  verifyGoogleFormat("class A {\n"
269                     " public:\n"
270                     " protected:\n"
271                     " private:\n"
272                     "  void f() {\n"
273                     "  }\n"
274                     "};");
275}
276
277TEST_F(FormatTest, FormatsDerivedClass) {
278  verifyFormat("class A : public B {\n"
279               "};");
280  verifyFormat("class A : public ::B {\n"
281               "};");
282}
283
284TEST_F(FormatTest, FormatsEnum) {
285  verifyFormat("enum {\n"
286               "  Zero,\n"
287               "  One = 1,\n"
288               "  Two = One + 1,\n"
289               "  Three = (One + Two),\n"
290               "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
291               "  Five = (One, Two, Three, Four, 5)\n"
292               "};");
293  verifyFormat("enum Enum {\n"
294               "};");
295  verifyFormat("enum {\n"
296               "};");
297}
298
299TEST_F(FormatTest, FormatsNamespaces) {
300  verifyFormat("namespace some_namespace {\n"
301               "class A {\n"
302               "};\n"
303               "void f() {\n"
304               "  f();\n"
305               "}\n"
306               "}");
307  verifyFormat("namespace {\n"
308               "class A {\n"
309               "};\n"
310               "void f() {\n"
311               "  f();\n"
312               "}\n"
313               "}");
314  verifyFormat("using namespace some_namespace;\n"
315               "class A {\n"
316               "};\n"
317               "void f() {\n"
318               "  f();\n"
319               "}");
320}
321
322//===----------------------------------------------------------------------===//
323// Line break tests.
324//===----------------------------------------------------------------------===//
325
326TEST_F(FormatTest, FormatsFunctionDefinition) {
327  verifyFormat("void f(int a, int b, int c, int d, int e, int f, int g,"
328               " int h, int j, int f,\n"
329               "       int c, int ddddddddddddd) {\n"
330               "}");
331}
332
333TEST_F(FormatTest, FormatsAwesomeMethodCall) {
334  verifyFormat(
335      "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
336      "    parameter, parameter, parameter)), SecondLongCall(parameter));");
337}
338
339TEST_F(FormatTest, BreaksAsHighAsPossible) {
340  verifyFormat(
341      "if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
342      "    (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
343      "  f();");
344}
345
346TEST_F(FormatTest, BreaksDesireably) {
347  verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
348               "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
349               "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};");
350
351  verifyFormat(
352      "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
353      "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
354
355  verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
356               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
357               "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
358
359  verifyFormat(
360      "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
361      "                            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
362      "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
363      "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
364
365  verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
366               "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
367
368  // This test case breaks on an incorrect memoization, i.e. an optimization not
369  // taking into account the StopAt value.
370  verifyFormat(
371      "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
372      "    aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
373      "    aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
374      "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
375}
376
377TEST_F(FormatTest, AlignsStringLiterals) {
378  verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
379               "                                      \"short literal\");");
380  verifyFormat(
381      "looooooooooooooooooooooooongFunction(\n"
382      "    \"short literal\"\n"
383      "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
384}
385
386TEST_F(FormatTest, AlignsPipes) {
387  verifyFormat(
388      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
389      "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
390      "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
391  verifyFormat(
392      "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
393      "                     << aaaaaaaaaaaaaaaaaaaa;");
394  verifyFormat(
395      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
396      "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
397  verifyFormat(
398      "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
399      "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
400      "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
401  verifyFormat(
402      "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
403      "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
404      "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
405}
406
407TEST_F(FormatTest, UnderstandsEquals) {
408  verifyFormat(
409      "aaaaaaaaaaaaaaaaa =\n"
410      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
411  verifyFormat(
412      "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
413      "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
414      "}");
415  verifyFormat(
416      "if (a) {\n"
417      "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
418      "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
419      "}");
420
421  verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
422               "        100000000 + 100000000) {\n}");
423}
424
425TEST_F(FormatTest, UnderstandsTemplateParameters) {
426  verifyFormat("A<int> a;");
427  verifyFormat("A<A<A<int> > > a;");
428  verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
429  verifyFormat("bool x = a < 1 || 2 > a;");
430  verifyFormat("bool x = 5 < f<int>();");
431  verifyFormat("bool x = f<int>() > 5;");
432  verifyFormat("bool x = 5 < a<int>::x;");
433  verifyFormat("bool x = a < 4 ? a > 2 : false;");
434  verifyFormat("bool x = f() ? a < 2 : a > 2;");
435
436  verifyGoogleFormat("A<A<int>> a;");
437  verifyGoogleFormat("A<A<A<int>>> a;");
438  verifyGoogleFormat("A<A<A<A<int>>>> a;");
439
440  verifyFormat("test >> a >> b;");
441  verifyFormat("test << a >> b;");
442
443  verifyFormat("f<int>();");
444  verifyFormat("template <typename T> void f() {\n}");
445}
446
447TEST_F(FormatTest, UndestandsUnaryOperators) {
448  verifyFormat("int a = -2;");
449  verifyFormat("f(-1, -2, -3);");
450  verifyFormat("a[-1] = 5;");
451  verifyFormat("int a = 5 + -2;");
452  verifyFormat("if (i == -1) {\n}");
453  verifyFormat("if (i != -1) {\n}");
454  verifyFormat("if (i > -1) {\n}");
455  verifyFormat("if (i < -1) {\n}");
456  verifyFormat("++(a->f());");
457  verifyFormat("--(a->f());");
458  verifyFormat("if (!(a->f())) {\n}");
459}
460
461TEST_F(FormatTest, UndestandsOverloadedOperators) {
462  verifyFormat("bool operator<() {\n}");
463}
464
465TEST_F(FormatTest, UnderstandsUsesOfStar) {
466  verifyFormat("int *f(int *a) {\n}");
467  verifyFormat("f(a, *a);");
468  verifyFormat("f(*a);");
469  verifyFormat("int a = b * 10;");
470  verifyFormat("int a = 10 * b;");
471  verifyFormat("int a = b * c;");
472  verifyFormat("int a += b * c;");
473  verifyFormat("int a -= b * c;");
474  verifyFormat("int a *= b * c;");
475  verifyFormat("int a /= b * c;");
476  verifyFormat("int a = *b;");
477  verifyFormat("int a = *b * c;");
478  verifyFormat("int a = b * *c;");
479  verifyFormat("int main(int argc, char **argv) {\n}");
480
481  verifyGoogleFormat("int main(int argc, char** argv) {\n}");
482}
483
484TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
485  verifyFormat("(a)->b();");
486  verifyFormat("--a;");
487}
488
489TEST_F(FormatTest, HandlesIncludeDirectives) {
490  EXPECT_EQ("#include <string>\n", format("#include <string>\n"));
491  EXPECT_EQ("#include \"a/b/string\"\n", format("#include \"a/b/string\"\n"));
492  EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
493  EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
494}
495
496
497//===----------------------------------------------------------------------===//
498// Error recovery tests.
499//===----------------------------------------------------------------------===//
500
501//TEST_F(FormatTest, IncorrectDerivedClass) {
502//  verifyFormat("public B {\n"
503//               "};");
504//}
505
506TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
507  verifyFormat("{");
508}
509
510TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
511  verifyFormat("do {\n"
512               "};");
513  verifyFormat("do {\n"
514               "};\n"
515               "f();");
516  verifyFormat("do {\n"
517               "}\n"
518               "wheeee(fun);");
519  verifyFormat("do {\n"
520               "  f();\n"
521               "};");
522}
523
524TEST_F(FormatTest, IncorrectCodeErrorDetection) {
525  EXPECT_EQ("{\n{\n}\n", format("{\n{\n}\n"));
526  EXPECT_EQ("{\n  {\n}\n", format("{\n  {\n}\n"));
527  EXPECT_EQ("{\n  {\n  }\n", format("{\n  {\n  }\n"));
528  EXPECT_EQ("{\n  {\n    }\n  }\n}\n", format("{\n  {\n    }\n  }\n}\n"));
529
530  FormatStyle Style = getLLVMStyle();
531  Style.ColumnLimit = 10;
532  EXPECT_EQ("{\n"
533            "    {\n"
534            " breakme(\n"
535            "     qwe);\n"
536            "}\n", format("{\n"
537                          "    {\n"
538                          " breakme(qwe);\n"
539                          "}\n", Style));
540
541}
542
543}  // end namespace tooling
544}  // end namespace clang
545