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 #define DEBUG_TYPE "format-test"
11 
12 #include "clang/Format/Format.h"
13 #include "../Tooling/RewriterTestContext.h"
14 #include "clang/Lex/Lexer.h"
15 #include "llvm/Support/Debug.h"
16 #include "gtest/gtest.h"
17 
18 namespace clang {
19 namespace format {
20 
21 class FormatTest : public ::testing::Test {
22 protected:
23   std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length,
24                      const FormatStyle &Style) {
25     DEBUG(llvm::errs() << "---\n");
26     RewriterTestContext Context;
27     FileID ID = Context.createInMemoryFile("input.cc", Code);
28     SourceLocation Start =
29         Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset);
30     std::vector<CharSourceRange> Ranges(
31         1,
32         CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length)));
33     Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources,
34               getFormattingLangOpts());
35     tooling::Replacements Replace = reformat(
36         Style, Lex, Context.Sources, Ranges, new IgnoringDiagConsumer());
37     ReplacementCount = Replace.size();
38     EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite));
39     DEBUG(llvm::errs() << "\n" << Context.getRewrittenText(ID) << "\n\n");
40     return Context.getRewrittenText(ID);
41   }
42 
43   std::string
44   format(llvm::StringRef Code, const FormatStyle &Style = getLLVMStyle()) {
45     return format(Code, 0, Code.size(), Style);
46   }
47 
48   std::string messUp(llvm::StringRef Code) {
49     std::string MessedUp(Code.str());
50     bool InComment = false;
51     bool InPreprocessorDirective = false;
52     bool JustReplacedNewline = false;
53     for (unsigned i = 0, e = MessedUp.size() - 1; i != e; ++i) {
54       if (MessedUp[i] == '/' && MessedUp[i + 1] == '/') {
55         if (JustReplacedNewline)
56           MessedUp[i - 1] = '\n';
57         InComment = true;
58       } else if (MessedUp[i] == '#' && (JustReplacedNewline || i == 0)) {
59         if (i != 0)
60           MessedUp[i - 1] = '\n';
61         InPreprocessorDirective = true;
62       } else if (MessedUp[i] == '\\' && MessedUp[i + 1] == '\n') {
63         MessedUp[i] = ' ';
64         MessedUp[i + 1] = ' ';
65       } else if (MessedUp[i] == '\n') {
66         if (InComment) {
67           InComment = false;
68         } else if (InPreprocessorDirective) {
69           InPreprocessorDirective = false;
70         } else {
71           JustReplacedNewline = true;
72           MessedUp[i] = ' ';
73         }
74       } else if (MessedUp[i] != ' ') {
75         JustReplacedNewline = false;
76       }
77     }
78     return MessedUp;
79   }
80 
81   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
82     FormatStyle Style = getLLVMStyle();
83     Style.ColumnLimit = ColumnLimit;
84     return Style;
85   }
86 
87   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
88     FormatStyle Style = getGoogleStyle();
89     Style.ColumnLimit = ColumnLimit;
90     return Style;
91   }
92 
93   void verifyFormat(llvm::StringRef Code,
94                     const FormatStyle &Style = getLLVMStyle()) {
95     EXPECT_EQ(Code.str(), format(messUp(Code), Style));
96   }
97 
98   void verifyGoogleFormat(llvm::StringRef Code) {
99     verifyFormat(Code, getGoogleStyle());
100   }
101 
102   void verifyIndependentOfContext(llvm::StringRef text) {
103     verifyFormat(text);
104     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
105   }
106 
107   int ReplacementCount;
108 };
109 
110 TEST_F(FormatTest, MessUp) {
111   EXPECT_EQ("1 2 3", messUp("1 2 3"));
112   EXPECT_EQ("1 2 3\n", messUp("1\n2\n3\n"));
113   EXPECT_EQ("a\n//b\nc", messUp("a\n//b\nc"));
114   EXPECT_EQ("a\n#b\nc", messUp("a\n#b\nc"));
115   EXPECT_EQ("a\n#b  c  d\ne", messUp("a\n#b\\\nc\\\nd\ne"));
116 }
117 
118 //===----------------------------------------------------------------------===//
119 // Basic function tests.
120 //===----------------------------------------------------------------------===//
121 
122 TEST_F(FormatTest, DoesNotChangeCorrectlyFormatedCode) {
123   EXPECT_EQ(";", format(";"));
124 }
125 
126 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
127   EXPECT_EQ("int i;", format("  int i;"));
128   EXPECT_EQ("\nint i;", format(" \n\t \r  int i;"));
129   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
130   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
131 }
132 
133 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
134   EXPECT_EQ("int i;", format("int\ni;"));
135 }
136 
137 TEST_F(FormatTest, FormatsNestedBlockStatements) {
138   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
139 }
140 
141 TEST_F(FormatTest, FormatsNestedCall) {
142   verifyFormat("Method(f1, f2(f3));");
143   verifyFormat("Method(f1(f2, f3()));");
144   verifyFormat("Method(f1(f2, (f3())));");
145 }
146 
147 TEST_F(FormatTest, NestedNameSpecifiers) {
148   verifyFormat("vector< ::Type> v;");
149   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
150 }
151 
152 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
153   EXPECT_EQ("if (a) {\n"
154             "  f();\n"
155             "}",
156             format("if(a){f();}"));
157   EXPECT_EQ(4, ReplacementCount);
158   EXPECT_EQ("if (a) {\n"
159             "  f();\n"
160             "}",
161             format("if (a) {\n"
162                    "  f();\n"
163                    "}"));
164   EXPECT_EQ(0, ReplacementCount);
165 }
166 
167 TEST_F(FormatTest, RemovesTrailingWhitespaceOfFormattedLine) {
168   EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0, getLLVMStyle()));
169   EXPECT_EQ("int a;", format("int a;         "));
170   EXPECT_EQ("int a;\n", format("int a;  \n   \n   \n "));
171   EXPECT_EQ("int a;\nint b;    ",
172             format("int a;  \nint b;    ", 0, 0, getLLVMStyle()));
173 }
174 
175 TEST_F(FormatTest, FormatsCorrectRegionForLeadingWhitespace) {
176   EXPECT_EQ("int b;\nint a;",
177             format("int b;\n   int a;", 7, 0, getLLVMStyle()));
178   EXPECT_EQ("int b;\n   int a;",
179             format("int b;\n   int a;", 6, 0, getLLVMStyle()));
180 
181   EXPECT_EQ("#define A  \\\n"
182             "  int a;   \\\n"
183             "  int b;",
184             format("#define A  \\\n"
185                    "  int a;   \\\n"
186                    "    int b;",
187                    26, 0, getLLVMStyleWithColumns(12)));
188   EXPECT_EQ("#define A  \\\n"
189             "  int a;   \\\n"
190             "    int b;",
191             format("#define A  \\\n"
192                    "  int a;   \\\n"
193                    "    int b;",
194                    25, 0, getLLVMStyleWithColumns(12)));
195 }
196 
197 TEST_F(FormatTest, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
198   EXPECT_EQ("int  a;\n\n int b;",
199             format("int  a;\n  \n\n int b;", 7, 0, getLLVMStyle()));
200   EXPECT_EQ("int  a;\n\n int b;",
201             format("int  a;\n  \n\n int b;", 9, 0, getLLVMStyle()));
202 }
203 
204 TEST_F(FormatTest, ReformatsMovedLines) {
205   EXPECT_EQ(
206       "template <typename T> T *getFETokenInfo() const {\n"
207       "  return static_cast<T *>(FETokenInfo);\n"
208       "}\n"
209       "  int a; // <- Should not be formatted",
210       format(
211           "template<typename T>\n"
212           "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
213           "  int a; // <- Should not be formatted",
214           9, 5, getLLVMStyle()));
215 }
216 
217 //===----------------------------------------------------------------------===//
218 // Tests for control statements.
219 //===----------------------------------------------------------------------===//
220 
221 TEST_F(FormatTest, FormatIfWithoutCompountStatement) {
222   verifyFormat("if (true)\n  f();\ng();");
223   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
224   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
225 
226   FormatStyle AllowsMergedIf = getGoogleStyle();
227   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
228   verifyFormat("if (a)\n"
229                "  // comment\n"
230                "  f();",
231                AllowsMergedIf);
232 
233   verifyFormat("if (a)  // Can't merge this\n"
234                "  f();\n",
235                AllowsMergedIf);
236   verifyFormat("if (a) /* still don't merge */\n"
237                "  f();",
238                AllowsMergedIf);
239   verifyFormat("if (a) {  // Never merge this\n"
240                "  f();\n"
241                "}",
242                AllowsMergedIf);
243   verifyFormat("if (a) { /* Never merge this */\n"
244                "  f();\n"
245                "}",
246                AllowsMergedIf);
247 
248   AllowsMergedIf.ColumnLimit = 14;
249   verifyFormat("if (a) return;", AllowsMergedIf);
250   verifyFormat("if (aaaaaaaaa)\n"
251                "  return;",
252                AllowsMergedIf);
253 
254   AllowsMergedIf.ColumnLimit = 13;
255   verifyFormat("if (a)\n  return;", AllowsMergedIf);
256 }
257 
258 TEST_F(FormatTest, ParseIfElse) {
259   verifyFormat("if (true)\n"
260                "  if (true)\n"
261                "    if (true)\n"
262                "      f();\n"
263                "    else\n"
264                "      g();\n"
265                "  else\n"
266                "    h();\n"
267                "else\n"
268                "  i();");
269   verifyFormat("if (true)\n"
270                "  if (true)\n"
271                "    if (true) {\n"
272                "      if (true)\n"
273                "        f();\n"
274                "    } else {\n"
275                "      g();\n"
276                "    }\n"
277                "  else\n"
278                "    h();\n"
279                "else {\n"
280                "  i();\n"
281                "}");
282 }
283 
284 TEST_F(FormatTest, ElseIf) {
285   verifyFormat("if (a) {\n} else if (b) {\n}");
286   verifyFormat("if (a)\n"
287                "  f();\n"
288                "else if (b)\n"
289                "  g();\n"
290                "else\n"
291                "  h();");
292 }
293 
294 TEST_F(FormatTest, FormatsForLoop) {
295   verifyFormat(
296       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
297       "     ++VeryVeryLongLoopVariable)\n"
298       "  ;");
299   verifyFormat("for (;;)\n"
300                "  f();");
301   verifyFormat("for (;;) {\n}");
302   verifyFormat("for (;;) {\n"
303                "  f();\n"
304                "}");
305 
306   verifyFormat(
307       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
308       "                                          E = UnwrappedLines.end();\n"
309       "     I != E; ++I) {\n}");
310 
311   verifyFormat(
312       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
313       "     ++IIIII) {\n}");
314   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
315                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
316                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
317   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
318                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
319                "         E = FD->getDeclsInPrototypeScope().end();\n"
320                "     I != E; ++I) {\n}");
321 
322   // FIXME: Not sure whether we want extra identation in line 3 here:
323   verifyFormat(
324       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
325       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
326       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
327       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
328       "     ++aaaaaaaaaaa) {\n}");
329   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
330                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
331                "}");
332   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
333                "         aaaaaaaaaa);\n"
334                "     iter; ++iter) {\n"
335                "}");
336 
337   FormatStyle NoBinPacking = getLLVMStyle();
338   NoBinPacking.BinPackParameters = false;
339   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
340                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
341                "                                           aaaaaaaaaaaaaaaa,\n"
342                "                                           aaaaaaaaaaaaaaaa,\n"
343                "                                           aaaaaaaaaaaaaaaa);\n"
344                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
345                "}",
346                NoBinPacking);
347   verifyFormat(
348       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
349       "                                          E = UnwrappedLines.end();\n"
350       "     I != E;\n"
351       "     ++I) {\n}",
352       NoBinPacking);
353 }
354 
355 TEST_F(FormatTest, RangeBasedForLoops) {
356   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
357                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
358   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
359                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
360   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
361                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
362 }
363 
364 TEST_F(FormatTest, FormatsWhileLoop) {
365   verifyFormat("while (true) {\n}");
366   verifyFormat("while (true)\n"
367                "  f();");
368   verifyFormat("while () {\n}");
369   verifyFormat("while () {\n"
370                "  f();\n"
371                "}");
372 }
373 
374 TEST_F(FormatTest, FormatsDoWhile) {
375   verifyFormat("do {\n"
376                "  do_something();\n"
377                "} while (something());");
378   verifyFormat("do\n"
379                "  do_something();\n"
380                "while (something());");
381 }
382 
383 TEST_F(FormatTest, FormatsSwitchStatement) {
384   verifyFormat("switch (x) {\n"
385                "case 1:\n"
386                "  f();\n"
387                "  break;\n"
388                "case kFoo:\n"
389                "case ns::kBar:\n"
390                "case kBaz:\n"
391                "  break;\n"
392                "default:\n"
393                "  g();\n"
394                "  break;\n"
395                "}");
396   verifyFormat("switch (x) {\n"
397                "case 1: {\n"
398                "  f();\n"
399                "  break;\n"
400                "}\n"
401                "}");
402   verifyFormat("switch (x) {\n"
403                "case 1: {\n"
404                "  f();\n"
405                "  {\n"
406                "    g();\n"
407                "    h();\n"
408                "  }\n"
409                "  break;\n"
410                "}\n"
411                "}");
412   verifyFormat("switch (x) {\n"
413                "case 1: {\n"
414                "  f();\n"
415                "  if (foo) {\n"
416                "    g();\n"
417                "    h();\n"
418                "  }\n"
419                "  break;\n"
420                "}\n"
421                "}");
422   verifyFormat("switch (x) {\n"
423                "case 1: {\n"
424                "  f();\n"
425                "  g();\n"
426                "} break;\n"
427                "}");
428   verifyFormat("switch (test)\n"
429                "  ;");
430   verifyFormat("switch (x) {\n"
431                "default: {\n"
432                "  // Do nothing.\n"
433                "}\n"
434                "}");
435   verifyFormat("switch (x) {\n"
436                "// comment\n"
437                "// if 1, do f()\n"
438                "case 1:\n"
439                "  f();\n"
440                "}");
441   verifyFormat("switch (x) {\n"
442                "case 1:\n"
443                "  // Do amazing stuff\n"
444                "  {\n"
445                "    f();\n"
446                "    g();\n"
447                "  }\n"
448                "  break;\n"
449                "}");
450   verifyFormat("#define A          \\\n"
451                "  switch (x) {     \\\n"
452                "  case a:          \\\n"
453                "    foo = b;       \\\n"
454                "  }", getLLVMStyleWithColumns(20));
455 
456   verifyGoogleFormat("switch (x) {\n"
457                      "  case 1:\n"
458                      "    f();\n"
459                      "    break;\n"
460                      "  case kFoo:\n"
461                      "  case ns::kBar:\n"
462                      "  case kBaz:\n"
463                      "    break;\n"
464                      "  default:\n"
465                      "    g();\n"
466                      "    break;\n"
467                      "}");
468   verifyGoogleFormat("switch (x) {\n"
469                      "  case 1: {\n"
470                      "    f();\n"
471                      "    break;\n"
472                      "  }\n"
473                      "}");
474   verifyGoogleFormat("switch (test)\n"
475                      "    ;");
476 }
477 
478 TEST_F(FormatTest, FormatsLabels) {
479   verifyFormat("void f() {\n"
480                "  some_code();\n"
481                "test_label:\n"
482                "  some_other_code();\n"
483                "  {\n"
484                "    some_more_code();\n"
485                "  another_label:\n"
486                "    some_more_code();\n"
487                "  }\n"
488                "}");
489   verifyFormat("some_code();\n"
490                "test_label:\n"
491                "some_other_code();");
492 }
493 
494 //===----------------------------------------------------------------------===//
495 // Tests for comments.
496 //===----------------------------------------------------------------------===//
497 
498 TEST_F(FormatTest, UnderstandsSingleLineComments) {
499   verifyFormat("//* */");
500   verifyFormat("// line 1\n"
501                "// line 2\n"
502                "void f() {}\n");
503 
504   verifyFormat("void f() {\n"
505                "  // Doesn't do anything\n"
506                "}");
507   verifyFormat("void f(int i,  // some comment (probably for i)\n"
508                "       int j,  // some comment (probably for j)\n"
509                "       int k); // some comment (probably for k)");
510   verifyFormat("void f(int i,\n"
511                "       // some comment (probably for j)\n"
512                "       int j,\n"
513                "       // some comment (probably for k)\n"
514                "       int k);");
515 
516   verifyFormat("int i    // This is a fancy variable\n"
517                "    = 5; // with nicely aligned comment.");
518 
519   verifyFormat("// Leading comment.\n"
520                "int a; // Trailing comment.");
521   verifyFormat("int a; // Trailing comment\n"
522                "       // on 2\n"
523                "       // or 3 lines.\n"
524                "int b;");
525   verifyFormat("int a; // Trailing comment\n"
526                "\n"
527                "// Leading comment.\n"
528                "int b;");
529   verifyFormat("int a;    // Comment.\n"
530                "          // More details.\n"
531                "int bbbb; // Another comment.");
532   verifyFormat(
533       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
534       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   // comment\n"
535       "int cccccccccccccccccccccccccccccc;       // comment\n"
536       "int ddd;                     // looooooooooooooooooooooooong comment\n"
537       "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
538       "int bbbbbbbbbbbbbbbbbbbbb;   // comment\n"
539       "int ccccccccccccccccccc;     // comment");
540 
541   verifyFormat("#include \"a\"     // comment\n"
542                "#include \"a/b/c\" // comment");
543   verifyFormat("#include <a>     // comment\n"
544                "#include <a/b/c> // comment");
545 
546   verifyFormat("enum E {\n"
547                "  // comment\n"
548                "  VAL_A, // comment\n"
549                "  VAL_B\n"
550                "};");
551 
552   verifyFormat(
553       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
554       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
555   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
556                "    // Comment inside a statement.\n"
557                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
558   verifyFormat(
559       "bool aaaaaaaaaaaaa = // comment\n"
560       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
561       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
562 
563   verifyFormat("int aaaa; // aaaaa\n"
564                "int aa;   // aaaaaaa",
565                getLLVMStyleWithColumns(20));
566 
567   EXPECT_EQ("void f() { // This does something ..\n"
568             "}\n"
569             "int a; // This is unrelated",
570             format("void f()    {     // This does something ..\n"
571                    "  }\n"
572                    "int   a;     // This is unrelated"));
573   EXPECT_EQ("void f() { // This does something ..\n"
574             "}          // awesome..\n"
575             "\n"
576             "int a; // This is unrelated",
577             format("void f()    { // This does something ..\n"
578                    "      } // awesome..\n"
579                    " \n"
580                    "int a;    // This is unrelated"));
581 
582   EXPECT_EQ("int i; // single line trailing comment",
583             format("int i;\\\n// single line trailing comment"));
584 
585   verifyGoogleFormat("int a;  // Trailing comment.");
586 
587   verifyFormat("someFunction(anotherFunction( // Force break.\n"
588                "    parameter));");
589 
590   verifyGoogleFormat("#endif  // HEADER_GUARD");
591 
592   verifyFormat("const char *test[] = {\n"
593                "  // A\n"
594                "  \"aaaa\",\n"
595                "  // B\n"
596                "  \"aaaaa\",\n"
597                "};");
598   verifyGoogleFormat(
599       "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
600       "    aaaaaaaaaaaaaaaaaaaaaa);  // 81 cols with this comment");
601   EXPECT_EQ("D(a, {\n"
602             "  // test\n"
603             "  int a;\n"
604             "});",
605             format("D(a, {\n"
606                    "// test\n"
607                    "int a;\n"
608                    "});"));
609 }
610 
611 TEST_F(FormatTest, CanFormatCommentsLocally) {
612   EXPECT_EQ("int a;    // comment\n"
613             "int    b; // comment",
614             format("int   a; // comment\n"
615                    "int    b; // comment",
616                    0, 0, getLLVMStyle()));
617   EXPECT_EQ("int   a; // comment\n"
618             "         // line 2\n"
619             "int b;",
620             format("int   a; // comment\n"
621                    "            // line 2\n"
622                    "int b;",
623                    28, 0, getLLVMStyle()));
624 }
625 
626 TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
627   EXPECT_EQ("// comment", format("// comment  "));
628   EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
629             format("int aaaaaaa, bbbbbbb; // comment                   ",
630                    getLLVMStyleWithColumns(33)));
631 }
632 
633 TEST_F(FormatTest, UnderstandsMultiLineComments) {
634   verifyFormat("f(/*test=*/ true);");
635   EXPECT_EQ(
636       "f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
637       "  bbbbbbbbbbbbbbbbbbbbbbbbb);",
638       format("f(aaaaaaaaaaaaaaaaaaaaaaaaa ,   \\\n/* Trailing comment for aa... */\n"
639              "  bbbbbbbbbbbbbbbbbbbbbbbbb);"));
640   EXPECT_EQ(
641       "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
642       "  /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
643       format("f(aaaaaaaaaaaaaaaaaaaaaaaaa    ,   \n"
644              "/* Leading comment for bb... */   bbbbbbbbbbbbbbbbbbbbbbbbb);"));
645 
646   FormatStyle NoBinPacking = getLLVMStyle();
647   NoBinPacking.BinPackParameters = false;
648   verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
649                "         /* parameter 2 */ aaaaaa,\n"
650                "         /* parameter 3 */ aaaaaa,\n"
651                "         /* parameter 4 */ aaaaaa);",
652                NoBinPacking);
653 }
654 
655 TEST_F(FormatTest, AlignsMultiLineComments) {
656   EXPECT_EQ("/*\n"
657             " * Really multi-line\n"
658             " * comment.\n"
659             " */\n"
660             "void f() {}",
661             format("  /*\n"
662                    "   * Really multi-line\n"
663                    "   * comment.\n"
664                    "   */\n"
665                    "  void f() {}"));
666   EXPECT_EQ("class C {\n"
667             "  /*\n"
668             "   * Another multi-line\n"
669             "   * comment.\n"
670             "   */\n"
671             "  void f() {}\n"
672             "};",
673             format("class C {\n"
674                    "/*\n"
675                    " * Another multi-line\n"
676                    " * comment.\n"
677                    " */\n"
678                    "void f() {}\n"
679                    "};"));
680   EXPECT_EQ("/*\n"
681             "  1. This is a comment with non-trivial formatting.\n"
682             "     1.1. We have to indent/outdent all lines equally\n"
683             "         1.1.1. to keep the formatting.\n"
684             " */",
685             format("  /*\n"
686                    "    1. This is a comment with non-trivial formatting.\n"
687                    "       1.1. We have to indent/outdent all lines equally\n"
688                    "           1.1.1. to keep the formatting.\n"
689                    "   */"));
690   EXPECT_EQ("/*\n"
691             " Don't try to outdent if there's not enough inentation.\n"
692             " */",
693             format("  /*\n"
694                    " Don't try to outdent if there's not enough inentation.\n"
695                    " */"));
696 }
697 
698 TEST_F(FormatTest, SplitsLongCxxComments) {
699   EXPECT_EQ("// A comment that\n"
700             "// doesn't fit on\n"
701             "// one line",
702             format("// A comment that doesn't fit on one line",
703                    getLLVMStyleWithColumns(20)));
704   EXPECT_EQ("// a b c d\n"
705             "// e f  g\n"
706             "// h i j k",
707             format("// a b c d e f  g h i j k",
708                    getLLVMStyleWithColumns(10)));
709   EXPECT_EQ("// a b c d\n"
710             "// e f  g\n"
711             "// h i j k",
712             format("\\\n// a b c d e f  g h i j k",
713                    getLLVMStyleWithColumns(10)));
714   EXPECT_EQ("if (true) // A comment that\n"
715             "          // doesn't fit on\n"
716             "          // one line",
717             format("if (true) // A comment that doesn't fit on one line   ",
718                    getLLVMStyleWithColumns(30)));
719   EXPECT_EQ("//    Don't_touch_leading_whitespace",
720             format("//    Don't_touch_leading_whitespace",
721                    getLLVMStyleWithColumns(20)));
722   EXPECT_EQ(
723       "//Don't add leading\n"
724       "//whitespace",
725       format("//Don't add leading whitespace", getLLVMStyleWithColumns(20)));
726   EXPECT_EQ("// A comment before\n"
727             "// a macro\n"
728             "// definition\n"
729             "#define a b",
730             format("// A comment before a macro definition\n"
731                    "#define a b",
732                    getLLVMStyleWithColumns(20)));
733 }
734 
735 TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
736   EXPECT_EQ("namespace {}\n// Test\n#define A",
737             format("namespace {}\n   // Test\n#define A"));
738   EXPECT_EQ("namespace {}\n/* Test */\n#define A",
739             format("namespace {}\n   /* Test */\n#define A"));
740   EXPECT_EQ("namespace {}\n/* Test */ #define A",
741             format("namespace {}\n   /* Test */    #define A"));
742 }
743 
744 TEST_F(FormatTest, SplitsLongLinesInComments) {
745   EXPECT_EQ("/* This is a long\n"
746             " * comment that\n"
747             " * doesn't\n"
748             " * fit on one line.\n"
749             " */",
750             format("/* "
751                    "This is a long                                         "
752                    "comment that "
753                    "doesn't                                    "
754                    "fit on one line.  */",
755                    getLLVMStyleWithColumns(20)));
756   EXPECT_EQ("/* a b c d\n"
757             " * e f  g\n"
758             " * h i j k\n"
759             " */",
760             format("/* a b c d e f  g h i j k */",
761                    getLLVMStyleWithColumns(10)));
762   EXPECT_EQ("/* a b c d\n"
763             " * e f  g\n"
764             " * h i j k\n"
765             " */",
766             format("\\\n/* a b c d e f  g h i j k */",
767                    getLLVMStyleWithColumns(10)));
768   EXPECT_EQ("/*\n"
769             "This is a long\n"
770             "comment that doesn't\n"
771             "fit on one line.\n"
772             "*/",
773             format("/*\n"
774                    "This is a long                                         "
775                    "comment that doesn't                                    "
776                    "fit on one line.                                      \n"
777                    "*/", getLLVMStyleWithColumns(20)));
778   EXPECT_EQ("/*\n"
779             " * This is a long\n"
780             " * comment that\n"
781             " * doesn't fit on\n"
782             " * one line.\n"
783             " */",
784             format("/*      \n"
785                    " * This is a long "
786                    "   comment that     "
787                    "   doesn't fit on   "
788                    "   one line.                                            \n"
789                    " */", getLLVMStyleWithColumns(20)));
790   EXPECT_EQ("/*\n"
791             " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
792             " * so_it_should_be_broken\n"
793             " * wherever_a_space_occurs\n"
794             " */",
795             format("/*\n"
796                    " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
797                    "   so_it_should_be_broken "
798                    "   wherever_a_space_occurs                             \n"
799                    " */",
800                    getLLVMStyleWithColumns(20)));
801   EXPECT_EQ("/*\n"
802             " *    This_comment_can_not_be_broken_into_lines\n"
803             " */",
804             format("/*\n"
805                    " *    This_comment_can_not_be_broken_into_lines\n"
806                    " */",
807                    getLLVMStyleWithColumns(20)));
808   EXPECT_EQ("{\n"
809             "  /*\n"
810             "  This is another\n"
811             "  long comment that\n"
812             "  doesn't fit on one\n"
813             "  line    1234567890\n"
814             "  */\n"
815             "}",
816             format("{\n"
817                    "/*\n"
818                    "This is another     "
819                    "  long comment that "
820                    "  doesn't fit on one"
821                    "  line    1234567890\n"
822                    "*/\n"
823                    "}", getLLVMStyleWithColumns(20)));
824   EXPECT_EQ("{\n"
825             "  /*\n"
826             "   * This        i s\n"
827             "   * another comment\n"
828             "   * t hat  doesn' t\n"
829             "   * fit on one l i\n"
830             "   * n e\n"
831             "   */\n"
832             "}",
833             format("{\n"
834                    "/*\n"
835                    " * This        i s"
836                    "   another comment"
837                    "   t hat  doesn' t"
838                    "   fit on one l i"
839                    "   n e\n"
840                    " */\n"
841                    "}", getLLVMStyleWithColumns(20)));
842   EXPECT_EQ("/*\n"
843             " * This is a long\n"
844             " * comment that\n"
845             " * doesn't fit on\n"
846             " * one line\n"
847             " */",
848             format("   /*\n"
849                    "    * This is a long comment that doesn't fit on one line\n"
850                    "    */", getLLVMStyleWithColumns(20)));
851   EXPECT_EQ("{\n"
852             "  if (something) /* This is a\n"
853             "long comment */\n"
854             "    ;\n"
855             "}",
856             format("{\n"
857                    "  if (something) /* This is a long comment */\n"
858                    "    ;\n"
859                    "}",
860                    getLLVMStyleWithColumns(30)));
861 }
862 
863 TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
864   EXPECT_EQ("#define X          \\\n"
865             "  /*               \\\n"
866             "   Test            \\\n"
867             "   Macro comment   \\\n"
868             "   with a long     \\\n"
869             "   line            \\\n"
870             "   */              \\\n"
871             "  A + B",
872             format("#define X \\\n"
873                    "  /*\n"
874                    "   Test\n"
875                    "   Macro comment with a long  line\n"
876                    "   */ \\\n"
877                    "  A + B",
878                    getLLVMStyleWithColumns(20)));
879   EXPECT_EQ("#define X          \\\n"
880             "  /* Macro comment \\\n"
881             "     with a long   \\\n"
882             "     line */       \\\n"
883             "  A + B",
884             format("#define X \\\n"
885                    "  /* Macro comment with a long\n"
886                    "     line */ \\\n"
887                    "  A + B",
888                    getLLVMStyleWithColumns(20)));
889   EXPECT_EQ("#define X          \\\n"
890             "  /* Macro comment \\\n"
891             "   * with a long   \\\n"
892             "   * line */       \\\n"
893             "  A + B",
894             format("#define X \\\n"
895                    "  /* Macro comment with a long  line */ \\\n"
896                    "  A + B",
897                    getLLVMStyleWithColumns(20)));
898 }
899 
900 TEST_F(FormatTest, CommentsInStaticInitializers) {
901   EXPECT_EQ(
902       "static SomeType type = { aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
903       "                         aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
904       "                         /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
905       "                         aaaaaaaaaaaaaaaaaaaa, // comment\n"
906       "                         aaaaaaaaaaaaaaaaaaaa };",
907       format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa  ,  /* comment */\n"
908              "                   aaaaaaaaaaaaaaaaaaaa   /* comment */ ,\n"
909              "                     /* comment */   aaaaaaaaaaaaaaaaaaaa ,\n"
910              "              aaaaaaaaaaaaaaaaaaaa ,   // comment\n"
911              "                  aaaaaaaaaaaaaaaaaaaa };"));
912   verifyFormat("static SomeType type = { aaaaaaaaaaa, // comment for aa...\n"
913                "                         bbbbbbbbbbb, ccccccccccc };");
914   verifyFormat("static SomeType type = { aaaaaaaaaaa,\n"
915                "                         // comment for bb....\n"
916                "                         bbbbbbbbbbb, ccccccccccc };");
917   verifyGoogleFormat(
918       "static SomeType type = { aaaaaaaaaaa,  // comment for aa...\n"
919       "                         bbbbbbbbbbb, ccccccccccc };");
920   verifyGoogleFormat("static SomeType type = { aaaaaaaaaaa,\n"
921                      "                         // comment for bb....\n"
922                      "                         bbbbbbbbbbb, ccccccccccc };");
923 
924   verifyFormat("S s = { { a, b, c },   // Group #1\n"
925                "        { d, e, f },   // Group #2\n"
926                "        { g, h, i } }; // Group #3");
927   verifyFormat("S s = { { // Group #1\n"
928                "          a, b, c },\n"
929                "        { // Group #2\n"
930                "          d, e, f },\n"
931                "        { // Group #3\n"
932                "          g, h, i } };");
933 
934   EXPECT_EQ("S s = {\n"
935             "  // Some comment\n"
936             "  a,\n"
937             "\n"
938             "  // Comment after empty line\n"
939             "  b\n"
940             "}",
941             format("S s =    {\n"
942                    "      // Some comment\n"
943                    "  a,\n"
944                    "  \n"
945                    "     // Comment after empty line\n"
946                    "      b\n"
947                    "}"));
948   EXPECT_EQ("S s = { a, b };", format("S s = {\n"
949                                       "  a,\n"
950                                       "\n"
951                                       "  b\n"
952                                       "};"));
953   verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
954                "  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
955                "  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
956                "  0x00, 0x00, 0x00, 0x00              // comment\n"
957                "};");
958 }
959 
960 //===----------------------------------------------------------------------===//
961 // Tests for classes, namespaces, etc.
962 //===----------------------------------------------------------------------===//
963 
964 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
965   verifyFormat("class A {\n};");
966 }
967 
968 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
969   verifyFormat("class A {\n"
970                "public:\n"
971                "public: // comment\n"
972                "protected:\n"
973                "private:\n"
974                "  void f() {}\n"
975                "};");
976   verifyGoogleFormat("class A {\n"
977                      " public:\n"
978                      " protected:\n"
979                      " private:\n"
980                      "  void f() {}\n"
981                      "};");
982 }
983 
984 TEST_F(FormatTest, SeparatesLogicalBlocks) {
985   EXPECT_EQ("class A {\n"
986             "public:\n"
987             "  void f();\n"
988             "\n"
989             "private:\n"
990             "  void g() {}\n"
991             "  // test\n"
992             "protected:\n"
993             "  int h;\n"
994             "};",
995             format("class A {\n"
996                    "public:\n"
997                    "void f();\n"
998                    "private:\n"
999                    "void g() {}\n"
1000                    "// test\n"
1001                    "protected:\n"
1002                    "int h;\n"
1003                    "};"));
1004 }
1005 
1006 TEST_F(FormatTest, FormatsClasses) {
1007   verifyFormat("class A : public B {\n};");
1008   verifyFormat("class A : public ::B {\n};");
1009 
1010   verifyFormat(
1011       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1012       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {\n"
1013       "};\n");
1014   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA :\n"
1015                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1016                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {\n"
1017                "};\n");
1018   verifyFormat(
1019       "class A : public B, public C, public D, public E, public F, public G {\n"
1020       "};");
1021   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1022                "                     public C,\n"
1023                "                     public D,\n"
1024                "                     public E,\n"
1025                "                     public F,\n"
1026                "                     public G {\n"
1027                "};");
1028 
1029   verifyFormat("class\n"
1030                "    ReallyReallyLongClassName {\n};",
1031                getLLVMStyleWithColumns(32));
1032 }
1033 
1034 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1035   verifyFormat("class A {\n} a, b;");
1036   verifyFormat("struct A {\n} a, b;");
1037   verifyFormat("union A {\n} a;");
1038 }
1039 
1040 TEST_F(FormatTest, FormatsEnum) {
1041   verifyFormat("enum {\n"
1042                "  Zero,\n"
1043                "  One = 1,\n"
1044                "  Two = One + 1,\n"
1045                "  Three = (One + Two),\n"
1046                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1047                "  Five = (One, Two, Three, Four, 5)\n"
1048                "};");
1049   verifyFormat("enum Enum {\n"
1050                "};");
1051   verifyFormat("enum {\n"
1052                "};");
1053   verifyFormat("enum X E {\n} d;");
1054   verifyFormat("enum __attribute__((...)) E {\n} d;");
1055   verifyFormat("enum __declspec__((...)) E {\n} d;");
1056   verifyFormat("enum X f() {\n  a();\n  return 42;\n}");
1057 }
1058 
1059 TEST_F(FormatTest, FormatsBitfields) {
1060   verifyFormat("struct Bitfields {\n"
1061                "  unsigned sClass : 8;\n"
1062                "  unsigned ValueKind : 2;\n"
1063                "};");
1064 }
1065 
1066 TEST_F(FormatTest, FormatsNamespaces) {
1067   verifyFormat("namespace some_namespace {\n"
1068                "class A {\n};\n"
1069                "void f() { f(); }\n"
1070                "}");
1071   verifyFormat("namespace {\n"
1072                "class A {\n};\n"
1073                "void f() { f(); }\n"
1074                "}");
1075   verifyFormat("inline namespace X {\n"
1076                "class A {\n};\n"
1077                "void f() { f(); }\n"
1078                "}");
1079   verifyFormat("using namespace some_namespace;\n"
1080                "class A {\n};\n"
1081                "void f() { f(); }");
1082 
1083   // This code is more common than we thought; if we
1084   // layout this correctly the semicolon will go into
1085   // its own line, which is undesireable.
1086   verifyFormat("namespace {\n};");
1087   verifyFormat("namespace {\n"
1088                "class A {\n"
1089                "};\n"
1090                "};");
1091 }
1092 
1093 TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
1094 
1095 TEST_F(FormatTest, FormatsInlineASM) {
1096   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
1097   verifyFormat(
1098       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1099       "    \"cpuid\\n\\t\"\n"
1100       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
1101       "    : \"=a\" (*rEAX), \"=S\" (*rEBX), \"=c\" (*rECX), \"=d\" (*rEDX)\n"
1102       "    : \"a\"(value));");
1103 }
1104 
1105 TEST_F(FormatTest, FormatTryCatch) {
1106   // FIXME: Handle try-catch explicitly in the UnwrappedLineParser, then we'll
1107   // also not create single-line-blocks.
1108   verifyFormat("try {\n"
1109                "  throw a * b;\n"
1110                "}\n"
1111                "catch (int a) {\n"
1112                "  // Do nothing.\n"
1113                "}\n"
1114                "catch (...) {\n"
1115                "  exit(42);\n"
1116                "}");
1117 
1118   // Function-level try statements.
1119   verifyFormat("int f() try { return 4; }\n"
1120                "catch (...) {\n"
1121                "  return 5;\n"
1122                "}");
1123   verifyFormat("class A {\n"
1124                "  int a;\n"
1125                "  A() try : a(0) {}\n"
1126                "  catch (...) {\n"
1127                "    throw;\n"
1128                "  }\n"
1129                "};\n");
1130 }
1131 
1132 TEST_F(FormatTest, FormatObjCTryCatch) {
1133   verifyFormat("@try {\n"
1134                "  f();\n"
1135                "}\n"
1136                "@catch (NSException e) {\n"
1137                "  @throw;\n"
1138                "}\n"
1139                "@finally {\n"
1140                "  exit(42);\n"
1141                "}");
1142 }
1143 
1144 TEST_F(FormatTest, StaticInitializers) {
1145   verifyFormat("static SomeClass SC = { 1, 'a' };");
1146 
1147   // FIXME: Format like enums if the static initializer does not fit on a line.
1148   verifyFormat(
1149       "static SomeClass WithALoooooooooooooooooooongName = {\n"
1150       "  100000000, \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
1151       "};");
1152 
1153   verifyFormat(
1154       "static SomeClass = { a, b, c, d, e, f, g, h, i, j,\n"
1155       "                     looooooooooooooooooooooooooooooooooongname,\n"
1156       "                     looooooooooooooooooooooooooooooong };");
1157   // Allow bin-packing in static initializers as this would often lead to
1158   // terrible results, e.g.:
1159   verifyGoogleFormat(
1160       "static SomeClass = { a, b, c, d, e, f, g, h, i, j,\n"
1161       "                     looooooooooooooooooooooooooooooooooongname,\n"
1162       "                     looooooooooooooooooooooooooooooong };");
1163 }
1164 
1165 TEST_F(FormatTest, NestedStaticInitializers) {
1166   verifyFormat("static A x = { { {} } };\n");
1167   verifyFormat("static A x = { { { init1, init2, init3, init4 },\n"
1168                "                 { init1, init2, init3, init4 } } };");
1169 
1170   verifyFormat("somes Status::global_reps[3] = {\n"
1171                "  { kGlobalRef, OK_CODE, NULL, NULL, NULL },\n"
1172                "  { kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL },\n"
1173                "  { kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL }\n"
1174                "};");
1175   verifyGoogleFormat("somes Status::global_reps[3] = {\n"
1176                      "  { kGlobalRef, OK_CODE, NULL, NULL, NULL },\n"
1177                      "  { kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL },\n"
1178                      "  { kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL }\n"
1179                      "};");
1180   verifyFormat(
1181       "CGRect cg_rect = { { rect.fLeft, rect.fTop },\n"
1182       "                   { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop"
1183       " } };");
1184 
1185   verifyFormat(
1186       "SomeArrayOfSomeType a = { { { 1, 2, 3 }, { 1, 2, 3 },\n"
1187       "                            { 111111111111111111111111111111,\n"
1188       "                              222222222222222222222222222222,\n"
1189       "                              333333333333333333333333333333 },\n"
1190       "                            { 1, 2, 3 }, { 1, 2, 3 } } };");
1191   verifyFormat(
1192       "SomeArrayOfSomeType a = { { { 1, 2, 3 } }, { { 1, 2, 3 } },\n"
1193       "                          { { 111111111111111111111111111111,\n"
1194       "                              222222222222222222222222222222,\n"
1195       "                              333333333333333333333333333333 } },\n"
1196       "                          { { 1, 2, 3 } }, { { 1, 2, 3 } } };");
1197 
1198   // FIXME: We might at some point want to handle this similar to parameter
1199   // lists, where we have an option to put each on a single line.
1200   verifyFormat(
1201       "struct {\n"
1202       "  unsigned bit;\n"
1203       "  const char *const name;\n"
1204       "} kBitsToOs[] = { { kOsMac, \"Mac\" }, { kOsWin, \"Windows\" },\n"
1205       "                  { kOsLinux, \"Linux\" }, { kOsCrOS, \"Chrome OS\" } };");
1206 }
1207 
1208 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1209   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1210                "                      \\\n"
1211                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1212 }
1213 
1214 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
1215   verifyFormat(
1216       "virtual void write(ELFWriter *writerrr,\n"
1217       "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
1218 }
1219 
1220 TEST_F(FormatTest, LayoutUnknownPPDirective) {
1221   EXPECT_EQ("#123 \"A string literal\"",
1222             format("   #     123    \"A string literal\""));
1223   EXPECT_EQ("#;", format("#;"));
1224   verifyFormat("#\n;\n;\n;");
1225 }
1226 
1227 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1228   EXPECT_EQ("#line 42 \"test\"\n",
1229             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
1230   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
1231                                     getLLVMStyleWithColumns(12)));
1232 }
1233 
1234 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1235   EXPECT_EQ("#line 42 \"test\"",
1236             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
1237   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
1238 }
1239 
1240 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
1241   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1242   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
1243   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
1244   // FIXME: We never break before the macro name.
1245   verifyFormat("#define AA(\\\n    B)", getLLVMStyleWithColumns(12));
1246 
1247   verifyFormat("#define A A\n#define A A");
1248   verifyFormat("#define A(X) A\n#define A A");
1249 
1250   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1251   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
1252 }
1253 
1254 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
1255   EXPECT_EQ("// somecomment\n"
1256             "#include \"a.h\"\n"
1257             "#define A(  \\\n"
1258             "    A, B)\n"
1259             "#include \"b.h\"\n"
1260             "// somecomment\n",
1261             format("  // somecomment\n"
1262                    "  #include \"a.h\"\n"
1263                    "#define A(A,\\\n"
1264                    "    B)\n"
1265                    "    #include \"b.h\"\n"
1266                    " // somecomment\n",
1267                    getLLVMStyleWithColumns(13)));
1268 }
1269 
1270 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
1271 
1272 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1273   EXPECT_EQ("#define A    \\\n"
1274             "  c;         \\\n"
1275             "  e;\n"
1276             "f;",
1277             format("#define A c; e;\n"
1278                    "f;",
1279                    getLLVMStyleWithColumns(14)));
1280 }
1281 
1282 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
1283 
1284 TEST_F(FormatTest, LayoutSingleUnwrappedLineInMacro) {
1285   EXPECT_EQ("# define A\\\n  b;",
1286             format("# define A b;", 11, 2, getLLVMStyleWithColumns(11)));
1287 }
1288 
1289 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
1290   EXPECT_EQ("int x,\n"
1291             "#define A\n"
1292             "    y;",
1293             format("int x,\n#define A\ny;"));
1294 }
1295 
1296 TEST_F(FormatTest, HashInMacroDefinition) {
1297   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
1298   verifyFormat("#define A \\\n"
1299                "  {       \\\n"
1300                "    f(#c);\\\n"
1301                "  }",
1302                getLLVMStyleWithColumns(11));
1303 
1304   verifyFormat("#define A(X)         \\\n"
1305                "  void function##X()",
1306                getLLVMStyleWithColumns(22));
1307 
1308   verifyFormat("#define A(a, b, c)   \\\n"
1309                "  void a##b##c()",
1310                getLLVMStyleWithColumns(22));
1311 
1312   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
1313 }
1314 
1315 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
1316   verifyFormat("#define A (1)");
1317 }
1318 
1319 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1320   EXPECT_EQ("#define A b;", format("#define A \\\n"
1321                                    "          \\\n"
1322                                    "  b;",
1323                                    getLLVMStyleWithColumns(25)));
1324   EXPECT_EQ("#define A \\\n"
1325             "          \\\n"
1326             "  a;      \\\n"
1327             "  b;",
1328             format("#define A \\\n"
1329                    "          \\\n"
1330                    "  a;      \\\n"
1331                    "  b;",
1332                    getLLVMStyleWithColumns(11)));
1333   EXPECT_EQ("#define A \\\n"
1334             "  a;      \\\n"
1335             "          \\\n"
1336             "  b;",
1337             format("#define A \\\n"
1338                    "  a;      \\\n"
1339                    "          \\\n"
1340                    "  b;",
1341                    getLLVMStyleWithColumns(11)));
1342 }
1343 
1344 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
1345   verifyFormat("#define A :");
1346 
1347   // FIXME: Improve formatting of case labels in macros.
1348   verifyFormat("#define SOMECASES  \\\n"
1349                "  case 1:          \\\n"
1350                "  case 2\n",
1351                getLLVMStyleWithColumns(20));
1352 
1353   verifyFormat("#define A template <typename T>");
1354   verifyFormat("#define STR(x) #x\n"
1355                "f(STR(this_is_a_string_literal{));");
1356 }
1357 
1358 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1359   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1360             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1361             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1362             "class X {\n"
1363             "};\n"
1364             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1365             "int *createScopDetectionPass() { return 0; }",
1366             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1367                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1368                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1369                    "  class X {};\n"
1370                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1371                    "  int *createScopDetectionPass() { return 0; }"));
1372   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1373   // braces, so that inner block is indented one level more.
1374   EXPECT_EQ("int q() {\n"
1375             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1376             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1377             "  IPC_END_MESSAGE_MAP()\n"
1378             "}",
1379             format("int q() {\n"
1380                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1381                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1382                    "  IPC_END_MESSAGE_MAP()\n"
1383                    "}"));
1384   EXPECT_EQ("int q() {\n"
1385             "  f(x);\n"
1386             "  f(x) {}\n"
1387             "  f(x)->g();\n"
1388             "  f(x)->*g();\n"
1389             "  f(x).g();\n"
1390             "  f(x) = x;\n"
1391             "  f(x) += x;\n"
1392             "  f(x) -= x;\n"
1393             "  f(x) *= x;\n"
1394             "  f(x) /= x;\n"
1395             "  f(x) %= x;\n"
1396             "  f(x) &= x;\n"
1397             "  f(x) |= x;\n"
1398             "  f(x) ^= x;\n"
1399             "  f(x) >>= x;\n"
1400             "  f(x) <<= x;\n"
1401             "  f(x)[y].z();\n"
1402             "  LOG(INFO) << x;\n"
1403             "  ifstream(x) >> x;\n"
1404             "}\n",
1405             format("int q() {\n"
1406                    "  f(x)\n;\n"
1407                    "  f(x)\n {}\n"
1408                    "  f(x)\n->g();\n"
1409                    "  f(x)\n->*g();\n"
1410                    "  f(x)\n.g();\n"
1411                    "  f(x)\n = x;\n"
1412                    "  f(x)\n += x;\n"
1413                    "  f(x)\n -= x;\n"
1414                    "  f(x)\n *= x;\n"
1415                    "  f(x)\n /= x;\n"
1416                    "  f(x)\n %= x;\n"
1417                    "  f(x)\n &= x;\n"
1418                    "  f(x)\n |= x;\n"
1419                    "  f(x)\n ^= x;\n"
1420                    "  f(x)\n >>= x;\n"
1421                    "  f(x)\n <<= x;\n"
1422                    "  f(x)\n[y].z();\n"
1423                    "  LOG(INFO)\n << x;\n"
1424                    "  ifstream(x)\n >> x;\n"
1425                    "}\n"));
1426   EXPECT_EQ("int q() {\n"
1427             "  f(x)\n"
1428             "  if (1) {\n"
1429             "  }\n"
1430             "  f(x)\n"
1431             "  while (1) {\n"
1432             "  }\n"
1433             "  f(x)\n"
1434             "  g(x);\n"
1435             "  f(x)\n"
1436             "  try {\n"
1437             "    q();\n"
1438             "  }\n"
1439             "  catch (...) {\n"
1440             "  }\n"
1441             "}\n",
1442             format("int q() {\n"
1443                    "f(x)\n"
1444                    "if (1) {}\n"
1445                    "f(x)\n"
1446                    "while (1) {}\n"
1447                    "f(x)\n"
1448                    "g(x);\n"
1449                    "f(x)\n"
1450                    "try { q(); } catch (...) {}\n"
1451                    "}\n"));
1452   EXPECT_EQ("class A {\n"
1453             "  A() : t(0) {}\n"
1454             "  A(X x)\n" // FIXME: function-level try blocks are broken.
1455             "  try : t(0) {\n"
1456             "  }\n"
1457             "  catch (...) {\n"
1458             "  }\n"
1459             "};",
1460             format("class A {\n"
1461                    "  A()\n : t(0) {}\n"
1462                    "  A(X x)\n"
1463                    "  try : t(0) {} catch (...) {}\n"
1464                    "};"));
1465 }
1466 
1467 TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1468   EXPECT_EQ("{\n  {\n#define A\n  }\n}", format("{{\n#define A\n}}"));
1469 }
1470 
1471 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
1472   verifyFormat("{\n  { a #c; }\n}");
1473 }
1474 
1475 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1476   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
1477             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1478   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
1479             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1480 }
1481 
1482 TEST_F(FormatTest, EscapedNewlineAtStartOfTokenInMacroDefinition) {
1483   EXPECT_EQ(
1484       "#define A \\\n  int i;  \\\n  int j;",
1485       format("#define A \\\nint i;\\\n  int j;", getLLVMStyleWithColumns(11)));
1486 }
1487 
1488 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
1489   verifyFormat("#define A \\\n"
1490                "  int v(  \\\n"
1491                "      a); \\\n"
1492                "  int i;",
1493                getLLVMStyleWithColumns(11));
1494 }
1495 
1496 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
1497   EXPECT_EQ(
1498       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1499       "                      \\\n"
1500       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1501       "\n"
1502       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1503       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
1504       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
1505              "\\\n"
1506              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1507              "  \n"
1508              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1509              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
1510 }
1511 
1512 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
1513   EXPECT_EQ("int\n"
1514             "#define A\n"
1515             "a;",
1516             format("int\n#define A\na;"));
1517   verifyFormat("functionCallTo(\n"
1518                "    someOtherFunction(\n"
1519                "        withSomeParameters, whichInSequence,\n"
1520                "        areLongerThanALine(andAnotherCall,\n"
1521                "#define A B\n"
1522                "                           withMoreParamters,\n"
1523                "                           whichStronglyInfluenceTheLayout),\n"
1524                "        andMoreParameters),\n"
1525                "    trailing);",
1526                getLLVMStyleWithColumns(69));
1527 }
1528 
1529 TEST_F(FormatTest, LayoutBlockInsideParens) {
1530   EXPECT_EQ("functionCall({\n"
1531             "  int i;\n"
1532             "});",
1533             format(" functionCall ( {int i;} );"));
1534 }
1535 
1536 TEST_F(FormatTest, LayoutBlockInsideStatement) {
1537   EXPECT_EQ("SOME_MACRO { int i; }\n"
1538             "int i;",
1539             format("  SOME_MACRO  {int i;}  int i;"));
1540 }
1541 
1542 TEST_F(FormatTest, LayoutNestedBlocks) {
1543   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
1544                "  struct s {\n"
1545                "    int i;\n"
1546                "  };\n"
1547                "  s kBitsToOs[] = { { 10 } };\n"
1548                "  for (int i = 0; i < 10; ++i)\n"
1549                "    return;\n"
1550                "}");
1551 }
1552 
1553 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
1554   EXPECT_EQ("{}", format("{}"));
1555 
1556   // Negative test for enum.
1557   verifyFormat("enum E {\n};");
1558 
1559   // Note that when there's a missing ';', we still join...
1560   verifyFormat("enum E {}");
1561 }
1562 
1563 //===----------------------------------------------------------------------===//
1564 // Line break tests.
1565 //===----------------------------------------------------------------------===//
1566 
1567 TEST_F(FormatTest, FormatsFunctionDefinition) {
1568   verifyFormat("void f(int a, int b, int c, int d, int e, int f, int g,"
1569                " int h, int j, int f,\n"
1570                "       int c, int ddddddddddddd) {}");
1571 }
1572 
1573 TEST_F(FormatTest, FormatsAwesomeMethodCall) {
1574   verifyFormat(
1575       "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
1576       "                       parameter, parameter, parameter)),\n"
1577       "                   SecondLongCall(parameter));");
1578 }
1579 
1580 TEST_F(FormatTest, PreventConfusingIndents) {
1581   verifyFormat(
1582       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1583       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
1584       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
1585       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
1586   verifyFormat(
1587       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[\n"
1588       "    aaaaaaaaaaaaaaaaaaaaaaaa[\n"
1589       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa],\n"
1590       "    aaaaaaaaaaaaaaaaaaaaaaaa];");
1591   verifyFormat(
1592       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
1593       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
1594       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
1595       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
1596   verifyFormat("int a = bbbb && ccc && fffff(\n"
1597                "#define A Just forcing a new line\n"
1598                "                           ddd);");
1599 }
1600 
1601 TEST_F(FormatTest, ExpressionIndentation) {
1602   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1603                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1604                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
1605                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
1606                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
1607                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
1608                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
1609                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
1610                "                 ccccccccccccccccccccccccccccccccccccccccc;");
1611   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
1612                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1613                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
1614                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
1615   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1616                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
1617                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
1618                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
1619   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
1620                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
1621                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1622                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
1623 }
1624 
1625 TEST_F(FormatTest, ConstructorInitializers) {
1626   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
1627   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
1628                getLLVMStyleWithColumns(45));
1629   verifyFormat("Constructor()\n"
1630                "    : Inttializer(FitsOnTheLine) {}",
1631                getLLVMStyleWithColumns(44));
1632   verifyFormat("Constructor()\n"
1633                "    : Inttializer(FitsOnTheLine) {}",
1634                getLLVMStyleWithColumns(43));
1635 
1636   verifyFormat(
1637       "SomeClass::Constructor()\n"
1638       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
1639 
1640   verifyFormat(
1641       "SomeClass::Constructor()\n"
1642       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
1643       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
1644   verifyFormat(
1645       "SomeClass::Constructor()\n"
1646       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
1647       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
1648 
1649   verifyFormat("Constructor()\n"
1650                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
1651                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1652                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
1653                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
1654 
1655   verifyFormat("Constructor()\n"
1656                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1657                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
1658 
1659   verifyFormat("Constructor(int Parameter = 0)\n"
1660                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
1661                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
1662 
1663   // Here a line could be saved by splitting the second initializer onto two
1664   // lines, but that is not desireable.
1665   verifyFormat("Constructor()\n"
1666                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
1667                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
1668                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
1669 
1670   FormatStyle OnePerLine = getLLVMStyle();
1671   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
1672   verifyFormat("SomeClass::Constructor()\n"
1673                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
1674                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
1675                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
1676                OnePerLine);
1677   verifyFormat("SomeClass::Constructor()\n"
1678                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
1679                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
1680                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
1681                OnePerLine);
1682   verifyFormat("MyClass::MyClass(int var)\n"
1683                "    : some_var_(var),            // 4 space indent\n"
1684                "      some_other_var_(var + 1) { // lined up\n"
1685                "}",
1686                OnePerLine);
1687   verifyFormat("Constructor()\n"
1688                "    : aaaaa(aaaaaa),\n"
1689                "      aaaaa(aaaaaa),\n"
1690                "      aaaaa(aaaaaa),\n"
1691                "      aaaaa(aaaaaa),\n"
1692                "      aaaaa(aaaaaa) {}",
1693                OnePerLine);
1694 
1695   // This test takes VERY long when memoization is broken.
1696   OnePerLine.BinPackParameters = false;
1697   std::string input = "Constructor()\n"
1698                       "    : aaaa(a,\n";
1699   for (unsigned i = 0, e = 80; i != e; ++i) {
1700     input += "           a,\n";
1701   }
1702   input += "           a) {}";
1703   verifyFormat(input, OnePerLine);
1704 }
1705 
1706 TEST_F(FormatTest, BreaksAsHighAsPossible) {
1707   verifyFormat(
1708       "void f() {\n"
1709       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
1710       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
1711       "    f();\n"
1712       "}");
1713   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
1714                "    Intervals[i - 1].getRange().getLast()) {\n}");
1715 }
1716 
1717 TEST_F(FormatTest, BreaksFunctionDeclarations) {
1718   // Principially, we break function declarations in a certain order:
1719   // 1) break amongst arguments.
1720   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
1721                "                              Cccccccccccccc cccccccccccccc);");
1722 
1723   // 2) break after return type.
1724   verifyFormat("Aaaaaaaaaaaaaaaaaaaaaaaa\n"
1725                "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);");
1726 
1727   // 3) break after (.
1728   verifyFormat(
1729       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
1730       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);");
1731 
1732   // 4) break before after nested name specifiers.
1733   verifyFormat(
1734       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1735       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
1736       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);");
1737 
1738   // However, there are exceptions, if a sufficient amount of lines can be
1739   // saved.
1740   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
1741   // more adjusting.
1742   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
1743                "                                  Cccccccccccccc cccccccccc,\n"
1744                "                                  Cccccccccccccc cccccccccc,\n"
1745                "                                  Cccccccccccccc cccccccccc,\n"
1746                "                                  Cccccccccccccc cccccccccc);");
1747   verifyFormat(
1748       "Aaaaaaaaaaaaaaaaaa\n"
1749       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
1750       "               Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
1751       "               Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
1752   verifyFormat(
1753       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
1754       "                                          Cccccccccccccc cccccccccc,\n"
1755       "                                          Cccccccccccccc cccccccccc,\n"
1756       "                                          Cccccccccccccc cccccccccc,\n"
1757       "                                          Cccccccccccccc cccccccccc,\n"
1758       "                                          Cccccccccccccc cccccccccc,\n"
1759       "                                          Cccccccccccccc cccccccccc);");
1760   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
1761                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
1762                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
1763                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
1764                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
1765 
1766   // Break after multi-line parameters.
1767   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1768                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1769                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1770                "    bbbb bbbb);");
1771 }
1772 
1773 TEST_F(FormatTest, BreaksDesireably) {
1774   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
1775                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
1776                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
1777   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1778                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
1779                "}");
1780 
1781   verifyFormat(
1782       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1783       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
1784 
1785   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1786                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1787                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
1788 
1789   verifyFormat(
1790       "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1791       "                            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
1792       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1793       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
1794 
1795   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
1796                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
1797 
1798   verifyFormat(
1799       "void f() {\n"
1800       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
1801       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
1802       "}");
1803   verifyFormat(
1804       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1805       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
1806   verifyFormat(
1807       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1808       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
1809   verifyFormat(
1810       "aaaaaaaaaaaaaaaaa(\n"
1811       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1812       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
1813 
1814   // This test case breaks on an incorrect memoization, i.e. an optimization not
1815   // taking into account the StopAt value.
1816   verifyFormat(
1817       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
1818       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
1819       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
1820       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
1821 
1822   verifyFormat("{\n  {\n    {\n"
1823                "      Annotation.SpaceRequiredBefore =\n"
1824                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
1825                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
1826                "    }\n  }\n}");
1827 }
1828 
1829 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
1830   FormatStyle NoBinPacking = getGoogleStyle();
1831   NoBinPacking.BinPackParameters = false;
1832   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
1833                "  aaaaaaaaaaaaaaaaaaaa,\n"
1834                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
1835                NoBinPacking);
1836   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
1837                "        aaaaaaaaaaaaa,\n"
1838                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
1839                NoBinPacking);
1840   verifyFormat(
1841       "aaaaaaaa(aaaaaaaaaaaaa,\n"
1842       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1843       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
1844       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1845       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
1846       NoBinPacking);
1847   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
1848                "    .aaaaaaaaaaaaaaaaaa();",
1849                NoBinPacking);
1850   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1851                "    aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);",
1852                NoBinPacking);
1853 
1854   verifyFormat(
1855       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1856       "             aaaaaaaaaaaa,\n"
1857       "             aaaaaaaaaaaa);",
1858       NoBinPacking);
1859   verifyFormat(
1860       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
1861       "                               ddddddddddddddddddddddddddddd),\n"
1862       "             test);",
1863       NoBinPacking);
1864 
1865   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
1866                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
1867                "            aaaaaaaaaaaaaaaaaaaaaaa> aaaaaaaaaaaaaaaaaa;",
1868                NoBinPacking);
1869   verifyFormat("a(\"a\"\n"
1870                "  \"a\",\n"
1871                "  a);");
1872 
1873   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
1874   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
1875                "                aaaaaaaaa,\n"
1876                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
1877                NoBinPacking);
1878   verifyFormat(
1879       "void f() {\n"
1880       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
1881       "      .aaaaaaa();\n"
1882       "}",
1883       NoBinPacking);
1884 }
1885 
1886 TEST_F(FormatTest, FormatsBuilderPattern) {
1887   verifyFormat(
1888       "return llvm::StringSwitch<Reference::Kind>(name)\n"
1889       "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
1890       "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME).StartsWith(\".init\", ORDER_INIT)\n"
1891       "    .StartsWith(\".fini\", ORDER_FINI).StartsWith(\".hash\", ORDER_HASH)\n"
1892       "    .Default(ORDER_TEXT);\n");
1893 
1894   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
1895                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
1896   verifyFormat(
1897       "aaaaaaa->aaaaaaa\n"
1898       "    ->aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
1899       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
1900   verifyFormat(
1901       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
1902       "    aaaaaaaaaaaaaa);");
1903   verifyFormat(
1904       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa = aaaaaa->aaaaaaaaaaaa()\n"
1905       "    ->aaaaaaaaaaaaaaaa(\n"
1906       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
1907       "    ->aaaaaaaaaaaaaaaaa();");
1908 }
1909 
1910 TEST_F(FormatTest, DoesNotBreakTrailingAnnotation) {
1911   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
1912                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
1913   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
1914                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
1915   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
1916                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
1917   verifyFormat(
1918       "void aaaaaaaaaaaaaaaaaa()\n"
1919       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
1920       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
1921   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1922                "    __attribute__((unused));");
1923 
1924   // FIXME: This is bad indentation, but generally hard to distinguish from a
1925   // function declaration.
1926   verifyFormat(
1927       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1928       "GUARDED_BY(aaaaaaaaaaaa);");
1929 }
1930 
1931 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
1932   verifyFormat(
1933       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
1934       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
1935   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
1936                "    ccccccccccccccccccccccccc) {\n}");
1937   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
1938                "    ccccccccccccccccccccccccc) {\n}");
1939   verifyFormat(
1940       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
1941       "    ccccccccccccccccccccccccc) {\n}");
1942   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
1943                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
1944                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
1945                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
1946   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
1947                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
1948                "    aaaaaaaaaaaaaaa != aa) {\n}");
1949 }
1950 
1951 TEST_F(FormatTest, BreaksAfterAssignments) {
1952   verifyFormat(
1953       "unsigned Cost =\n"
1954       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
1955       "                        SI->getPointerAddressSpaceee());\n");
1956   verifyFormat(
1957       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
1958       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
1959 
1960   verifyFormat(
1961       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa()\n"
1962       "    .aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
1963 }
1964 
1965 TEST_F(FormatTest, AlignsAfterAssignments) {
1966   verifyFormat(
1967       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1968       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
1969   verifyFormat(
1970       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1971       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
1972   verifyFormat(
1973       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1974       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
1975   verifyFormat(
1976       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1977       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
1978   verifyFormat("double LooooooooooooooooooooooooongResult =\n"
1979                "    aaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaa +\n"
1980                "    aaaaaaaaaaaaaaaaaaaaaaaa;");
1981 }
1982 
1983 TEST_F(FormatTest, AlignsAfterReturn) {
1984   verifyFormat(
1985       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1986       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
1987   verifyFormat(
1988       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
1989       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
1990   verifyFormat(
1991       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
1992       "       aaaaaaaaaaaaaaaaaaaaaa();");
1993   verifyFormat(
1994       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
1995       "        aaaaaaaaaaaaaaaaaaaaaa());");
1996   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1997                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
1998   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1999                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
2000                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2001 }
2002 
2003 TEST_F(FormatTest, BreaksConditionalExpressions) {
2004   verifyFormat(
2005       "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
2006       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2007       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2008   verifyFormat(
2009       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2010       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2011   verifyFormat(
2012       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
2013       "                                                    : aaaaaaaaaaaaa);");
2014   verifyFormat(
2015       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2016       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2017       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2018       "                   aaaaaaaaaaaaa);");
2019   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2020                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2021                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2022                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2023                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2024   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2025                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2026                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2027                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2028                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2029                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2030                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2031 
2032   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2033                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2034                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2035   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
2036                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2037                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2038                "        : aaaaaaaaaaaaaaaa;");
2039   verifyFormat(
2040       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2041       "    ? aaaaaaaaaaaaaaa\n"
2042       "    : aaaaaaaaaaaaaaa;");
2043   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
2044                "          aaaaaaaaa\n"
2045                "      ? b\n"
2046                "      : c);");
2047   verifyFormat(
2048       "unsigned Indent =\n"
2049       "    format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n"
2050       "                              ? IndentForLevel[TheLine.Level]\n"
2051       "                              : TheLine * 2,\n"
2052       "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
2053       getLLVMStyleWithColumns(70));
2054 
2055   FormatStyle NoBinPacking = getLLVMStyle();
2056   NoBinPacking.BinPackParameters = false;
2057   verifyFormat(
2058       "void f() {\n"
2059       "  g(aaa,\n"
2060       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
2061       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2062       "        ? aaaaaaaaaaaaaaa\n"
2063       "        : aaaaaaaaaaaaaaa);\n"
2064       "}",
2065       NoBinPacking);
2066 }
2067 
2068 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
2069   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
2070                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
2071   verifyFormat("bool a = true, b = false;");
2072 
2073   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2074                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
2075                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
2076                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
2077   verifyFormat(
2078       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2079       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
2080       "     d = e && f;");
2081   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
2082                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
2083   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
2084                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
2085   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
2086                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
2087   // FIXME: If multiple variables are defined, the "*" needs to move to the new
2088   // line. Also fix indent for breaking after the type, this looks bad.
2089   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2090                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
2091                "    *b = bbbbbbbbbbbbbbbbbbb;");
2092 
2093   // Not ideal, but pointer-with-type does not allow much here.
2094   verifyGoogleFormat(
2095       "aaaaaaaaa* a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
2096       "           *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;");
2097 }
2098 
2099 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
2100   verifyFormat("arr[foo ? bar : baz];");
2101   verifyFormat("f()[foo ? bar : baz];");
2102   verifyFormat("(a + b)[foo ? bar : baz];");
2103   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
2104 }
2105 
2106 TEST_F(FormatTest, AlignsStringLiterals) {
2107   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
2108                "                                      \"short literal\");");
2109   verifyFormat(
2110       "looooooooooooooooooooooooongFunction(\n"
2111       "    \"short literal\"\n"
2112       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
2113   verifyFormat("someFunction(\"Always break between multi-line\"\n"
2114                "             \" string literals\",\n"
2115                "             and, other, parameters);");
2116   EXPECT_EQ("fun + \"1243\" /* comment */\n"
2117             "      \"5678\";",
2118             format("fun + \"1243\" /* comment */\n"
2119                    "      \"5678\";",
2120                    getLLVMStyleWithColumns(28)));
2121   EXPECT_EQ(
2122       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
2123       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
2124       "         \"aaaaaaaaaaaaaaaa\";",
2125       format("aaaaaa ="
2126              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
2127              "aaaaaaaaaaaaaaaaaaaaa\" "
2128              "\"aaaaaaaaaaaaaaaa\";"));
2129   verifyFormat("a = a + \"a\"\n"
2130                "        \"a\"\n"
2131                "        \"a\";");
2132 
2133   verifyFormat(
2134       "#define LL_FORMAT \"ll\"\n"
2135       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
2136       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
2137 }
2138 
2139 TEST_F(FormatTest, AlignsPipes) {
2140   verifyFormat(
2141       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2142       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2143       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2144   verifyFormat(
2145       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
2146       "                     << aaaaaaaaaaaaaaaaaaaa;");
2147   verifyFormat(
2148       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2149       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2150   verifyFormat(
2151       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
2152       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
2153       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
2154   verifyFormat(
2155       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2156       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2157       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2158 
2159   verifyFormat("return out << \"somepacket = {\\n\"\n"
2160                "           << \"  aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
2161                "           << \"  bbbb = \" << pkt.bbbb << \"\\n\"\n"
2162                "           << \"  cccccc = \" << pkt.cccccc << \"\\n\"\n"
2163                "           << \"  ddd = [\" << pkt.ddd << \"]\\n\"\n"
2164                "           << \"}\";");
2165 
2166   verifyFormat(
2167       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
2168       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
2169       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
2170       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
2171       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
2172   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
2173                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
2174 
2175   verifyFormat(
2176       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2177       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
2178 }
2179 
2180 TEST_F(FormatTest, UnderstandsEquals) {
2181   verifyFormat(
2182       "aaaaaaaaaaaaaaaaa =\n"
2183       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2184   verifyFormat(
2185       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2186       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
2187   verifyFormat(
2188       "if (a) {\n"
2189       "  f();\n"
2190       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2191       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2192       "}");
2193 
2194   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2195                "        100000000 + 10000000) {\n}");
2196 }
2197 
2198 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
2199   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
2200                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
2201 
2202   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
2203                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
2204 
2205   verifyFormat(
2206       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
2207       "                                                          Parameter2);");
2208 
2209   verifyFormat(
2210       "ShortObject->shortFunction(\n"
2211       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
2212       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
2213 
2214   verifyFormat("loooooooooooooongFunction(\n"
2215                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
2216 
2217   verifyFormat(
2218       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
2219       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
2220 
2221   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
2222                "    .WillRepeatedly(Return(SomeValue));");
2223   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)]\n"
2224                "    .insert(ccccccccccccccccccccccc);");
2225   verifyFormat(
2226       "aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2227       "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2228       "    .aaaaaaaaaaaaaaa(\n"
2229       "        aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2230       "           aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
2231   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2232                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2233                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2234                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
2235                "}");
2236 
2237   // Here, it is not necessary to wrap at "." or "->".
2238   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
2239                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
2240   verifyFormat(
2241       "aaaaaaaaaaa->aaaaaaaaa(\n"
2242       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2243       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
2244 
2245   verifyFormat(
2246       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2247       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
2248   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
2249                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
2250   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
2251                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
2252 
2253   // FIXME: Should we break before .a()?
2254   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2255                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).a();");
2256 
2257   FormatStyle NoBinPacking = getLLVMStyle();
2258   NoBinPacking.BinPackParameters = false;
2259   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
2260                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
2261                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
2262                "                         aaaaaaaaaaaaaaaaaaa,\n"
2263                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2264                NoBinPacking);
2265 }
2266 
2267 TEST_F(FormatTest, WrapsTemplateDeclarations) {
2268   verifyFormat("template <typename T>\n"
2269                "virtual void loooooooooooongFunction(int Param1, int Param2);");
2270   verifyFormat(
2271       "template <typename T>\n"
2272       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
2273   verifyFormat("template <typename T>\n"
2274                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
2275                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
2276   verifyFormat(
2277       "template <typename T>\n"
2278       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
2279       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
2280   verifyFormat(
2281       "template <typename T>\n"
2282       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
2283       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
2284       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2285   verifyFormat("template <typename T>\n"
2286                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2287                "    int aaaaaaaaaaaaaaaaaaaaaa);");
2288   verifyFormat(
2289       "template <typename T1, typename T2 = char, typename T3 = char,\n"
2290       "          typename T4 = char>\n"
2291       "void f();");
2292   verifyFormat(
2293       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
2294       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2295 
2296   verifyFormat("a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
2297                "    a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));");
2298 }
2299 
2300 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
2301   verifyFormat(
2302       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2303       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
2304   verifyFormat(
2305       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2306       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2307       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
2308 
2309   // FIXME: Should we have an extra indent after the second break?
2310   verifyFormat(
2311       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2312       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2313       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
2314 
2315   // FIXME: Look into whether we should indent 4 from the start or 4 from
2316   // "bbbbb..." here instead of what we are doing now.
2317   verifyFormat(
2318       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
2319       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
2320 
2321   // Breaking at nested name specifiers is generally not desirable.
2322   verifyFormat(
2323       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2324       "    aaaaaaaaaaaaaaaaaaaaaaa);");
2325 
2326   verifyFormat(
2327       "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2328       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2329       "                   aaaaaaaaaaaaaaaaaaaaa);",
2330       getLLVMStyleWithColumns(74));
2331 
2332   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
2333                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2334                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
2335 }
2336 
2337 TEST_F(FormatTest, UnderstandsTemplateParameters) {
2338   verifyFormat("A<int> a;");
2339   verifyFormat("A<A<A<int> > > a;");
2340   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
2341   verifyFormat("bool x = a < 1 || 2 > a;");
2342   verifyFormat("bool x = 5 < f<int>();");
2343   verifyFormat("bool x = f<int>() > 5;");
2344   verifyFormat("bool x = 5 < a<int>::x;");
2345   verifyFormat("bool x = a < 4 ? a > 2 : false;");
2346   verifyFormat("bool x = f() ? a < 2 : a > 2;");
2347 
2348   verifyGoogleFormat("A<A<int>> a;");
2349   verifyGoogleFormat("A<A<A<int>>> a;");
2350   verifyGoogleFormat("A<A<A<A<int>>>> a;");
2351   verifyGoogleFormat("A<A<int> > a;");
2352   verifyGoogleFormat("A<A<A<int> > > a;");
2353   verifyGoogleFormat("A<A<A<A<int> > > > a;");
2354   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
2355   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
2356 
2357   verifyFormat("test >> a >> b;");
2358   verifyFormat("test << a >> b;");
2359 
2360   verifyFormat("f<int>();");
2361   verifyFormat("template <typename T> void f() {}");
2362 }
2363 
2364 TEST_F(FormatTest, UnderstandsBinaryOperators) {
2365   verifyFormat("COMPARE(a, ==, b);");
2366 }
2367 
2368 TEST_F(FormatTest, UnderstandsPointersToMembers) {
2369   verifyFormat("int A::*x;");
2370   // FIXME: Recognize pointers to member functions.
2371   //verifyFormat("int (S::*func)(void *);");
2372   verifyFormat("int(S::*func)(void *);");
2373   verifyFormat("(a->*f)();");
2374   verifyFormat("a->*x;");
2375   verifyFormat("(a.*f)();");
2376   verifyFormat("((*a).*f)();");
2377   verifyFormat("a.*x;");
2378 }
2379 
2380 TEST_F(FormatTest, UnderstandsUnaryOperators) {
2381   verifyFormat("int a = -2;");
2382   verifyFormat("f(-1, -2, -3);");
2383   verifyFormat("a[-1] = 5;");
2384   verifyFormat("int a = 5 + -2;");
2385   verifyFormat("if (i == -1) {\n}");
2386   verifyFormat("if (i != -1) {\n}");
2387   verifyFormat("if (i > -1) {\n}");
2388   verifyFormat("if (i < -1) {\n}");
2389   verifyFormat("++(a->f());");
2390   verifyFormat("--(a->f());");
2391   verifyFormat("(a->f())++;");
2392   verifyFormat("a[42]++;");
2393   verifyFormat("if (!(a->f())) {\n}");
2394 
2395   verifyFormat("a-- > b;");
2396   verifyFormat("b ? -a : c;");
2397   verifyFormat("n * sizeof char16;");
2398   verifyFormat("n * alignof char16;");
2399   verifyFormat("sizeof(char);");
2400   verifyFormat("alignof(char);");
2401 
2402   verifyFormat("return -1;");
2403   verifyFormat("switch (a) {\n"
2404                "case -1:\n"
2405                "  break;\n"
2406                "}");
2407   verifyFormat("#define X -1");
2408   verifyFormat("#define X -kConstant");
2409 
2410   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = { -5, +3 };");
2411   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = { +5, -3 };");
2412 
2413   verifyFormat("int a = /* confusing comment */ -1;");
2414   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
2415   verifyFormat("int a = i /* confusing comment */++;");
2416 }
2417 
2418 TEST_F(FormatTest, UndestandsOverloadedOperators) {
2419   verifyFormat("bool operator<();");
2420   verifyFormat("bool operator>();");
2421   verifyFormat("bool operator=();");
2422   verifyFormat("bool operator==();");
2423   verifyFormat("bool operator!=();");
2424   verifyFormat("int operator+();");
2425   verifyFormat("int operator++();");
2426   verifyFormat("bool operator();");
2427   verifyFormat("bool operator()();");
2428   verifyFormat("bool operator[]();");
2429   verifyFormat("operator bool();");
2430   verifyFormat("operator int();");
2431   verifyFormat("operator void *();");
2432   verifyFormat("operator SomeType<int>();");
2433   verifyFormat("operator SomeType<int, int>();");
2434   verifyFormat("operator SomeType<SomeType<int> >();");
2435   verifyFormat("void *operator new(std::size_t size);");
2436   verifyFormat("void *operator new[](std::size_t size);");
2437   verifyFormat("void operator delete(void *ptr);");
2438   verifyFormat("void operator delete[](void *ptr);");
2439 
2440   verifyFormat(
2441       "ostream &operator<<(ostream &OutputStream,\n"
2442       "                    SomeReallyLongType WithSomeReallyLongValue);");
2443   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
2444                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
2445                "  return left.group < right.group;\n"
2446                "}");
2447   verifyFormat("SomeType &operator=(const SomeType &S);");
2448 
2449   verifyGoogleFormat("operator void*();");
2450   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
2451 }
2452 
2453 TEST_F(FormatTest, UnderstandsNewAndDelete) {
2454   verifyFormat("void f() {\n"
2455                "  A *a = new A;\n"
2456                "  A *a = new (placement) A;\n"
2457                "  delete a;\n"
2458                "  delete (A *)a;\n"
2459                "}");
2460 }
2461 
2462 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
2463   verifyFormat("int *f(int *a) {}");
2464   verifyFormat("int main(int argc, char **argv) {}");
2465   verifyFormat("Test::Test(int b) : a(b * b) {}");
2466   verifyIndependentOfContext("f(a, *a);");
2467   verifyFormat("void g() { f(*a); }");
2468   verifyIndependentOfContext("int a = b * 10;");
2469   verifyIndependentOfContext("int a = 10 * b;");
2470   verifyIndependentOfContext("int a = b * c;");
2471   verifyIndependentOfContext("int a += b * c;");
2472   verifyIndependentOfContext("int a -= b * c;");
2473   verifyIndependentOfContext("int a *= b * c;");
2474   verifyIndependentOfContext("int a /= b * c;");
2475   verifyIndependentOfContext("int a = *b;");
2476   verifyIndependentOfContext("int a = *b * c;");
2477   verifyIndependentOfContext("int a = b * *c;");
2478   verifyIndependentOfContext("return 10 * b;");
2479   verifyIndependentOfContext("return *b * *c;");
2480   verifyIndependentOfContext("return a & ~b;");
2481   verifyIndependentOfContext("f(b ? *c : *d);");
2482   verifyIndependentOfContext("int a = b ? *c : *d;");
2483   verifyIndependentOfContext("*b = a;");
2484   verifyIndependentOfContext("a * ~b;");
2485   verifyIndependentOfContext("a * !b;");
2486   verifyIndependentOfContext("a * +b;");
2487   verifyIndependentOfContext("a * -b;");
2488   verifyIndependentOfContext("a * ++b;");
2489   verifyIndependentOfContext("a * --b;");
2490   verifyIndependentOfContext("a[4] * b;");
2491   verifyIndependentOfContext("a[a * a] = 1;");
2492   verifyIndependentOfContext("f() * b;");
2493   verifyIndependentOfContext("a * [self dostuff];");
2494   verifyIndependentOfContext("int x = a * (a + b);");
2495   verifyIndependentOfContext("(a *)(a + b);");
2496   verifyIndependentOfContext("int *pa = (int *)&a;");
2497   verifyIndependentOfContext("return sizeof(int **);");
2498   verifyIndependentOfContext("return sizeof(int ******);");
2499   verifyIndependentOfContext("return (int **&)a;");
2500   verifyFormat("void f(Type (*parameter)[10]) {}");
2501   verifyGoogleFormat("return sizeof(int**);");
2502   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
2503   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
2504   // FIXME: The newline is wrong.
2505   verifyFormat("auto a = [](int **&, int ***) {}\n;");
2506 
2507   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
2508 
2509   verifyIndependentOfContext("A<int *> a;");
2510   verifyIndependentOfContext("A<int **> a;");
2511   verifyIndependentOfContext("A<int *, int *> a;");
2512   verifyIndependentOfContext(
2513       "const char *const p = reinterpret_cast<const char *const>(q);");
2514   verifyIndependentOfContext("A<int **, int **> a;");
2515   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
2516   verifyFormat("for (char **a = b; *a; ++a) {\n}");
2517 
2518   verifyFormat(
2519       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2520       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2521 
2522   verifyGoogleFormat("int main(int argc, char** argv) {}");
2523   verifyGoogleFormat("A<int*> a;");
2524   verifyGoogleFormat("A<int**> a;");
2525   verifyGoogleFormat("A<int*, int*> a;");
2526   verifyGoogleFormat("A<int**, int**> a;");
2527   verifyGoogleFormat("f(b ? *c : *d);");
2528   verifyGoogleFormat("int a = b ? *c : *d;");
2529   verifyGoogleFormat("Type* t = **x;");
2530   verifyGoogleFormat("Type* t = *++*x;");
2531   verifyGoogleFormat("*++*x;");
2532   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
2533   verifyGoogleFormat("Type* t = x++ * y;");
2534   verifyGoogleFormat(
2535       "const char* const p = reinterpret_cast<const char* const>(q);");
2536 
2537   verifyIndependentOfContext("a = *(x + y);");
2538   verifyIndependentOfContext("a = &(x + y);");
2539   verifyIndependentOfContext("*(x + y).call();");
2540   verifyIndependentOfContext("&(x + y)->call();");
2541   verifyFormat("void f() { &(*I).first; }");
2542 
2543   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
2544   verifyFormat(
2545       "int *MyValues = {\n"
2546       "  *A, // Operator detection might be confused by the '{'\n"
2547       "  *BB // Operator detection might be confused by previous comment\n"
2548       "};");
2549 
2550   verifyIndependentOfContext("if (int *a = &b)");
2551   verifyIndependentOfContext("if (int &a = *b)");
2552   verifyIndependentOfContext("if (a & b[i])");
2553   verifyIndependentOfContext("if (a::b::c::d & b[i])");
2554   verifyIndependentOfContext("if (*b[i])");
2555   verifyIndependentOfContext("if (int *a = (&b))");
2556   verifyIndependentOfContext("while (int *a = &b)");
2557   verifyFormat("void f() {\n"
2558                "  for (const int &v : Values) {\n"
2559                "  }\n"
2560                "}");
2561   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
2562   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
2563 
2564   verifyIndependentOfContext("A = new SomeType *[Length];");
2565   verifyIndependentOfContext("A = new SomeType *[Length]();");
2566   verifyGoogleFormat("A = new SomeType* [Length]();");
2567   verifyGoogleFormat("A = new SomeType* [Length];");
2568 }
2569 
2570 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
2571   EXPECT_EQ("int *a;\n"
2572             "int *a;\n"
2573             "int *a;",
2574             format("int *a;\n"
2575                    "int* a;\n"
2576                    "int *a;",
2577                    getGoogleStyle()));
2578   EXPECT_EQ("int* a;\n"
2579             "int* a;\n"
2580             "int* a;",
2581             format("int* a;\n"
2582                    "int* a;\n"
2583                    "int *a;",
2584                    getGoogleStyle()));
2585   EXPECT_EQ("int *a;\n"
2586             "int *a;\n"
2587             "int *a;",
2588             format("int *a;\n"
2589                    "int * a;\n"
2590                    "int *  a;",
2591                    getGoogleStyle()));
2592 }
2593 
2594 TEST_F(FormatTest, UnderstandsRvalueReferences) {
2595   verifyFormat("int f(int &&a) {}");
2596   verifyFormat("int f(int a, char &&b) {}");
2597   verifyFormat("void f() { int &&a = b; }");
2598   verifyGoogleFormat("int f(int a, char&& b) {}");
2599   verifyGoogleFormat("void f() { int&& a = b; }");
2600 
2601   // FIXME: These require somewhat deeper changes in template arguments
2602   // formatting.
2603   //  verifyIndependentOfContext("A<int &&> a;");
2604   //  verifyIndependentOfContext("A<int &&, int &&> a;");
2605   //  verifyGoogleFormat("A<int&&> a;");
2606   //  verifyGoogleFormat("A<int&&, int&&> a;");
2607 }
2608 
2609 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
2610   verifyFormat("void f() {\n"
2611                "  x[aaaaaaaaa -\n"
2612                "    b] = 23;\n"
2613                "}",
2614                getLLVMStyleWithColumns(15));
2615 }
2616 
2617 TEST_F(FormatTest, FormatsCasts) {
2618   verifyFormat("Type *A = static_cast<Type *>(P);");
2619   verifyFormat("Type *A = (Type *)P;");
2620   verifyFormat("Type *A = (vector<Type *, int *>)P;");
2621   verifyFormat("int a = (int)(2.0f);");
2622 
2623   // FIXME: These also need to be identified.
2624   verifyFormat("int a = (int) 2.0f;");
2625   verifyFormat("int a = (int) * b;");
2626 
2627   // These are not casts.
2628   verifyFormat("void f(int *) {}");
2629   verifyFormat("f(foo)->b;");
2630   verifyFormat("f(foo).b;");
2631   verifyFormat("f(foo)(b);");
2632   verifyFormat("f(foo)[b];");
2633   verifyFormat("[](foo) { return 4; }(bar)];");
2634   verifyFormat("(*funptr)(foo)[4];");
2635   verifyFormat("funptrs[4](foo)[4];");
2636   verifyFormat("void f(int *);");
2637   verifyFormat("void f(int *) = 0;");
2638   verifyFormat("void f(SmallVector<int>) {}");
2639   verifyFormat("void f(SmallVector<int>);");
2640   verifyFormat("void f(SmallVector<int>) = 0;");
2641   verifyFormat("void f(int i = (kValue) * kMask) {}");
2642   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
2643   verifyFormat("int a = sizeof(int) * b;");
2644   verifyFormat("int a = alignof(int) * b;");
2645 
2646   // These are not casts, but at some point were confused with casts.
2647   verifyFormat("virtual void foo(int *) override;");
2648   verifyFormat("virtual void foo(char &) const;");
2649   verifyFormat("virtual void foo(int *a, char *) const;");
2650   verifyFormat("int a = sizeof(int *) + b;");
2651   verifyFormat("int a = alignof(int *) + b;");
2652 }
2653 
2654 TEST_F(FormatTest, FormatsFunctionTypes) {
2655   verifyFormat("A<bool()> a;");
2656   verifyFormat("A<SomeType()> a;");
2657   verifyFormat("A<void(*)(int, std::string)> a;");
2658   verifyFormat("A<void *(int)>;");
2659   verifyFormat("void *(*a)(int *, SomeType *);");
2660 
2661   // FIXME: Inconsistent.
2662   verifyFormat("int (*func)(void *);");
2663   verifyFormat("void f() { int(*func)(void *); }");
2664 
2665   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
2666   verifyGoogleFormat("void* (*a)(int);");
2667 }
2668 
2669 TEST_F(FormatTest, BreaksLongDeclarations) {
2670   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
2671                "                  int LoooooooooooooooooooongParam2) {}");
2672   verifyFormat(
2673       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
2674       "                                   SourceLocation L, IdentifierIn *II,\n"
2675       "                                   Type *T) {}");
2676   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
2677                "ReallyReallyLongFunctionName(\n"
2678                "    const std::string &SomeParameter,\n"
2679                "    const SomeType<string, SomeOtherTemplateParameter> &\n"
2680                "        ReallyReallyLongParameterName,\n"
2681                "    const SomeType<string, SomeOtherTemplateParameter> &\n"
2682                "        AnotherLongParameterName) {}");
2683   verifyFormat(
2684       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
2685       "aaaaaaaaaaaaaaaaaaaaaaa;");
2686 
2687   verifyGoogleFormat(
2688       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
2689       "                                   SourceLocation L) {}");
2690   verifyGoogleFormat(
2691       "some_namespace::LongReturnType\n"
2692       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
2693       "    int first_long_parameter, int second_parameter) {}");
2694 
2695   verifyGoogleFormat("template <typename T>\n"
2696                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2697                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
2698   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2699                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
2700 }
2701 
2702 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
2703   verifyFormat("(a)->b();");
2704   verifyFormat("--a;");
2705 }
2706 
2707 TEST_F(FormatTest, HandlesIncludeDirectives) {
2708   verifyFormat("#include <string>\n"
2709                "#include <a/b/c.h>\n"
2710                "#include \"a/b/string\"\n"
2711                "#include \"string.h\"\n"
2712                "#include \"string.h\"\n"
2713                "#include <a-a>\n"
2714                "#include < path with space >\n"
2715                "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
2716                getLLVMStyleWithColumns(35));
2717 
2718   verifyFormat("#import <string>");
2719   verifyFormat("#import <a/b/c.h>");
2720   verifyFormat("#import \"a/b/string\"");
2721   verifyFormat("#import \"string.h\"");
2722   verifyFormat("#import \"string.h\"");
2723 }
2724 
2725 //===----------------------------------------------------------------------===//
2726 // Error recovery tests.
2727 //===----------------------------------------------------------------------===//
2728 
2729 TEST_F(FormatTest, IncompleteParameterLists) {
2730   FormatStyle NoBinPacking = getLLVMStyle();
2731   NoBinPacking.BinPackParameters = false;
2732   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
2733                "                        double *min_x,\n"
2734                "                        double *max_x,\n"
2735                "                        double *min_y,\n"
2736                "                        double *max_y,\n"
2737                "                        double *min_z,\n"
2738                "                        double *max_z, ) {}",
2739                NoBinPacking);
2740 }
2741 
2742 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
2743   verifyFormat("void f() { return; }\n42");
2744   verifyFormat("void f() {\n"
2745                "  if (0)\n"
2746                "    return;\n"
2747                "}\n"
2748                "42");
2749   verifyFormat("void f() { return }\n42");
2750   verifyFormat("void f() {\n"
2751                "  if (0)\n"
2752                "    return\n"
2753                "}\n"
2754                "42");
2755 }
2756 
2757 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
2758   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
2759   EXPECT_EQ("void f() {\n"
2760             "  if (a)\n"
2761             "    return\n"
2762             "}",
2763             format("void  f  (  )  {  if  ( a )  return  }"));
2764   EXPECT_EQ("namespace N { void f() }", format("namespace  N  {  void f()  }"));
2765   EXPECT_EQ("namespace N {\n"
2766             "void f() {}\n"
2767             "void g()\n"
2768             "}",
2769             format("namespace N  { void f( ) { } void g( ) }"));
2770 }
2771 
2772 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
2773   verifyFormat("int aaaaaaaa =\n"
2774                "    // Overlylongcomment\n"
2775                "    b;",
2776                getLLVMStyleWithColumns(20));
2777   verifyFormat("function(\n"
2778                "    ShortArgument,\n"
2779                "    LoooooooooooongArgument);\n",
2780                getLLVMStyleWithColumns(20));
2781 }
2782 
2783 TEST_F(FormatTest, IncorrectAccessSpecifier) {
2784   verifyFormat("public:");
2785   verifyFormat("class A {\n"
2786                "public\n"
2787                "  void f() {}\n"
2788                "};");
2789   verifyFormat("public\n"
2790                "int qwerty;");
2791   verifyFormat("public\n"
2792                "B {}");
2793   verifyFormat("public\n"
2794                "{}");
2795   verifyFormat("public\n"
2796                "B { int x; }");
2797 }
2798 
2799 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
2800   verifyFormat("{");
2801   verifyFormat("#})");
2802 }
2803 
2804 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
2805   verifyFormat("do {\n}");
2806   verifyFormat("do {\n}\n"
2807                "f();");
2808   verifyFormat("do {\n}\n"
2809                "wheeee(fun);");
2810   verifyFormat("do {\n"
2811                "  f();\n"
2812                "}");
2813 }
2814 
2815 TEST_F(FormatTest, IncorrectCodeMissingParens) {
2816   verifyFormat("if {\n  foo;\n  foo();\n}");
2817   verifyFormat("switch {\n  foo;\n  foo();\n}");
2818   verifyFormat("for {\n  foo;\n  foo();\n}");
2819   verifyFormat("while {\n  foo;\n  foo();\n}");
2820   verifyFormat("do {\n  foo;\n  foo();\n} while;");
2821 }
2822 
2823 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
2824   verifyFormat("namespace {\n"
2825                "class Foo {  Foo  ( }; }  // comment");
2826 }
2827 
2828 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
2829   EXPECT_EQ("{\n{}\n", format("{\n{\n}\n"));
2830   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
2831   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
2832   EXPECT_EQ("{\n  {}\n  }\n}\n", format("{\n  {\n    }\n  }\n}\n"));
2833 
2834   EXPECT_EQ("{\n"
2835             "    {\n"
2836             " breakme(\n"
2837             "     qwe);\n"
2838             "}\n",
2839             format("{\n"
2840                    "    {\n"
2841                    " breakme(qwe);\n"
2842                    "}\n",
2843                    getLLVMStyleWithColumns(10)));
2844 }
2845 
2846 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
2847   verifyFormat("int x = {\n"
2848                "  avariable,\n"
2849                "  b(alongervariable)\n"
2850                "};",
2851                getLLVMStyleWithColumns(25));
2852 }
2853 
2854 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
2855   verifyFormat("return (a)(b) { 1, 2, 3 };");
2856 }
2857 
2858 TEST_F(FormatTest, LayoutTokensFollowingBlockInParentheses) {
2859   // FIXME: This is bad, find a better and more generic solution.
2860   verifyFormat(
2861       "Aaa({\n"
2862       "  int i;\n"
2863       "},\n"
2864       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2865       "                                     ccccccccccccccccc));");
2866 }
2867 
2868 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
2869   verifyFormat("void f() { return 42; }");
2870   verifyFormat("void f() {\n"
2871                "  // Comment\n"
2872                "}");
2873   verifyFormat("{\n"
2874                "#error {\n"
2875                "  int a;\n"
2876                "}");
2877   verifyFormat("{\n"
2878                "  int a;\n"
2879                "#error {\n"
2880                "}");
2881 
2882   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
2883   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
2884 
2885   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
2886   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
2887 }
2888 
2889 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
2890   // Elaborate type variable declarations.
2891   verifyFormat("struct foo a = { bar };\nint n;");
2892   verifyFormat("class foo a = { bar };\nint n;");
2893   verifyFormat("union foo a = { bar };\nint n;");
2894 
2895   // Elaborate types inside function definitions.
2896   verifyFormat("struct foo f() {}\nint n;");
2897   verifyFormat("class foo f() {}\nint n;");
2898   verifyFormat("union foo f() {}\nint n;");
2899 
2900   // Templates.
2901   verifyFormat("template <class X> void f() {}\nint n;");
2902   verifyFormat("template <struct X> void f() {}\nint n;");
2903   verifyFormat("template <union X> void f() {}\nint n;");
2904 
2905   // Actual definitions...
2906   verifyFormat("struct {\n} n;");
2907   verifyFormat(
2908       "template <template <class T, class Y>, class Z> class X {\n} n;");
2909   verifyFormat("union Z {\n  int n;\n} x;");
2910   verifyFormat("class MACRO Z {\n} n;");
2911   verifyFormat("class MACRO(X) Z {\n} n;");
2912   verifyFormat("class __attribute__(X) Z {\n} n;");
2913   verifyFormat("class __declspec(X) Z {\n} n;");
2914   verifyFormat("class A##B##C {\n} n;");
2915 
2916   // Redefinition from nested context:
2917   verifyFormat("class A::B::C {\n} n;");
2918 
2919   // Template definitions.
2920   // FIXME: This is still incorrectly handled at the formatter side.
2921   verifyFormat("template <> struct X < 15, i < 3 && 42 < 50 && 33<28> {\n};");
2922 
2923   // FIXME:
2924   // This now gets parsed incorrectly as class definition.
2925   // verifyFormat("class A<int> f() {\n}\nint n;");
2926 
2927   // Elaborate types where incorrectly parsing the structural element would
2928   // break the indent.
2929   verifyFormat("if (true)\n"
2930                "  class X x;\n"
2931                "else\n"
2932                "  f();\n");
2933 
2934   // This is simply incomplete. Formatting is not important, but must not crash.
2935   verifyFormat("class A:");
2936 }
2937 
2938 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
2939   verifyFormat("#error Leave     all         white!!!!! space* alone!\n");
2940   verifyFormat("#warning Leave     all         white!!!!! space* alone!\n");
2941   EXPECT_EQ("#error 1", format("  #  error   1"));
2942   EXPECT_EQ("#warning 1", format("  #  warning 1"));
2943 }
2944 
2945 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
2946   FormatStyle AllowsMergedIf = getGoogleStyle();
2947   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
2948   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
2949   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
2950   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
2951   EXPECT_EQ("if (true) return 42;",
2952             format("if (true)\nreturn 42;", AllowsMergedIf));
2953   FormatStyle ShortMergedIf = AllowsMergedIf;
2954   ShortMergedIf.ColumnLimit = 25;
2955   verifyFormat("#define A               \\\n"
2956                "  if (true) return 42;",
2957                ShortMergedIf);
2958   verifyFormat("#define A               \\\n"
2959                "  f();                  \\\n"
2960                "  if (true)\n"
2961                "#define B",
2962                ShortMergedIf);
2963   verifyFormat("#define A               \\\n"
2964                "  f();                  \\\n"
2965                "  if (true)\n"
2966                "g();",
2967                ShortMergedIf);
2968   verifyFormat("{\n"
2969                "#ifdef A\n"
2970                "  // Comment\n"
2971                "  if (true) continue;\n"
2972                "#endif\n"
2973                "  // Comment\n"
2974                "  if (true) continue;",
2975                ShortMergedIf);
2976 }
2977 
2978 TEST_F(FormatTest, BlockCommentsInControlLoops) {
2979   verifyFormat("if (0) /* a comment in a strange place */ {\n"
2980                "  f();\n"
2981                "}");
2982   verifyFormat("if (0) /* a comment in a strange place */ {\n"
2983                "  f();\n"
2984                "} /* another comment */ else /* comment #3 */ {\n"
2985                "  g();\n"
2986                "}");
2987   verifyFormat("while (0) /* a comment in a strange place */ {\n"
2988                "  f();\n"
2989                "}");
2990   verifyFormat("for (;;) /* a comment in a strange place */ {\n"
2991                "  f();\n"
2992                "}");
2993   verifyFormat("do /* a comment in a strange place */ {\n"
2994                "  f();\n"
2995                "} /* another comment */ while (0);");
2996 }
2997 
2998 TEST_F(FormatTest, BlockComments) {
2999   EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
3000             format("/* *//* */  /* */\n/* *//* */  /* */"));
3001   EXPECT_EQ("/* */ a /* */ b;", format("  /* */  a/* */  b;"));
3002   EXPECT_EQ("#define A /*123*/\\\n"
3003             "  b\n"
3004             "/* */\n"
3005             "someCall(\n"
3006             "    parameter);",
3007             format("#define A /*123*/ b\n"
3008                    "/* */\n"
3009                    "someCall(parameter);",
3010                    getLLVMStyleWithColumns(15)));
3011 
3012   EXPECT_EQ("#define A\n"
3013             "/* */ someCall(\n"
3014             "    parameter);",
3015             format("#define A\n"
3016                    "/* */someCall(parameter);",
3017                    getLLVMStyleWithColumns(15)));
3018 
3019   FormatStyle NoBinPacking = getLLVMStyle();
3020   NoBinPacking.BinPackParameters = false;
3021   EXPECT_EQ("someFunction(1, /* comment 1 */\n"
3022             "             2, /* comment 2 */\n"
3023             "             3, /* comment 3 */\n"
3024             "             aaaa,\n"
3025             "             bbbb);",
3026             format("someFunction (1,   /* comment 1 */\n"
3027                    "                2, /* comment 2 */  \n"
3028                    "               3,   /* comment 3 */\n"
3029                    "aaaa, bbbb );",
3030                    NoBinPacking));
3031   verifyFormat(
3032       "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3033       "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3034   EXPECT_EQ(
3035       "bool aaaaaaaaaaaaa = /* trailing comment */\n"
3036       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3037       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
3038       format(
3039           "bool       aaaaaaaaaaaaa =       /* trailing comment */\n"
3040           "    aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa    ||\n"
3041           "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa   || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
3042   EXPECT_EQ(
3043       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
3044       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   /* comment */\n"
3045       "int cccccccccccccccccccccccccccccc;       /* comment */\n",
3046       format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
3047              "int      bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
3048              "int    cccccccccccccccccccccccccccccc;  /* comment */\n"));
3049 }
3050 
3051 TEST_F(FormatTest, BlockCommentsInMacros) {
3052   EXPECT_EQ("#define A          \\\n"
3053             "  {                \\\n"
3054             "    /* one line */ \\\n"
3055             "    someCall();",
3056             format("#define A {        \\\n"
3057                    "  /* one line */   \\\n"
3058                    "  someCall();",
3059                    getLLVMStyleWithColumns(20)));
3060   EXPECT_EQ("#define A          \\\n"
3061             "  {                \\\n"
3062             "    /* previous */ \\\n"
3063             "    /* one line */ \\\n"
3064             "    someCall();",
3065             format("#define A {        \\\n"
3066                    "  /* previous */   \\\n"
3067                    "  /* one line */   \\\n"
3068                    "  someCall();",
3069                    getLLVMStyleWithColumns(20)));
3070 }
3071 
3072 TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
3073   // FIXME: This is not what we want...
3074   verifyFormat("{\n"
3075                "// a"
3076                "// b");
3077 }
3078 
3079 TEST_F(FormatTest, FormatStarDependingOnContext) {
3080   verifyFormat("void f(int *a);");
3081   verifyFormat("void f() { f(fint * b); }");
3082   verifyFormat("class A {\n  void f(int *a);\n};");
3083   verifyFormat("class A {\n  int *a;\n};");
3084   verifyFormat("namespace a {\n"
3085                "namespace b {\n"
3086                "class A {\n"
3087                "  void f() {}\n"
3088                "  int *a;\n"
3089                "};\n"
3090                "}\n"
3091                "}");
3092 }
3093 
3094 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
3095   verifyFormat("while");
3096   verifyFormat("operator");
3097 }
3098 
3099 //===----------------------------------------------------------------------===//
3100 // Objective-C tests.
3101 //===----------------------------------------------------------------------===//
3102 
3103 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
3104   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
3105   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
3106             format("-(NSUInteger)indexOfObject:(id)anObject;"));
3107   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
3108   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
3109   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
3110             format("-(NSInteger)Method3:(id)anObject;"));
3111   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
3112             format("-(NSInteger)Method4:(id)anObject;"));
3113   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
3114             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
3115   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
3116             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
3117   EXPECT_EQ(
3118       "- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;",
3119       format(
3120           "- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;"));
3121 
3122   // Very long objectiveC method declaration.
3123   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
3124                "                    inRange:(NSRange)range\n"
3125                "                   outRange:(NSRange)out_range\n"
3126                "                  outRange1:(NSRange)out_range1\n"
3127                "                  outRange2:(NSRange)out_range2\n"
3128                "                  outRange3:(NSRange)out_range3\n"
3129                "                  outRange4:(NSRange)out_range4\n"
3130                "                  outRange5:(NSRange)out_range5\n"
3131                "                  outRange6:(NSRange)out_range6\n"
3132                "                  outRange7:(NSRange)out_range7\n"
3133                "                  outRange8:(NSRange)out_range8\n"
3134                "                  outRange9:(NSRange)out_range9;");
3135 
3136   verifyFormat("- (int)sum:(vector<int>)numbers;");
3137   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
3138   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
3139   // protocol lists (but not for template classes):
3140   //verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
3141 
3142   verifyFormat("- (int(*)())foo:(int(*)())f;");
3143   verifyGoogleFormat("- (int(*)())foo:(int(*)())foo;");
3144 
3145   // If there's no return type (very rare in practice!), LLVM and Google style
3146   // agree.
3147   verifyFormat("- foo;");
3148   verifyFormat("- foo:(int)f;");
3149   verifyGoogleFormat("- foo:(int)foo;");
3150 }
3151 
3152 TEST_F(FormatTest, FormatObjCBlocks) {
3153   verifyFormat("int (^Block)(int, int);");
3154   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)");
3155 }
3156 
3157 TEST_F(FormatTest, FormatObjCInterface) {
3158   verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
3159                "@public\n"
3160                "  int field1;\n"
3161                "@protected\n"
3162                "  int field2;\n"
3163                "@private\n"
3164                "  int field3;\n"
3165                "@package\n"
3166                "  int field4;\n"
3167                "}\n"
3168                "+ (id)init;\n"
3169                "@end");
3170 
3171   verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
3172                      " @public\n"
3173                      "  int field1;\n"
3174                      " @protected\n"
3175                      "  int field2;\n"
3176                      " @private\n"
3177                      "  int field3;\n"
3178                      " @package\n"
3179                      "  int field4;\n"
3180                      "}\n"
3181                      "+ (id)init;\n"
3182                      "@end");
3183 
3184   verifyFormat("@interface /* wait for it */ Foo\n"
3185                "+ (id)init;\n"
3186                "// Look, a comment!\n"
3187                "- (int)answerWith:(int)i;\n"
3188                "@end");
3189 
3190   verifyFormat("@interface Foo\n"
3191                "@end\n"
3192                "@interface Bar\n"
3193                "@end");
3194 
3195   verifyFormat("@interface Foo : Bar\n"
3196                "+ (id)init;\n"
3197                "@end");
3198 
3199   verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
3200                "+ (id)init;\n"
3201                "@end");
3202 
3203   verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
3204                      "+ (id)init;\n"
3205                      "@end");
3206 
3207   verifyFormat("@interface Foo (HackStuff)\n"
3208                "+ (id)init;\n"
3209                "@end");
3210 
3211   verifyFormat("@interface Foo ()\n"
3212                "+ (id)init;\n"
3213                "@end");
3214 
3215   verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
3216                "+ (id)init;\n"
3217                "@end");
3218 
3219   verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
3220                      "+ (id)init;\n"
3221                      "@end");
3222 
3223   verifyFormat("@interface Foo {\n"
3224                "  int _i;\n"
3225                "}\n"
3226                "+ (id)init;\n"
3227                "@end");
3228 
3229   verifyFormat("@interface Foo : Bar {\n"
3230                "  int _i;\n"
3231                "}\n"
3232                "+ (id)init;\n"
3233                "@end");
3234 
3235   verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
3236                "  int _i;\n"
3237                "}\n"
3238                "+ (id)init;\n"
3239                "@end");
3240 
3241   verifyFormat("@interface Foo (HackStuff) {\n"
3242                "  int _i;\n"
3243                "}\n"
3244                "+ (id)init;\n"
3245                "@end");
3246 
3247   verifyFormat("@interface Foo () {\n"
3248                "  int _i;\n"
3249                "}\n"
3250                "+ (id)init;\n"
3251                "@end");
3252 
3253   verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
3254                "  int _i;\n"
3255                "}\n"
3256                "+ (id)init;\n"
3257                "@end");
3258 }
3259 
3260 TEST_F(FormatTest, FormatObjCImplementation) {
3261   verifyFormat("@implementation Foo : NSObject {\n"
3262                "@public\n"
3263                "  int field1;\n"
3264                "@protected\n"
3265                "  int field2;\n"
3266                "@private\n"
3267                "  int field3;\n"
3268                "@package\n"
3269                "  int field4;\n"
3270                "}\n"
3271                "+ (id)init {\n}\n"
3272                "@end");
3273 
3274   verifyGoogleFormat("@implementation Foo : NSObject {\n"
3275                      " @public\n"
3276                      "  int field1;\n"
3277                      " @protected\n"
3278                      "  int field2;\n"
3279                      " @private\n"
3280                      "  int field3;\n"
3281                      " @package\n"
3282                      "  int field4;\n"
3283                      "}\n"
3284                      "+ (id)init {\n}\n"
3285                      "@end");
3286 
3287   verifyFormat("@implementation Foo\n"
3288                "+ (id)init {\n"
3289                "  if (true)\n"
3290                "    return nil;\n"
3291                "}\n"
3292                "// Look, a comment!\n"
3293                "- (int)answerWith:(int)i {\n"
3294                "  return i;\n"
3295                "}\n"
3296                "+ (int)answerWith:(int)i {\n"
3297                "  return i;\n"
3298                "}\n"
3299                "@end");
3300 
3301   verifyFormat("@implementation Foo\n"
3302                "@end\n"
3303                "@implementation Bar\n"
3304                "@end");
3305 
3306   verifyFormat("@implementation Foo : Bar\n"
3307                "+ (id)init {\n}\n"
3308                "- (void)foo {\n}\n"
3309                "@end");
3310 
3311   verifyFormat("@implementation Foo {\n"
3312                "  int _i;\n"
3313                "}\n"
3314                "+ (id)init {\n}\n"
3315                "@end");
3316 
3317   verifyFormat("@implementation Foo : Bar {\n"
3318                "  int _i;\n"
3319                "}\n"
3320                "+ (id)init {\n}\n"
3321                "@end");
3322 
3323   verifyFormat("@implementation Foo (HackStuff)\n"
3324                "+ (id)init {\n}\n"
3325                "@end");
3326 }
3327 
3328 TEST_F(FormatTest, FormatObjCProtocol) {
3329   verifyFormat("@protocol Foo\n"
3330                "@property(weak) id delegate;\n"
3331                "- (NSUInteger)numberOfThings;\n"
3332                "@end");
3333 
3334   verifyFormat("@protocol MyProtocol <NSObject>\n"
3335                "- (NSUInteger)numberOfThings;\n"
3336                "@end");
3337 
3338   verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
3339                      "- (NSUInteger)numberOfThings;\n"
3340                      "@end");
3341 
3342   verifyFormat("@protocol Foo;\n"
3343                "@protocol Bar;\n");
3344 
3345   verifyFormat("@protocol Foo\n"
3346                "@end\n"
3347                "@protocol Bar\n"
3348                "@end");
3349 
3350   verifyFormat("@protocol myProtocol\n"
3351                "- (void)mandatoryWithInt:(int)i;\n"
3352                "@optional\n"
3353                "- (void)optional;\n"
3354                "@required\n"
3355                "- (void)required;\n"
3356                "@optional\n"
3357                "@property(assign) int madProp;\n"
3358                "@end\n");
3359 }
3360 
3361 TEST_F(FormatTest, FormatObjCMethodDeclarations) {
3362   verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
3363                "                   rect:(NSRect)theRect\n"
3364                "               interval:(float)theInterval {\n"
3365                "}");
3366   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
3367                "          longKeyword:(NSRect)theRect\n"
3368                "    evenLongerKeyword:(float)theInterval\n"
3369                "                error:(NSError **)theError {\n"
3370                "}");
3371 }
3372 
3373 TEST_F(FormatTest, FormatObjCMethodExpr) {
3374   verifyFormat("[foo bar:baz];");
3375   verifyFormat("return [foo bar:baz];");
3376   verifyFormat("f([foo bar:baz]);");
3377   verifyFormat("f(2, [foo bar:baz]);");
3378   verifyFormat("f(2, a ? b : c);");
3379   verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
3380 
3381   // Unary operators.
3382   verifyFormat("int a = +[foo bar:baz];");
3383   verifyFormat("int a = -[foo bar:baz];");
3384   verifyFormat("int a = ![foo bar:baz];");
3385   verifyFormat("int a = ~[foo bar:baz];");
3386   verifyFormat("int a = ++[foo bar:baz];");
3387   verifyFormat("int a = --[foo bar:baz];");
3388   verifyFormat("int a = sizeof [foo bar:baz];");
3389   verifyFormat("int a = alignof [foo bar:baz];");
3390   verifyFormat("int a = &[foo bar:baz];");
3391   verifyFormat("int a = *[foo bar:baz];");
3392   // FIXME: Make casts work, without breaking f()[4].
3393   //verifyFormat("int a = (int)[foo bar:baz];");
3394   //verifyFormat("return (int)[foo bar:baz];");
3395   //verifyFormat("(void)[foo bar:baz];");
3396   verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
3397 
3398   // Binary operators.
3399   verifyFormat("[foo bar:baz], [foo bar:baz];");
3400   verifyFormat("[foo bar:baz] = [foo bar:baz];");
3401   verifyFormat("[foo bar:baz] *= [foo bar:baz];");
3402   verifyFormat("[foo bar:baz] /= [foo bar:baz];");
3403   verifyFormat("[foo bar:baz] %= [foo bar:baz];");
3404   verifyFormat("[foo bar:baz] += [foo bar:baz];");
3405   verifyFormat("[foo bar:baz] -= [foo bar:baz];");
3406   verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
3407   verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
3408   verifyFormat("[foo bar:baz] &= [foo bar:baz];");
3409   verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
3410   verifyFormat("[foo bar:baz] |= [foo bar:baz];");
3411   verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
3412   verifyFormat("[foo bar:baz] || [foo bar:baz];");
3413   verifyFormat("[foo bar:baz] && [foo bar:baz];");
3414   verifyFormat("[foo bar:baz] | [foo bar:baz];");
3415   verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
3416   verifyFormat("[foo bar:baz] & [foo bar:baz];");
3417   verifyFormat("[foo bar:baz] == [foo bar:baz];");
3418   verifyFormat("[foo bar:baz] != [foo bar:baz];");
3419   verifyFormat("[foo bar:baz] >= [foo bar:baz];");
3420   verifyFormat("[foo bar:baz] <= [foo bar:baz];");
3421   verifyFormat("[foo bar:baz] > [foo bar:baz];");
3422   verifyFormat("[foo bar:baz] < [foo bar:baz];");
3423   verifyFormat("[foo bar:baz] >> [foo bar:baz];");
3424   verifyFormat("[foo bar:baz] << [foo bar:baz];");
3425   verifyFormat("[foo bar:baz] - [foo bar:baz];");
3426   verifyFormat("[foo bar:baz] + [foo bar:baz];");
3427   verifyFormat("[foo bar:baz] * [foo bar:baz];");
3428   verifyFormat("[foo bar:baz] / [foo bar:baz];");
3429   verifyFormat("[foo bar:baz] % [foo bar:baz];");
3430   // Whew!
3431 
3432   verifyFormat("return in[42];");
3433   verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
3434                "}");
3435 
3436   verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
3437   verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
3438   verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
3439   verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
3440   verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
3441   verifyFormat("[button setAction:@selector(zoomOut:)];");
3442   verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
3443 
3444   verifyFormat("arr[[self indexForFoo:a]];");
3445   verifyFormat("throw [self errorFor:a];");
3446   verifyFormat("@throw [self errorFor:a];");
3447 
3448   // This tests that the formatter doesn't break after "backing" but before ":",
3449   // which would be at 80 columns.
3450   verifyFormat(
3451       "void f() {\n"
3452       "  if ((self = [super initWithContentRect:contentRect\n"
3453       "                               styleMask:styleMask\n"
3454       "                                 backing:NSBackingStoreBuffered\n"
3455       "                                   defer:YES]))");
3456 
3457   verifyFormat(
3458       "[foo checkThatBreakingAfterColonWorksOk:\n"
3459       "        [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
3460 
3461   verifyFormat("[myObj short:arg1 // Force line break\n"
3462                "          longKeyword:arg2\n"
3463                "    evenLongerKeyword:arg3\n"
3464                "                error:arg4];");
3465   verifyFormat(
3466       "void f() {\n"
3467       "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
3468       "      initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
3469       "                                     pos.width(), pos.height())\n"
3470       "                styleMask:NSBorderlessWindowMask\n"
3471       "                  backing:NSBackingStoreBuffered\n"
3472       "                    defer:NO]);\n"
3473       "}");
3474   verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
3475                "                             with:contentsNativeView];");
3476 
3477   verifyFormat(
3478       "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
3479       "           owner:nillllll];");
3480 
3481   verifyFormat(
3482       "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
3483       "        forType:kBookmarkButtonDragType];");
3484 
3485   verifyFormat("[defaultCenter addObserver:self\n"
3486                "                  selector:@selector(willEnterFullscreen)\n"
3487                "                      name:kWillEnterFullscreenNotification\n"
3488                "                    object:nil];");
3489   verifyFormat("[image_rep drawInRect:drawRect\n"
3490                "             fromRect:NSZeroRect\n"
3491                "            operation:NSCompositeCopy\n"
3492                "             fraction:1.0\n"
3493                "       respectFlipped:NO\n"
3494                "                hints:nil];");
3495 
3496   verifyFormat(
3497       "scoped_nsobject<NSTextField> message(\n"
3498       "    // The frame will be fixed up when |-setMessageText:| is called.\n"
3499       "    [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
3500 }
3501 
3502 TEST_F(FormatTest, ObjCAt) {
3503   verifyFormat("@autoreleasepool");
3504   verifyFormat("@catch");
3505   verifyFormat("@class");
3506   verifyFormat("@compatibility_alias");
3507   verifyFormat("@defs");
3508   verifyFormat("@dynamic");
3509   verifyFormat("@encode");
3510   verifyFormat("@end");
3511   verifyFormat("@finally");
3512   verifyFormat("@implementation");
3513   verifyFormat("@import");
3514   verifyFormat("@interface");
3515   verifyFormat("@optional");
3516   verifyFormat("@package");
3517   verifyFormat("@private");
3518   verifyFormat("@property");
3519   verifyFormat("@protected");
3520   verifyFormat("@protocol");
3521   verifyFormat("@public");
3522   verifyFormat("@required");
3523   verifyFormat("@selector");
3524   verifyFormat("@synchronized");
3525   verifyFormat("@synthesize");
3526   verifyFormat("@throw");
3527   verifyFormat("@try");
3528 
3529   EXPECT_EQ("@interface", format("@ interface"));
3530 
3531   // The precise formatting of this doesn't matter, nobody writes code like
3532   // this.
3533   verifyFormat("@ /*foo*/ interface");
3534 }
3535 
3536 TEST_F(FormatTest, ObjCSnippets) {
3537   verifyFormat("@autoreleasepool {\n"
3538                "  foo();\n"
3539                "}");
3540   verifyFormat("@class Foo, Bar;");
3541   verifyFormat("@compatibility_alias AliasName ExistingClass;");
3542   verifyFormat("@dynamic textColor;");
3543   verifyFormat("char *buf1 = @encode(int *);");
3544   verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
3545   verifyFormat("char *buf1 = @encode(int **);");
3546   verifyFormat("Protocol *proto = @protocol(p1);");
3547   verifyFormat("SEL s = @selector(foo:);");
3548   verifyFormat("@synchronized(self) {\n"
3549                "  f();\n"
3550                "}");
3551 
3552   verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
3553   verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
3554 
3555   verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
3556   verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
3557   verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
3558 }
3559 
3560 TEST_F(FormatTest, ObjCLiterals) {
3561   verifyFormat("@\"String\"");
3562   verifyFormat("@1");
3563   verifyFormat("@+4.8");
3564   verifyFormat("@-4");
3565   verifyFormat("@1LL");
3566   verifyFormat("@.5");
3567   verifyFormat("@'c'");
3568   verifyFormat("@true");
3569 
3570   verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
3571   verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
3572   verifyFormat("NSNumber *favoriteColor = @(Green);");
3573   verifyFormat("NSString *path = @(getenv(\"PATH\"));");
3574 
3575   verifyFormat("@[");
3576   verifyFormat("@[]");
3577   verifyFormat(
3578       "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
3579   verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
3580 
3581   verifyFormat("@{");
3582   verifyFormat("@{}");
3583   verifyFormat("@{ @\"one\" : @1 }");
3584   verifyFormat("return @{ @\"one\" : @1 };");
3585   verifyFormat("@{ @\"one\" : @1, }");
3586 
3587   // FIXME: Breaking in cases where we think there's a structural error
3588   // showed that we're incorrectly parsing this code. We need to fix the
3589   // parsing here.
3590   verifyFormat("@{ @\"one\" : @\n"
3591                "{ @2 : @1 }\n"
3592                "}");
3593   verifyFormat("@{ @\"one\" : @\n"
3594                "{ @2 : @1 }\n"
3595                ",\n"
3596                "}");
3597 
3598   verifyFormat("@{ 1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2 }");
3599   verifyFormat("[self setDict:@{}");
3600   verifyFormat("[self setDict:@{ @1 : @2 }");
3601   verifyFormat("NSLog(@\"%@\", @{ @1 : @2, @2 : @3 }[@1]);");
3602   verifyFormat(
3603       "NSDictionary *masses = @{ @\"H\" : @1.0078, @\"He\" : @4.0026 };");
3604   verifyFormat(
3605       "NSDictionary *settings = @{ AVEncoderKey : @(AVAudioQualityMax) };");
3606 
3607   // FIXME: Nested and multi-line array and dictionary literals need more work.
3608   verifyFormat(
3609       "NSDictionary *d = @{ @\"nam\" : NSUserNam(), @\"dte\" : [NSDate date],\n"
3610       "                     @\"processInfo\" : [NSProcessInfo processInfo] };");
3611 }
3612 
3613 TEST_F(FormatTest, ReformatRegionAdjustsIndent) {
3614   EXPECT_EQ("{\n"
3615             "{\n"
3616             "a;\n"
3617             "b;\n"
3618             "}\n"
3619             "}",
3620             format("{\n"
3621                    "{\n"
3622                    "a;\n"
3623                    "     b;\n"
3624                    "}\n"
3625                    "}",
3626                    13, 2, getLLVMStyle()));
3627   EXPECT_EQ("{\n"
3628             "{\n"
3629             "  a;\n"
3630             "b;\n"
3631             "}\n"
3632             "}",
3633             format("{\n"
3634                    "{\n"
3635                    "     a;\n"
3636                    "b;\n"
3637                    "}\n"
3638                    "}",
3639                    9, 2, getLLVMStyle()));
3640   EXPECT_EQ("{\n"
3641             "{\n"
3642             "public:\n"
3643             "  b;\n"
3644             "}\n"
3645             "}",
3646             format("{\n"
3647                    "{\n"
3648                    "public:\n"
3649                    "     b;\n"
3650                    "}\n"
3651                    "}",
3652                    17, 2, getLLVMStyle()));
3653   EXPECT_EQ("{\n"
3654             "{\n"
3655             "a;\n"
3656             "}\n"
3657             "{\n"
3658             "  b;\n"
3659             "}\n"
3660             "}",
3661             format("{\n"
3662                    "{\n"
3663                    "a;\n"
3664                    "}\n"
3665                    "{\n"
3666                    "           b;\n"
3667                    "}\n"
3668                    "}",
3669                    22, 2, getLLVMStyle()));
3670   EXPECT_EQ("  {\n"
3671             "    a;\n"
3672             "  }",
3673             format("  {\n"
3674                    "a;\n"
3675                    "  }",
3676                    4, 2, getLLVMStyle()));
3677   EXPECT_EQ("void f() {}\n"
3678             "void g() {}",
3679             format("void f() {}\n"
3680                    "void g() {}",
3681                    13, 0, getLLVMStyle()));
3682   EXPECT_EQ("int a; // comment\n"
3683             "       // line 2\n"
3684             "int b;",
3685             format("int a; // comment\n"
3686                    "       // line 2\n"
3687                    "  int b;",
3688                    35, 0, getLLVMStyle()));
3689 }
3690 
3691 TEST_F(FormatTest, BreakStringLiterals) {
3692   EXPECT_EQ("\"some text \"\n"
3693             "\"other\";",
3694             format("\"some text other\";", getLLVMStyleWithColumns(12)));
3695   EXPECT_EQ("\"some text \"\n"
3696             "\"other\";",
3697             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
3698   EXPECT_EQ(
3699       "#define A  \\\n"
3700       "  \"some \"  \\\n"
3701       "  \"text \"  \\\n"
3702       "  \"other\";",
3703       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
3704   EXPECT_EQ(
3705       "#define A  \\\n"
3706       "  \"so \"    \\\n"
3707       "  \"text \"  \\\n"
3708       "  \"other\";",
3709       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
3710 
3711   EXPECT_EQ("\"some text\"",
3712             format("\"some text\"", getLLVMStyleWithColumns(1)));
3713   EXPECT_EQ("\"some text\"",
3714             format("\"some text\"", getLLVMStyleWithColumns(11)));
3715   EXPECT_EQ("\"some \"\n"
3716             "\"text\"",
3717             format("\"some text\"", getLLVMStyleWithColumns(10)));
3718   EXPECT_EQ("\"some \"\n"
3719             "\"text\"",
3720             format("\"some text\"", getLLVMStyleWithColumns(7)));
3721   EXPECT_EQ("\"some\"\n"
3722             "\" tex\"\n"
3723             "\"t\"",
3724             format("\"some text\"", getLLVMStyleWithColumns(6)));
3725   EXPECT_EQ("\"some\"\n"
3726             "\" tex\"\n"
3727             "\" and\"",
3728             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
3729   EXPECT_EQ("\"some\"\n"
3730             "\"/tex\"\n"
3731             "\"/and\"",
3732             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
3733 
3734   EXPECT_EQ("variable =\n"
3735             "    \"long string \"\n"
3736             "    \"literal\";",
3737             format("variable = \"long string literal\";",
3738                    getLLVMStyleWithColumns(20)));
3739 
3740   EXPECT_EQ("variable = f(\n"
3741             "    \"long string \"\n"
3742             "    \"literal\",\n"
3743             "    short,\n"
3744             "    loooooooooooooooooooong);",
3745             format("variable = f(\"long string literal\", short, "
3746                    "loooooooooooooooooooong);",
3747                    getLLVMStyleWithColumns(20)));
3748   EXPECT_EQ(
3749       "f(\"one two\".split(\n"
3750       "    variable));",
3751       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
3752   EXPECT_EQ("f(\"one two three four five six \"\n"
3753             "  \"seven\".split(\n"
3754             "      really_looooong_variable));",
3755             format("f(\"one two three four five six seven\"."
3756                    "split(really_looooong_variable));",
3757                    getLLVMStyleWithColumns(33)));
3758 
3759   EXPECT_EQ("f(\"some \"\n"
3760             "  \"text\",\n"
3761             "  other);",
3762             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
3763 
3764   // Only break as a last resort.
3765   verifyFormat(
3766       "aaaaaaaaaaaaaaaaaaaa(\n"
3767       "    aaaaaaaaaaaaaaaaaaaa,\n"
3768       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
3769 
3770   EXPECT_EQ(
3771       "\"splitmea\"\n"
3772       "\"trandomp\"\n"
3773       "\"oint\"",
3774       format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
3775 
3776   EXPECT_EQ(
3777       "\"split/\"\n"
3778       "\"pathat/\"\n"
3779       "\"slashes\"",
3780       format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
3781 }
3782 
3783 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
3784   EXPECT_EQ("\"\\a\"",
3785             format("\"\\a\"", getLLVMStyleWithColumns(3)));
3786   EXPECT_EQ("\"\\\"",
3787             format("\"\\\"", getLLVMStyleWithColumns(2)));
3788   EXPECT_EQ("\"test\"\n"
3789             "\"\\n\"",
3790             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
3791   EXPECT_EQ("\"tes\\\\\"\n"
3792             "\"n\"",
3793             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
3794   EXPECT_EQ("\"\\\\\\\\\"\n"
3795             "\"\\n\"",
3796             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
3797   EXPECT_EQ("\"\\uff01\"",
3798             format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
3799   EXPECT_EQ("\"\\uff01\"\n"
3800             "\"test\"",
3801             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
3802   EXPECT_EQ("\"\\Uff01ff02\"",
3803             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
3804   EXPECT_EQ("\"\\x000000000001\"\n"
3805             "\"next\"",
3806             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
3807   EXPECT_EQ("\"\\x000000000001next\"",
3808             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
3809   EXPECT_EQ("\"\\x000000000001\"",
3810             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
3811   EXPECT_EQ("\"test\"\n"
3812             "\"\\000000\"\n"
3813             "\"000001\"",
3814             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
3815   EXPECT_EQ("\"test\\000\"\n"
3816             "\"00000000\"\n"
3817             "\"1\"",
3818             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
3819   EXPECT_EQ("R\"(\\x\\x00)\"\n",
3820             format("R\"(\\x\\x00)\"\n", getLLVMStyleWithColumns(7)));
3821 }
3822 
3823 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
3824   verifyFormat("void f() {\n"
3825                "  return g() {}\n"
3826                "  void h() {}");
3827   verifyFormat("if (foo)\n"
3828                "  return { forgot_closing_brace();\n"
3829                "test();");
3830   verifyFormat("int a[] = { void forgot_closing_brace()\n"
3831                "{\n"
3832                "  f();\n"
3833                "  g();\n"
3834                "}");
3835 }
3836 
3837 } // end namespace tooling
3838 } // end namespace clang
3839