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 "clang/Lex/Lexer.h"
14 #include "llvm/Support/Debug.h"
15 #include "gtest/gtest.h"
16 
17 namespace clang {
18 namespace format {
19 
20 class FormatTest : public ::testing::Test {
21 protected:
22   std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length,
23                      const FormatStyle &Style) {
24     DEBUG(llvm::errs() << "---\n");
25     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
26     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
27     ReplacementCount = Replaces.size();
28     std::string Result = applyAllReplacements(Code, Replaces);
29     EXPECT_NE("", Result);
30     DEBUG(llvm::errs() << "\n" << Result << "\n\n");
31     return Result;
32   }
33 
34   std::string
35   format(llvm::StringRef Code, const FormatStyle &Style = getLLVMStyle()) {
36     return format(Code, 0, Code.size(), Style);
37   }
38 
39   std::string messUp(llvm::StringRef Code) {
40     std::string MessedUp(Code.str());
41     bool InComment = false;
42     bool InPreprocessorDirective = false;
43     bool JustReplacedNewline = false;
44     for (unsigned i = 0, e = MessedUp.size() - 1; i != e; ++i) {
45       if (MessedUp[i] == '/' && MessedUp[i + 1] == '/') {
46         if (JustReplacedNewline)
47           MessedUp[i - 1] = '\n';
48         InComment = true;
49       } else if (MessedUp[i] == '#' && (JustReplacedNewline || i == 0)) {
50         if (i != 0)
51           MessedUp[i - 1] = '\n';
52         InPreprocessorDirective = true;
53       } else if (MessedUp[i] == '\\' && MessedUp[i + 1] == '\n') {
54         MessedUp[i] = ' ';
55         MessedUp[i + 1] = ' ';
56       } else if (MessedUp[i] == '\n') {
57         if (InComment) {
58           InComment = false;
59         } else if (InPreprocessorDirective) {
60           InPreprocessorDirective = false;
61         } else {
62           JustReplacedNewline = true;
63           MessedUp[i] = ' ';
64         }
65       } else if (MessedUp[i] != ' ') {
66         JustReplacedNewline = false;
67       }
68     }
69     return MessedUp;
70   }
71 
72   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
73     FormatStyle Style = getLLVMStyle();
74     Style.ColumnLimit = ColumnLimit;
75     return Style;
76   }
77 
78   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
79     FormatStyle Style = getGoogleStyle();
80     Style.ColumnLimit = ColumnLimit;
81     return Style;
82   }
83 
84   void verifyFormat(llvm::StringRef Code,
85                     const FormatStyle &Style = getLLVMStyle()) {
86     EXPECT_EQ(Code.str(), format(messUp(Code), Style));
87   }
88 
89   void verifyGoogleFormat(llvm::StringRef Code) {
90     verifyFormat(Code, getGoogleStyle());
91   }
92 
93   void verifyIndependentOfContext(llvm::StringRef text) {
94     verifyFormat(text);
95     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
96   }
97 
98   int ReplacementCount;
99 };
100 
101 TEST_F(FormatTest, MessUp) {
102   EXPECT_EQ("1 2 3", messUp("1 2 3"));
103   EXPECT_EQ("1 2 3\n", messUp("1\n2\n3\n"));
104   EXPECT_EQ("a\n//b\nc", messUp("a\n//b\nc"));
105   EXPECT_EQ("a\n#b\nc", messUp("a\n#b\nc"));
106   EXPECT_EQ("a\n#b  c  d\ne", messUp("a\n#b\\\nc\\\nd\ne"));
107 }
108 
109 //===----------------------------------------------------------------------===//
110 // Basic function tests.
111 //===----------------------------------------------------------------------===//
112 
113 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
114   EXPECT_EQ(";", format(";"));
115 }
116 
117 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
118   EXPECT_EQ("int i;", format("  int i;"));
119   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
120   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
121   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
122 }
123 
124 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
125   EXPECT_EQ("int i;", format("int\ni;"));
126 }
127 
128 TEST_F(FormatTest, FormatsNestedBlockStatements) {
129   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
130 }
131 
132 TEST_F(FormatTest, FormatsNestedCall) {
133   verifyFormat("Method(f1, f2(f3));");
134   verifyFormat("Method(f1(f2, f3()));");
135   verifyFormat("Method(f1(f2, (f3())));");
136 }
137 
138 TEST_F(FormatTest, NestedNameSpecifiers) {
139   verifyFormat("vector< ::Type> v;");
140   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
141   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
142 }
143 
144 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145   EXPECT_EQ("if (a) {\n"
146             "  f();\n"
147             "}",
148             format("if(a){f();}"));
149   EXPECT_EQ(4, ReplacementCount);
150   EXPECT_EQ("if (a) {\n"
151             "  f();\n"
152             "}",
153             format("if (a) {\n"
154                    "  f();\n"
155                    "}"));
156   EXPECT_EQ(0, ReplacementCount);
157 }
158 
159 TEST_F(FormatTest, RemovesTrailingWhitespaceOfFormattedLine) {
160   EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0, getLLVMStyle()));
161   EXPECT_EQ("int a;", format("int a;         "));
162   EXPECT_EQ("int a;\n", format("int a;  \n   \n   \n "));
163   EXPECT_EQ("int a;\nint b;    ",
164             format("int a;  \nint b;    ", 0, 0, getLLVMStyle()));
165 }
166 
167 TEST_F(FormatTest, FormatsCorrectRegionForLeadingWhitespace) {
168   EXPECT_EQ("int b;\nint a;",
169             format("int b;\n   int a;", 7, 0, getLLVMStyle()));
170   EXPECT_EQ("int b;\n   int a;",
171             format("int b;\n   int a;", 6, 0, getLLVMStyle()));
172 
173   EXPECT_EQ("#define A  \\\n"
174             "  int a;   \\\n"
175             "  int b;",
176             format("#define A  \\\n"
177                    "  int a;   \\\n"
178                    "    int b;",
179                    26, 0, getLLVMStyleWithColumns(12)));
180   EXPECT_EQ("#define A  \\\n"
181             "  int a;   \\\n"
182             "    int b;",
183             format("#define A  \\\n"
184                    "  int a;   \\\n"
185                    "    int b;",
186                    25, 0, getLLVMStyleWithColumns(12)));
187 }
188 
189 TEST_F(FormatTest, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
190   EXPECT_EQ("int  a;\n\n int b;",
191             format("int  a;\n  \n\n int b;", 7, 0, getLLVMStyle()));
192   EXPECT_EQ("int  a;\n\n int b;",
193             format("int  a;\n  \n\n int b;", 9, 0, getLLVMStyle()));
194 }
195 
196 TEST_F(FormatTest, RemovesEmptyLines) {
197   EXPECT_EQ("class C {\n"
198             "  int i;\n"
199             "};",
200             format("class C {\n"
201                    " int i;\n"
202                    "\n"
203                    "};"));
204 
205   // Don't remove empty lines in more complex control statements.
206   EXPECT_EQ("void f() {\n"
207             "  if (a) {\n"
208             "    f();\n"
209             "\n"
210             "  } else if (b) {\n"
211             "    f();\n"
212             "  }\n"
213             "}",
214             format("void f() {\n"
215                    "  if (a) {\n"
216                    "    f();\n"
217                    "\n"
218                    "  } else if (b) {\n"
219                    "    f();\n"
220                    "\n"
221                    "  }\n"
222                    "\n"
223                    "}"));
224 
225   // FIXME: This is slightly inconsistent.
226   EXPECT_EQ("namespace {\n"
227             "int i;\n"
228             "}",
229             format("namespace {\n"
230                    "int i;\n"
231                    "\n"
232                    "}"));
233   EXPECT_EQ("namespace {\n"
234             "int i;\n"
235             "\n"
236             "} // namespace",
237             format("namespace {\n"
238                    "int i;\n"
239                    "\n"
240                    "}  // namespace"));
241 }
242 
243 TEST_F(FormatTest, ReformatsMovedLines) {
244   EXPECT_EQ(
245       "template <typename T> T *getFETokenInfo() const {\n"
246       "  return static_cast<T *>(FETokenInfo);\n"
247       "}\n"
248       "  int a; // <- Should not be formatted",
249       format(
250           "template<typename T>\n"
251           "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
252           "  int a; // <- Should not be formatted",
253           9, 5, getLLVMStyle()));
254 }
255 
256 //===----------------------------------------------------------------------===//
257 // Tests for control statements.
258 //===----------------------------------------------------------------------===//
259 
260 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
261   verifyFormat("if (true)\n  f();\ng();");
262   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
263   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
264 
265   FormatStyle AllowsMergedIf = getLLVMStyle();
266   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
267   verifyFormat("if (a)\n"
268                "  // comment\n"
269                "  f();",
270                AllowsMergedIf);
271   verifyFormat("if (a)\n"
272                "  ;",
273                AllowsMergedIf);
274   verifyFormat("if (a)\n"
275                "  if (b) return;",
276                AllowsMergedIf);
277 
278   verifyFormat("if (a) // Can't merge this\n"
279                "  f();\n",
280                AllowsMergedIf);
281   verifyFormat("if (a) /* still don't merge */\n"
282                "  f();",
283                AllowsMergedIf);
284   verifyFormat("if (a) { // Never merge this\n"
285                "  f();\n"
286                "}",
287                AllowsMergedIf);
288   verifyFormat("if (a) { /* Never merge this */\n"
289                "  f();\n"
290                "}",
291                AllowsMergedIf);
292 
293   EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1, AllowsMergedIf));
294   EXPECT_EQ("if (a) return; // comment",
295             format("if(a)\nreturn; // comment", 20, 1, AllowsMergedIf));
296 
297   AllowsMergedIf.ColumnLimit = 14;
298   verifyFormat("if (a) return;", AllowsMergedIf);
299   verifyFormat("if (aaaaaaaaa)\n"
300                "  return;",
301                AllowsMergedIf);
302 
303   AllowsMergedIf.ColumnLimit = 13;
304   verifyFormat("if (a)\n  return;", AllowsMergedIf);
305 }
306 
307 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
308   FormatStyle AllowsMergedLoops = getLLVMStyle();
309   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
310   verifyFormat("while (true) continue;", AllowsMergedLoops);
311   verifyFormat("for (;;) continue;", AllowsMergedLoops);
312   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
313   verifyFormat("while (true)\n"
314                "  ;",
315                AllowsMergedLoops);
316   verifyFormat("for (;;)\n"
317                "  ;",
318                AllowsMergedLoops);
319   verifyFormat("for (;;)\n"
320                "  for (;;) continue;",
321                AllowsMergedLoops);
322   verifyFormat("for (;;) // Can't merge this\n"
323                "  continue;",
324                AllowsMergedLoops);
325   verifyFormat("for (;;) /* still don't merge */\n"
326                "  continue;",
327                AllowsMergedLoops);
328 }
329 
330 TEST_F(FormatTest, ParseIfElse) {
331   verifyFormat("if (true)\n"
332                "  if (true)\n"
333                "    if (true)\n"
334                "      f();\n"
335                "    else\n"
336                "      g();\n"
337                "  else\n"
338                "    h();\n"
339                "else\n"
340                "  i();");
341   verifyFormat("if (true)\n"
342                "  if (true)\n"
343                "    if (true) {\n"
344                "      if (true)\n"
345                "        f();\n"
346                "    } else {\n"
347                "      g();\n"
348                "    }\n"
349                "  else\n"
350                "    h();\n"
351                "else {\n"
352                "  i();\n"
353                "}");
354   verifyFormat("void f() {\n"
355                "  if (a) {\n"
356                "  } else {\n"
357                "  }\n"
358                "}");
359 }
360 
361 TEST_F(FormatTest, ElseIf) {
362   verifyFormat("if (a) {\n} else if (b) {\n}");
363   verifyFormat("if (a)\n"
364                "  f();\n"
365                "else if (b)\n"
366                "  g();\n"
367                "else\n"
368                "  h();");
369 }
370 
371 TEST_F(FormatTest, FormatsForLoop) {
372   verifyFormat(
373       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
374       "     ++VeryVeryLongLoopVariable)\n"
375       "  ;");
376   verifyFormat("for (;;)\n"
377                "  f();");
378   verifyFormat("for (;;) {\n}");
379   verifyFormat("for (;;) {\n"
380                "  f();\n"
381                "}");
382   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
383 
384   verifyFormat(
385       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
386       "                                          E = UnwrappedLines.end();\n"
387       "     I != E; ++I) {\n}");
388 
389   verifyFormat(
390       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
391       "     ++IIIII) {\n}");
392   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
393                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
394                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
395   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
396                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
397                "         E = FD->getDeclsInPrototypeScope().end();\n"
398                "     I != E; ++I) {\n}");
399 
400   // FIXME: Not sure whether we want extra identation in line 3 here:
401   verifyFormat(
402       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
403       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
404       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
405       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
406       "     ++aaaaaaaaaaa) {\n}");
407   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
408                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
409                "}");
410   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
411                "         aaaaaaaaaa);\n"
412                "     iter; ++iter) {\n"
413                "}");
414 
415   FormatStyle NoBinPacking = getLLVMStyle();
416   NoBinPacking.BinPackParameters = false;
417   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
418                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
419                "                                           aaaaaaaaaaaaaaaa,\n"
420                "                                           aaaaaaaaaaaaaaaa,\n"
421                "                                           aaaaaaaaaaaaaaaa);\n"
422                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
423                "}",
424                NoBinPacking);
425   verifyFormat(
426       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
427       "                                          E = UnwrappedLines.end();\n"
428       "     I != E;\n"
429       "     ++I) {\n}",
430       NoBinPacking);
431 }
432 
433 TEST_F(FormatTest, RangeBasedForLoops) {
434   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
435                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
436   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
437                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
438   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
439                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
440 }
441 
442 TEST_F(FormatTest, FormatsWhileLoop) {
443   verifyFormat("while (true) {\n}");
444   verifyFormat("while (true)\n"
445                "  f();");
446   verifyFormat("while () {\n}");
447   verifyFormat("while () {\n"
448                "  f();\n"
449                "}");
450 }
451 
452 TEST_F(FormatTest, FormatsDoWhile) {
453   verifyFormat("do {\n"
454                "  do_something();\n"
455                "} while (something());");
456   verifyFormat("do\n"
457                "  do_something();\n"
458                "while (something());");
459 }
460 
461 TEST_F(FormatTest, FormatsSwitchStatement) {
462   verifyFormat("switch (x) {\n"
463                "case 1:\n"
464                "  f();\n"
465                "  break;\n"
466                "case kFoo:\n"
467                "case ns::kBar:\n"
468                "case kBaz:\n"
469                "  break;\n"
470                "default:\n"
471                "  g();\n"
472                "  break;\n"
473                "}");
474   verifyFormat("switch (x) {\n"
475                "case 1: {\n"
476                "  f();\n"
477                "  break;\n"
478                "}\n"
479                "}");
480   verifyFormat("switch (x) {\n"
481                "case 1: {\n"
482                "  f();\n"
483                "  {\n"
484                "    g();\n"
485                "    h();\n"
486                "  }\n"
487                "  break;\n"
488                "}\n"
489                "}");
490   verifyFormat("switch (x) {\n"
491                "case 1: {\n"
492                "  f();\n"
493                "  if (foo) {\n"
494                "    g();\n"
495                "    h();\n"
496                "  }\n"
497                "  break;\n"
498                "}\n"
499                "}");
500   verifyFormat("switch (x) {\n"
501                "case 1: {\n"
502                "  f();\n"
503                "  g();\n"
504                "} break;\n"
505                "}");
506   verifyFormat("switch (test)\n"
507                "  ;");
508   verifyFormat("switch (x) {\n"
509                "default: {\n"
510                "  // Do nothing.\n"
511                "}\n"
512                "}");
513   verifyFormat("switch (x) {\n"
514                "// comment\n"
515                "// if 1, do f()\n"
516                "case 1:\n"
517                "  f();\n"
518                "}");
519   verifyFormat("switch (x) {\n"
520                "case 1:\n"
521                "  // Do amazing stuff\n"
522                "  {\n"
523                "    f();\n"
524                "    g();\n"
525                "  }\n"
526                "  break;\n"
527                "}");
528   verifyFormat("#define A          \\\n"
529                "  switch (x) {     \\\n"
530                "  case a:          \\\n"
531                "    foo = b;       \\\n"
532                "  }", getLLVMStyleWithColumns(20));
533   verifyFormat("#define OPERATION_CASE(name)           \\\n"
534                "  case OP_name:                        \\\n"
535                "    return operations::Operation##name\n",
536                getLLVMStyleWithColumns(40));
537 
538   verifyGoogleFormat("switch (x) {\n"
539                      "  case 1:\n"
540                      "    f();\n"
541                      "    break;\n"
542                      "  case kFoo:\n"
543                      "  case ns::kBar:\n"
544                      "  case kBaz:\n"
545                      "    break;\n"
546                      "  default:\n"
547                      "    g();\n"
548                      "    break;\n"
549                      "}");
550   verifyGoogleFormat("switch (x) {\n"
551                      "  case 1: {\n"
552                      "    f();\n"
553                      "    break;\n"
554                      "  }\n"
555                      "}");
556   verifyGoogleFormat("switch (test)\n"
557                      "  ;");
558 
559   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
560                      "  case OP_name:              \\\n"
561                      "    return operations::Operation##name\n");
562   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
563                      "  // Get the correction operation class.\n"
564                      "  switch (OpCode) {\n"
565                      "    CASE(Add);\n"
566                      "    CASE(Subtract);\n"
567                      "    default:\n"
568                      "      return operations::Unknown;\n"
569                      "  }\n"
570                      "#undef OPERATION_CASE\n"
571                      "}");
572   verifyFormat("DEBUG({\n"
573                "  switch (x) {\n"
574                "  case A:\n"
575                "    f();\n"
576                "    break;\n"
577                "  // On B:\n"
578                "  case B:\n"
579                "    g();\n"
580                "    break;\n"
581                "  }\n"
582                "});");
583 }
584 
585 TEST_F(FormatTest, FormatsLabels) {
586   verifyFormat("void f() {\n"
587                "  some_code();\n"
588                "test_label:\n"
589                "  some_other_code();\n"
590                "  {\n"
591                "    some_more_code();\n"
592                "  another_label:\n"
593                "    some_more_code();\n"
594                "  }\n"
595                "}");
596   verifyFormat("some_code();\n"
597                "test_label:\n"
598                "some_other_code();");
599 }
600 
601 //===----------------------------------------------------------------------===//
602 // Tests for comments.
603 //===----------------------------------------------------------------------===//
604 
605 TEST_F(FormatTest, UnderstandsSingleLineComments) {
606   verifyFormat("//* */");
607   verifyFormat("// line 1\n"
608                "// line 2\n"
609                "void f() {}\n");
610 
611   verifyFormat("void f() {\n"
612                "  // Doesn't do anything\n"
613                "}");
614   verifyFormat("SomeObject\n"
615                "    // Calling someFunction on SomeObject\n"
616                "    .someFunction();");
617   verifyFormat("void f(int i,  // some comment (probably for i)\n"
618                "       int j,  // some comment (probably for j)\n"
619                "       int k); // some comment (probably for k)");
620   verifyFormat("void f(int i,\n"
621                "       // some comment (probably for j)\n"
622                "       int j,\n"
623                "       // some comment (probably for k)\n"
624                "       int k);");
625 
626   verifyFormat("int i    // This is a fancy variable\n"
627                "    = 5; // with nicely aligned comment.");
628 
629   verifyFormat("// Leading comment.\n"
630                "int a; // Trailing comment.");
631   verifyFormat("int a; // Trailing comment\n"
632                "       // on 2\n"
633                "       // or 3 lines.\n"
634                "int b;");
635   verifyFormat("int a; // Trailing comment\n"
636                "\n"
637                "// Leading comment.\n"
638                "int b;");
639   verifyFormat("int a;    // Comment.\n"
640                "          // More details.\n"
641                "int bbbb; // Another comment.");
642   verifyFormat(
643       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
644       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   // comment\n"
645       "int cccccccccccccccccccccccccccccc;       // comment\n"
646       "int ddd;                     // looooooooooooooooooooooooong comment\n"
647       "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
648       "int bbbbbbbbbbbbbbbbbbbbb;   // comment\n"
649       "int ccccccccccccccccccc;     // comment");
650 
651   verifyFormat("#include \"a\"     // comment\n"
652                "#include \"a/b/c\" // comment");
653   verifyFormat("#include <a>     // comment\n"
654                "#include <a/b/c> // comment");
655   EXPECT_EQ("#include \\\n"
656             "  \"a\"            // comment\n"
657             "#include \"a/b/c\" // comment",
658             format("#include \\\n"
659                    "  \"a\" // comment\n"
660                    "#include \"a/b/c\" // comment"));
661 
662   verifyFormat("enum E {\n"
663                "  // comment\n"
664                "  VAL_A, // comment\n"
665                "  VAL_B\n"
666                "};");
667 
668   verifyFormat(
669       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
670       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
671   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
672                "    // Comment inside a statement.\n"
673                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
674   verifyFormat(
675       "bool aaaaaaaaaaaaa = // comment\n"
676       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
677       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
678 
679   verifyFormat("int aaaa; // aaaaa\n"
680                "int aa;   // aaaaaaa",
681                getLLVMStyleWithColumns(20));
682 
683   EXPECT_EQ("void f() { // This does something ..\n"
684             "}\n"
685             "int a; // This is unrelated",
686             format("void f()    {     // This does something ..\n"
687                    "  }\n"
688                    "int   a;     // This is unrelated"));
689   EXPECT_EQ("class C {\n"
690             "  void f() { // This does something ..\n"
691             "  }          // awesome..\n"
692             "\n"
693             "  int a; // This is unrelated\n"
694             "};",
695             format("class C{void f()    { // This does something ..\n"
696                    "      } // awesome..\n"
697                    " \n"
698                    "int a;    // This is unrelated\n"
699                    "};"));
700 
701   EXPECT_EQ("int i; // single line trailing comment",
702             format("int i;\\\n// single line trailing comment"));
703 
704   verifyGoogleFormat("int a;  // Trailing comment.");
705 
706   verifyFormat("someFunction(anotherFunction( // Force break.\n"
707                "    parameter));");
708 
709   verifyGoogleFormat("#endif  // HEADER_GUARD");
710 
711   verifyFormat("const char *test[] = {\n"
712                "  // A\n"
713                "  \"aaaa\",\n"
714                "  // B\n"
715                "  \"aaaaa\",\n"
716                "};");
717   verifyGoogleFormat(
718       "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
719       "    aaaaaaaaaaaaaaaaaaaaaa);  // 81_cols_with_this_comment");
720   EXPECT_EQ("D(a, {\n"
721             "  // test\n"
722             "  int a;\n"
723             "});",
724             format("D(a, {\n"
725                    "// test\n"
726                    "int a;\n"
727                    "});"));
728 
729   EXPECT_EQ("lineWith(); // comment\n"
730             "// at start\n"
731             "otherLine();",
732             format("lineWith();   // comment\n"
733                    "// at start\n"
734                    "otherLine();"));
735   EXPECT_EQ("lineWith(); // comment\n"
736             "            // at start\n"
737             "otherLine();",
738             format("lineWith();   // comment\n"
739                    " // at start\n"
740                    "otherLine();"));
741 
742   EXPECT_EQ("lineWith(); // comment\n"
743             "// at start\n"
744             "otherLine(); // comment",
745             format("lineWith();   // comment\n"
746                    "// at start\n"
747                    "otherLine();   // comment"));
748   EXPECT_EQ("lineWith();\n"
749             "// at start\n"
750             "otherLine(); // comment",
751             format("lineWith();\n"
752                    " // at start\n"
753                    "otherLine();   // comment"));
754   EXPECT_EQ("// first\n"
755             "// at start\n"
756             "otherLine(); // comment",
757             format("// first\n"
758                    " // at start\n"
759                    "otherLine();   // comment"));
760   EXPECT_EQ("f();\n"
761             "// first\n"
762             "// at start\n"
763             "otherLine(); // comment",
764             format("f();\n"
765                    "// first\n"
766                    " // at start\n"
767                    "otherLine();   // comment"));
768 }
769 
770 TEST_F(FormatTest, CanFormatCommentsLocally) {
771   EXPECT_EQ("int a;    // comment\n"
772             "int    b; // comment",
773             format("int   a; // comment\n"
774                    "int    b; // comment",
775                    0, 0, getLLVMStyle()));
776   EXPECT_EQ("int   a; // comment\n"
777             "         // line 2\n"
778             "int b;",
779             format("int   a; // comment\n"
780                    "            // line 2\n"
781                    "int b;",
782                    28, 0, getLLVMStyle()));
783   EXPECT_EQ("int aaaaaa; // comment\n"
784             "int b;\n"
785             "int c; // unrelated comment",
786             format("int aaaaaa; // comment\n"
787                    "int b;\n"
788                    "int   c; // unrelated comment",
789                    31, 0, getLLVMStyle()));
790 }
791 
792 TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
793   EXPECT_EQ("// comment", format("// comment  "));
794   EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
795             format("int aaaaaaa, bbbbbbb; // comment                   ",
796                    getLLVMStyleWithColumns(33)));
797   EXPECT_EQ("// comment\\\n", format("// comment\\\n  \t \v   \f   "));
798   EXPECT_EQ("// comment    \\\n", format("// comment    \\\n  \t \v   \f   "));
799 }
800 
801 TEST_F(FormatTest, UnderstandsBlockComments) {
802   verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
803   EXPECT_EQ(
804       "f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
805       "  bbbbbbbbbbbbbbbbbbbbbbbbb);",
806       format("f(aaaaaaaaaaaaaaaaaaaaaaaaa ,   \\\n/* Trailing comment for aa... */\n"
807              "  bbbbbbbbbbbbbbbbbbbbbbbbb);"));
808   EXPECT_EQ(
809       "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
810       "  /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
811       format("f(aaaaaaaaaaaaaaaaaaaaaaaaa    ,   \n"
812              "/* Leading comment for bb... */   bbbbbbbbbbbbbbbbbbbbbbbbb);"));
813   EXPECT_EQ(
814       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
815       "    aaaaaaaaaaaaaaaaaa,\n"
816       "    aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
817       "}",
818       format("void      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
819              "                      aaaaaaaaaaaaaaaaaa  ,\n"
820              "    aaaaaaaaaaaaaaaaaa) {   /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
821              "}"));
822 
823   FormatStyle NoBinPacking = getLLVMStyle();
824   NoBinPacking.BinPackParameters = false;
825   verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
826                "         /* parameter 2 */ aaaaaa,\n"
827                "         /* parameter 3 */ aaaaaa,\n"
828                "         /* parameter 4 */ aaaaaa);",
829                NoBinPacking);
830 }
831 
832 TEST_F(FormatTest, AlignsBlockComments) {
833   EXPECT_EQ("/*\n"
834             " * Really multi-line\n"
835             " * comment.\n"
836             " */\n"
837             "void f() {}",
838             format("  /*\n"
839                    "   * Really multi-line\n"
840                    "   * comment.\n"
841                    "   */\n"
842                    "  void f() {}"));
843   EXPECT_EQ("class C {\n"
844             "  /*\n"
845             "   * Another multi-line\n"
846             "   * comment.\n"
847             "   */\n"
848             "  void f() {}\n"
849             "};",
850             format("class C {\n"
851                    "/*\n"
852                    " * Another multi-line\n"
853                    " * comment.\n"
854                    " */\n"
855                    "void f() {}\n"
856                    "};"));
857   EXPECT_EQ("/*\n"
858             "  1. This is a comment with non-trivial formatting.\n"
859             "     1.1. We have to indent/outdent all lines equally\n"
860             "         1.1.1. to keep the formatting.\n"
861             " */",
862             format("  /*\n"
863                    "    1. This is a comment with non-trivial formatting.\n"
864                    "       1.1. We have to indent/outdent all lines equally\n"
865                    "           1.1.1. to keep the formatting.\n"
866                    "   */"));
867   EXPECT_EQ("/*\n"
868             "Don't try to outdent if there's not enough indentation.\n"
869             "*/",
870             format("  /*\n"
871                    " Don't try to outdent if there's not enough indentation.\n"
872                    " */"));
873 
874   EXPECT_EQ("int i; /* Comment with empty...\n"
875             "        *\n"
876             "        * line. */",
877             format("int i; /* Comment with empty...\n"
878                    "        *\n"
879                    "        * line. */"));
880 }
881 
882 TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
883   EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
884             "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
885             format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
886                    "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
887   EXPECT_EQ(
888       "void ffffffffffff(\n"
889       "    int aaaaaaaa, int bbbbbbbb,\n"
890       "    int cccccccccccc) { /*\n"
891       "                           aaaaaaaaaa\n"
892       "                           aaaaaaaaaaaaa\n"
893       "                           bbbbbbbbbbbbbb\n"
894       "                           bbbbbbbbbb\n"
895       "                         */\n"
896       "}",
897       format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
898              "{ /*\n"
899              "     aaaaaaaaaa aaaaaaaaaaaaa\n"
900              "     bbbbbbbbbbbbbb bbbbbbbbbb\n"
901              "   */\n"
902              "}",
903              getLLVMStyleWithColumns(40)));
904 }
905 
906 TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
907   EXPECT_EQ("void\n"
908             "ffffffffff(int aaaaa /* test */);",
909             format("void ffffffffff(int aaaaa /* test */);",
910                    getLLVMStyleWithColumns(35)));
911 }
912 
913 TEST_F(FormatTest, SplitsLongCxxComments) {
914   EXPECT_EQ("// A comment that\n"
915             "// doesn't fit on\n"
916             "// one line",
917             format("// A comment that doesn't fit on one line",
918                    getLLVMStyleWithColumns(20)));
919   EXPECT_EQ("// a b c d\n"
920             "// e f  g\n"
921             "// h i j k",
922             format("// a b c d e f  g h i j k",
923                    getLLVMStyleWithColumns(10)));
924   EXPECT_EQ("// a b c d\n"
925             "// e f  g\n"
926             "// h i j k",
927             format("\\\n// a b c d e f  g h i j k",
928                    getLLVMStyleWithColumns(10)));
929   EXPECT_EQ("if (true) // A comment that\n"
930             "          // doesn't fit on\n"
931             "          // one line",
932             format("if (true) // A comment that doesn't fit on one line   ",
933                    getLLVMStyleWithColumns(30)));
934   EXPECT_EQ("//    Don't_touch_leading_whitespace",
935             format("//    Don't_touch_leading_whitespace",
936                    getLLVMStyleWithColumns(20)));
937   EXPECT_EQ("// Add leading\n"
938             "// whitespace",
939             format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
940   EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
941   EXPECT_EQ("// Even if it makes the line exceed the column\n"
942             "// limit",
943             format("//Even if it makes the line exceed the column limit",
944                    getLLVMStyleWithColumns(51)));
945   EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
946   EXPECT_EQ("// A comment before\n"
947             "// a macro\n"
948             "// definition\n"
949             "#define a b",
950             format("// A comment before a macro definition\n"
951                    "#define a b",
952                    getLLVMStyleWithColumns(20)));
953   EXPECT_EQ("void ffffff(int aaaaaaaaa,  // wwww\n"
954             "            int a, int bbb, // xxxxxxx\n"
955             "                            // yyyyyyyyy\n"
956             "            int c, int d, int e) {}",
957             format("void ffffff(\n"
958                    "    int aaaaaaaaa, // wwww\n"
959                    "    int a,\n"
960                    "    int bbb, // xxxxxxx yyyyyyyyy\n"
961                    "    int c, int d, int e) {}",
962                    getLLVMStyleWithColumns(40)));
963   EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
964             format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
965                    getLLVMStyleWithColumns(20)));
966 }
967 
968 TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
969   EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
970             "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
971             "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
972             format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
973                    "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
974                    "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
975   EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
976             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
977             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
978             format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
979                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
980                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
981                    getLLVMStyleWithColumns(50)));
982   // FIXME: One day we might want to implement adjustment of leading whitespace
983   // of the consecutive lines in this kind of comment:
984   EXPECT_EQ("int\n"
985             "a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
986             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
987             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
988             format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
989                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
990                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
991                    getLLVMStyleWithColumns(49)));
992 }
993 
994 TEST_F(FormatTest, PriorityOfCommentBreaking) {
995   EXPECT_EQ("if (xxx ==\n"
996             "        yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
997             "    zzz)\n"
998             "  q();",
999             format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1000                    "    zzz) q();",
1001                    getLLVMStyleWithColumns(40)));
1002   EXPECT_EQ("if (xxxxxxxxxx ==\n"
1003             "        yyy && // aaaaaa bbbbbbbb cccc\n"
1004             "    zzz)\n"
1005             "  q();",
1006             format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1007                    "    zzz) q();",
1008                    getLLVMStyleWithColumns(40)));
1009   EXPECT_EQ("if (xxxxxxxxxx &&\n"
1010             "        yyy || // aaaaaa bbbbbbbb cccc\n"
1011             "    zzz)\n"
1012             "  q();",
1013             format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1014                    "    zzz) q();",
1015                    getLLVMStyleWithColumns(40)));
1016   EXPECT_EQ("fffffffff(&xxx, // aaaaaaaaaaaa\n"
1017             "                // bbbbbbbbbbb\n"
1018             "          zzz);",
1019             format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1020                    " zzz);",
1021                    getLLVMStyleWithColumns(40)));
1022 }
1023 
1024 TEST_F(FormatTest, MultiLineCommentsInDefines) {
1025   EXPECT_EQ("#define A(x) /* \\\n"
1026             "  a comment     \\\n"
1027             "  inside */     \\\n"
1028             "  f();",
1029             format("#define A(x) /* \\\n"
1030                    "  a comment     \\\n"
1031                    "  inside */     \\\n"
1032                    "  f();",
1033                    getLLVMStyleWithColumns(17)));
1034   EXPECT_EQ("#define A(      \\\n"
1035             "    x) /*       \\\n"
1036             "  a comment     \\\n"
1037             "  inside */     \\\n"
1038             "  f();",
1039             format("#define A(      \\\n"
1040                    "    x) /*       \\\n"
1041                    "  a comment     \\\n"
1042                    "  inside */     \\\n"
1043                    "  f();",
1044                    getLLVMStyleWithColumns(17)));
1045 }
1046 
1047 TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
1048   EXPECT_EQ("namespace {}\n// Test\n#define A",
1049             format("namespace {}\n   // Test\n#define A"));
1050   EXPECT_EQ("namespace {}\n/* Test */\n#define A",
1051             format("namespace {}\n   /* Test */\n#define A"));
1052   EXPECT_EQ("namespace {}\n/* Test */ #define A",
1053             format("namespace {}\n   /* Test */    #define A"));
1054 }
1055 
1056 TEST_F(FormatTest, SplitsLongLinesInComments) {
1057   EXPECT_EQ("/* This is a long\n"
1058             " * comment that\n"
1059             " * doesn't\n"
1060             " * fit on one line.\n"
1061             " */",
1062             format("/* "
1063                    "This is a long                                         "
1064                    "comment that "
1065                    "doesn't                                    "
1066                    "fit on one line.  */",
1067                    getLLVMStyleWithColumns(20)));
1068   EXPECT_EQ("/* a b c d\n"
1069             " * e f  g\n"
1070             " * h i j k\n"
1071             " */",
1072             format("/* a b c d e f  g h i j k */",
1073                    getLLVMStyleWithColumns(10)));
1074   EXPECT_EQ("/* a b c d\n"
1075             " * e f  g\n"
1076             " * h i j k\n"
1077             " */",
1078             format("\\\n/* a b c d e f  g h i j k */",
1079                    getLLVMStyleWithColumns(10)));
1080   EXPECT_EQ("/*\n"
1081             "This is a long\n"
1082             "comment that doesn't\n"
1083             "fit on one line.\n"
1084             "*/",
1085             format("/*\n"
1086                    "This is a long                                         "
1087                    "comment that doesn't                                    "
1088                    "fit on one line.                                      \n"
1089                    "*/", getLLVMStyleWithColumns(20)));
1090   EXPECT_EQ("/*\n"
1091             " * This is a long\n"
1092             " * comment that\n"
1093             " * doesn't fit on\n"
1094             " * one line.\n"
1095             " */",
1096             format("/*      \n"
1097                    " * This is a long "
1098                    "   comment that     "
1099                    "   doesn't fit on   "
1100                    "   one line.                                            \n"
1101                    " */", getLLVMStyleWithColumns(20)));
1102   EXPECT_EQ("/*\n"
1103             " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1104             " * so_it_should_be_broken\n"
1105             " * wherever_a_space_occurs\n"
1106             " */",
1107             format("/*\n"
1108                    " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1109                    "   so_it_should_be_broken "
1110                    "   wherever_a_space_occurs                             \n"
1111                    " */",
1112                    getLLVMStyleWithColumns(20)));
1113   EXPECT_EQ("/*\n"
1114             " *    This_comment_can_not_be_broken_into_lines\n"
1115             " */",
1116             format("/*\n"
1117                    " *    This_comment_can_not_be_broken_into_lines\n"
1118                    " */",
1119                    getLLVMStyleWithColumns(20)));
1120   EXPECT_EQ("{\n"
1121             "  /*\n"
1122             "  This is another\n"
1123             "  long comment that\n"
1124             "  doesn't fit on one\n"
1125             "  line    1234567890\n"
1126             "  */\n"
1127             "}",
1128             format("{\n"
1129                    "/*\n"
1130                    "This is another     "
1131                    "  long comment that "
1132                    "  doesn't fit on one"
1133                    "  line    1234567890\n"
1134                    "*/\n"
1135                    "}", getLLVMStyleWithColumns(20)));
1136   EXPECT_EQ("{\n"
1137             "  /*\n"
1138             "   * This        i s\n"
1139             "   * another comment\n"
1140             "   * t hat  doesn' t\n"
1141             "   * fit on one l i\n"
1142             "   * n e\n"
1143             "   */\n"
1144             "}",
1145             format("{\n"
1146                    "/*\n"
1147                    " * This        i s"
1148                    "   another comment"
1149                    "   t hat  doesn' t"
1150                    "   fit on one l i"
1151                    "   n e\n"
1152                    " */\n"
1153                    "}", getLLVMStyleWithColumns(20)));
1154   EXPECT_EQ("/*\n"
1155             " * This is a long\n"
1156             " * comment that\n"
1157             " * doesn't fit on\n"
1158             " * one line\n"
1159             " */",
1160             format("   /*\n"
1161                    "    * This is a long comment that doesn't fit on one line\n"
1162                    "    */", getLLVMStyleWithColumns(20)));
1163   EXPECT_EQ("{\n"
1164             "  if (something) /* This is a\n"
1165             "                    long\n"
1166             "                    comment */\n"
1167             "    ;\n"
1168             "}",
1169             format("{\n"
1170                    "  if (something) /* This is a long comment */\n"
1171                    "    ;\n"
1172                    "}",
1173                    getLLVMStyleWithColumns(30)));
1174 
1175   EXPECT_EQ("/* A comment before\n"
1176             " * a macro\n"
1177             " * definition */\n"
1178             "#define a b",
1179             format("/* A comment before a macro definition */\n"
1180                    "#define a b",
1181                    getLLVMStyleWithColumns(20)));
1182 
1183   EXPECT_EQ("/* some comment\n"
1184             "     *   a comment\n"
1185             "* that we break\n"
1186             " * another comment\n"
1187             "* we have to break\n"
1188             "* a left comment\n"
1189             " */",
1190             format("  /* some comment\n"
1191                    "       *   a comment that we break\n"
1192                    "   * another comment we have to break\n"
1193                    "* a left comment\n"
1194                    "   */",
1195                    getLLVMStyleWithColumns(20)));
1196 
1197   EXPECT_EQ("/*\n"
1198             "\n"
1199             "\n"
1200             "    */\n",
1201             format("  /*       \n"
1202                    "      \n"
1203                    "               \n"
1204                    "      */\n"));
1205 }
1206 
1207 TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1208   EXPECT_EQ("#define X          \\\n"
1209             "  /*               \\\n"
1210             "   Test            \\\n"
1211             "   Macro comment   \\\n"
1212             "   with a long     \\\n"
1213             "   line            \\\n"
1214             "   */              \\\n"
1215             "  A + B",
1216             format("#define X \\\n"
1217                    "  /*\n"
1218                    "   Test\n"
1219                    "   Macro comment with a long  line\n"
1220                    "   */ \\\n"
1221                    "  A + B",
1222                    getLLVMStyleWithColumns(20)));
1223   EXPECT_EQ("#define X          \\\n"
1224             "  /* Macro comment \\\n"
1225             "     with a long   \\\n"
1226             "     line */       \\\n"
1227             "  A + B",
1228             format("#define X \\\n"
1229                    "  /* Macro comment with a long\n"
1230                    "     line */ \\\n"
1231                    "  A + B",
1232                    getLLVMStyleWithColumns(20)));
1233   EXPECT_EQ("#define X          \\\n"
1234             "  /* Macro comment \\\n"
1235             "   * with a long   \\\n"
1236             "   * line */       \\\n"
1237             "  A + B",
1238             format("#define X \\\n"
1239                    "  /* Macro comment with a long  line */ \\\n"
1240                    "  A + B",
1241                    getLLVMStyleWithColumns(20)));
1242 }
1243 
1244 TEST_F(FormatTest, CommentsInStaticInitializers) {
1245   EXPECT_EQ(
1246       "static SomeType type = { aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1247       "                         aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1248       "                         /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1249       "                         aaaaaaaaaaaaaaaaaaaa, // comment\n"
1250       "                         aaaaaaaaaaaaaaaaaaaa };",
1251       format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa  ,  /* comment */\n"
1252              "                   aaaaaaaaaaaaaaaaaaaa   /* comment */ ,\n"
1253              "                     /* comment */   aaaaaaaaaaaaaaaaaaaa ,\n"
1254              "              aaaaaaaaaaaaaaaaaaaa ,   // comment\n"
1255              "                  aaaaaaaaaaaaaaaaaaaa };"));
1256   verifyFormat("static SomeType type = { aaaaaaaaaaa, // comment for aa...\n"
1257                "                         bbbbbbbbbbb, ccccccccccc };");
1258   verifyFormat("static SomeType type = { aaaaaaaaaaa,\n"
1259                "                         // comment for bb....\n"
1260                "                         bbbbbbbbbbb, ccccccccccc };");
1261   verifyGoogleFormat(
1262       "static SomeType type = {aaaaaaaaaaa,  // comment for aa...\n"
1263       "                        bbbbbbbbbbb, ccccccccccc};");
1264   verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1265                      "                        // comment for bb....\n"
1266                      "                        bbbbbbbbbbb, ccccccccccc};");
1267 
1268   verifyFormat("S s = { { a, b, c },   // Group #1\n"
1269                "        { d, e, f },   // Group #2\n"
1270                "        { g, h, i } }; // Group #3");
1271   verifyFormat("S s = { { // Group #1\n"
1272                "          a, b, c },\n"
1273                "        { // Group #2\n"
1274                "          d, e, f },\n"
1275                "        { // Group #3\n"
1276                "          g, h, i } };");
1277 
1278   EXPECT_EQ("S s = {\n"
1279             "  // Some comment\n"
1280             "  a,\n"
1281             "\n"
1282             "  // Comment after empty line\n"
1283             "  b\n"
1284             "}",
1285             format("S s =    {\n"
1286                    "      // Some comment\n"
1287                    "  a,\n"
1288                    "  \n"
1289                    "     // Comment after empty line\n"
1290                    "      b\n"
1291                    "}"));
1292   EXPECT_EQ("S s = {\n"
1293             "  /* Some comment */\n"
1294             "  a,\n"
1295             "\n"
1296             "  /* Comment after empty line */\n"
1297             "  b\n"
1298             "}",
1299             format("S s =    {\n"
1300                    "      /* Some comment */\n"
1301                    "  a,\n"
1302                    "  \n"
1303                    "     /* Comment after empty line */\n"
1304                    "      b\n"
1305                    "}"));
1306   verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
1307                "  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1308                "  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1309                "  0x00, 0x00, 0x00, 0x00              // comment\n"
1310                "};");
1311 }
1312 
1313 TEST_F(FormatTest, IgnoresIf0Contents) {
1314   EXPECT_EQ("#if 0\n"
1315             "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1316             "#endif\n"
1317             "void f() {}",
1318             format("#if 0\n"
1319                    "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1320                    "#endif\n"
1321                    "void f(  ) {  }"));
1322   EXPECT_EQ("#if false\n"
1323             "void f(  ) {  }\n"
1324             "#endif\n"
1325             "void g() {}\n",
1326             format("#if false\n"
1327                    "void f(  ) {  }\n"
1328                    "#endif\n"
1329                    "void g(  ) {  }\n"));
1330   EXPECT_EQ("enum E {\n"
1331             "  One,\n"
1332             "  Two,\n"
1333             "#if 0\n"
1334             "Three,\n"
1335             "      Four,\n"
1336             "#endif\n"
1337             "  Five\n"
1338             "};",
1339             format("enum E {\n"
1340                    "  One,Two,\n"
1341                    "#if 0\n"
1342                    "Three,\n"
1343                    "      Four,\n"
1344                    "#endif\n"
1345                    "  Five};"));
1346   EXPECT_EQ("enum F {\n"
1347             "  One,\n"
1348             "#if 1\n"
1349             "  Two,\n"
1350             "#if 0\n"
1351             "Three,\n"
1352             "      Four,\n"
1353             "#endif\n"
1354             "  Five\n"
1355             "#endif\n"
1356             "};",
1357             format("enum F {\n"
1358                    "One,\n"
1359                    "#if 1\n"
1360                    "Two,\n"
1361                    "#if 0\n"
1362                    "Three,\n"
1363                    "      Four,\n"
1364                    "#endif\n"
1365                    "Five\n"
1366                    "#endif\n"
1367                    "};"));
1368   EXPECT_EQ("enum G {\n"
1369             "  One,\n"
1370             "#if 0\n"
1371             "Two,\n"
1372             "#else\n"
1373             "  Three,\n"
1374             "#endif\n"
1375             "  Four\n"
1376             "};",
1377             format("enum G {\n"
1378                    "One,\n"
1379                    "#if 0\n"
1380                    "Two,\n"
1381                    "#else\n"
1382                    "Three,\n"
1383                    "#endif\n"
1384                    "Four\n"
1385                    "};"));
1386   EXPECT_EQ("enum H {\n"
1387             "  One,\n"
1388             "#if 0\n"
1389             "#ifdef Q\n"
1390             "Two,\n"
1391             "#else\n"
1392             "Three,\n"
1393             "#endif\n"
1394             "#endif\n"
1395             "  Four\n"
1396             "};",
1397             format("enum H {\n"
1398                    "One,\n"
1399                    "#if 0\n"
1400                    "#ifdef Q\n"
1401                    "Two,\n"
1402                    "#else\n"
1403                    "Three,\n"
1404                    "#endif\n"
1405                    "#endif\n"
1406                    "Four\n"
1407                    "};"));
1408   EXPECT_EQ("enum I {\n"
1409             "  One,\n"
1410             "#if /* test */ 0 || 1\n"
1411             "Two,\n"
1412             "Three,\n"
1413             "#endif\n"
1414             "  Four\n"
1415             "};",
1416             format("enum I {\n"
1417                    "One,\n"
1418                    "#if /* test */ 0 || 1\n"
1419                    "Two,\n"
1420                    "Three,\n"
1421                    "#endif\n"
1422                    "Four\n"
1423                    "};"));
1424   EXPECT_EQ("enum J {\n"
1425             "  One,\n"
1426             "#if 0\n"
1427             "#if 0\n"
1428             "Two,\n"
1429             "#else\n"
1430             "Three,\n"
1431             "#endif\n"
1432             "Four,\n"
1433             "#endif\n"
1434             "  Five\n"
1435             "};",
1436             format("enum J {\n"
1437                    "One,\n"
1438                    "#if 0\n"
1439                    "#if 0\n"
1440                    "Two,\n"
1441                    "#else\n"
1442                    "Three,\n"
1443                    "#endif\n"
1444                    "Four,\n"
1445                    "#endif\n"
1446                    "Five\n"
1447                    "};"));
1448 
1449 }
1450 
1451 //===----------------------------------------------------------------------===//
1452 // Tests for classes, namespaces, etc.
1453 //===----------------------------------------------------------------------===//
1454 
1455 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1456   verifyFormat("class A {};");
1457 }
1458 
1459 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1460   verifyFormat("class A {\n"
1461                "public:\n"
1462                "public: // comment\n"
1463                "protected:\n"
1464                "private:\n"
1465                "  void f() {}\n"
1466                "};");
1467   verifyGoogleFormat("class A {\n"
1468                      " public:\n"
1469                      " protected:\n"
1470                      " private:\n"
1471                      "  void f() {}\n"
1472                      "};");
1473 }
1474 
1475 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1476   EXPECT_EQ("class A {\n"
1477             "public:\n"
1478             "  void f();\n"
1479             "\n"
1480             "private:\n"
1481             "  void g() {}\n"
1482             "  // test\n"
1483             "protected:\n"
1484             "  int h;\n"
1485             "};",
1486             format("class A {\n"
1487                    "public:\n"
1488                    "void f();\n"
1489                    "private:\n"
1490                    "void g() {}\n"
1491                    "// test\n"
1492                    "protected:\n"
1493                    "int h;\n"
1494                    "};"));
1495   EXPECT_EQ("class A {\n"
1496             "protected:\n"
1497             "public:\n"
1498             "  void f();\n"
1499             "};",
1500             format("class A {\n"
1501                    "protected:\n"
1502                    "\n"
1503                    "public:\n"
1504                    "\n"
1505                    "  void f();\n"
1506                    "};"));
1507 }
1508 
1509 TEST_F(FormatTest, FormatsClasses) {
1510   verifyFormat("class A : public B {};");
1511   verifyFormat("class A : public ::B {};");
1512 
1513   verifyFormat(
1514       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1515       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1516   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1517                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1518                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1519   verifyFormat(
1520       "class A : public B, public C, public D, public E, public F {};");
1521   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1522                "                     public C,\n"
1523                "                     public D,\n"
1524                "                     public E,\n"
1525                "                     public F,\n"
1526                "                     public G {};");
1527 
1528   verifyFormat("class\n"
1529                "    ReallyReallyLongClassName {\n"
1530                "  int i;\n"
1531                "};",
1532                getLLVMStyleWithColumns(32));
1533   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1534                "                           aaaaaaaaaaaaaaaa> {};");
1535   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1536                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1537                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1538 }
1539 
1540 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1541   verifyFormat("class A {\n} a, b;");
1542   verifyFormat("struct A {\n} a, b;");
1543   verifyFormat("union A {\n} a;");
1544 }
1545 
1546 TEST_F(FormatTest, FormatsEnum) {
1547   verifyFormat("enum {\n"
1548                "  Zero,\n"
1549                "  One = 1,\n"
1550                "  Two = One + 1,\n"
1551                "  Three = (One + Two),\n"
1552                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1553                "  Five = (One, Two, Three, Four, 5)\n"
1554                "};");
1555   verifyGoogleFormat("enum {\n"
1556                      "  Zero,\n"
1557                      "  One = 1,\n"
1558                      "  Two = One + 1,\n"
1559                      "  Three = (One + Two),\n"
1560                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1561                      "  Five = (One, Two, Three, Four, 5)\n"
1562                      "};");
1563   verifyFormat("enum Enum {};");
1564   verifyFormat("enum {};");
1565   verifyFormat("enum X E {} d;");
1566   verifyFormat("enum __attribute__((...)) E {} d;");
1567   verifyFormat("enum __declspec__((...)) E {} d;");
1568   verifyFormat("enum X f() {\n  a();\n  return 42;\n}");
1569   verifyFormat("enum {\n"
1570                "  Bar = Foo<int, int>::value\n"
1571                "};");
1572 }
1573 
1574 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1575   verifyFormat("enum Type {\n"
1576                "  One = 0;\n" // These semicolons should be commas.
1577                "  Two = 1;\n"
1578                "};");
1579   verifyFormat("namespace n {\n"
1580                "enum Type {\n"
1581                "  One,\n"
1582                "  Two,\n" // missing };
1583                "  int i;\n"
1584                "}\n"
1585                "void g() {}");
1586 }
1587 
1588 TEST_F(FormatTest, FormatsEnumStruct) {
1589   verifyFormat("enum struct {\n"
1590                "  Zero,\n"
1591                "  One = 1,\n"
1592                "  Two = One + 1,\n"
1593                "  Three = (One + Two),\n"
1594                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1595                "  Five = (One, Two, Three, Four, 5)\n"
1596                "};");
1597   verifyFormat("enum struct Enum {};");
1598   verifyFormat("enum struct {};");
1599   verifyFormat("enum struct X E {} d;");
1600   verifyFormat("enum struct __attribute__((...)) E {} d;");
1601   verifyFormat("enum struct __declspec__((...)) E {} d;");
1602   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1603 }
1604 
1605 TEST_F(FormatTest, FormatsEnumClass) {
1606   verifyFormat("enum class {\n"
1607                "  Zero,\n"
1608                "  One = 1,\n"
1609                "  Two = One + 1,\n"
1610                "  Three = (One + Two),\n"
1611                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1612                "  Five = (One, Two, Three, Four, 5)\n"
1613                "};");
1614   verifyFormat("enum class Enum {};");
1615   verifyFormat("enum class {};");
1616   verifyFormat("enum class X E {} d;");
1617   verifyFormat("enum class __attribute__((...)) E {} d;");
1618   verifyFormat("enum class __declspec__((...)) E {} d;");
1619   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1620 }
1621 
1622 TEST_F(FormatTest, FormatsEnumTypes) {
1623   verifyFormat("enum X : int {\n"
1624                "  A,\n"
1625                "  B\n"
1626                "};");
1627   verifyFormat("enum X : std::uint32_t {\n"
1628                "  A,\n"
1629                "  B\n"
1630                "};");
1631 }
1632 
1633 TEST_F(FormatTest, FormatsBitfields) {
1634   verifyFormat("struct Bitfields {\n"
1635                "  unsigned sClass : 8;\n"
1636                "  unsigned ValueKind : 2;\n"
1637                "};");
1638 }
1639 
1640 TEST_F(FormatTest, FormatsNamespaces) {
1641   verifyFormat("namespace some_namespace {\n"
1642                "class A {};\n"
1643                "void f() { f(); }\n"
1644                "}");
1645   verifyFormat("namespace {\n"
1646                "class A {};\n"
1647                "void f() { f(); }\n"
1648                "}");
1649   verifyFormat("inline namespace X {\n"
1650                "class A {};\n"
1651                "void f() { f(); }\n"
1652                "}");
1653   verifyFormat("using namespace some_namespace;\n"
1654                "class A {};\n"
1655                "void f() { f(); }");
1656 
1657   // This code is more common than we thought; if we
1658   // layout this correctly the semicolon will go into
1659   // its own line, which is undesireable.
1660   verifyFormat("namespace {};");
1661   verifyFormat("namespace {\n"
1662                "class A {};\n"
1663                "};");
1664 
1665   verifyFormat("namespace {\n"
1666                "int SomeVariable = 0; // comment\n"
1667                "} // namespace");
1668   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1669             "#define HEADER_GUARD\n"
1670             "namespace my_namespace {\n"
1671             "int i;\n"
1672             "} // my_namespace\n"
1673             "#endif // HEADER_GUARD",
1674             format("#ifndef HEADER_GUARD\n"
1675                    " #define HEADER_GUARD\n"
1676                    "   namespace my_namespace {\n"
1677                    "int i;\n"
1678                    "}    // my_namespace\n"
1679                    "#endif    // HEADER_GUARD"));
1680 
1681   FormatStyle Style = getLLVMStyle();
1682   Style.NamespaceIndentation = FormatStyle::NI_All;
1683   EXPECT_EQ("namespace out {\n"
1684             "  int i;\n"
1685             "  namespace in {\n"
1686             "    int i;\n"
1687             "  } // namespace\n"
1688             "} // namespace",
1689             format("namespace out {\n"
1690                    "int i;\n"
1691                    "namespace in {\n"
1692                    "int i;\n"
1693                    "} // namespace\n"
1694                    "} // namespace",
1695                    Style));
1696 
1697   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1698   EXPECT_EQ("namespace out {\n"
1699             "int i;\n"
1700             "namespace in {\n"
1701             "  int i;\n"
1702             "} // namespace\n"
1703             "} // namespace",
1704             format("namespace out {\n"
1705                    "int i;\n"
1706                    "namespace in {\n"
1707                    "int i;\n"
1708                    "} // namespace\n"
1709                    "} // namespace",
1710                    Style));
1711 }
1712 
1713 TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
1714 
1715 TEST_F(FormatTest, FormatsInlineASM) {
1716   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
1717   verifyFormat(
1718       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1719       "    \"cpuid\\n\\t\"\n"
1720       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
1721       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
1722       "    : \"a\"(value));");
1723 }
1724 
1725 TEST_F(FormatTest, FormatTryCatch) {
1726   // FIXME: Handle try-catch explicitly in the UnwrappedLineParser, then we'll
1727   // also not create single-line-blocks.
1728   verifyFormat("try {\n"
1729                "  throw a * b;\n"
1730                "}\n"
1731                "catch (int a) {\n"
1732                "  // Do nothing.\n"
1733                "}\n"
1734                "catch (...) {\n"
1735                "  exit(42);\n"
1736                "}");
1737 
1738   // Function-level try statements.
1739   verifyFormat("int f() try { return 4; }\n"
1740                "catch (...) {\n"
1741                "  return 5;\n"
1742                "}");
1743   verifyFormat("class A {\n"
1744                "  int a;\n"
1745                "  A() try : a(0) {}\n"
1746                "  catch (...) {\n"
1747                "    throw;\n"
1748                "  }\n"
1749                "};\n");
1750 }
1751 
1752 TEST_F(FormatTest, FormatObjCTryCatch) {
1753   verifyFormat("@try {\n"
1754                "  f();\n"
1755                "}\n"
1756                "@catch (NSException e) {\n"
1757                "  @throw;\n"
1758                "}\n"
1759                "@finally {\n"
1760                "  exit(42);\n"
1761                "}");
1762 }
1763 
1764 TEST_F(FormatTest, StaticInitializers) {
1765   verifyFormat("static SomeClass SC = { 1, 'a' };");
1766 
1767   verifyFormat(
1768       "static SomeClass WithALoooooooooooooooooooongName = {\n"
1769       "  100000000, \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
1770       "};");
1771 
1772   // Here, everything other than the "}" would fit on a line.
1773   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
1774                "  100000000000000000000000\n"
1775                "};");
1776   EXPECT_EQ("S s = { a, b };", format("S s = {\n"
1777                                       "  a,\n"
1778                                       "\n"
1779                                       "  b\n"
1780                                       "};"));
1781 
1782   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1783   // line. However, the formatting looks a bit off and this probably doesn't
1784   // happen often in practice.
1785   verifyFormat("static int Variable[1] = {\n"
1786                "  { 1000000000000000000000000000000000000 }\n"
1787                "};",
1788                getLLVMStyleWithColumns(40));
1789 }
1790 
1791 TEST_F(FormatTest, DesignatedInitializers) {
1792   verifyFormat("const struct A a = { .a = 1, .b = 2 };");
1793   verifyFormat("const struct A a = { .aaaaaaaaaa = 1,\n"
1794                "                     .bbbbbbbbbb = 2,\n"
1795                "                     .cccccccccc = 3,\n"
1796                "                     .dddddddddd = 4,\n"
1797                "                     .eeeeeeeeee = 5 };");
1798   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1799                "  .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1800                "  .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1801                "  .ccccccccccccccccccccccccccc = 3,\n"
1802                "  .ddddddddddddddddddddddddddd = 4,\n"
1803                "  .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5\n"
1804                "};");
1805 
1806   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1807 }
1808 
1809 TEST_F(FormatTest, NestedStaticInitializers) {
1810   verifyFormat("static A x = { { {} } };\n");
1811   verifyFormat("static A x = { { { init1, init2, init3, init4 },\n"
1812                "                 { init1, init2, init3, init4 } } };");
1813 
1814   verifyFormat("somes Status::global_reps[3] = {\n"
1815                "  { kGlobalRef, OK_CODE, NULL, NULL, NULL },\n"
1816                "  { kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL },\n"
1817                "  { kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL }\n"
1818                "};");
1819   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
1820                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1821                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1822                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
1823   verifyFormat(
1824       "CGRect cg_rect = { { rect.fLeft, rect.fTop },\n"
1825       "                   { rect.fRight - rect.fLeft, rect.fBottom - rect.fTop"
1826       " } };");
1827 
1828   verifyFormat(
1829       "SomeArrayOfSomeType a = { { { 1, 2, 3 }, { 1, 2, 3 },\n"
1830       "                            { 111111111111111111111111111111,\n"
1831       "                              222222222222222222222222222222,\n"
1832       "                              333333333333333333333333333333 },\n"
1833       "                            { 1, 2, 3 }, { 1, 2, 3 } } };");
1834   verifyFormat(
1835       "SomeArrayOfSomeType a = { { { 1, 2, 3 } }, { { 1, 2, 3 } },\n"
1836       "                          { { 111111111111111111111111111111,\n"
1837       "                              222222222222222222222222222222,\n"
1838       "                              333333333333333333333333333333 } },\n"
1839       "                          { { 1, 2, 3 } }, { { 1, 2, 3 } } };");
1840   verifyGoogleFormat(
1841       "SomeArrayOfSomeType a = {\n"
1842       "    {{1, 2, 3}}, {{1, 2, 3}},\n"
1843       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1844       "      333333333333333333333333333333}},\n"
1845       "    {{1, 2, 3}}, {{1, 2, 3}}};");
1846 
1847   // FIXME: We might at some point want to handle this similar to parameter
1848   // lists, where we have an option to put each on a single line.
1849   verifyFormat(
1850       "struct {\n"
1851       "  unsigned bit;\n"
1852       "  const char *const name;\n"
1853       "} kBitsToOs[] = { { kOsMac, \"Mac\" },     { kOsWin, \"Windows\" },\n"
1854       "                  { kOsLinux, \"Linux\" }, { kOsCrOS, \"Chrome OS\" } };");
1855 }
1856 
1857 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1858   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1859                "                      \\\n"
1860                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1861 }
1862 
1863 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
1864   verifyFormat(
1865       "virtual void write(ELFWriter *writerrr,\n"
1866       "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
1867 }
1868 
1869 TEST_F(FormatTest, LayoutUnknownPPDirective) {
1870   EXPECT_EQ("#123 \"A string literal\"",
1871             format("   #     123    \"A string literal\""));
1872   EXPECT_EQ("#;", format("#;"));
1873   verifyFormat("#\n;\n;\n;");
1874 }
1875 
1876 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1877   EXPECT_EQ("#line 42 \"test\"\n",
1878             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
1879   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
1880                                     getLLVMStyleWithColumns(12)));
1881 }
1882 
1883 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1884   EXPECT_EQ("#line 42 \"test\"",
1885             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
1886   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
1887 }
1888 
1889 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
1890   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1891   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
1892   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
1893   // FIXME: We never break before the macro name.
1894   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
1895 
1896   verifyFormat("#define A A\n#define A A");
1897   verifyFormat("#define A(X) A\n#define A A");
1898 
1899   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1900   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
1901 }
1902 
1903 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
1904   EXPECT_EQ("// somecomment\n"
1905             "#include \"a.h\"\n"
1906             "#define A(  \\\n"
1907             "    A, B)\n"
1908             "#include \"b.h\"\n"
1909             "// somecomment\n",
1910             format("  // somecomment\n"
1911                    "  #include \"a.h\"\n"
1912                    "#define A(A,\\\n"
1913                    "    B)\n"
1914                    "    #include \"b.h\"\n"
1915                    " // somecomment\n",
1916                    getLLVMStyleWithColumns(13)));
1917 }
1918 
1919 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
1920 
1921 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1922   EXPECT_EQ("#define A    \\\n"
1923             "  c;         \\\n"
1924             "  e;\n"
1925             "f;",
1926             format("#define A c; e;\n"
1927                    "f;",
1928                    getLLVMStyleWithColumns(14)));
1929 }
1930 
1931 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
1932 
1933 TEST_F(FormatTest, AlwaysFormatsEntireMacroDefinitions) {
1934   EXPECT_EQ("int  i;\n"
1935             "#define A \\\n"
1936             "  int i;  \\\n"
1937             "  int j\n"
1938             "int  k;",
1939             format("int  i;\n"
1940                    "#define A  \\\n"
1941                    " int   i    ;  \\\n"
1942                    " int   j\n"
1943                    "int  k;",
1944                    8, 0, getGoogleStyle())); // 8: position of "#define".
1945   EXPECT_EQ("int  i;\n"
1946             "#define A \\\n"
1947             "  int i;  \\\n"
1948             "  int j\n"
1949             "int  k;",
1950             format("int  i;\n"
1951                    "#define A  \\\n"
1952                    " int   i    ;  \\\n"
1953                    " int   j\n"
1954                    "int  k;",
1955                    45, 0, getGoogleStyle())); // 45: position of "j".
1956 }
1957 
1958 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
1959   EXPECT_EQ("int x,\n"
1960             "#define A\n"
1961             "    y;",
1962             format("int x,\n#define A\ny;"));
1963 }
1964 
1965 TEST_F(FormatTest, HashInMacroDefinition) {
1966   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
1967   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
1968   verifyFormat("#define A  \\\n"
1969                "  {        \\\n"
1970                "    f(#c); \\\n"
1971                "  }",
1972                getLLVMStyleWithColumns(11));
1973 
1974   verifyFormat("#define A(X)         \\\n"
1975                "  void function##X()",
1976                getLLVMStyleWithColumns(22));
1977 
1978   verifyFormat("#define A(a, b, c)   \\\n"
1979                "  void a##b##c()",
1980                getLLVMStyleWithColumns(22));
1981 
1982   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
1983 }
1984 
1985 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
1986   verifyFormat("#define A (1)");
1987 }
1988 
1989 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1990   EXPECT_EQ("#define A b;", format("#define A \\\n"
1991                                    "          \\\n"
1992                                    "  b;",
1993                                    getLLVMStyleWithColumns(25)));
1994   EXPECT_EQ("#define A \\\n"
1995             "          \\\n"
1996             "  a;      \\\n"
1997             "  b;",
1998             format("#define A \\\n"
1999                    "          \\\n"
2000                    "  a;      \\\n"
2001                    "  b;",
2002                    getLLVMStyleWithColumns(11)));
2003   EXPECT_EQ("#define A \\\n"
2004             "  a;      \\\n"
2005             "          \\\n"
2006             "  b;",
2007             format("#define A \\\n"
2008                    "  a;      \\\n"
2009                    "          \\\n"
2010                    "  b;",
2011                    getLLVMStyleWithColumns(11)));
2012 }
2013 
2014 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2015   verifyFormat("#define A :");
2016   verifyFormat("#define SOMECASES  \\\n"
2017                "  case 1:          \\\n"
2018                "  case 2\n",
2019                getLLVMStyleWithColumns(20));
2020   verifyFormat("#define A template <typename T>");
2021   verifyFormat("#define STR(x) #x\n"
2022                "f(STR(this_is_a_string_literal{));");
2023   verifyFormat("#pragma omp threadprivate( \\\n"
2024                "    y)), // expected-warning",
2025                getLLVMStyleWithColumns(28));
2026 }
2027 
2028 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2029   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2030   EXPECT_EQ("class A : public QObject {\n"
2031             "  Q_OBJECT\n"
2032             "\n"
2033             "  A() {}\n"
2034             "};",
2035             format("class A  :  public QObject {\n"
2036                    "     Q_OBJECT\n"
2037                    "\n"
2038                    "  A() {\n}\n"
2039                    "}  ;"));
2040   EXPECT_EQ("SOME_MACRO\n"
2041             "namespace {\n"
2042             "void f();\n"
2043             "}",
2044             format("SOME_MACRO\n"
2045                    "  namespace    {\n"
2046                    "void   f(  );\n"
2047                    "}"));
2048   // Only if the identifier contains at least 5 characters.
2049   EXPECT_EQ("HTTP f();",
2050             format("HTTP\nf();"));
2051   EXPECT_EQ("MACRO\nf();",
2052             format("MACRO\nf();"));
2053   // Only if everything is upper case.
2054   EXPECT_EQ("class A : public QObject {\n"
2055             "  Q_Object A() {}\n"
2056             "};",
2057             format("class A  :  public QObject {\n"
2058                    "     Q_Object\n"
2059                    "\n"
2060                    "  A() {\n}\n"
2061                    "}  ;"));
2062 }
2063 
2064 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2065   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2066             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2067             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2068             "class X {};\n"
2069             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2070             "int *createScopDetectionPass() { return 0; }",
2071             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2072                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2073                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2074                    "  class X {};\n"
2075                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2076                    "  int *createScopDetectionPass() { return 0; }"));
2077   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2078   // braces, so that inner block is indented one level more.
2079   EXPECT_EQ("int q() {\n"
2080             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2081             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2082             "  IPC_END_MESSAGE_MAP()\n"
2083             "}",
2084             format("int q() {\n"
2085                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2086                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2087                    "  IPC_END_MESSAGE_MAP()\n"
2088                    "}"));
2089 
2090   // These must not be recognized as macros.
2091   EXPECT_EQ("int q() {\n"
2092             "  f(x);\n"
2093             "  f(x) {}\n"
2094             "  f(x)->g();\n"
2095             "  f(x)->*g();\n"
2096             "  f(x).g();\n"
2097             "  f(x) = x;\n"
2098             "  f(x) += x;\n"
2099             "  f(x) -= x;\n"
2100             "  f(x) *= x;\n"
2101             "  f(x) /= x;\n"
2102             "  f(x) %= x;\n"
2103             "  f(x) &= x;\n"
2104             "  f(x) |= x;\n"
2105             "  f(x) ^= x;\n"
2106             "  f(x) >>= x;\n"
2107             "  f(x) <<= x;\n"
2108             "  f(x)[y].z();\n"
2109             "  LOG(INFO) << x;\n"
2110             "  ifstream(x) >> x;\n"
2111             "}\n",
2112             format("int q() {\n"
2113                    "  f(x)\n;\n"
2114                    "  f(x)\n {}\n"
2115                    "  f(x)\n->g();\n"
2116                    "  f(x)\n->*g();\n"
2117                    "  f(x)\n.g();\n"
2118                    "  f(x)\n = x;\n"
2119                    "  f(x)\n += x;\n"
2120                    "  f(x)\n -= x;\n"
2121                    "  f(x)\n *= x;\n"
2122                    "  f(x)\n /= x;\n"
2123                    "  f(x)\n %= x;\n"
2124                    "  f(x)\n &= x;\n"
2125                    "  f(x)\n |= x;\n"
2126                    "  f(x)\n ^= x;\n"
2127                    "  f(x)\n >>= x;\n"
2128                    "  f(x)\n <<= x;\n"
2129                    "  f(x)\n[y].z();\n"
2130                    "  LOG(INFO)\n << x;\n"
2131                    "  ifstream(x)\n >> x;\n"
2132                    "}\n"));
2133   EXPECT_EQ("int q() {\n"
2134             "  f(x)\n"
2135             "  if (1) {\n"
2136             "  }\n"
2137             "  f(x)\n"
2138             "  while (1) {\n"
2139             "  }\n"
2140             "  f(x)\n"
2141             "  g(x);\n"
2142             "  f(x)\n"
2143             "  try {\n"
2144             "    q();\n"
2145             "  }\n"
2146             "  catch (...) {\n"
2147             "  }\n"
2148             "}\n",
2149             format("int q() {\n"
2150                    "f(x)\n"
2151                    "if (1) {}\n"
2152                    "f(x)\n"
2153                    "while (1) {}\n"
2154                    "f(x)\n"
2155                    "g(x);\n"
2156                    "f(x)\n"
2157                    "try { q(); } catch (...) {}\n"
2158                    "}\n"));
2159   EXPECT_EQ("class A {\n"
2160             "  A() : t(0) {}\n"
2161             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2162             "  try : t(0) {\n"
2163             "  }\n"
2164             "  catch (...) {\n"
2165             "  }\n"
2166             "};",
2167             format("class A {\n"
2168                    "  A()\n : t(0) {}\n"
2169                    "  A(X x)\n"
2170                    "  try : t(0) {} catch (...) {}\n"
2171                    "};"));
2172 }
2173 
2174 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2175   verifyFormat("#define A \\\n"
2176                "  f({     \\\n"
2177                "    g();  \\\n"
2178                "  });", getLLVMStyleWithColumns(11));
2179 }
2180 
2181 TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
2182   EXPECT_EQ("{\n  {\n#define A\n  }\n}", format("{{\n#define A\n}}"));
2183 }
2184 
2185 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
2186   verifyFormat("{\n  { a #c; }\n}");
2187 }
2188 
2189 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2190   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
2191             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2192   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
2193             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2194 }
2195 
2196 TEST_F(FormatTest, EscapedNewlineAtStartOfToken) {
2197   EXPECT_EQ(
2198       "#define A \\\n  int i;  \\\n  int j;",
2199       format("#define A \\\nint i;\\\n  int j;", getLLVMStyleWithColumns(11)));
2200   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2201 }
2202 
2203 TEST_F(FormatTest, NoEscapedNewlineHandlingInBlockComments) {
2204   EXPECT_EQ("/* \\  \\  \\\n*/", format("\\\n/* \\  \\  \\\n*/"));
2205 }
2206 
2207 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2208   verifyFormat("#define A \\\n"
2209                "  int v(  \\\n"
2210                "      a); \\\n"
2211                "  int i;",
2212                getLLVMStyleWithColumns(11));
2213 }
2214 
2215 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
2216   EXPECT_EQ(
2217       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2218       "                      \\\n"
2219       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2220       "\n"
2221       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2222       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2223       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
2224              "\\\n"
2225              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2226              "  \n"
2227              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2228              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
2229 }
2230 
2231 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2232   EXPECT_EQ("int\n"
2233             "#define A\n"
2234             "    a;",
2235             format("int\n#define A\na;", getGoogleStyle()));
2236   verifyFormat("functionCallTo(\n"
2237                "    someOtherFunction(\n"
2238                "        withSomeParameters, whichInSequence,\n"
2239                "        areLongerThanALine(andAnotherCall,\n"
2240                "#define A B\n"
2241                "                           withMoreParamters,\n"
2242                "                           whichStronglyInfluenceTheLayout),\n"
2243                "        andMoreParameters),\n"
2244                "    trailing);",
2245                getLLVMStyleWithColumns(69));
2246   verifyFormat("Foo::Foo()\n"
2247                "#ifdef BAR\n"
2248                "    : baz(0)\n"
2249                "#endif\n"
2250                "{\n"
2251                "}");
2252 }
2253 
2254 TEST_F(FormatTest, LayoutBlockInsideParens) {
2255   EXPECT_EQ("functionCall({ int i; });", format(" functionCall ( {int i;} );"));
2256   EXPECT_EQ("functionCall({\n"
2257             "  int i;\n"
2258             "  int j;\n"
2259             "});",
2260             format(" functionCall ( {int i;int j;} );"));
2261   EXPECT_EQ("functionCall({\n"
2262             "               int i;\n"
2263             "               int j;\n"
2264             "             },\n"
2265             "             aaaa, bbbb, cccc);",
2266             format(" functionCall ( {int i;int j;},  aaaa,   bbbb, cccc);"));
2267   EXPECT_EQ("functionCall(aaaa, bbbb, { int i; });",
2268             format(" functionCall (aaaa,   bbbb, {int i;});"));
2269   EXPECT_EQ("functionCall(aaaa, bbbb, {\n"
2270             "  int i;\n"
2271             "  int j;\n"
2272             "});",
2273             format(" functionCall (aaaa,   bbbb, {int i;int j;});"));
2274   EXPECT_EQ("functionCall(aaaa, bbbb, { int i; });",
2275             format(" functionCall (aaaa,   bbbb, {int i;});"));
2276   verifyFormat(
2277       "Aaa({\n"
2278       "      int i; // break\n"
2279       "    },\n"
2280       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2281       "                                     ccccccccccccccccc));");
2282   verifyFormat("DEBUG({\n"
2283                "  if (a)\n"
2284                "    f();\n"
2285                "});");
2286 }
2287 
2288 TEST_F(FormatTest, LayoutBlockInsideStatement) {
2289   EXPECT_EQ("SOME_MACRO { int i; }\n"
2290             "int i;",
2291             format("  SOME_MACRO  {int i;}  int i;"));
2292 }
2293 
2294 TEST_F(FormatTest, LayoutNestedBlocks) {
2295   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2296                "  struct s {\n"
2297                "    int i;\n"
2298                "  };\n"
2299                "  s kBitsToOs[] = { { 10 } };\n"
2300                "  for (int i = 0; i < 10; ++i)\n"
2301                "    return;\n"
2302                "}");
2303   verifyFormat("call(parameter, {\n"
2304                "  something();\n"
2305                "  // Comment using all columns.\n"
2306                "  somethingelse();\n"
2307                "});",
2308                getLLVMStyleWithColumns(40));
2309   EXPECT_EQ("call(parameter, {\n"
2310             "  something();\n"
2311             "  // Comment too\n"
2312             "  // looooooooooong.\n"
2313             "  somethingElse();\n"
2314             "});",
2315             format("call(parameter, {\n"
2316                    "  something();\n"
2317                    "  // Comment too looooooooooong.\n"
2318                    "  somethingElse();\n"
2319                    "});",
2320                    getLLVMStyleWithColumns(29)));
2321   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
2322   EXPECT_EQ("DEBUG({\n"
2323             "  int i;\n"
2324             "\n"
2325             "  // comment\n"
2326             "  int j;\n"
2327             "});",
2328             format("DEBUG({\n"
2329                    "  int  i;\n"
2330                    "\n"
2331                    "  // comment\n"
2332                    "  int  j;\n"
2333                    "});"));
2334 }
2335 
2336 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2337   EXPECT_EQ("{}", format("{}"));
2338   verifyFormat("enum E {};");
2339   verifyFormat("enum E {}");
2340 }
2341 
2342 //===----------------------------------------------------------------------===//
2343 // Line break tests.
2344 //===----------------------------------------------------------------------===//
2345 
2346 TEST_F(FormatTest, PreventConfusingIndents) {
2347   verifyFormat(
2348       "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2349       "                       parameter, parameter, parameter)),\n"
2350       "                   SecondLongCall(parameter));");
2351   verifyFormat(
2352       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2353       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2354       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2355       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
2356   verifyFormat(
2357       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2358       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2359       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2360       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
2361   verifyFormat(
2362       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2363       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2364       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2365       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
2366   verifyFormat("int a = bbbb && ccc && fffff(\n"
2367                "#define A Just forcing a new line\n"
2368                "                           ddd);");
2369 }
2370 
2371 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2372   verifyFormat(
2373       "bool aaaaaaa =\n"
2374       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2375       "    bbbbbbbb();");
2376   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2377                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2378                "    ccccccccc == ddddddddddd;");
2379 
2380   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2381                "                 aaaaaa) &&\n"
2382                "         bbbbbb && cccccc;");
2383   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2384                "                 aaaaaa) >>\n"
2385                "         bbbbbb;");
2386   verifyFormat("Whitespaces.addUntouchableComment(\n"
2387                "    SourceMgr.getSpellingColumnNumber(\n"
2388                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2389                "    1);");
2390 
2391   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2392                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2393                "    cccccc) {\n}");
2394 
2395   // If the LHS of a comparison is not a binary expression itself, the
2396   // additional linebreak confuses many people.
2397   verifyFormat(
2398       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2399       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2400       "}");
2401   verifyFormat(
2402       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2403       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2404       "}");
2405   verifyFormat(
2406       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2407       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2408       "}");
2409   // Even explicit parentheses stress the precedence enough to make the
2410   // additional break unnecessary.
2411   verifyFormat(
2412       "if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2413       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2414       "}");
2415   // This cases is borderline, but with the indentation it is still readable.
2416   verifyFormat(
2417       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2418       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2419       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2420       "}",
2421       getLLVMStyleWithColumns(75));
2422 
2423   // If the LHS is a binary expression, we should still use the additional break
2424   // as otherwise the formatting hides the operator precedence.
2425   verifyFormat(
2426       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2427       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2428       "    5) {\n"
2429       "}");
2430 
2431   FormatStyle OnePerLine = getLLVMStyle();
2432   OnePerLine.BinPackParameters = false;
2433   verifyFormat(
2434       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2435       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2436       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2437       OnePerLine);
2438 }
2439 
2440 TEST_F(FormatTest, ExpressionIndentation) {
2441   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2442                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2443                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2444                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2445                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2446                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2447                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2448                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2449                "                 ccccccccccccccccccccccccccccccccccccccccc;");
2450   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2451                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2452                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2453                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2454   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2455                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2456                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2457                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2458   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2459                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2460                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2461                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2462   verifyFormat("if () {\n"
2463                "} else if (aaaaa && bbbbb > // break\n"
2464                "                        ccccc) {\n"
2465                "}");
2466 
2467   // Presence of a trailing comment used to change indentation of b.
2468   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2469                "       b;\n"
2470                "return aaaaaaaaaaaaaaaaaaa +\n"
2471                "       b; //",
2472                getLLVMStyleWithColumns(30));
2473 }
2474 
2475 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2476   // Not sure what the best system is here. Like this, the LHS can be found
2477   // immediately above an operator (everything with the same or a higher
2478   // indent). The RHS is aligned right of the operator and so compasses
2479   // everything until something with the same indent as the operator is found.
2480   // FIXME: Is this a good system?
2481   FormatStyle Style = getLLVMStyle();
2482   Style.BreakBeforeBinaryOperators = true;
2483   verifyFormat(
2484       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2485       "             + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2486       "             + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2487       "             == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2488       "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2489       "                + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2490       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2491       "                * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2492       "                > ccccccccccccccccccccccccccccccccccccccccc;",
2493       Style);
2494   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2495                "    * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2496                "    + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2497                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2498                Style);
2499   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2500                "    + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2501                "      * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2502                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2503                Style);
2504   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2505                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2506                "       * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2507                "       + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2508                Style);
2509   verifyFormat("if () {\n"
2510                "} else if (aaaaa && bbbbb // break\n"
2511                "                    > ccccc) {\n"
2512                "}",
2513                Style);
2514 }
2515 
2516 TEST_F(FormatTest, ConstructorInitializers) {
2517   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
2518   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2519                getLLVMStyleWithColumns(45));
2520   verifyFormat("Constructor()\n"
2521                "    : Inttializer(FitsOnTheLine) {}",
2522                getLLVMStyleWithColumns(44));
2523   verifyFormat("Constructor()\n"
2524                "    : Inttializer(FitsOnTheLine) {}",
2525                getLLVMStyleWithColumns(43));
2526 
2527   verifyFormat(
2528       "SomeClass::Constructor()\n"
2529       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
2530 
2531   verifyFormat(
2532       "SomeClass::Constructor()\n"
2533       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2534       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
2535   verifyFormat(
2536       "SomeClass::Constructor()\n"
2537       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2538       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
2539 
2540   verifyFormat("Constructor()\n"
2541                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2542                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2543                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2544                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
2545 
2546   verifyFormat("Constructor()\n"
2547                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2548                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
2549 
2550   verifyFormat("Constructor(int Parameter = 0)\n"
2551                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2552                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
2553   verifyFormat("Constructor()\n"
2554                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2555                "}",
2556                getLLVMStyleWithColumns(60));
2557 
2558   // Here a line could be saved by splitting the second initializer onto two
2559   // lines, but that is not desireable.
2560   verifyFormat("Constructor()\n"
2561                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2562                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
2563                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
2564 
2565   FormatStyle OnePerLine = getLLVMStyle();
2566   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
2567   verifyFormat("SomeClass::Constructor()\n"
2568                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2569                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2570                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2571                OnePerLine);
2572   verifyFormat("SomeClass::Constructor()\n"
2573                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2574                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2575                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2576                OnePerLine);
2577   verifyFormat("MyClass::MyClass(int var)\n"
2578                "    : some_var_(var),            // 4 space indent\n"
2579                "      some_other_var_(var + 1) { // lined up\n"
2580                "}",
2581                OnePerLine);
2582   verifyFormat("Constructor()\n"
2583                "    : aaaaa(aaaaaa),\n"
2584                "      aaaaa(aaaaaa),\n"
2585                "      aaaaa(aaaaaa),\n"
2586                "      aaaaa(aaaaaa),\n"
2587                "      aaaaa(aaaaaa) {}",
2588                OnePerLine);
2589   verifyFormat("Constructor()\n"
2590                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2591                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
2592                OnePerLine);
2593 }
2594 
2595 TEST_F(FormatTest, MemoizationTests) {
2596   // This breaks if the memoization lookup does not take \c Indent and
2597   // \c LastSpace into account.
2598   verifyFormat(
2599       "extern CFRunLoopTimerRef\n"
2600       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2601       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
2602       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
2603       "                     CFRunLoopTimerContext *context) {}");
2604 
2605   // Deep nesting somewhat works around our memoization.
2606   verifyFormat(
2607       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2608       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2609       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2610       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2611       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
2612       getLLVMStyleWithColumns(65));
2613   verifyFormat(
2614       "aaaaa(\n"
2615       "    aaaaa,\n"
2616       "    aaaaa(\n"
2617       "        aaaaa,\n"
2618       "        aaaaa(\n"
2619       "            aaaaa,\n"
2620       "            aaaaa(\n"
2621       "                aaaaa,\n"
2622       "                aaaaa(\n"
2623       "                    aaaaa,\n"
2624       "                    aaaaa(\n"
2625       "                        aaaaa,\n"
2626       "                        aaaaa(\n"
2627       "                            aaaaa,\n"
2628       "                            aaaaa(\n"
2629       "                                aaaaa,\n"
2630       "                                aaaaa(\n"
2631       "                                    aaaaa,\n"
2632       "                                    aaaaa(\n"
2633       "                                        aaaaa,\n"
2634       "                                        aaaaa(\n"
2635       "                                            aaaaa,\n"
2636       "                                            aaaaa(\n"
2637       "                                                aaaaa,\n"
2638       "                                                aaaaa))))))))))));",
2639       getLLVMStyleWithColumns(65));
2640   verifyFormat(
2641       "a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(), a), a), a), a),\n"
2642       "                                  a),\n"
2643       "                                a),\n"
2644       "                              a),\n"
2645       "                            a),\n"
2646       "                          a),\n"
2647       "                        a),\n"
2648       "                      a),\n"
2649       "                    a),\n"
2650       "                  a),\n"
2651       "                a),\n"
2652       "              a),\n"
2653       "            a),\n"
2654       "          a),\n"
2655       "        a),\n"
2656       "      a),\n"
2657       "    a),\n"
2658       "  a)",
2659       getLLVMStyleWithColumns(65));
2660 
2661   // This test takes VERY long when memoization is broken.
2662   FormatStyle OnePerLine = getLLVMStyle();
2663   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
2664   OnePerLine.BinPackParameters = false;
2665   std::string input = "Constructor()\n"
2666                       "    : aaaa(a,\n";
2667   for (unsigned i = 0, e = 80; i != e; ++i) {
2668     input += "           a,\n";
2669   }
2670   input += "           a) {}";
2671   verifyFormat(input, OnePerLine);
2672 }
2673 
2674 TEST_F(FormatTest, BreaksAsHighAsPossible) {
2675   verifyFormat(
2676       "void f() {\n"
2677       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2678       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2679       "    f();\n"
2680       "}");
2681   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
2682                "    Intervals[i - 1].getRange().getLast()) {\n}");
2683 }
2684 
2685 TEST_F(FormatTest, BreaksFunctionDeclarations) {
2686   // Principially, we break function declarations in a certain order:
2687   // 1) break amongst arguments.
2688   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2689                "                              Cccccccccccccc cccccccccccccc);");
2690   verifyFormat(
2691       "template <class TemplateIt>\n"
2692       "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2693       "                            TemplateIt *stop) {}");
2694 
2695   // 2) break after return type.
2696   verifyFormat(
2697       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2698       "    bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
2699       getGoogleStyle());
2700 
2701   // 3) break after (.
2702   verifyFormat(
2703       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
2704       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2705       getGoogleStyle());
2706 
2707   // 4) break before after nested name specifiers.
2708   verifyFormat(
2709       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2710       "    SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2711       "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
2712       getGoogleStyle());
2713 
2714   // However, there are exceptions, if a sufficient amount of lines can be
2715   // saved.
2716   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2717   // more adjusting.
2718   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2719                "                                  Cccccccccccccc cccccccccc,\n"
2720                "                                  Cccccccccccccc cccccccccc,\n"
2721                "                                  Cccccccccccccc cccccccccc,\n"
2722                "                                  Cccccccccccccc cccccccccc);");
2723   verifyFormat(
2724       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2725       "    bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2726       "                Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2727       "                Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
2728       getGoogleStyle());
2729   verifyFormat(
2730       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2731       "                                          Cccccccccccccc cccccccccc,\n"
2732       "                                          Cccccccccccccc cccccccccc,\n"
2733       "                                          Cccccccccccccc cccccccccc,\n"
2734       "                                          Cccccccccccccc cccccccccc,\n"
2735       "                                          Cccccccccccccc cccccccccc,\n"
2736       "                                          Cccccccccccccc cccccccccc);");
2737   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2738                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2739                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2740                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2741                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
2742 
2743   // Break after multi-line parameters.
2744   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2745                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2746                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2747                "    bbbb bbbb);");
2748 
2749   // Treat overloaded operators like other functions.
2750   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2751                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
2752   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2753                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
2754   verifyGoogleFormat(
2755       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2756       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
2757 }
2758 
2759 TEST_F(FormatTest, TrailingReturnType) {
2760   verifyFormat("auto foo() -> int;\n");
2761   verifyFormat("struct S {\n"
2762                "  auto bar() const -> int;\n"
2763                "};");
2764   verifyFormat("template <size_t Order, typename T>\n"
2765                "auto load_img(const std::string &filename)\n"
2766                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
2767 
2768   // Not trailing return types.
2769   verifyFormat("void f() { auto a = b->c(); }");
2770 }
2771 
2772 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
2773   // Avoid breaking before trailing 'const'.
2774   verifyFormat("void someLongFunction(\n"
2775                "    int someLongParameter) const {}",
2776                getLLVMStyleWithColumns(46));
2777   FormatStyle Style = getGoogleStyle();
2778   Style.ColumnLimit = 47;
2779   verifyFormat("void\n"
2780                "someLongFunction(int someLongParameter) const {\n}",
2781                getLLVMStyleWithColumns(47));
2782   verifyFormat("void someLongFunction(\n"
2783                "    int someLongParameter) const {}",
2784                Style);
2785   verifyFormat("LoooooongReturnType\n"
2786                "someLoooooooongFunction() const {}",
2787                getLLVMStyleWithColumns(47));
2788   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2789                "    const {}",
2790                Style);
2791 
2792   // Avoid breaking before other trailing annotations, if they are not
2793   // function-like.
2794   verifyFormat("void SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2795                "                  aaaaaaaaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2796   verifyFormat("void SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2797                "                  aaaaaaaaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2798   verifyFormat("void SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2799                "                  aaaaaaaaaaaaaaaaaaaaaaaaaa) override final;");
2800 
2801   // Breaking before function-like trailing annotations is fine to keep them
2802   // close to their arguments.
2803   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2804                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2805   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2806                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2807   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2808                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
2809 
2810   verifyFormat(
2811       "void aaaaaaaaaaaaaaaaaa()\n"
2812       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2813       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
2814   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2815                "    __attribute__((unused));");
2816   verifyFormat(
2817       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2818       "    GUARDED_BY(aaaaaaaaaaaa);",
2819       getGoogleStyle());
2820   verifyFormat(
2821       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2822       "    GUARDED_BY(aaaaaaaaaaaa);",
2823       getGoogleStyle());
2824 }
2825 
2826 TEST_F(FormatTest, BreaksDesireably) {
2827   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2828                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2829                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
2830   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2831                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
2832                "}");
2833 
2834   verifyFormat(
2835       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2836       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
2837 
2838   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2839                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2840                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
2841 
2842   verifyFormat(
2843       "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2844       "                            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
2845       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2846       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
2847 
2848   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2849                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2850 
2851   verifyFormat(
2852       "void f() {\n"
2853       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
2854       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
2855       "}");
2856   verifyFormat(
2857       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2858       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
2859   verifyFormat(
2860       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2861       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
2862   verifyFormat(
2863       "aaaaaaaaaaaaaaaaa(\n"
2864       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2865       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2866 
2867   // Indent consistently indenpendent of call expression.
2868   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
2869                "    dddddddddddddddddddddddddddddd));\n"
2870                "aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2871                "    dddddddddddddddddddddddddddddd));");
2872 
2873   // This test case breaks on an incorrect memoization, i.e. an optimization not
2874   // taking into account the StopAt value.
2875   verifyFormat(
2876       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
2877       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
2878       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
2879       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
2880 
2881   verifyFormat("{\n  {\n    {\n"
2882                "      Annotation.SpaceRequiredBefore =\n"
2883                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
2884                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
2885                "    }\n  }\n}");
2886 
2887   // Break on an outer level if there was a break on an inner level.
2888   EXPECT_EQ("f(g(h(a, // comment\n"
2889             "      b, c),\n"
2890             "    d, e),\n"
2891             "  x, y);",
2892             format("f(g(h(a, // comment\n"
2893                    "    b, c), d, e), x, y);"));
2894 
2895   // Prefer breaking similar line breaks.
2896   verifyFormat(
2897       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
2898       "                             NSTrackingMouseEnteredAndExited |\n"
2899       "                             NSTrackingActiveAlways;");
2900 }
2901 
2902 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
2903   FormatStyle NoBinPacking = getGoogleStyle();
2904   NoBinPacking.BinPackParameters = false;
2905   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
2906                "  aaaaaaaaaaaaaaaaaaaa,\n"
2907                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
2908                NoBinPacking);
2909   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
2910                "        aaaaaaaaaaaaa,\n"
2911                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
2912                NoBinPacking);
2913   verifyFormat(
2914       "aaaaaaaa(aaaaaaaaaaaaa,\n"
2915       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2916       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
2917       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2918       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
2919       NoBinPacking);
2920   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
2921                "    .aaaaaaaaaaaaaaaaaa();",
2922                NoBinPacking);
2923   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2924                "    aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);",
2925                NoBinPacking);
2926 
2927   verifyFormat(
2928       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2929       "             aaaaaaaaaaaa,\n"
2930       "             aaaaaaaaaaaa);",
2931       NoBinPacking);
2932   verifyFormat(
2933       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
2934       "                               ddddddddddddddddddddddddddddd),\n"
2935       "             test);",
2936       NoBinPacking);
2937 
2938   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
2939                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
2940                "            aaaaaaaaaaaaaaaaaaaaaaa> aaaaaaaaaaaaaaaaaa;",
2941                NoBinPacking);
2942   verifyFormat("a(\"a\"\n"
2943                "  \"a\",\n"
2944                "  a);");
2945 
2946   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
2947   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
2948                "                aaaaaaaaa,\n"
2949                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2950                NoBinPacking);
2951   verifyFormat(
2952       "void f() {\n"
2953       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
2954       "      .aaaaaaa();\n"
2955       "}",
2956       NoBinPacking);
2957   verifyFormat(
2958       "template <class SomeType, class SomeOtherType>\n"
2959       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
2960       NoBinPacking);
2961 }
2962 
2963 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
2964   FormatStyle Style = getLLVMStyleWithColumns(15);
2965   Style.ExperimentalAutoDetectBinPacking = true;
2966   EXPECT_EQ("aaa(aaaa,\n"
2967             "    aaaa,\n"
2968             "    aaaa);\n"
2969             "aaa(aaaa,\n"
2970             "    aaaa,\n"
2971             "    aaaa);",
2972             format("aaa(aaaa,\n" // one-per-line
2973                    "  aaaa,\n"
2974                    "    aaaa  );\n"
2975                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
2976                    Style));
2977   EXPECT_EQ("aaa(aaaa, aaaa,\n"
2978             "    aaaa);\n"
2979             "aaa(aaaa, aaaa,\n"
2980             "    aaaa);",
2981             format("aaa(aaaa,  aaaa,\n" // bin-packed
2982                    "    aaaa  );\n"
2983                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
2984                    Style));
2985 }
2986 
2987 TEST_F(FormatTest, FormatsBuilderPattern) {
2988   verifyFormat(
2989       "return llvm::StringSwitch<Reference::Kind>(name)\n"
2990       "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
2991       "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
2992       "    .StartsWith(\".init\", ORDER_INIT)\n"
2993       "    .StartsWith(\".fini\", ORDER_FINI)\n"
2994       "    .StartsWith(\".hash\", ORDER_HASH)\n"
2995       "    .Default(ORDER_TEXT);\n");
2996 
2997   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
2998                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
2999   verifyFormat(
3000       "aaaaaaa->aaaaaaa->aaaaaaaaaaaaaaaa(\n"
3001       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3002       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3003   verifyFormat(
3004       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
3005       "    aaaaaaaaaaaaaa);");
3006   verifyFormat(
3007       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3008       "    aaaaaa->aaaaaaaaaaaa()\n"
3009       "        ->aaaaaaaaaaaaaaaa(\n"
3010       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3011       "        ->aaaaaaaaaaaaaaaaa();");
3012   verifyFormat(
3013       "someobj->Add((new util::filetools::Handler(dir))\n"
3014       "                 ->OnEvent1(NewPermanentCallback(\n"
3015       "                       this, &HandlerHolderClass::EventHandlerCBA))\n"
3016       "                 ->OnEvent2(NewPermanentCallback(\n"
3017       "                       this, &HandlerHolderClass::EventHandlerCBB))\n"
3018       "                 ->OnEvent3(NewPermanentCallback(\n"
3019       "                       this, &HandlerHolderClass::EventHandlerCBC))\n"
3020       "                 ->OnEvent5(NewPermanentCallback(\n"
3021       "                       this, &HandlerHolderClass::EventHandlerCBD))\n"
3022       "                 ->OnEvent6(NewPermanentCallback(\n"
3023       "                       this, &HandlerHolderClass::EventHandlerCBE)));");
3024 
3025   verifyFormat(
3026       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3027   verifyFormat("aaaaaaaaaaaaaaa()\n"
3028                "    .aaaaaaaaaaaaaaa()\n"
3029                "    .aaaaaaaaaaaaaaa()\n"
3030                "    .aaaaaaaaaaaaaaa()\n"
3031                "    .aaaaaaaaaaaaaaa();");
3032   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3033                "    .aaaaaaaaaaaaaaa()\n"
3034                "    .aaaaaaaaaaaaaaa()\n"
3035                "    .aaaaaaaaaaaaaaa();");
3036   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3037                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3038                "    .aaaaaaaaaaaaaaa();");
3039   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3040                "    ->aaaaaaaaaaaaaae(0)\n"
3041                "    ->aaaaaaaaaaaaaaa();");
3042 
3043   // Prefer not to break after empty parentheses.
3044   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3045                "    First->LastNewlineOffset);");
3046 }
3047 
3048 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3049   verifyFormat(
3050       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3051       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
3052   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
3053                "    ccccccccccccccccccccccccc) {\n}");
3054   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
3055                "    ccccccccccccccccccccccccc) {\n}");
3056   verifyFormat(
3057       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
3058       "    ccccccccccccccccccccccccc) {\n}");
3059   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3060                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3061                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3062                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3063   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3064                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3065                "    aaaaaaaaaaaaaaa != aa) {\n}");
3066 }
3067 
3068 TEST_F(FormatTest, BreaksAfterAssignments) {
3069   verifyFormat(
3070       "unsigned Cost =\n"
3071       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3072       "                        SI->getPointerAddressSpaceee());\n");
3073   verifyFormat(
3074       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3075       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
3076 
3077   verifyFormat(
3078       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3079       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
3080   verifyFormat("unsigned OriginalStartColumn =\n"
3081                "    SourceMgr.getSpellingColumnNumber(\n"
3082                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
3083                "    1;");
3084 }
3085 
3086 TEST_F(FormatTest, AlignsAfterAssignments) {
3087   verifyFormat(
3088       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3089       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
3090   verifyFormat(
3091       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3092       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
3093   verifyFormat(
3094       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3095       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
3096   verifyFormat(
3097       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3098       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
3099   verifyFormat(
3100       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3101       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3102       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
3103 }
3104 
3105 TEST_F(FormatTest, AlignsAfterReturn) {
3106   verifyFormat(
3107       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3108       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
3109   verifyFormat(
3110       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3111       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
3112   verifyFormat(
3113       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
3114       "       aaaaaaaaaaaaaaaaaaaaaa();");
3115   verifyFormat(
3116       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
3117       "        aaaaaaaaaaaaaaaaaaaaaa());");
3118   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3119                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3120   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3121                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3122                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3123   verifyFormat("return\n"
3124                "    // true if code is one of a or b.\n"
3125                "    code == a || code == b;");
3126 }
3127 
3128 TEST_F(FormatTest, BreaksConditionalExpressions) {
3129   verifyFormat(
3130       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3131       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3132       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3133   verifyFormat(
3134       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3135       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3136   verifyFormat(
3137       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3138       "                                                    : aaaaaaaaaaaaa);");
3139   verifyFormat(
3140       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3141       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3142       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3143       "                   aaaaaaaaaaaaa);");
3144   verifyFormat(
3145       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3146       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3147       "                   aaaaaaaaaaaaa);");
3148   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3149                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3150                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3151                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3152                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3153   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3154                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3155                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3156                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3157                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3158                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3159                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3160   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3161                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3162                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3163                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3164                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3165   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3166                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3167                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3168   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3169                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3170                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3171                "        : aaaaaaaaaaaaaaaa;");
3172   verifyFormat(
3173       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3174       "    ? aaaaaaaaaaaaaaa\n"
3175       "    : aaaaaaaaaaaaaaa;");
3176   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3177                "          aaaaaaaaa\n"
3178                "      ? b\n"
3179                "      : c);");
3180   verifyFormat(
3181       "unsigned Indent =\n"
3182       "    format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n"
3183       "                              ? IndentForLevel[TheLine.Level]\n"
3184       "                              : TheLine * 2,\n"
3185       "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
3186       getLLVMStyleWithColumns(70));
3187   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3188                "                  ? aaaaaaaaaaaaaaa\n"
3189                "                  : bbbbbbbbbbbbbbb //\n"
3190                "                        ? ccccccccccccccc\n"
3191                "                        : ddddddddddddddd;");
3192   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3193                "                  ? aaaaaaaaaaaaaaa\n"
3194                "                  : (bbbbbbbbbbbbbbb //\n"
3195                "                         ? ccccccccccccccc\n"
3196                "                         : ddddddddddddddd);");
3197 
3198   FormatStyle NoBinPacking = getLLVMStyle();
3199   NoBinPacking.BinPackParameters = false;
3200   verifyFormat(
3201       "void f() {\n"
3202       "  g(aaa,\n"
3203       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3204       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3205       "        ? aaaaaaaaaaaaaaa\n"
3206       "        : aaaaaaaaaaaaaaa);\n"
3207       "}",
3208       NoBinPacking);
3209   verifyFormat(
3210       "void f() {\n"
3211       "  g(aaa,\n"
3212       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3213       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3214       "        ?: aaaaaaaaaaaaaaa);\n"
3215       "}",
3216       NoBinPacking);
3217 }
3218 
3219 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3220   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3221                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3222   verifyFormat("bool a = true, b = false;");
3223 
3224   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3225                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
3226                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
3227                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
3228   verifyFormat(
3229       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3230       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
3231       "     d = e && f;");
3232   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3233                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3234   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3235                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3236   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3237                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
3238   // FIXME: If multiple variables are defined, the "*" needs to move to the new
3239   // line. Also fix indent for breaking after the type, this looks bad.
3240   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3241                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3242                "    *b = bbbbbbbbbbbbbbbbbbb;",
3243                getGoogleStyle());
3244 
3245   // Not ideal, but pointer-with-type does not allow much here.
3246   verifyGoogleFormat(
3247       "aaaaaaaaa* a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3248       "           *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;");
3249 }
3250 
3251 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3252   verifyFormat("arr[foo ? bar : baz];");
3253   verifyFormat("f()[foo ? bar : baz];");
3254   verifyFormat("(a + b)[foo ? bar : baz];");
3255   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3256 }
3257 
3258 TEST_F(FormatTest, AlignsStringLiterals) {
3259   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3260                "                                      \"short literal\");");
3261   verifyFormat(
3262       "looooooooooooooooooooooooongFunction(\n"
3263       "    \"short literal\"\n"
3264       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
3265   verifyFormat("someFunction(\"Always break between multi-line\"\n"
3266                "             \" string literals\",\n"
3267                "             and, other, parameters);");
3268   EXPECT_EQ("fun + \"1243\" /* comment */\n"
3269             "      \"5678\";",
3270             format("fun + \"1243\" /* comment */\n"
3271                    "      \"5678\";",
3272                    getLLVMStyleWithColumns(28)));
3273   EXPECT_EQ(
3274       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3275       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3276       "         \"aaaaaaaaaaaaaaaa\";",
3277       format("aaaaaa ="
3278              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3279              "aaaaaaaaaaaaaaaaaaaaa\" "
3280              "\"aaaaaaaaaaaaaaaa\";"));
3281   verifyFormat("a = a + \"a\"\n"
3282                "        \"a\"\n"
3283                "        \"a\";");
3284   verifyFormat("f(\"a\", \"b\"\n"
3285                "       \"c\");");
3286 
3287   verifyFormat(
3288       "#define LL_FORMAT \"ll\"\n"
3289       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3290       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
3291 
3292   verifyFormat("#define A(X)          \\\n"
3293                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
3294                "  \"ccccc\"",
3295                getLLVMStyleWithColumns(23));
3296   verifyFormat("#define A \"def\"\n"
3297                "f(\"abc\" A \"ghi\"\n"
3298                "  \"jkl\");");
3299 }
3300 
3301 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
3302   FormatStyle NoBreak = getLLVMStyle();
3303   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
3304   FormatStyle Break = getLLVMStyle();
3305   Break.AlwaysBreakBeforeMultilineStrings = true;
3306   verifyFormat("aaaa = \"bbbb\"\n"
3307                "       \"cccc\";",
3308                NoBreak);
3309   verifyFormat("aaaa =\n"
3310                "    \"bbbb\"\n"
3311                "    \"cccc\";",
3312                Break);
3313   verifyFormat("aaaa(\"bbbb\"\n"
3314                "     \"cccc\");",
3315                NoBreak);
3316   verifyFormat("aaaa(\n"
3317                "    \"bbbb\"\n"
3318                "    \"cccc\");",
3319                Break);
3320   verifyFormat("aaaa(qqq, \"bbbb\"\n"
3321                "          \"cccc\");",
3322                NoBreak);
3323   verifyFormat("aaaa(qqq,\n"
3324                "     \"bbbb\"\n"
3325                "     \"cccc\");",
3326                Break);
3327 
3328   // Don't break if there is no column gain.
3329   verifyFormat("f(\"aaaa\"\n"
3330                "  \"bbbb\");",
3331                Break);
3332 
3333   // Treat literals with escaped newlines like multi-line string literals.
3334   EXPECT_EQ("x = \"a\\\n"
3335             "b\\\n"
3336             "c\";",
3337             format("x = \"a\\\n"
3338                    "b\\\n"
3339                    "c\";",
3340                    NoBreak));
3341   EXPECT_EQ("x =\n"
3342             "    \"a\\\n"
3343             "b\\\n"
3344             "c\";",
3345             format("x = \"a\\\n"
3346                    "b\\\n"
3347                    "c\";",
3348                    Break));
3349 }
3350 
3351 TEST_F(FormatTest, AlignsPipes) {
3352   verifyFormat(
3353       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3355       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3356   verifyFormat(
3357       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
3358       "                     << aaaaaaaaaaaaaaaaaaaa;");
3359   verifyFormat(
3360       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3361       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3362   verifyFormat(
3363       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
3364       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
3365       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
3366   verifyFormat(
3367       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3368       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3369       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3370 
3371   verifyFormat("return out << \"somepacket = {\\n\"\n"
3372                "           << \"  aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
3373                "           << \"  bbbb = \" << pkt.bbbb << \"\\n\"\n"
3374                "           << \"  cccccc = \" << pkt.cccccc << \"\\n\"\n"
3375                "           << \"  ddd = [\" << pkt.ddd << \"]\\n\"\n"
3376                "           << \"}\";");
3377 
3378   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
3379                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
3380                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
3381   verifyFormat(
3382       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
3383       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
3384       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
3385       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
3386       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
3387   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
3388                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
3389   verifyFormat(
3390       "void f() {\n"
3391       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
3392       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3393       "}");
3394 
3395   // Breaking before the first "<<" is generally not desirable.
3396   verifyFormat(
3397       "llvm::errs()\n"
3398       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3399       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3400       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3401       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3402       getLLVMStyleWithColumns(70));
3403   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
3404                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3405                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
3406                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3407                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
3408                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3409                getLLVMStyleWithColumns(70));
3410 
3411   // But sometimes, breaking before the first "<<" is desirable.
3412   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
3413                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3414                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3415   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
3416                "    << BEF << IsTemplate << Description << E->getType();");
3417 
3418   verifyFormat(
3419       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3420       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3421 
3422   // Incomplete string literal.
3423   EXPECT_EQ("llvm::errs() << \"\n"
3424             "             << a;",
3425             format("llvm::errs() << \"\n<<a;"));
3426 }
3427 
3428 TEST_F(FormatTest, UnderstandsEquals) {
3429   verifyFormat(
3430       "aaaaaaaaaaaaaaaaa =\n"
3431       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3432   verifyFormat(
3433       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3434       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
3435   verifyFormat(
3436       "if (a) {\n"
3437       "  f();\n"
3438       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3439       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3440       "}");
3441 
3442   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3443                "        100000000 + 10000000) {\n}");
3444 }
3445 
3446 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
3447   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
3448                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
3449 
3450   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
3451                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
3452 
3453   verifyFormat(
3454       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
3455       "                                                          Parameter2);");
3456 
3457   verifyFormat(
3458       "ShortObject->shortFunction(\n"
3459       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
3460       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
3461 
3462   verifyFormat("loooooooooooooongFunction(\n"
3463                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
3464 
3465   verifyFormat(
3466       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
3467       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
3468 
3469   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
3470                "    .WillRepeatedly(Return(SomeValue));");
3471   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)]\n"
3472                "    .insert(ccccccccccccccccccccccc);");
3473   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3474                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).aaaaa(aaaaa),\n"
3475                "      aaaaaaaaaaaaaaaaaaaaa);");
3476   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3477                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());");
3478   verifyFormat(
3479       "aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3480       "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3481       "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3482       "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3483       "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3484   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3485                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3486                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3487                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
3488                "}");
3489 
3490   // Here, it is not necessary to wrap at "." or "->".
3491   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
3492                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
3493   verifyFormat(
3494       "aaaaaaaaaaa->aaaaaaaaa(\n"
3495       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3496       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
3497 
3498   verifyFormat(
3499       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3500       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
3501   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
3502                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
3503   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
3504                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
3505 
3506   // FIXME: Should we break before .a()?
3507   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3508                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).a();");
3509 
3510   FormatStyle NoBinPacking = getLLVMStyle();
3511   NoBinPacking.BinPackParameters = false;
3512   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
3513                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
3514                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
3515                "                         aaaaaaaaaaaaaaaaaaa,\n"
3516                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3517                NoBinPacking);
3518 
3519   // If there is a subsequent call, change to hanging indentation.
3520   verifyFormat(
3521       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3522       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
3523       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3524   verifyFormat(
3525       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3526       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
3527 }
3528 
3529 TEST_F(FormatTest, WrapsTemplateDeclarations) {
3530   verifyFormat("template <typename T>\n"
3531                "virtual void loooooooooooongFunction(int Param1, int Param2);");
3532   verifyFormat("template <typename T>\n"
3533                "// T should be one of {A, B}.\n"
3534                "virtual void loooooooooooongFunction(int Param1, int Param2);");
3535   verifyFormat(
3536       "template <typename T>\n"
3537       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
3538   verifyFormat("template <typename T>\n"
3539                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
3540                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
3541   verifyFormat(
3542       "template <typename T>\n"
3543       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
3544       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
3545   verifyFormat(
3546       "template <typename T>\n"
3547       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
3548       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
3549       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3550   verifyFormat("template <typename T>\n"
3551                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3552                "    int aaaaaaaaaaaaaaaaaaaaaa);");
3553   verifyFormat(
3554       "template <typename T1, typename T2 = char, typename T3 = char,\n"
3555       "          typename T4 = char>\n"
3556       "void f();");
3557   verifyFormat(
3558       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
3559       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3560 
3561   verifyFormat("a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
3562                "    a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));");
3563 
3564   verifyFormat("template <typename T> class C {};");
3565   verifyFormat("template <typename T> void f();");
3566   verifyFormat("template <typename T> void f() {}");
3567   verifyFormat(
3568       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
3569       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3570       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
3571       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
3572       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3573       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
3574       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
3575       getLLVMStyleWithColumns(72));
3576 
3577   FormatStyle AlwaysBreak = getLLVMStyle();
3578   AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
3579   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
3580   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
3581   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
3582   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3583                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
3584                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
3585   verifyFormat("template <template <typename> class Fooooooo,\n"
3586                "          template <typename> class Baaaaaaar>\n"
3587                "struct C {};",
3588                AlwaysBreak);
3589   verifyFormat("template <typename T> // T can be A, B or C.\n"
3590                "struct C {};",
3591                AlwaysBreak);
3592 }
3593 
3594 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
3595   verifyFormat(
3596       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3597       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3598   verifyFormat(
3599       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3600       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3601       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
3602 
3603   // FIXME: Should we have the extra indent after the second break?
3604   verifyFormat(
3605       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3606       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3607       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3608 
3609   verifyFormat(
3610       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
3611       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
3612 
3613   // Breaking at nested name specifiers is generally not desirable.
3614   verifyFormat(
3615       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3616       "    aaaaaaaaaaaaaaaaaaaaaaa);");
3617 
3618   verifyFormat(
3619       "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3620       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3621       "                   aaaaaaaaaaaaaaaaaaaaa);",
3622       getLLVMStyleWithColumns(74));
3623 
3624   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
3625                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3626                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3627 }
3628 
3629 TEST_F(FormatTest, UnderstandsTemplateParameters) {
3630   verifyFormat("A<int> a;");
3631   verifyFormat("A<A<A<int> > > a;");
3632   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
3633   verifyFormat("bool x = a < 1 || 2 > a;");
3634   verifyFormat("bool x = 5 < f<int>();");
3635   verifyFormat("bool x = f<int>() > 5;");
3636   verifyFormat("bool x = 5 < a<int>::x;");
3637   verifyFormat("bool x = a < 4 ? a > 2 : false;");
3638   verifyFormat("bool x = f() ? a < 2 : a > 2;");
3639 
3640   verifyGoogleFormat("A<A<int>> a;");
3641   verifyGoogleFormat("A<A<A<int>>> a;");
3642   verifyGoogleFormat("A<A<A<A<int>>>> a;");
3643   verifyGoogleFormat("A<A<int> > a;");
3644   verifyGoogleFormat("A<A<A<int> > > a;");
3645   verifyGoogleFormat("A<A<A<A<int> > > > a;");
3646   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
3647   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
3648 
3649   verifyFormat("test >> a >> b;");
3650   verifyFormat("test << a >> b;");
3651 
3652   verifyFormat("f<int>();");
3653   verifyFormat("template <typename T> void f() {}");
3654 
3655   // Not template parameters.
3656   verifyFormat("return a < b && c > d;");
3657   verifyFormat("void f() {\n"
3658                "  while (a < b && c > d) {\n"
3659                "  }\n"
3660                "}");
3661   verifyFormat("template <typename... Types>\n"
3662                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
3663 
3664   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3665                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
3666                getLLVMStyleWithColumns(60));
3667 }
3668 
3669 TEST_F(FormatTest, UnderstandsBinaryOperators) {
3670   verifyFormat("COMPARE(a, ==, b);");
3671 }
3672 
3673 TEST_F(FormatTest, UnderstandsPointersToMembers) {
3674   verifyFormat("int A::*x;");
3675   verifyFormat("int (S::*func)(void *);");
3676   verifyFormat("void f() { int (S::*func)(void *); }");
3677   verifyFormat("typedef bool *(Class::*Member)() const;");
3678   verifyFormat("void f() {\n"
3679                "  (a->*f)();\n"
3680                "  a->*x;\n"
3681                "  (a.*f)();\n"
3682                "  ((*a).*f)();\n"
3683                "  a.*x;\n"
3684                "}");
3685   verifyFormat("void f() {\n"
3686                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
3687                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
3688                "}");
3689   FormatStyle Style = getLLVMStyle();
3690   Style.PointerBindsToType = true;
3691   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
3692 }
3693 
3694 TEST_F(FormatTest, UnderstandsUnaryOperators) {
3695   verifyFormat("int a = -2;");
3696   verifyFormat("f(-1, -2, -3);");
3697   verifyFormat("a[-1] = 5;");
3698   verifyFormat("int a = 5 + -2;");
3699   verifyFormat("if (i == -1) {\n}");
3700   verifyFormat("if (i != -1) {\n}");
3701   verifyFormat("if (i > -1) {\n}");
3702   verifyFormat("if (i < -1) {\n}");
3703   verifyFormat("++(a->f());");
3704   verifyFormat("--(a->f());");
3705   verifyFormat("(a->f())++;");
3706   verifyFormat("a[42]++;");
3707   verifyFormat("if (!(a->f())) {\n}");
3708 
3709   verifyFormat("a-- > b;");
3710   verifyFormat("b ? -a : c;");
3711   verifyFormat("n * sizeof char16;");
3712   verifyFormat("n * alignof char16;", getGoogleStyle());
3713   verifyFormat("sizeof(char);");
3714   verifyFormat("alignof(char);", getGoogleStyle());
3715 
3716   verifyFormat("return -1;");
3717   verifyFormat("switch (a) {\n"
3718                "case -1:\n"
3719                "  break;\n"
3720                "}");
3721   verifyFormat("#define X -1");
3722   verifyFormat("#define X -kConstant");
3723 
3724   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = { -5, +3 };");
3725   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = { +5, -3 };");
3726 
3727   verifyFormat("int a = /* confusing comment */ -1;");
3728   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
3729   verifyFormat("int a = i /* confusing comment */++;");
3730 }
3731 
3732 TEST_F(FormatTest, IndentsRelativeToUnaryOperators) {
3733   verifyFormat("if (!aaaaaaaaaa( // break\n"
3734                "         aaaaa)) {\n"
3735                "}");
3736   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
3737                "                aaaaa));");
3738 
3739   // Only indent relative to unary operators if the expression is nested.
3740   verifyFormat("*aaa = aaaaaaa( // break\n"
3741                "    bbbbbb);");
3742 }
3743 
3744 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
3745   verifyFormat("bool operator<();");
3746   verifyFormat("bool operator>();");
3747   verifyFormat("bool operator=();");
3748   verifyFormat("bool operator==();");
3749   verifyFormat("bool operator!=();");
3750   verifyFormat("int operator+();");
3751   verifyFormat("int operator++();");
3752   verifyFormat("bool operator();");
3753   verifyFormat("bool operator()();");
3754   verifyFormat("bool operator[]();");
3755   verifyFormat("operator bool();");
3756   verifyFormat("operator int();");
3757   verifyFormat("operator void *();");
3758   verifyFormat("operator SomeType<int>();");
3759   verifyFormat("operator SomeType<int, int>();");
3760   verifyFormat("operator SomeType<SomeType<int> >();");
3761   verifyFormat("void *operator new(std::size_t size);");
3762   verifyFormat("void *operator new[](std::size_t size);");
3763   verifyFormat("void operator delete(void *ptr);");
3764   verifyFormat("void operator delete[](void *ptr);");
3765   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
3766                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
3767 
3768   verifyFormat(
3769       "ostream &operator<<(ostream &OutputStream,\n"
3770       "                    SomeReallyLongType WithSomeReallyLongValue);");
3771   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
3772                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
3773                "  return left.group < right.group;\n"
3774                "}");
3775   verifyFormat("SomeType &operator=(const SomeType &S);");
3776 
3777   verifyGoogleFormat("operator void*();");
3778   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
3779 
3780   verifyFormat("using A::operator+;");
3781 }
3782 
3783 TEST_F(FormatTest, UnderstandsNewAndDelete) {
3784   verifyFormat("void f() {\n"
3785                "  A *a = new A;\n"
3786                "  A *a = new (placement) A;\n"
3787                "  delete a;\n"
3788                "  delete (A *)a;\n"
3789                "}");
3790 }
3791 
3792 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
3793   verifyFormat("int *f(int *a) {}");
3794   verifyFormat("int main(int argc, char **argv) {}");
3795   verifyFormat("Test::Test(int b) : a(b * b) {}");
3796   verifyIndependentOfContext("f(a, *a);");
3797   verifyFormat("void g() { f(*a); }");
3798   verifyIndependentOfContext("int a = b * 10;");
3799   verifyIndependentOfContext("int a = 10 * b;");
3800   verifyIndependentOfContext("int a = b * c;");
3801   verifyIndependentOfContext("int a += b * c;");
3802   verifyIndependentOfContext("int a -= b * c;");
3803   verifyIndependentOfContext("int a *= b * c;");
3804   verifyIndependentOfContext("int a /= b * c;");
3805   verifyIndependentOfContext("int a = *b;");
3806   verifyIndependentOfContext("int a = *b * c;");
3807   verifyIndependentOfContext("int a = b * *c;");
3808   verifyIndependentOfContext("return 10 * b;");
3809   verifyIndependentOfContext("return *b * *c;");
3810   verifyIndependentOfContext("return a & ~b;");
3811   verifyIndependentOfContext("f(b ? *c : *d);");
3812   verifyIndependentOfContext("int a = b ? *c : *d;");
3813   verifyIndependentOfContext("*b = a;");
3814   verifyIndependentOfContext("a * ~b;");
3815   verifyIndependentOfContext("a * !b;");
3816   verifyIndependentOfContext("a * +b;");
3817   verifyIndependentOfContext("a * -b;");
3818   verifyIndependentOfContext("a * ++b;");
3819   verifyIndependentOfContext("a * --b;");
3820   verifyIndependentOfContext("a[4] * b;");
3821   verifyIndependentOfContext("a[a * a] = 1;");
3822   verifyIndependentOfContext("f() * b;");
3823   verifyIndependentOfContext("a * [self dostuff];");
3824   verifyIndependentOfContext("int x = a * (a + b);");
3825   verifyIndependentOfContext("(a *)(a + b);");
3826   verifyIndependentOfContext("int *pa = (int *)&a;");
3827   verifyIndependentOfContext("return sizeof(int **);");
3828   verifyIndependentOfContext("return sizeof(int ******);");
3829   verifyIndependentOfContext("return (int **&)a;");
3830   verifyIndependentOfContext("f((*PointerToArray)[10]);");
3831   verifyFormat("void f(Type (*parameter)[10]) {}");
3832   verifyGoogleFormat("return sizeof(int**);");
3833   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
3834   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
3835   verifyFormat("auto a = [](int **&, int ***) {};");
3836   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
3837 
3838   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
3839 
3840   verifyIndependentOfContext("A<int *> a;");
3841   verifyIndependentOfContext("A<int **> a;");
3842   verifyIndependentOfContext("A<int *, int *> a;");
3843   verifyIndependentOfContext(
3844       "const char *const p = reinterpret_cast<const char *const>(q);");
3845   verifyIndependentOfContext("A<int **, int **> a;");
3846   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
3847   verifyFormat("for (char **a = b; *a; ++a) {\n}");
3848   verifyFormat("for (; a && b;) {\n}");
3849 
3850   verifyFormat(
3851       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3852       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3853 
3854   verifyGoogleFormat("int main(int argc, char** argv) {}");
3855   verifyGoogleFormat("A<int*> a;");
3856   verifyGoogleFormat("A<int**> a;");
3857   verifyGoogleFormat("A<int*, int*> a;");
3858   verifyGoogleFormat("A<int**, int**> a;");
3859   verifyGoogleFormat("f(b ? *c : *d);");
3860   verifyGoogleFormat("int a = b ? *c : *d;");
3861   verifyGoogleFormat("Type* t = **x;");
3862   verifyGoogleFormat("Type* t = *++*x;");
3863   verifyGoogleFormat("*++*x;");
3864   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
3865   verifyGoogleFormat("Type* t = x++ * y;");
3866   verifyGoogleFormat(
3867       "const char* const p = reinterpret_cast<const char* const>(q);");
3868 
3869   verifyIndependentOfContext("a = *(x + y);");
3870   verifyIndependentOfContext("a = &(x + y);");
3871   verifyIndependentOfContext("*(x + y).call();");
3872   verifyIndependentOfContext("&(x + y)->call();");
3873   verifyFormat("void f() { &(*I).first; }");
3874 
3875   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
3876   verifyFormat(
3877       "int *MyValues = {\n"
3878       "  *A, // Operator detection might be confused by the '{'\n"
3879       "  *BB // Operator detection might be confused by previous comment\n"
3880       "};");
3881 
3882   verifyIndependentOfContext("if (int *a = &b)");
3883   verifyIndependentOfContext("if (int &a = *b)");
3884   verifyIndependentOfContext("if (a & b[i])");
3885   verifyIndependentOfContext("if (a::b::c::d & b[i])");
3886   verifyIndependentOfContext("if (*b[i])");
3887   verifyIndependentOfContext("if (int *a = (&b))");
3888   verifyIndependentOfContext("while (int *a = &b)");
3889   verifyIndependentOfContext("size = sizeof *a;");
3890   verifyFormat("void f() {\n"
3891                "  for (const int &v : Values) {\n"
3892                "  }\n"
3893                "}");
3894   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
3895   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
3896   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
3897 
3898   verifyFormat("#define MACRO     \\\n"
3899                "  int *i = a * b; \\\n"
3900                "  void f(a *b);",
3901                getLLVMStyleWithColumns(19));
3902 
3903   verifyIndependentOfContext("A = new SomeType *[Length];");
3904   verifyIndependentOfContext("A = new SomeType *[Length]();");
3905   verifyIndependentOfContext("T **t = new T *;");
3906   verifyIndependentOfContext("T **t = new T *();");
3907   verifyGoogleFormat("A = new SomeType* [Length]();");
3908   verifyGoogleFormat("A = new SomeType* [Length];");
3909   verifyGoogleFormat("T** t = new T*;");
3910   verifyGoogleFormat("T** t = new T*();");
3911 
3912   FormatStyle PointerLeft = getLLVMStyle();
3913   PointerLeft.PointerBindsToType = true;
3914   verifyFormat("delete *x;", PointerLeft);
3915 }
3916 
3917 TEST_F(FormatTest, UnderstandsAttributes) {
3918   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
3919 }
3920 
3921 TEST_F(FormatTest, UnderstandsEllipsis) {
3922   verifyFormat("int printf(const char *fmt, ...);");
3923   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
3924   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
3925 
3926   FormatStyle PointersLeft = getLLVMStyle();
3927   PointersLeft.PointerBindsToType = true;
3928   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
3929 }
3930 
3931 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
3932   EXPECT_EQ("int *a;\n"
3933             "int *a;\n"
3934             "int *a;",
3935             format("int *a;\n"
3936                    "int* a;\n"
3937                    "int *a;",
3938                    getGoogleStyle()));
3939   EXPECT_EQ("int* a;\n"
3940             "int* a;\n"
3941             "int* a;",
3942             format("int* a;\n"
3943                    "int* a;\n"
3944                    "int *a;",
3945                    getGoogleStyle()));
3946   EXPECT_EQ("int *a;\n"
3947             "int *a;\n"
3948             "int *a;",
3949             format("int *a;\n"
3950                    "int * a;\n"
3951                    "int *  a;",
3952                    getGoogleStyle()));
3953 }
3954 
3955 TEST_F(FormatTest, UnderstandsRvalueReferences) {
3956   verifyFormat("int f(int &&a) {}");
3957   verifyFormat("int f(int a, char &&b) {}");
3958   verifyFormat("void f() { int &&a = b; }");
3959   verifyGoogleFormat("int f(int a, char&& b) {}");
3960   verifyGoogleFormat("void f() { int&& a = b; }");
3961 
3962   verifyIndependentOfContext("A<int &&> a;");
3963   verifyIndependentOfContext("A<int &&, int &&> a;");
3964   verifyGoogleFormat("A<int&&> a;");
3965   verifyGoogleFormat("A<int&&, int&&> a;");
3966 
3967   // Not rvalue references:
3968   verifyFormat("template <bool B, bool C> class A {\n"
3969                "  static_assert(B && C, \"Something is wrong\");\n"
3970                "};");
3971   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
3972   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
3973 }
3974 
3975 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
3976   verifyFormat("void f() {\n"
3977                "  x[aaaaaaaaa -\n"
3978                "    b] = 23;\n"
3979                "}",
3980                getLLVMStyleWithColumns(15));
3981 }
3982 
3983 TEST_F(FormatTest, FormatsCasts) {
3984   verifyFormat("Type *A = static_cast<Type *>(P);");
3985   verifyFormat("Type *A = (Type *)P;");
3986   verifyFormat("Type *A = (vector<Type *, int *>)P;");
3987   verifyFormat("int a = (int)(2.0f);");
3988   verifyFormat("int a = (int)2.0f;");
3989   verifyFormat("x[(int32)y];");
3990   verifyFormat("x = (int32)y;");
3991   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
3992   verifyFormat("int a = (int)*b;");
3993   verifyFormat("int a = (int)2.0f;");
3994   verifyFormat("int a = (int)~0;");
3995   verifyFormat("int a = (int)++a;");
3996   verifyFormat("int a = (int)sizeof(int);");
3997   verifyFormat("int a = (int)+2;");
3998   verifyFormat("my_int a = (my_int)2.0f;");
3999   verifyFormat("my_int a = (my_int)sizeof(int);");
4000   verifyFormat("return (my_int)aaa;");
4001   verifyFormat("#define x ((int)-1)");
4002   verifyFormat("#define p(q) ((int *)&q)");
4003 
4004   // FIXME: Without type knowledge, this can still fall apart miserably.
4005   verifyFormat("void f() { my_int a = (my_int) * b; }");
4006   verifyFormat("void f() { return P ? (my_int) * P : (my_int)0; }");
4007   verifyFormat("my_int a = (my_int) ~0;");
4008   verifyFormat("my_int a = (my_int)++ a;");
4009   verifyFormat("my_int a = (my_int) + 2;");
4010 
4011   // Don't break after a cast's
4012   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4013                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
4014                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
4015 
4016   // These are not casts.
4017   verifyFormat("void f(int *) {}");
4018   verifyFormat("f(foo)->b;");
4019   verifyFormat("f(foo).b;");
4020   verifyFormat("f(foo)(b);");
4021   verifyFormat("f(foo)[b];");
4022   verifyFormat("[](foo) { return 4; }(bar);");
4023   verifyFormat("(*funptr)(foo)[4];");
4024   verifyFormat("funptrs[4](foo)[4];");
4025   verifyFormat("void f(int *);");
4026   verifyFormat("void f(int *) = 0;");
4027   verifyFormat("void f(SmallVector<int>) {}");
4028   verifyFormat("void f(SmallVector<int>);");
4029   verifyFormat("void f(SmallVector<int>) = 0;");
4030   verifyFormat("void f(int i = (kValue) * kMask) {}");
4031   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
4032   verifyFormat("int a = sizeof(int) * b;");
4033   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
4034   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
4035   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
4036   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
4037 
4038   // These are not casts, but at some point were confused with casts.
4039   verifyFormat("virtual void foo(int *) override;");
4040   verifyFormat("virtual void foo(char &) const;");
4041   verifyFormat("virtual void foo(int *a, char *) const;");
4042   verifyFormat("int a = sizeof(int *) + b;");
4043   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
4044 
4045   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
4046                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4047   // FIXME: The indentation here is not ideal.
4048   verifyFormat(
4049       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4050       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
4051       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
4052 }
4053 
4054 TEST_F(FormatTest, FormatsFunctionTypes) {
4055   verifyFormat("A<bool()> a;");
4056   verifyFormat("A<SomeType()> a;");
4057   verifyFormat("A<void (*)(int, std::string)> a;");
4058   verifyFormat("A<void *(int)>;");
4059   verifyFormat("void *(*a)(int *, SomeType *);");
4060   verifyFormat("int (*func)(void *);");
4061   verifyFormat("void f() { int (*func)(void *); }");
4062   verifyFormat("template <class CallbackClass>\n"
4063                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
4064 
4065   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
4066   verifyGoogleFormat("void* (*a)(int);");
4067   verifyGoogleFormat(
4068       "template <class CallbackClass>\n"
4069       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
4070 
4071   // Other constructs can look somewhat like function types:
4072   verifyFormat("A<sizeof(*x)> a;");
4073   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
4074   verifyFormat("some_var = function(*some_pointer_var)[0];");
4075   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
4076 }
4077 
4078 TEST_F(FormatTest, BreaksLongDeclarations) {
4079   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
4080                "    AnotherNameForTheLongType;",
4081                getGoogleStyle());
4082   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
4083                "    LoooooooooooooooooooooooooooooooooooooooongVariable;",
4084                getGoogleStyle());
4085   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
4086                "    LoooooooooooooooooooooooooooooooooooooooongVariable;",
4087                getGoogleStyle());
4088   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
4089                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
4090                getGoogleStyle());
4091   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
4092                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
4093   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
4094                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
4095 
4096   // FIXME: Without the comment, this breaks after "(".
4097   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
4098                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
4099                getGoogleStyle());
4100 
4101   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
4102                "                  int LoooooooooooooooooooongParam2) {}");
4103   verifyFormat(
4104       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
4105       "                                   SourceLocation L, IdentifierIn *II,\n"
4106       "                                   Type *T) {}");
4107   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
4108                "ReallyReallyLongFunctionName(\n"
4109                "    const std::string &SomeParameter,\n"
4110                "    const SomeType<string, SomeOtherTemplateParameter> &\n"
4111                "        ReallyReallyLongParameterName,\n"
4112                "    const SomeType<string, SomeOtherTemplateParameter> &\n"
4113                "        AnotherLongParameterName) {}");
4114   verifyFormat("template <typename A>\n"
4115                "SomeLoooooooooooooooooooooongType<\n"
4116                "    typename some_namespace::SomeOtherType<A>::Type>\n"
4117                "Function() {}");
4118 
4119   verifyGoogleFormat(
4120       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
4121       "    aaaaaaaaaaaaaaaaaaaaaaa;");
4122   verifyGoogleFormat(
4123       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
4124       "                                   SourceLocation L) {}");
4125   verifyGoogleFormat(
4126       "some_namespace::LongReturnType\n"
4127       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
4128       "    int first_long_parameter, int second_parameter) {}");
4129 
4130   verifyGoogleFormat("template <typename T>\n"
4131                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4132                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
4133   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4134                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
4135 }
4136 
4137 TEST_F(FormatTest, FormatsArrays) {
4138   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4139                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
4140   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4141                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
4142   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4143                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
4144   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4145                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4146                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
4147   verifyFormat(
4148       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
4149       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4150       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
4151 }
4152 
4153 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
4154   verifyFormat("(a)->b();");
4155   verifyFormat("--a;");
4156 }
4157 
4158 TEST_F(FormatTest, HandlesIncludeDirectives) {
4159   verifyFormat("#include <string>\n"
4160                "#include <a/b/c.h>\n"
4161                "#include \"a/b/string\"\n"
4162                "#include \"string.h\"\n"
4163                "#include \"string.h\"\n"
4164                "#include <a-a>\n"
4165                "#include < path with space >\n"
4166                "#include \"abc.h\" // this is included for ABC\n"
4167                "#include \"some long include\" // with a comment\n"
4168                "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
4169                getLLVMStyleWithColumns(35));
4170 
4171   verifyFormat("#import <string>");
4172   verifyFormat("#import <a/b/c.h>");
4173   verifyFormat("#import \"a/b/string\"");
4174   verifyFormat("#import \"string.h\"");
4175   verifyFormat("#import \"string.h\"");
4176   verifyFormat("#if __has_include(<strstream>)\n"
4177                "#include <strstream>\n"
4178                "#endif");
4179 }
4180 
4181 //===----------------------------------------------------------------------===//
4182 // Error recovery tests.
4183 //===----------------------------------------------------------------------===//
4184 
4185 TEST_F(FormatTest, IncompleteParameterLists) {
4186   FormatStyle NoBinPacking = getLLVMStyle();
4187   NoBinPacking.BinPackParameters = false;
4188   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
4189                "                        double *min_x,\n"
4190                "                        double *max_x,\n"
4191                "                        double *min_y,\n"
4192                "                        double *max_y,\n"
4193                "                        double *min_z,\n"
4194                "                        double *max_z, ) {}",
4195                NoBinPacking);
4196 }
4197 
4198 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
4199   verifyFormat("void f() { return; }\n42");
4200   verifyFormat("void f() {\n"
4201                "  if (0)\n"
4202                "    return;\n"
4203                "}\n"
4204                "42");
4205   verifyFormat("void f() { return }\n42");
4206   verifyFormat("void f() {\n"
4207                "  if (0)\n"
4208                "    return\n"
4209                "}\n"
4210                "42");
4211 }
4212 
4213 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
4214   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
4215   EXPECT_EQ("void f() {\n"
4216             "  if (a)\n"
4217             "    return\n"
4218             "}",
4219             format("void  f  (  )  {  if  ( a )  return  }"));
4220   EXPECT_EQ("namespace N {\n"
4221             "void f()\n"
4222             "}",
4223             format("namespace  N  {  void f()  }"));
4224   EXPECT_EQ("namespace N {\n"
4225             "void f() {}\n"
4226             "void g()\n"
4227             "}",
4228             format("namespace N  { void f( ) { } void g( ) }"));
4229 }
4230 
4231 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
4232   verifyFormat("int aaaaaaaa =\n"
4233                "    // Overlylongcomment\n"
4234                "    b;",
4235                getLLVMStyleWithColumns(20));
4236   verifyFormat("function(\n"
4237                "    ShortArgument,\n"
4238                "    LoooooooooooongArgument);\n",
4239                getLLVMStyleWithColumns(20));
4240 }
4241 
4242 TEST_F(FormatTest, IncorrectAccessSpecifier) {
4243   verifyFormat("public:");
4244   verifyFormat("class A {\n"
4245                "public\n"
4246                "  void f() {}\n"
4247                "};");
4248   verifyFormat("public\n"
4249                "int qwerty;");
4250   verifyFormat("public\n"
4251                "B {}");
4252   verifyFormat("public\n"
4253                "{}");
4254   verifyFormat("public\n"
4255                "B { int x; }");
4256 }
4257 
4258 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
4259   verifyFormat("{");
4260   verifyFormat("#})");
4261 }
4262 
4263 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
4264   verifyFormat("do {\n}");
4265   verifyFormat("do {\n}\n"
4266                "f();");
4267   verifyFormat("do {\n}\n"
4268                "wheeee(fun);");
4269   verifyFormat("do {\n"
4270                "  f();\n"
4271                "}");
4272 }
4273 
4274 TEST_F(FormatTest, IncorrectCodeMissingParens) {
4275   verifyFormat("if {\n  foo;\n  foo();\n}");
4276   verifyFormat("switch {\n  foo;\n  foo();\n}");
4277   verifyFormat("for {\n  foo;\n  foo();\n}");
4278   verifyFormat("while {\n  foo;\n  foo();\n}");
4279   verifyFormat("do {\n  foo;\n  foo();\n} while;");
4280 }
4281 
4282 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
4283   verifyFormat("namespace {\n"
4284                "class Foo {  Foo  (\n"
4285                "};\n"
4286                "} // comment");
4287 }
4288 
4289 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
4290   EXPECT_EQ("{\n{}\n", format("{\n{\n}\n"));
4291   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
4292   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
4293   EXPECT_EQ("{\n  {}\n  }\n}\n", format("{\n  {\n    }\n  }\n}\n"));
4294 
4295   EXPECT_EQ("{\n"
4296             "    {\n"
4297             " breakme(\n"
4298             "     qwe);\n"
4299             "}\n",
4300             format("{\n"
4301                    "    {\n"
4302                    " breakme(qwe);\n"
4303                    "}\n",
4304                    getLLVMStyleWithColumns(10)));
4305 }
4306 
4307 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
4308   verifyFormat("int x = {\n"
4309                "  avariable,\n"
4310                "  b(alongervariable)\n"
4311                "};",
4312                getLLVMStyleWithColumns(25));
4313 }
4314 
4315 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
4316   verifyFormat("return (a)(b) { 1, 2, 3 };");
4317 }
4318 
4319 TEST_F(FormatTest, LayoutCxx11ConstructorBraceInitializers) {
4320     verifyFormat("vector<int> x{ 1, 2, 3, 4 };");
4321     verifyFormat("vector<T> x{ {}, {}, {}, {} };");
4322     verifyFormat("f({ 1, 2 });");
4323     verifyFormat("auto v = Foo{ 1 };");
4324     verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });");
4325     verifyFormat("Class::Class : member{ 1, 2, 3 } {}");
4326     verifyFormat("new vector<int>{ 1, 2, 3 };");
4327     verifyFormat("new int[3]{ 1, 2, 3 };");
4328     verifyFormat("return { arg1, arg2 };");
4329     verifyFormat("return { arg1, SomeType{ parameter } };");
4330     verifyFormat("new T{ arg1, arg2 };");
4331     verifyFormat("f(MyMap[{ composite, key }]);");
4332     verifyFormat("class Class {\n"
4333                  "  T member = { arg1, arg2 };\n"
4334                  "};");
4335     verifyFormat(
4336         "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4337         "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
4338         "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
4339         "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };");
4340     verifyFormat("DoSomethingWithVector({} /* No data */);");
4341     verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });");
4342     verifyFormat(
4343         "someFunction(OtherParam, BracedList{\n"
4344         "                           // comment 1 (Forcing interesting break)\n"
4345         "                           param1, param2,\n"
4346         "                           // comment 2\n"
4347         "                           param3, param4\n"
4348         "                         });");
4349     verifyFormat(
4350         "std::this_thread::sleep_for(\n"
4351         "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);");
4352 
4353     FormatStyle NoSpaces = getLLVMStyle();
4354     NoSpaces.Cpp11BracedListStyle = true;
4355     verifyFormat("vector<int> x{1, 2, 3, 4};", NoSpaces);
4356     verifyFormat("vector<T> x{{}, {}, {}, {}};", NoSpaces);
4357     verifyFormat("f({1, 2});", NoSpaces);
4358     verifyFormat("auto v = Foo{-1};", NoSpaces);
4359     verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});", NoSpaces);
4360     verifyFormat("Class::Class : member{1, 2, 3} {}", NoSpaces);
4361     verifyFormat("new vector<int>{1, 2, 3};", NoSpaces);
4362     verifyFormat("new int[3]{1, 2, 3};", NoSpaces);
4363     verifyFormat("return {arg1, arg2};", NoSpaces);
4364     verifyFormat("return {arg1, SomeType{parameter}};", NoSpaces);
4365     verifyFormat("new T{arg1, arg2};", NoSpaces);
4366     verifyFormat("f(MyMap[{composite, key}]);", NoSpaces);
4367     verifyFormat("class Class {\n"
4368                  "  T member = {arg1, arg2};\n"
4369                  "};",
4370                  NoSpaces);
4371 }
4372 
4373 TEST_F(FormatTest, FormatsBracedListsinColumnLayout) {
4374   verifyFormat("vector<int> x = { 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4375                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4376                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4377                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4378                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4379                "                  1, 22, 333, 4444, 55555, 666666, 7777777 };");
4380   verifyFormat("vector<int> x = { 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4381                "                  // line comment\n"
4382                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4383                "                  1, 22, 333, 4444, 55555,\n"
4384                "                  // line comment\n"
4385                "                  1, 22, 333, 4444, 55555, 666666, 7777777,\n"
4386                "                  1, 22, 333, 4444, 55555, 666666, 7777777 };");
4387   verifyFormat(
4388       "vector<int> x = { 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
4389       "                  1,       22, 333, 4444, 55555, 666666, 7777777,\n"
4390       "                  1,       22, 333, 4444, 55555, 666666, // comment\n"
4391       "                  7777777, 1,  22,  333,  4444,  55555,  666666,\n"
4392       "                  7777777, 1,  22,  333,  4444,  55555,  666666,\n"
4393       "                  7777777, 1,  22,  333,  4444,  55555,  666666,\n"
4394       "                  7777777 };");
4395   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
4396                "  X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
4397                "  X86::R8,  X86::R9,  X86::R10, X86::R11, 0\n"
4398                "};");
4399   verifyFormat("vector<int> x = { 1, 1, 1, 1,\n"
4400                "                  1, 1, 1, 1 };",
4401                getLLVMStyleWithColumns(39));
4402   verifyFormat("vector<int> x = { 1, 1, 1, 1,\n"
4403                "                  1, 1, 1, 1 };",
4404                getLLVMStyleWithColumns(38));
4405   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
4406                "  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1\n"
4407                "};",
4408                getLLVMStyleWithColumns(40));
4409 
4410   // Trailing commas.
4411   verifyFormat("vector<int> x = { 1, 1, 1, 1,\n"
4412                "                  1, 1, 1, 1, };",
4413                getLLVMStyleWithColumns(39));
4414   verifyFormat("vector<int> x = {\n"
4415                "  1, 1, 1, 1, 1, 1, 1, 1, //\n"
4416                "};",
4417                getLLVMStyleWithColumns(39));
4418   verifyFormat("vector<int> x = { 1, 1, 1, 1,\n"
4419                "                  1, 1, 1, 1,\n"
4420                "                  /**/ /**/ };",
4421                getLLVMStyleWithColumns(39));
4422   verifyFormat("return { { aaaaaaaaaaaaaaaaaaaaa }, { aaaaaaaaaaaaaaaaaaa },\n"
4423                "         { aaaaaaaaaaaaaaaaaaaaa }, { aaaaaaaaaaaaaaaaa } };",
4424                getLLVMStyleWithColumns(60));
4425 }
4426 
4427 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
4428   verifyFormat("void f() { return 42; }");
4429   verifyFormat("void f() {\n"
4430                "  // Comment\n"
4431                "}");
4432   verifyFormat("{\n"
4433                "#error {\n"
4434                "  int a;\n"
4435                "}");
4436   verifyFormat("{\n"
4437                "  int a;\n"
4438                "#error {\n"
4439                "}");
4440   verifyFormat("void f() {} // comment");
4441   verifyFormat("void f() { int a; } // comment");
4442   verifyFormat("void f() {\n"
4443                "} // comment",
4444                getLLVMStyleWithColumns(15));
4445 
4446   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
4447   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
4448 
4449   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
4450   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
4451 }
4452 
4453 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
4454   // Elaborate type variable declarations.
4455   verifyFormat("struct foo a = { bar };\nint n;");
4456   verifyFormat("class foo a = { bar };\nint n;");
4457   verifyFormat("union foo a = { bar };\nint n;");
4458 
4459   // Elaborate types inside function definitions.
4460   verifyFormat("struct foo f() {}\nint n;");
4461   verifyFormat("class foo f() {}\nint n;");
4462   verifyFormat("union foo f() {}\nint n;");
4463 
4464   // Templates.
4465   verifyFormat("template <class X> void f() {}\nint n;");
4466   verifyFormat("template <struct X> void f() {}\nint n;");
4467   verifyFormat("template <union X> void f() {}\nint n;");
4468 
4469   // Actual definitions...
4470   verifyFormat("struct {\n} n;");
4471   verifyFormat(
4472       "template <template <class T, class Y>, class Z> class X {\n} n;");
4473   verifyFormat("union Z {\n  int n;\n} x;");
4474   verifyFormat("class MACRO Z {\n} n;");
4475   verifyFormat("class MACRO(X) Z {\n} n;");
4476   verifyFormat("class __attribute__(X) Z {\n} n;");
4477   verifyFormat("class __declspec(X) Z {\n} n;");
4478   verifyFormat("class A##B##C {\n} n;");
4479   verifyFormat("class alignas(16) Z {\n} n;");
4480 
4481   // Redefinition from nested context:
4482   verifyFormat("class A::B::C {\n} n;");
4483 
4484   // Template definitions.
4485   verifyFormat(
4486       "template <typename F>\n"
4487       "Matcher(const Matcher<F> &Other,\n"
4488       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
4489       "                             !is_same<F, T>::value>::type * = 0)\n"
4490       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
4491 
4492   // FIXME: This is still incorrectly handled at the formatter side.
4493   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
4494 
4495   // FIXME:
4496   // This now gets parsed incorrectly as class definition.
4497   // verifyFormat("class A<int> f() {\n}\nint n;");
4498 
4499   // Elaborate types where incorrectly parsing the structural element would
4500   // break the indent.
4501   verifyFormat("if (true)\n"
4502                "  class X x;\n"
4503                "else\n"
4504                "  f();\n");
4505 
4506   // This is simply incomplete. Formatting is not important, but must not crash.
4507   verifyFormat("class A:");
4508 }
4509 
4510 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
4511   verifyFormat("#error Leave     all         white!!!!! space* alone!\n");
4512   verifyFormat("#warning Leave     all         white!!!!! space* alone!\n");
4513   EXPECT_EQ("#error 1", format("  #  error   1"));
4514   EXPECT_EQ("#warning 1", format("  #  warning 1"));
4515 }
4516 
4517 TEST_F(FormatTest, FormatHashIfExpressions) {
4518   // FIXME: Come up with a better indentation for #elif.
4519   verifyFormat(
4520       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
4521       "    defined(BBBBBBBB)\n"
4522       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
4523       "    defined(BBBBBBBB)\n"
4524       "#endif",
4525       getLLVMStyleWithColumns(65));
4526 }
4527 
4528 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
4529   FormatStyle AllowsMergedIf = getGoogleStyle();
4530   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
4531   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
4532   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
4533   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
4534   EXPECT_EQ("if (true) return 42;",
4535             format("if (true)\nreturn 42;", AllowsMergedIf));
4536   FormatStyle ShortMergedIf = AllowsMergedIf;
4537   ShortMergedIf.ColumnLimit = 25;
4538   verifyFormat("#define A \\\n"
4539                "  if (true) return 42;",
4540                ShortMergedIf);
4541   verifyFormat("#define A \\\n"
4542                "  f();    \\\n"
4543                "  if (true)\n"
4544                "#define B",
4545                ShortMergedIf);
4546   verifyFormat("#define A \\\n"
4547                "  f();    \\\n"
4548                "  if (true)\n"
4549                "g();",
4550                ShortMergedIf);
4551   verifyFormat("{\n"
4552                "#ifdef A\n"
4553                "  // Comment\n"
4554                "  if (true) continue;\n"
4555                "#endif\n"
4556                "  // Comment\n"
4557                "  if (true) continue;",
4558                ShortMergedIf);
4559 }
4560 
4561 TEST_F(FormatTest, BlockCommentsInControlLoops) {
4562   verifyFormat("if (0) /* a comment in a strange place */ {\n"
4563                "  f();\n"
4564                "}");
4565   verifyFormat("if (0) /* a comment in a strange place */ {\n"
4566                "  f();\n"
4567                "} /* another comment */ else /* comment #3 */ {\n"
4568                "  g();\n"
4569                "}");
4570   verifyFormat("while (0) /* a comment in a strange place */ {\n"
4571                "  f();\n"
4572                "}");
4573   verifyFormat("for (;;) /* a comment in a strange place */ {\n"
4574                "  f();\n"
4575                "}");
4576   verifyFormat("do /* a comment in a strange place */ {\n"
4577                "  f();\n"
4578                "} /* another comment */ while (0);");
4579 }
4580 
4581 TEST_F(FormatTest, BlockComments) {
4582   EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
4583             format("/* *//* */  /* */\n/* *//* */  /* */"));
4584   EXPECT_EQ("/* */ a /* */ b;", format("  /* */  a/* */  b;"));
4585   EXPECT_EQ("#define A /*123*/ \\\n"
4586             "  b\n"
4587             "/* */\n"
4588             "someCall(\n"
4589             "    parameter);",
4590             format("#define A /*123*/ b\n"
4591                    "/* */\n"
4592                    "someCall(parameter);",
4593                    getLLVMStyleWithColumns(15)));
4594 
4595   EXPECT_EQ("#define A\n"
4596             "/* */ someCall(\n"
4597             "    parameter);",
4598             format("#define A\n"
4599                    "/* */someCall(parameter);",
4600                    getLLVMStyleWithColumns(15)));
4601   EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
4602   EXPECT_EQ("/*\n"
4603             "*\n"
4604             " * aaaaaa\n"
4605             "*aaaaaa\n"
4606             "*/",
4607             format("/*\n"
4608                    "*\n"
4609                    " * aaaaaa aaaaaa\n"
4610                    "*/",
4611                    getLLVMStyleWithColumns(10)));
4612   EXPECT_EQ("/*\n"
4613             "**\n"
4614             "* aaaaaa\n"
4615             "*aaaaaa\n"
4616             "*/",
4617             format("/*\n"
4618                    "**\n"
4619                    "* aaaaaa aaaaaa\n"
4620                    "*/",
4621                    getLLVMStyleWithColumns(10)));
4622 
4623   FormatStyle NoBinPacking = getLLVMStyle();
4624   NoBinPacking.BinPackParameters = false;
4625   EXPECT_EQ("someFunction(1, /* comment 1 */\n"
4626             "             2, /* comment 2 */\n"
4627             "             3, /* comment 3 */\n"
4628             "             aaaa,\n"
4629             "             bbbb);",
4630             format("someFunction (1,   /* comment 1 */\n"
4631                    "                2, /* comment 2 */  \n"
4632                    "               3,   /* comment 3 */\n"
4633                    "aaaa, bbbb );",
4634                    NoBinPacking));
4635   verifyFormat(
4636       "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4637       "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4638   EXPECT_EQ(
4639       "bool aaaaaaaaaaaaa = /* trailing comment */\n"
4640       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4641       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
4642       format(
4643           "bool       aaaaaaaaaaaaa =       /* trailing comment */\n"
4644           "    aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa    ||\n"
4645           "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa   || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
4646   EXPECT_EQ(
4647       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
4648       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   /* comment */\n"
4649       "int cccccccccccccccccccccccccccccc;       /* comment */\n",
4650       format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
4651              "int      bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
4652              "int    cccccccccccccccccccccccccccccc;  /* comment */\n"));
4653 
4654   verifyFormat("void f(int * /* unused */) {}");
4655 
4656   EXPECT_EQ("/*\n"
4657             " **\n"
4658             " */",
4659             format("/*\n"
4660                    " **\n"
4661                    " */"));
4662   EXPECT_EQ("/*\n"
4663             " *q\n"
4664             " */",
4665             format("/*\n"
4666                    " *q\n"
4667                    " */"));
4668   EXPECT_EQ("/*\n"
4669             " * q\n"
4670             " */",
4671             format("/*\n"
4672                    " * q\n"
4673                    " */"));
4674   EXPECT_EQ("/*\n"
4675             " **/",
4676             format("/*\n"
4677                    " **/"));
4678   EXPECT_EQ("/*\n"
4679             " ***/",
4680             format("/*\n"
4681                    " ***/"));
4682 }
4683 
4684 TEST_F(FormatTest, BlockCommentsInMacros) {
4685   EXPECT_EQ("#define A          \\\n"
4686             "  {                \\\n"
4687             "    /* one line */ \\\n"
4688             "    someCall();",
4689             format("#define A {        \\\n"
4690                    "  /* one line */   \\\n"
4691                    "  someCall();",
4692                    getLLVMStyleWithColumns(20)));
4693   EXPECT_EQ("#define A          \\\n"
4694             "  {                \\\n"
4695             "    /* previous */ \\\n"
4696             "    /* one line */ \\\n"
4697             "    someCall();",
4698             format("#define A {        \\\n"
4699                    "  /* previous */   \\\n"
4700                    "  /* one line */   \\\n"
4701                    "  someCall();",
4702                    getLLVMStyleWithColumns(20)));
4703 }
4704 
4705 TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
4706   EXPECT_EQ("a = {\n"
4707             "  1111 /*    */\n"
4708             "};",
4709             format("a = {1111 /*    */\n"
4710                    "};",
4711                    getLLVMStyleWithColumns(15)));
4712   EXPECT_EQ("a = {\n"
4713             "  1111 /*      */\n"
4714             "};",
4715             format("a = {1111 /*      */\n"
4716                    "};",
4717                    getLLVMStyleWithColumns(15)));
4718 
4719   // FIXME: The formatting is still wrong here.
4720   EXPECT_EQ("a = {\n"
4721             "  1111 /*      a\n"
4722             "          */\n"
4723             "};",
4724             format("a = {1111 /*      a */\n"
4725                    "};",
4726                    getLLVMStyleWithColumns(15)));
4727 }
4728 
4729 TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
4730   // FIXME: This is not what we want...
4731   verifyFormat("{\n"
4732                "// a"
4733                "// b");
4734 }
4735 
4736 TEST_F(FormatTest, FormatStarDependingOnContext) {
4737   verifyFormat("void f(int *a);");
4738   verifyFormat("void f() { f(fint * b); }");
4739   verifyFormat("class A {\n  void f(int *a);\n};");
4740   verifyFormat("class A {\n  int *a;\n};");
4741   verifyFormat("namespace a {\n"
4742                "namespace b {\n"
4743                "class A {\n"
4744                "  void f() {}\n"
4745                "  int *a;\n"
4746                "};\n"
4747                "}\n"
4748                "}");
4749 }
4750 
4751 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
4752   verifyFormat("while");
4753   verifyFormat("operator");
4754 }
4755 
4756 //===----------------------------------------------------------------------===//
4757 // Objective-C tests.
4758 //===----------------------------------------------------------------------===//
4759 
4760 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
4761   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
4762   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
4763             format("-(NSUInteger)indexOfObject:(id)anObject;"));
4764   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
4765   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
4766   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
4767             format("-(NSInteger)Method3:(id)anObject;"));
4768   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
4769             format("-(NSInteger)Method4:(id)anObject;"));
4770   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
4771             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
4772   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
4773             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
4774   EXPECT_EQ(
4775       "- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;",
4776       format(
4777           "- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;"));
4778 
4779   // Very long objectiveC method declaration.
4780   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
4781                "                    inRange:(NSRange)range\n"
4782                "                   outRange:(NSRange)out_range\n"
4783                "                  outRange1:(NSRange)out_range1\n"
4784                "                  outRange2:(NSRange)out_range2\n"
4785                "                  outRange3:(NSRange)out_range3\n"
4786                "                  outRange4:(NSRange)out_range4\n"
4787                "                  outRange5:(NSRange)out_range5\n"
4788                "                  outRange6:(NSRange)out_range6\n"
4789                "                  outRange7:(NSRange)out_range7\n"
4790                "                  outRange8:(NSRange)out_range8\n"
4791                "                  outRange9:(NSRange)out_range9;");
4792 
4793   verifyFormat("- (int)sum:(vector<int>)numbers;");
4794   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
4795   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
4796   // protocol lists (but not for template classes):
4797   //verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
4798 
4799   verifyFormat("- (int (*)())foo:(int (*)())f;");
4800   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
4801 
4802   // If there's no return type (very rare in practice!), LLVM and Google style
4803   // agree.
4804   verifyFormat("- foo;");
4805   verifyFormat("- foo:(int)f;");
4806   verifyGoogleFormat("- foo:(int)foo;");
4807 }
4808 
4809 TEST_F(FormatTest, FormatObjCBlocks) {
4810   verifyFormat("int (^Block)(int, int);");
4811   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)");
4812 }
4813 
4814 TEST_F(FormatTest, FormatObjCInterface) {
4815   verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
4816                "@public\n"
4817                "  int field1;\n"
4818                "@protected\n"
4819                "  int field2;\n"
4820                "@private\n"
4821                "  int field3;\n"
4822                "@package\n"
4823                "  int field4;\n"
4824                "}\n"
4825                "+ (id)init;\n"
4826                "@end");
4827 
4828   verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
4829                      " @public\n"
4830                      "  int field1;\n"
4831                      " @protected\n"
4832                      "  int field2;\n"
4833                      " @private\n"
4834                      "  int field3;\n"
4835                      " @package\n"
4836                      "  int field4;\n"
4837                      "}\n"
4838                      "+ (id)init;\n"
4839                      "@end");
4840 
4841   verifyFormat("@interface /* wait for it */ Foo\n"
4842                "+ (id)init;\n"
4843                "// Look, a comment!\n"
4844                "- (int)answerWith:(int)i;\n"
4845                "@end");
4846 
4847   verifyFormat("@interface Foo\n"
4848                "@end\n"
4849                "@interface Bar\n"
4850                "@end");
4851 
4852   verifyFormat("@interface Foo : Bar\n"
4853                "+ (id)init;\n"
4854                "@end");
4855 
4856   verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
4857                "+ (id)init;\n"
4858                "@end");
4859 
4860   verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
4861                      "+ (id)init;\n"
4862                      "@end");
4863 
4864   verifyFormat("@interface Foo (HackStuff)\n"
4865                "+ (id)init;\n"
4866                "@end");
4867 
4868   verifyFormat("@interface Foo ()\n"
4869                "+ (id)init;\n"
4870                "@end");
4871 
4872   verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
4873                "+ (id)init;\n"
4874                "@end");
4875 
4876   verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
4877                      "+ (id)init;\n"
4878                      "@end");
4879 
4880   verifyFormat("@interface Foo {\n"
4881                "  int _i;\n"
4882                "}\n"
4883                "+ (id)init;\n"
4884                "@end");
4885 
4886   verifyFormat("@interface Foo : Bar {\n"
4887                "  int _i;\n"
4888                "}\n"
4889                "+ (id)init;\n"
4890                "@end");
4891 
4892   verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
4893                "  int _i;\n"
4894                "}\n"
4895                "+ (id)init;\n"
4896                "@end");
4897 
4898   verifyFormat("@interface Foo (HackStuff) {\n"
4899                "  int _i;\n"
4900                "}\n"
4901                "+ (id)init;\n"
4902                "@end");
4903 
4904   verifyFormat("@interface Foo () {\n"
4905                "  int _i;\n"
4906                "}\n"
4907                "+ (id)init;\n"
4908                "@end");
4909 
4910   verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
4911                "  int _i;\n"
4912                "}\n"
4913                "+ (id)init;\n"
4914                "@end");
4915 }
4916 
4917 TEST_F(FormatTest, FormatObjCImplementation) {
4918   verifyFormat("@implementation Foo : NSObject {\n"
4919                "@public\n"
4920                "  int field1;\n"
4921                "@protected\n"
4922                "  int field2;\n"
4923                "@private\n"
4924                "  int field3;\n"
4925                "@package\n"
4926                "  int field4;\n"
4927                "}\n"
4928                "+ (id)init {\n}\n"
4929                "@end");
4930 
4931   verifyGoogleFormat("@implementation Foo : NSObject {\n"
4932                      " @public\n"
4933                      "  int field1;\n"
4934                      " @protected\n"
4935                      "  int field2;\n"
4936                      " @private\n"
4937                      "  int field3;\n"
4938                      " @package\n"
4939                      "  int field4;\n"
4940                      "}\n"
4941                      "+ (id)init {\n}\n"
4942                      "@end");
4943 
4944   verifyFormat("@implementation Foo\n"
4945                "+ (id)init {\n"
4946                "  if (true)\n"
4947                "    return nil;\n"
4948                "}\n"
4949                "// Look, a comment!\n"
4950                "- (int)answerWith:(int)i {\n"
4951                "  return i;\n"
4952                "}\n"
4953                "+ (int)answerWith:(int)i {\n"
4954                "  return i;\n"
4955                "}\n"
4956                "@end");
4957 
4958   verifyFormat("@implementation Foo\n"
4959                "@end\n"
4960                "@implementation Bar\n"
4961                "@end");
4962 
4963   verifyFormat("@implementation Foo : Bar\n"
4964                "+ (id)init {\n}\n"
4965                "- (void)foo {\n}\n"
4966                "@end");
4967 
4968   verifyFormat("@implementation Foo {\n"
4969                "  int _i;\n"
4970                "}\n"
4971                "+ (id)init {\n}\n"
4972                "@end");
4973 
4974   verifyFormat("@implementation Foo : Bar {\n"
4975                "  int _i;\n"
4976                "}\n"
4977                "+ (id)init {\n}\n"
4978                "@end");
4979 
4980   verifyFormat("@implementation Foo (HackStuff)\n"
4981                "+ (id)init {\n}\n"
4982                "@end");
4983   verifyFormat("@implementation ObjcClass\n"
4984                "- (void)method;\n"
4985                "{}\n"
4986                "@end");
4987 }
4988 
4989 TEST_F(FormatTest, FormatObjCProtocol) {
4990   verifyFormat("@protocol Foo\n"
4991                "@property(weak) id delegate;\n"
4992                "- (NSUInteger)numberOfThings;\n"
4993                "@end");
4994 
4995   verifyFormat("@protocol MyProtocol <NSObject>\n"
4996                "- (NSUInteger)numberOfThings;\n"
4997                "@end");
4998 
4999   verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
5000                      "- (NSUInteger)numberOfThings;\n"
5001                      "@end");
5002 
5003   verifyFormat("@protocol Foo;\n"
5004                "@protocol Bar;\n");
5005 
5006   verifyFormat("@protocol Foo\n"
5007                "@end\n"
5008                "@protocol Bar\n"
5009                "@end");
5010 
5011   verifyFormat("@protocol myProtocol\n"
5012                "- (void)mandatoryWithInt:(int)i;\n"
5013                "@optional\n"
5014                "- (void)optional;\n"
5015                "@required\n"
5016                "- (void)required;\n"
5017                "@optional\n"
5018                "@property(assign) int madProp;\n"
5019                "@end\n");
5020 
5021   verifyFormat("@property(nonatomic, assign, readonly)\n"
5022                "    int *looooooooooooooooooooooooooooongNumber;\n"
5023                "@property(nonatomic, assign, readonly)\n"
5024                "    NSString *looooooooooooooooooooooooooooongName;");
5025 }
5026 
5027 TEST_F(FormatTest, FormatObjCMethodDeclarations) {
5028   verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
5029                "                   rect:(NSRect)theRect\n"
5030                "               interval:(float)theInterval {\n"
5031                "}");
5032   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
5033                "          longKeyword:(NSRect)theRect\n"
5034                "    evenLongerKeyword:(float)theInterval\n"
5035                "                error:(NSError **)theError {\n"
5036                "}");
5037 }
5038 
5039 TEST_F(FormatTest, FormatObjCMethodExpr) {
5040   verifyFormat("[foo bar:baz];");
5041   verifyFormat("return [foo bar:baz];");
5042   verifyFormat("f([foo bar:baz]);");
5043   verifyFormat("f(2, [foo bar:baz]);");
5044   verifyFormat("f(2, a ? b : c);");
5045   verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
5046 
5047   // Unary operators.
5048   verifyFormat("int a = +[foo bar:baz];");
5049   verifyFormat("int a = -[foo bar:baz];");
5050   verifyFormat("int a = ![foo bar:baz];");
5051   verifyFormat("int a = ~[foo bar:baz];");
5052   verifyFormat("int a = ++[foo bar:baz];");
5053   verifyFormat("int a = --[foo bar:baz];");
5054   verifyFormat("int a = sizeof [foo bar:baz];");
5055   verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
5056   verifyFormat("int a = &[foo bar:baz];");
5057   verifyFormat("int a = *[foo bar:baz];");
5058   // FIXME: Make casts work, without breaking f()[4].
5059   //verifyFormat("int a = (int)[foo bar:baz];");
5060   //verifyFormat("return (int)[foo bar:baz];");
5061   //verifyFormat("(void)[foo bar:baz];");
5062   verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
5063 
5064   // Binary operators.
5065   verifyFormat("[foo bar:baz], [foo bar:baz];");
5066   verifyFormat("[foo bar:baz] = [foo bar:baz];");
5067   verifyFormat("[foo bar:baz] *= [foo bar:baz];");
5068   verifyFormat("[foo bar:baz] /= [foo bar:baz];");
5069   verifyFormat("[foo bar:baz] %= [foo bar:baz];");
5070   verifyFormat("[foo bar:baz] += [foo bar:baz];");
5071   verifyFormat("[foo bar:baz] -= [foo bar:baz];");
5072   verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
5073   verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
5074   verifyFormat("[foo bar:baz] &= [foo bar:baz];");
5075   verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
5076   verifyFormat("[foo bar:baz] |= [foo bar:baz];");
5077   verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
5078   verifyFormat("[foo bar:baz] || [foo bar:baz];");
5079   verifyFormat("[foo bar:baz] && [foo bar:baz];");
5080   verifyFormat("[foo bar:baz] | [foo bar:baz];");
5081   verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
5082   verifyFormat("[foo bar:baz] & [foo bar:baz];");
5083   verifyFormat("[foo bar:baz] == [foo bar:baz];");
5084   verifyFormat("[foo bar:baz] != [foo bar:baz];");
5085   verifyFormat("[foo bar:baz] >= [foo bar:baz];");
5086   verifyFormat("[foo bar:baz] <= [foo bar:baz];");
5087   verifyFormat("[foo bar:baz] > [foo bar:baz];");
5088   verifyFormat("[foo bar:baz] < [foo bar:baz];");
5089   verifyFormat("[foo bar:baz] >> [foo bar:baz];");
5090   verifyFormat("[foo bar:baz] << [foo bar:baz];");
5091   verifyFormat("[foo bar:baz] - [foo bar:baz];");
5092   verifyFormat("[foo bar:baz] + [foo bar:baz];");
5093   verifyFormat("[foo bar:baz] * [foo bar:baz];");
5094   verifyFormat("[foo bar:baz] / [foo bar:baz];");
5095   verifyFormat("[foo bar:baz] % [foo bar:baz];");
5096   // Whew!
5097 
5098   verifyFormat("return in[42];");
5099   verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
5100                "}");
5101 
5102   verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
5103   verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
5104   verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
5105   verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
5106   verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
5107   verifyFormat("[button setAction:@selector(zoomOut:)];");
5108   verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
5109 
5110   verifyFormat("arr[[self indexForFoo:a]];");
5111   verifyFormat("throw [self errorFor:a];");
5112   verifyFormat("@throw [self errorFor:a];");
5113 
5114   verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
5115   verifyFormat("[(id)foo bar:(id) ? baz : quux];");
5116   verifyFormat("4 > 4 ? (id)a : (id)baz;");
5117 
5118   // This tests that the formatter doesn't break after "backing" but before ":",
5119   // which would be at 80 columns.
5120   verifyFormat(
5121       "void f() {\n"
5122       "  if ((self = [super initWithContentRect:contentRect\n"
5123       "                               styleMask:styleMask ?: otherMask\n"
5124       "                                 backing:NSBackingStoreBuffered\n"
5125       "                                   defer:YES]))");
5126 
5127   verifyFormat(
5128       "[foo checkThatBreakingAfterColonWorksOk:\n"
5129       "         [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
5130 
5131   verifyFormat("[myObj short:arg1 // Force line break\n"
5132                "          longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
5133                "    evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
5134                "                error:arg4];");
5135   verifyFormat(
5136       "void f() {\n"
5137       "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
5138       "      initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
5139       "                                     pos.width(), pos.height())\n"
5140       "                styleMask:NSBorderlessWindowMask\n"
5141       "                  backing:NSBackingStoreBuffered\n"
5142       "                    defer:NO]);\n"
5143       "}");
5144   verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
5145                "                             with:contentsNativeView];");
5146 
5147   verifyFormat(
5148       "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
5149       "           owner:nillllll];");
5150 
5151   verifyFormat(
5152       "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
5153       "        forType:kBookmarkButtonDragType];");
5154 
5155   verifyFormat("[defaultCenter addObserver:self\n"
5156                "                  selector:@selector(willEnterFullscreen)\n"
5157                "                      name:kWillEnterFullscreenNotification\n"
5158                "                    object:nil];");
5159   verifyFormat("[image_rep drawInRect:drawRect\n"
5160                "             fromRect:NSZeroRect\n"
5161                "            operation:NSCompositeCopy\n"
5162                "             fraction:1.0\n"
5163                "       respectFlipped:NO\n"
5164                "                hints:nil];");
5165 
5166   verifyFormat(
5167       "scoped_nsobject<NSTextField> message(\n"
5168       "    // The frame will be fixed up when |-setMessageText:| is called.\n"
5169       "    [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
5170   verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
5171                "    aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
5172                "         aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
5173                "          aaaa:bbb];");
5174 }
5175 
5176 TEST_F(FormatTest, ObjCAt) {
5177   verifyFormat("@autoreleasepool");
5178   verifyFormat("@catch");
5179   verifyFormat("@class");
5180   verifyFormat("@compatibility_alias");
5181   verifyFormat("@defs");
5182   verifyFormat("@dynamic");
5183   verifyFormat("@encode");
5184   verifyFormat("@end");
5185   verifyFormat("@finally");
5186   verifyFormat("@implementation");
5187   verifyFormat("@import");
5188   verifyFormat("@interface");
5189   verifyFormat("@optional");
5190   verifyFormat("@package");
5191   verifyFormat("@private");
5192   verifyFormat("@property");
5193   verifyFormat("@protected");
5194   verifyFormat("@protocol");
5195   verifyFormat("@public");
5196   verifyFormat("@required");
5197   verifyFormat("@selector");
5198   verifyFormat("@synchronized");
5199   verifyFormat("@synthesize");
5200   verifyFormat("@throw");
5201   verifyFormat("@try");
5202 
5203   EXPECT_EQ("@interface", format("@ interface"));
5204 
5205   // The precise formatting of this doesn't matter, nobody writes code like
5206   // this.
5207   verifyFormat("@ /*foo*/ interface");
5208 }
5209 
5210 TEST_F(FormatTest, ObjCSnippets) {
5211   verifyFormat("@autoreleasepool {\n"
5212                "  foo();\n"
5213                "}");
5214   verifyFormat("@class Foo, Bar;");
5215   verifyFormat("@compatibility_alias AliasName ExistingClass;");
5216   verifyFormat("@dynamic textColor;");
5217   verifyFormat("char *buf1 = @encode(int *);");
5218   verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
5219   verifyFormat("char *buf1 = @encode(int **);");
5220   verifyFormat("Protocol *proto = @protocol(p1);");
5221   verifyFormat("SEL s = @selector(foo:);");
5222   verifyFormat("@synchronized(self) {\n"
5223                "  f();\n"
5224                "}");
5225 
5226   verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
5227   verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
5228 
5229   verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
5230   verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
5231   verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
5232 
5233   verifyFormat("@import foo.bar;\n"
5234                "@import baz;");
5235 }
5236 
5237 TEST_F(FormatTest, ObjCLiterals) {
5238   verifyFormat("@\"String\"");
5239   verifyFormat("@1");
5240   verifyFormat("@+4.8");
5241   verifyFormat("@-4");
5242   verifyFormat("@1LL");
5243   verifyFormat("@.5");
5244   verifyFormat("@'c'");
5245   verifyFormat("@true");
5246 
5247   verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
5248   verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
5249   verifyFormat("NSNumber *favoriteColor = @(Green);");
5250   verifyFormat("NSString *path = @(getenv(\"PATH\"));");
5251 
5252   verifyFormat("@[");
5253   verifyFormat("@[]");
5254   verifyFormat(
5255       "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
5256   verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
5257 
5258   verifyFormat("@{");
5259   verifyFormat("@{}");
5260   verifyFormat("@{ @\"one\" : @1 }");
5261   verifyFormat("return @{ @\"one\" : @1 };");
5262   verifyFormat("@{ @\"one\" : @1, }");
5263 
5264   verifyFormat("@{ @\"one\" : @{ @2 : @1 } }");
5265   verifyFormat("@{ @\"one\" : @{ @2 : @1 }, }");
5266 
5267   verifyFormat("@{ 1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2 }");
5268   verifyFormat("[self setDict:@{}");
5269   verifyFormat("[self setDict:@{ @1 : @2 }");
5270   verifyFormat("NSLog(@\"%@\", @{ @1 : @2, @2 : @3 }[@1]);");
5271   verifyFormat(
5272       "NSDictionary *masses = @{ @\"H\" : @1.0078, @\"He\" : @4.0026 };");
5273   verifyFormat(
5274       "NSDictionary *settings = @{ AVEncoderKey : @(AVAudioQualityMax) };");
5275 
5276   // FIXME: Nested and multi-line array and dictionary literals need more work.
5277   verifyFormat(
5278       "NSDictionary *d = @{ @\"nam\" : NSUserNam(), @\"dte\" : [NSDate date],\n"
5279       "                     @\"processInfo\" : [NSProcessInfo processInfo] };");
5280   verifyFormat(
5281       "@{ NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
5282       "   regularFont, };");
5283 
5284 }
5285 
5286 TEST_F(FormatTest, ReformatRegionAdjustsIndent) {
5287   EXPECT_EQ("{\n"
5288             "{\n"
5289             "a;\n"
5290             "b;\n"
5291             "}\n"
5292             "}",
5293             format("{\n"
5294                    "{\n"
5295                    "a;\n"
5296                    "     b;\n"
5297                    "}\n"
5298                    "}",
5299                    13, 2, getLLVMStyle()));
5300   EXPECT_EQ("{\n"
5301             "{\n"
5302             "  a;\n"
5303             "b;\n"
5304             "}\n"
5305             "}",
5306             format("{\n"
5307                    "{\n"
5308                    "     a;\n"
5309                    "b;\n"
5310                    "}\n"
5311                    "}",
5312                    9, 2, getLLVMStyle()));
5313   EXPECT_EQ("{\n"
5314             "{\n"
5315             "public:\n"
5316             "  b;\n"
5317             "}\n"
5318             "}",
5319             format("{\n"
5320                    "{\n"
5321                    "public:\n"
5322                    "     b;\n"
5323                    "}\n"
5324                    "}",
5325                    17, 2, getLLVMStyle()));
5326   EXPECT_EQ("{\n"
5327             "{\n"
5328             "a;\n"
5329             "}\n"
5330             "{\n"
5331             "  b; //\n"
5332             "}\n"
5333             "}",
5334             format("{\n"
5335                    "{\n"
5336                    "a;\n"
5337                    "}\n"
5338                    "{\n"
5339                    "           b; //\n"
5340                    "}\n"
5341                    "}",
5342                    22, 2, getLLVMStyle()));
5343   EXPECT_EQ("  {\n"
5344             "    a; //\n"
5345             "  }",
5346             format("  {\n"
5347                    "a; //\n"
5348                    "  }",
5349                    4, 2, getLLVMStyle()));
5350   EXPECT_EQ("void f() {}\n"
5351             "void g() {}",
5352             format("void f() {}\n"
5353                    "void g() {}",
5354                    13, 0, getLLVMStyle()));
5355   EXPECT_EQ("int a; // comment\n"
5356             "       // line 2\n"
5357             "int b;",
5358             format("int a; // comment\n"
5359                    "       // line 2\n"
5360                    "  int b;",
5361                    35, 0, getLLVMStyle()));
5362   EXPECT_EQ("  int a;\n"
5363             "  void\n"
5364             "  ffffff() {\n"
5365             "  }",
5366             format("  int a;\n"
5367                    "void ffffff() {}",
5368                    11, 0, getLLVMStyleWithColumns(11)));
5369 }
5370 
5371 TEST_F(FormatTest, BreakStringLiterals) {
5372   EXPECT_EQ("\"some text \"\n"
5373             "\"other\";",
5374             format("\"some text other\";", getLLVMStyleWithColumns(12)));
5375   EXPECT_EQ("\"some text \"\n"
5376             "\"other\";",
5377             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
5378   EXPECT_EQ(
5379       "#define A  \\\n"
5380       "  \"some \"  \\\n"
5381       "  \"text \"  \\\n"
5382       "  \"other\";",
5383       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
5384   EXPECT_EQ(
5385       "#define A  \\\n"
5386       "  \"so \"    \\\n"
5387       "  \"text \"  \\\n"
5388       "  \"other\";",
5389       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
5390 
5391   EXPECT_EQ("\"some text\"",
5392             format("\"some text\"", getLLVMStyleWithColumns(1)));
5393   EXPECT_EQ("\"some text\"",
5394             format("\"some text\"", getLLVMStyleWithColumns(11)));
5395   EXPECT_EQ("\"some \"\n"
5396             "\"text\"",
5397             format("\"some text\"", getLLVMStyleWithColumns(10)));
5398   EXPECT_EQ("\"some \"\n"
5399             "\"text\"",
5400             format("\"some text\"", getLLVMStyleWithColumns(7)));
5401   EXPECT_EQ("\"some\"\n"
5402             "\" tex\"\n"
5403             "\"t\"",
5404             format("\"some text\"", getLLVMStyleWithColumns(6)));
5405   EXPECT_EQ("\"some\"\n"
5406             "\" tex\"\n"
5407             "\" and\"",
5408             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
5409   EXPECT_EQ("\"some\"\n"
5410             "\"/tex\"\n"
5411             "\"/and\"",
5412             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
5413 
5414   EXPECT_EQ("variable =\n"
5415             "    \"long string \"\n"
5416             "    \"literal\";",
5417             format("variable = \"long string literal\";",
5418                    getLLVMStyleWithColumns(20)));
5419 
5420   EXPECT_EQ("variable = f(\n"
5421             "    \"long string \"\n"
5422             "    \"literal\",\n"
5423             "    short,\n"
5424             "    loooooooooooooooooooong);",
5425             format("variable = f(\"long string literal\", short, "
5426                    "loooooooooooooooooooong);",
5427                    getLLVMStyleWithColumns(20)));
5428 
5429   EXPECT_EQ("f(g(\"long string \"\n"
5430             "    \"literal\"),\n"
5431             "  b);",
5432             format("f(g(\"long string literal\"), b);",
5433                    getLLVMStyleWithColumns(20)));
5434   EXPECT_EQ("f(g(\"long string \"\n"
5435             "    \"literal\",\n"
5436             "    a),\n"
5437             "  b);",
5438             format("f(g(\"long string literal\", a), b);",
5439                    getLLVMStyleWithColumns(20)));
5440   EXPECT_EQ(
5441       "f(\"one two\".split(\n"
5442       "    variable));",
5443       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
5444   EXPECT_EQ("f(\"one two three four five six \"\n"
5445             "  \"seven\".split(\n"
5446             "      really_looooong_variable));",
5447             format("f(\"one two three four five six seven\"."
5448                    "split(really_looooong_variable));",
5449                    getLLVMStyleWithColumns(33)));
5450 
5451   EXPECT_EQ("f(\"some \"\n"
5452             "  \"text\",\n"
5453             "  other);",
5454             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
5455 
5456   // Only break as a last resort.
5457   verifyFormat(
5458       "aaaaaaaaaaaaaaaaaaaa(\n"
5459       "    aaaaaaaaaaaaaaaaaaaa,\n"
5460       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
5461 
5462   EXPECT_EQ(
5463       "\"splitmea\"\n"
5464       "\"trandomp\"\n"
5465       "\"oint\"",
5466       format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
5467 
5468   EXPECT_EQ(
5469       "\"split/\"\n"
5470       "\"pathat/\"\n"
5471       "\"slashes\"",
5472       format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
5473 
5474   EXPECT_EQ(
5475       "\"split/\"\n"
5476       "\"pathat/\"\n"
5477       "\"slashes\"",
5478       format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
5479   EXPECT_EQ("\"split at \"\n"
5480             "\"spaces/at/\"\n"
5481             "\"slashes.at.any$\"\n"
5482             "\"non-alphanumeric%\"\n"
5483             "\"1111111111characte\"\n"
5484             "\"rs\"",
5485             format("\"split at "
5486                    "spaces/at/"
5487                    "slashes.at."
5488                    "any$non-"
5489                    "alphanumeric%"
5490                    "1111111111characte"
5491                    "rs\"",
5492                    getLLVMStyleWithColumns(20)));
5493 
5494   // Verify that splitting the strings understands
5495   // Style::AlwaysBreakBeforeMultilineStrings.
5496   EXPECT_EQ("aaaaaaaaaaaa(aaaaaaaaaaaaa,\n"
5497             "             \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
5498             "             \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
5499             format("aaaaaaaaaaaa(aaaaaaaaaaaaa, \"aaaaaaaaaaaaaaaaaaaaaa "
5500                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa "
5501                    "aaaaaaaaaaaaaaaaaaaaaa\");",
5502                    getGoogleStyle()));
5503   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5504             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
5505             format("llvm::outs() << "
5506                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
5507                    "aaaaaaaaaaaaaaaaaaa\";"));
5508   EXPECT_EQ("ffff(\n"
5509             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5510             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
5511             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5512                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
5513                    getGoogleStyle()));
5514 
5515   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
5516   AlignLeft.AlignEscapedNewlinesLeft = true;
5517   EXPECT_EQ(
5518       "#define A \\\n"
5519       "  \"some \" \\\n"
5520       "  \"text \" \\\n"
5521       "  \"other\";",
5522       format("#define A \"some text other\";", AlignLeft));
5523 }
5524 
5525 TEST_F(FormatTest, BreaksWideStringLiterals) {
5526   EXPECT_EQ(
5527       "u8\"utf8 string \"\n"
5528       "u8\"literal\";",
5529       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
5530   EXPECT_EQ(
5531       "u\"utf16 string \"\n"
5532       "u\"literal\";",
5533       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
5534   EXPECT_EQ(
5535       "U\"utf32 string \"\n"
5536       "U\"literal\";",
5537       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
5538   EXPECT_EQ("L\"wide string \"\n"
5539             "L\"literal\";",
5540             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
5541 }
5542 
5543 TEST_F(FormatTest, BreaksRawStringLiterals) {
5544   EXPECT_EQ("R\"x(raw )x\"\n"
5545             "R\"x(literal)x\";",
5546             format("R\"x(raw literal)x\";", getGoogleStyleWithColumns(15)));
5547   EXPECT_EQ("uR\"x(raw )x\"\n"
5548             "uR\"x(literal)x\";",
5549             format("uR\"x(raw literal)x\";", getGoogleStyleWithColumns(16)));
5550   EXPECT_EQ("u8R\"x(raw )x\"\n"
5551             "u8R\"x(literal)x\";",
5552             format("u8R\"x(raw literal)x\";", getGoogleStyleWithColumns(17)));
5553   EXPECT_EQ("LR\"x(raw )x\"\n"
5554             "LR\"x(literal)x\";",
5555             format("LR\"x(raw literal)x\";", getGoogleStyleWithColumns(16)));
5556   EXPECT_EQ("UR\"x(raw )x\"\n"
5557             "UR\"x(literal)x\";",
5558             format("UR\"x(raw literal)x\";", getGoogleStyleWithColumns(16)));
5559 }
5560 
5561 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
5562   FormatStyle Style = getLLVMStyleWithColumns(20);
5563   EXPECT_EQ(
5564       "_T(\"aaaaaaaaaaaaaa\")\n"
5565       "_T(\"aaaaaaaaaaaaaa\")\n"
5566       "_T(\"aaaaaaaaaaaa\")",
5567       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
5568   EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
5569             "     _T(\"aaaaaa\"),\n"
5570             "  z);",
5571             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
5572 
5573   // FIXME: Handle embedded spaces in one iteration.
5574   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
5575   //            "_T(\"aaaaaaaaaaaaa\")\n"
5576   //            "_T(\"aaaaaaaaaaaaa\")\n"
5577   //            "_T(\"a\")",
5578   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
5579   //                   getLLVMStyleWithColumns(20)));
5580   EXPECT_EQ(
5581       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
5582       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
5583 }
5584 
5585 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
5586   EXPECT_EQ(
5587       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
5588       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
5589       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
5590       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
5591              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
5592              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
5593 }
5594 
5595 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
5596   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
5597             format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
5598   EXPECT_EQ("fffffffffff(g(R\"x(\n"
5599             "multiline raw string literal xxxxxxxxxxxxxx\n"
5600             ")x\",\n"
5601             "              a),\n"
5602             "            b);",
5603             format("fffffffffff(g(R\"x(\n"
5604                    "multiline raw string literal xxxxxxxxxxxxxx\n"
5605                    ")x\", a), b);",
5606                    getGoogleStyleWithColumns(20)));
5607   EXPECT_EQ("fffffffffff(\n"
5608             "    g(R\"x(qqq\n"
5609             "multiline raw string literal xxxxxxxxxxxxxx\n"
5610             ")x\",\n"
5611             "      a),\n"
5612             "    b);",
5613             format("fffffffffff(g(R\"x(qqq\n"
5614                    "multiline raw string literal xxxxxxxxxxxxxx\n"
5615                    ")x\", a), b);",
5616                    getGoogleStyleWithColumns(20)));
5617 
5618   EXPECT_EQ("fffffffffff(R\"x(\n"
5619             "multiline raw string literal xxxxxxxxxxxxxx\n"
5620             ")x\");",
5621             format("fffffffffff(R\"x(\n"
5622                    "multiline raw string literal xxxxxxxxxxxxxx\n"
5623                    ")x\");",
5624                    getGoogleStyleWithColumns(20)));
5625   EXPECT_EQ("fffffffffff(R\"x(\n"
5626             "multiline raw string literal xxxxxxxxxxxxxx\n"
5627             ")x\" +\n"
5628             "            bbbbbb);",
5629             format("fffffffffff(R\"x(\n"
5630                    "multiline raw string literal xxxxxxxxxxxxxx\n"
5631                    ")x\" + bbbbbb);",
5632                    getGoogleStyleWithColumns(20)));
5633 }
5634 
5635 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
5636   verifyFormat("string a = \"unterminated;");
5637   EXPECT_EQ("function(\"unterminated,\n"
5638             "         OtherParameter);",
5639             format("function(  \"unterminated,\n"
5640                    "    OtherParameter);"));
5641 }
5642 
5643 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
5644   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
5645             format("#define x(_a) printf(\"foo\"_a);", getLLVMStyle()));
5646 }
5647 
5648 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
5649   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
5650             "             \"ddeeefff\");",
5651             format("someFunction(\"aaabbbcccdddeeefff\");",
5652                    getLLVMStyleWithColumns(25)));
5653   EXPECT_EQ("someFunction1234567890(\n"
5654             "    \"aaabbbcccdddeeefff\");",
5655             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
5656                    getLLVMStyleWithColumns(26)));
5657   EXPECT_EQ("someFunction1234567890(\n"
5658             "    \"aaabbbcccdddeeeff\"\n"
5659             "    \"f\");",
5660             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
5661                    getLLVMStyleWithColumns(25)));
5662   EXPECT_EQ("someFunction1234567890(\n"
5663             "    \"aaabbbcccdddeeeff\"\n"
5664             "    \"f\");",
5665             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
5666                    getLLVMStyleWithColumns(24)));
5667   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
5668             "             \"ddde \"\n"
5669             "             \"efff\");",
5670             format("someFunction(\"aaabbbcc ddde efff\");",
5671                    getLLVMStyleWithColumns(25)));
5672   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
5673             "             \"ddeeefff\");",
5674             format("someFunction(\"aaabbbccc ddeeefff\");",
5675                    getLLVMStyleWithColumns(25)));
5676   EXPECT_EQ("someFunction1234567890(\n"
5677             "    \"aaabb \"\n"
5678             "    \"cccdddeeefff\");",
5679             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
5680                    getLLVMStyleWithColumns(25)));
5681   EXPECT_EQ("#define A          \\\n"
5682             "  string s =       \\\n"
5683             "      \"123456789\"  \\\n"
5684             "      \"0\";         \\\n"
5685             "  int i;",
5686             format("#define A string s = \"1234567890\"; int i;",
5687                    getLLVMStyleWithColumns(20)));
5688   // FIXME: Put additional penalties on breaking at non-whitespace locations.
5689   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
5690             "             \"dddeeeff\"\n"
5691             "             \"f\");",
5692             format("someFunction(\"aaabbbcc dddeeefff\");",
5693                    getLLVMStyleWithColumns(25)));
5694 }
5695 
5696 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
5697   EXPECT_EQ("\"\\a\"",
5698             format("\"\\a\"", getLLVMStyleWithColumns(3)));
5699   EXPECT_EQ("\"\\\"",
5700             format("\"\\\"", getLLVMStyleWithColumns(2)));
5701   EXPECT_EQ("\"test\"\n"
5702             "\"\\n\"",
5703             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
5704   EXPECT_EQ("\"tes\\\\\"\n"
5705             "\"n\"",
5706             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
5707   EXPECT_EQ("\"\\\\\\\\\"\n"
5708             "\"\\n\"",
5709             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
5710   EXPECT_EQ("\"\\uff01\"",
5711             format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
5712   EXPECT_EQ("\"\\uff01\"\n"
5713             "\"test\"",
5714             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
5715   EXPECT_EQ("\"\\Uff01ff02\"",
5716             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
5717   EXPECT_EQ("\"\\x000000000001\"\n"
5718             "\"next\"",
5719             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
5720   EXPECT_EQ("\"\\x000000000001next\"",
5721             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
5722   EXPECT_EQ("\"\\x000000000001\"",
5723             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
5724   EXPECT_EQ("\"test\"\n"
5725             "\"\\000000\"\n"
5726             "\"000001\"",
5727             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
5728   EXPECT_EQ("\"test\\000\"\n"
5729             "\"00000000\"\n"
5730             "\"1\"",
5731             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
5732   // FIXME: We probably don't need to care about escape sequences in raw
5733   // literals.
5734   EXPECT_EQ("R\"(\\x)\"\n"
5735             "R\"(\\x00)\"\n",
5736             format("R\"(\\x\\x00)\"\n", getGoogleStyleWithColumns(7)));
5737 }
5738 
5739 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
5740   verifyFormat("void f() {\n"
5741                "  return g() {}\n"
5742                "  void h() {}");
5743   verifyFormat("if (foo)\n"
5744                "  return { forgot_closing_brace();\n"
5745                "test();");
5746   verifyFormat("int a[] = { void forgot_closing_brace() { f();\n"
5747                "g();\n"
5748                "}");
5749 }
5750 
5751 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
5752   verifyFormat("class X {\n"
5753                "  void f() {\n"
5754                "  }\n"
5755                "};",
5756                getLLVMStyleWithColumns(12));
5757 }
5758 
5759 TEST_F(FormatTest, ConfigurableIndentWidth) {
5760   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
5761   EightIndent.IndentWidth = 8;
5762   verifyFormat("void f() {\n"
5763                "        someFunction();\n"
5764                "        if (true) {\n"
5765                "                f();\n"
5766                "        }\n"
5767                "}",
5768                EightIndent);
5769   verifyFormat("class X {\n"
5770                "        void f() {\n"
5771                "        }\n"
5772                "};",
5773                EightIndent);
5774   verifyFormat("int x[] = {\n"
5775                "        call(),\n"
5776                "        call(),\n"
5777                "};",
5778                EightIndent);
5779 }
5780 
5781 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
5782   verifyFormat("void\n"
5783                "f();",
5784                getLLVMStyleWithColumns(8));
5785 }
5786 
5787 TEST_F(FormatTest, ConfigurableUseOfTab) {
5788   FormatStyle Tab = getLLVMStyleWithColumns(42);
5789   Tab.IndentWidth = 8;
5790   Tab.UseTab = FormatStyle::UT_Always;
5791   Tab.AlignEscapedNewlinesLeft = true;
5792 
5793   EXPECT_EQ("if (aaaaaaaa && // q\n"
5794             "    bb)\t\t// w\n"
5795             "\t;",
5796             format("if (aaaaaaaa &&// q\n"
5797                    "bb)// w\n"
5798                    ";",
5799                    Tab));
5800   EXPECT_EQ("if (aaa && bbb) // w\n"
5801             "\t;",
5802             format("if(aaa&&bbb)// w\n"
5803                    ";",
5804                    Tab));
5805 
5806   verifyFormat("class X {\n"
5807                "\tvoid f() {\n"
5808                "\t\tsomeFunction(parameter1,\n"
5809                "\t\t\t     parameter2);\n"
5810                "\t}\n"
5811                "};",
5812                Tab);
5813   verifyFormat("#define A                        \\\n"
5814                "\tvoid f() {               \\\n"
5815                "\t\tsomeFunction(    \\\n"
5816                "\t\t    parameter1,  \\\n"
5817                "\t\t    parameter2); \\\n"
5818                "\t}",
5819                Tab);
5820   EXPECT_EQ("void f() {\n"
5821             "\tf();\n"
5822             "\tg();\n"
5823             "}",
5824             format("void f() {\n"
5825                    "\tf();\n"
5826                    "\tg();\n"
5827                    "}",
5828                    0, 0, Tab));
5829   EXPECT_EQ("void f() {\n"
5830             "\tf();\n"
5831             "\tg();\n"
5832             "}",
5833             format("void f() {\n"
5834                    "\tf();\n"
5835                    "\tg();\n"
5836                    "}",
5837                    16, 0, Tab));
5838   EXPECT_EQ("void f() {\n"
5839             "  \tf();\n"
5840             "\tg();\n"
5841             "}",
5842             format("void f() {\n"
5843                    "  \tf();\n"
5844                    "  \tg();\n"
5845                    "}",
5846                    21, 0, Tab));
5847 
5848   Tab.TabWidth = 4;
5849   Tab.IndentWidth = 8;
5850   verifyFormat("class TabWidth4Indent8 {\n"
5851                "\t\tvoid f() {\n"
5852                "\t\t\t\tsomeFunction(parameter1,\n"
5853                "\t\t\t\t\t\t\t parameter2);\n"
5854                "\t\t}\n"
5855                "};",
5856                Tab);
5857 
5858   Tab.TabWidth = 4;
5859   Tab.IndentWidth = 4;
5860   verifyFormat("class TabWidth4Indent4 {\n"
5861                "\tvoid f() {\n"
5862                "\t\tsomeFunction(parameter1,\n"
5863                "\t\t\t\t\t parameter2);\n"
5864                "\t}\n"
5865                "};",
5866                Tab);
5867 
5868   Tab.TabWidth = 8;
5869   Tab.IndentWidth = 4;
5870   verifyFormat("class TabWidth8Indent4 {\n"
5871                "    void f() {\n"
5872                "\tsomeFunction(parameter1,\n"
5873                "\t\t     parameter2);\n"
5874                "    }\n"
5875                "};",
5876                Tab);
5877 
5878   Tab.TabWidth = 8;
5879   Tab.IndentWidth = 8;
5880   EXPECT_EQ("/*\n"
5881             "\t      a\t\tcomment\n"
5882             "\t      in multiple lines\n"
5883             "       */",
5884             format("   /*\t \t \n"
5885                    " \t \t a\t\tcomment\t \t\n"
5886                    " \t \t in multiple lines\t\n"
5887                    " \t  */",
5888                    Tab));
5889 
5890   Tab.UseTab = FormatStyle::UT_ForIndentation;
5891   EXPECT_EQ("if (aaaaaaaa && // q\n"
5892             "    bb)         // w\n"
5893             "\t;",
5894             format("if (aaaaaaaa &&// q\n"
5895                    "bb)// w\n"
5896                    ";",
5897                    Tab));
5898   verifyFormat("class X {\n"
5899                "\tvoid f() {\n"
5900                "\t\tsomeFunction(parameter1,\n"
5901                "\t\t             parameter2);\n"
5902                "\t}\n"
5903                "};",
5904                Tab);
5905   verifyFormat("{\n"
5906                "\tQ({\n"
5907                "\t\t  int a;\n"
5908                "\t\t  someFunction(aaaaaaaaaa,\n"
5909                "\t\t               bbbbbbbbb);\n"
5910                "\t  },\n"
5911                "\t  p);\n"
5912                "}",
5913                Tab);
5914   EXPECT_EQ("{\n"
5915             "\t/* aaaa\n"
5916             "\t   bbbb */\n"
5917             "}",
5918             format("{\n"
5919                    "/* aaaa\n"
5920                    "   bbbb */\n"
5921                    "}",
5922                    Tab));
5923   EXPECT_EQ("{\n"
5924             "\t/*\n"
5925             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5926             "\t  bbbbbbbbbbbbb\n"
5927             "\t*/\n"
5928             "}",
5929             format("{\n"
5930                    "/*\n"
5931                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
5932                    "*/\n"
5933                    "}",
5934                    Tab));
5935   EXPECT_EQ("{\n"
5936             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5937             "\t// bbbbbbbbbbbbb\n"
5938             "}",
5939             format("{\n"
5940                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
5941                    "}",
5942                    Tab));
5943   EXPECT_EQ("{\n"
5944             "\t/*\n"
5945             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5946             "\t  bbbbbbbbbbbbb\n"
5947             "\t*/\n"
5948             "}",
5949             format("{\n"
5950                    "\t/*\n"
5951                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
5952                    "\t*/\n"
5953                    "}",
5954                    Tab));
5955   EXPECT_EQ("{\n"
5956             "\t/*\n"
5957             "\n"
5958             "\t*/\n"
5959             "}",
5960             format("{\n"
5961                    "\t/*\n"
5962                    "\n"
5963                    "\t*/\n"
5964                    "}",
5965                    Tab));
5966   EXPECT_EQ("{\n"
5967             "\t/*\n"
5968             " asdf\n"
5969             "\t*/\n"
5970             "}",
5971             format("{\n"
5972                    "\t/*\n"
5973                    " asdf\n"
5974                    "\t*/\n"
5975                    "}",
5976                    Tab));
5977 
5978   Tab.UseTab = FormatStyle::UT_Never;
5979   EXPECT_EQ("/*\n"
5980             "              a\t\tcomment\n"
5981             "              in multiple lines\n"
5982             "       */",
5983             format("   /*\t \t \n"
5984                    " \t \t a\t\tcomment\t \t\n"
5985                    " \t \t in multiple lines\t\n"
5986                    " \t  */",
5987                    Tab));
5988   EXPECT_EQ("/* some\n"
5989             "   comment */",
5990            format(" \t \t /* some\n"
5991                   " \t \t    comment */",
5992                   Tab));
5993   EXPECT_EQ("int a; /* some\n"
5994             "   comment */",
5995            format(" \t \t int a; /* some\n"
5996                   " \t \t    comment */",
5997                   Tab));
5998 
5999   EXPECT_EQ("int a; /* some\n"
6000             "comment */",
6001            format(" \t \t int\ta; /* some\n"
6002                   " \t \t    comment */",
6003                   Tab));
6004   EXPECT_EQ("f(\"\t\t\"); /* some\n"
6005             "    comment */",
6006            format(" \t \t f(\"\t\t\"); /* some\n"
6007                   " \t \t    comment */",
6008                   Tab));
6009   EXPECT_EQ("{\n"
6010             "  /*\n"
6011             "   * Comment\n"
6012             "   */\n"
6013             "  int i;\n"
6014             "}",
6015             format("{\n"
6016                    "\t/*\n"
6017                    "\t * Comment\n"
6018                    "\t */\n"
6019                    "\t int i;\n"
6020                    "}"));
6021 }
6022 
6023 TEST_F(FormatTest, CalculatesOriginalColumn) {
6024   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6025             "q\"; /* some\n"
6026             "       comment */",
6027             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6028                    "q\"; /* some\n"
6029                    "       comment */",
6030                    getLLVMStyle()));
6031   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
6032             "/* some\n"
6033             "   comment */",
6034             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
6035                    " /* some\n"
6036                    "    comment */",
6037                    getLLVMStyle()));
6038   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6039             "qqq\n"
6040             "/* some\n"
6041             "   comment */",
6042             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6043                    "qqq\n"
6044                    " /* some\n"
6045                    "    comment */",
6046                    getLLVMStyle()));
6047   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6048             "wwww; /* some\n"
6049             "         comment */",
6050             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
6051                    "wwww; /* some\n"
6052                    "         comment */",
6053                    getLLVMStyle()));
6054 }
6055 
6056 TEST_F(FormatTest, ConfigurableSpaceAfterControlStatementKeyword) {
6057   FormatStyle NoSpace = getLLVMStyle();
6058   NoSpace.SpaceAfterControlStatementKeyword = false;
6059 
6060   verifyFormat("while(true)\n"
6061                "  continue;", NoSpace);
6062   verifyFormat("for(;;)\n"
6063                "  continue;", NoSpace);
6064   verifyFormat("if(true)\n"
6065                "  f();\n"
6066                "else if(true)\n"
6067                "  f();", NoSpace);
6068   verifyFormat("do {\n"
6069                "  do_something();\n"
6070                "} while(something());", NoSpace);
6071   verifyFormat("switch(x) {\n"
6072                "default:\n"
6073                "  break;\n"
6074                "}", NoSpace);
6075 }
6076 
6077 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
6078   FormatStyle Spaces = getLLVMStyle();
6079 
6080   Spaces.SpacesInParentheses = true;
6081   verifyFormat("call( x, y, z );", Spaces);
6082   verifyFormat("while ( (bool)1 )\n"
6083                "  continue;", Spaces);
6084   verifyFormat("for ( ;; )\n"
6085                "  continue;", Spaces);
6086   verifyFormat("if ( true )\n"
6087                "  f();\n"
6088                "else if ( true )\n"
6089                "  f();", Spaces);
6090   verifyFormat("do {\n"
6091                "  do_something( (int)i );\n"
6092                "} while ( something() );", Spaces);
6093   verifyFormat("switch ( x ) {\n"
6094                "default:\n"
6095                "  break;\n"
6096                "}", Spaces);
6097 
6098   Spaces.SpacesInParentheses = false;
6099   Spaces.SpacesInCStyleCastParentheses = true;
6100   verifyFormat("Type *A = ( Type * )P;", Spaces);
6101   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
6102   verifyFormat("x = ( int32 )y;", Spaces);
6103   verifyFormat("int a = ( int )(2.0f);", Spaces);
6104   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
6105   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
6106   verifyFormat("#define x (( int )-1)", Spaces);
6107 
6108   Spaces.SpacesInParentheses = false;
6109   Spaces.SpaceInEmptyParentheses = true;
6110   verifyFormat("call(x, y, z);", Spaces);
6111   verifyFormat("call( )", Spaces);
6112 
6113   // Run the first set of tests again with
6114   // Spaces.SpacesInParentheses = false,
6115   // Spaces.SpaceInEmptyParentheses = true and
6116   // Spaces.SpacesInCStyleCastParentheses = true
6117   Spaces.SpacesInParentheses = false,
6118   Spaces.SpaceInEmptyParentheses = true;
6119   Spaces.SpacesInCStyleCastParentheses = true;
6120   verifyFormat("call(x, y, z);", Spaces);
6121   verifyFormat("while (( bool )1)\n"
6122                "  continue;", Spaces);
6123   verifyFormat("for (;;)\n"
6124                "  continue;", Spaces);
6125   verifyFormat("if (true)\n"
6126                "  f( );\n"
6127                "else if (true)\n"
6128                "  f( );", Spaces);
6129   verifyFormat("do {\n"
6130                "  do_something(( int )i);\n"
6131                "} while (something( ));", Spaces);
6132   verifyFormat("switch (x) {\n"
6133                "default:\n"
6134                "  break;\n"
6135                "}", Spaces);
6136 }
6137 
6138 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
6139   verifyFormat("int a = 5;");
6140   verifyFormat("a += 42;");
6141   verifyFormat("a or_eq 8;");
6142 
6143   FormatStyle Spaces = getLLVMStyle();
6144   Spaces.SpaceBeforeAssignmentOperators = false;
6145   verifyFormat("int a= 5;", Spaces);
6146   verifyFormat("a+= 42;", Spaces);
6147   verifyFormat("a or_eq 8;", Spaces);
6148 }
6149 
6150 TEST_F(FormatTest, LinuxBraceBreaking) {
6151   FormatStyle BreakBeforeBrace = getLLVMStyle();
6152   BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Linux;
6153   verifyFormat("namespace a\n"
6154                "{\n"
6155                "class A\n"
6156                "{\n"
6157                "  void f()\n"
6158                "  {\n"
6159                "    if (true) {\n"
6160                "      a();\n"
6161                "      b();\n"
6162                "    }\n"
6163                "  }\n"
6164                "  void g()\n"
6165                "  {\n"
6166                "    return;\n"
6167                "  }\n"
6168                "}\n"
6169                "}",
6170                BreakBeforeBrace);
6171 }
6172 
6173 TEST_F(FormatTest, StroustrupBraceBreaking) {
6174   FormatStyle BreakBeforeBrace = getLLVMStyle();
6175   BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6176   verifyFormat("namespace a {\n"
6177                "class A {\n"
6178                "  void f()\n"
6179                "  {\n"
6180                "    if (true) {\n"
6181                "      a();\n"
6182                "      b();\n"
6183                "    }\n"
6184                "  }\n"
6185                "  void g()\n"
6186                "  {\n"
6187                "    return;\n"
6188                "  }\n"
6189                "}\n"
6190                "}",
6191                BreakBeforeBrace);
6192 }
6193 
6194 TEST_F(FormatTest, AllmanBraceBreaking) {
6195   FormatStyle BreakBeforeBrace = getLLVMStyle();
6196   BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Allman;
6197   verifyFormat("namespace a\n"
6198                "{\n"
6199                "class A\n"
6200                "{\n"
6201                "  void f()\n"
6202                "  {\n"
6203                "    if (true)\n"
6204                "    {\n"
6205                "      a();\n"
6206                "      b();\n"
6207                "    }\n"
6208                "  }\n"
6209                "  void g()\n"
6210                "  {\n"
6211                "    return;\n"
6212                "  }\n"
6213                "}\n"
6214                "}",
6215                BreakBeforeBrace);
6216 
6217   verifyFormat("void f()\n"
6218                "{\n"
6219                "  if (true)\n"
6220                "  {\n"
6221                "    a();\n"
6222                "  }\n"
6223                "  else if (false)\n"
6224                "  {\n"
6225                "    b();\n"
6226                "  }\n"
6227                "  else\n"
6228                "  {\n"
6229                "    c();\n"
6230                "  }\n"
6231                "}\n",
6232                BreakBeforeBrace);
6233 
6234   verifyFormat("void f()\n"
6235                "{\n"
6236                "  for (int i = 0; i < 10; ++i)\n"
6237                "  {\n"
6238                "    a();\n"
6239                "  }\n"
6240                "  while (false)\n"
6241                "  {\n"
6242                "    b();\n"
6243                "  }\n"
6244                "  do\n"
6245                "  {\n"
6246                "    c();\n"
6247                "  } while (false)\n"
6248                "}\n",
6249                BreakBeforeBrace);
6250 
6251   verifyFormat("void f(int a)\n"
6252                "{\n"
6253                "  switch (a)\n"
6254                "  {\n"
6255                "  case 0:\n"
6256                "    break;\n"
6257                "  case 1:\n"
6258                "  {\n"
6259                "    break;\n"
6260                "  }\n"
6261                "  case 2:\n"
6262                "  {\n"
6263                "  }\n"
6264                "  break;\n"
6265                "  default:\n"
6266                "    break;\n"
6267                "  }\n"
6268                "}\n",
6269                BreakBeforeBrace);
6270 
6271   verifyFormat("enum X\n"
6272                "{\n"
6273                "  Y = 0,\n"
6274                "}\n",
6275                BreakBeforeBrace);
6276 
6277   FormatStyle BreakBeforeBraceShortIfs = BreakBeforeBrace;
6278   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
6279   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
6280   verifyFormat("void f(bool b)\n"
6281                "{\n"
6282                "  if (b)\n"
6283                "  {\n"
6284                "    return;\n"
6285                "  }\n"
6286                "}\n",
6287                BreakBeforeBraceShortIfs);
6288   verifyFormat("void f(bool b)\n"
6289                "{\n"
6290                "  if (b) return;\n"
6291                "}\n",
6292                BreakBeforeBraceShortIfs);
6293   verifyFormat("void f(bool b)\n"
6294                "{\n"
6295                "  while (b)\n"
6296                "  {\n"
6297                "    return;\n"
6298                "  }\n"
6299                "}\n",
6300                BreakBeforeBraceShortIfs);
6301 }
6302 
6303 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
6304   verifyFormat("void f() {\n"
6305                "  try {\n"
6306                "  }\n"
6307                "  catch (const Exception &e) {\n"
6308                "  }\n"
6309                "}\n",
6310                getLLVMStyle());
6311 }
6312 
6313 TEST_F(FormatTest, UnderstandsPragmas) {
6314   verifyFormat("#pragma omp reduction(| : var)");
6315   verifyFormat("#pragma omp reduction(+ : var)");
6316 }
6317 
6318 bool allStylesEqual(ArrayRef<FormatStyle> Styles) {
6319   for (size_t i = 1; i < Styles.size(); ++i)
6320     if (!(Styles[0] == Styles[i]))
6321       return false;
6322   return true;
6323 }
6324 
6325 TEST_F(FormatTest, GetsPredefinedStyleByName) {
6326   FormatStyle Styles[3];
6327 
6328   Styles[0] = getLLVMStyle();
6329   EXPECT_TRUE(getPredefinedStyle("LLVM", &Styles[1]));
6330   EXPECT_TRUE(getPredefinedStyle("lLvM", &Styles[2]));
6331   EXPECT_TRUE(allStylesEqual(Styles));
6332 
6333   Styles[0] = getGoogleStyle();
6334   EXPECT_TRUE(getPredefinedStyle("Google", &Styles[1]));
6335   EXPECT_TRUE(getPredefinedStyle("gOOgle", &Styles[2]));
6336   EXPECT_TRUE(allStylesEqual(Styles));
6337 
6338   Styles[0] = getChromiumStyle();
6339   EXPECT_TRUE(getPredefinedStyle("Chromium", &Styles[1]));
6340   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", &Styles[2]));
6341   EXPECT_TRUE(allStylesEqual(Styles));
6342 
6343   Styles[0] = getMozillaStyle();
6344   EXPECT_TRUE(getPredefinedStyle("Mozilla", &Styles[1]));
6345   EXPECT_TRUE(getPredefinedStyle("moZILla", &Styles[2]));
6346   EXPECT_TRUE(allStylesEqual(Styles));
6347 
6348   Styles[0] = getWebKitStyle();
6349   EXPECT_TRUE(getPredefinedStyle("WebKit", &Styles[1]));
6350   EXPECT_TRUE(getPredefinedStyle("wEbKit", &Styles[2]));
6351   EXPECT_TRUE(allStylesEqual(Styles));
6352 
6353   EXPECT_FALSE(getPredefinedStyle("qwerty", &Styles[0]));
6354 }
6355 
6356 TEST_F(FormatTest, ParsesConfiguration) {
6357   FormatStyle Style = {};
6358 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
6359   EXPECT_NE(VALUE, Style.FIELD);                                               \
6360   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
6361   EXPECT_EQ(VALUE, Style.FIELD)
6362 
6363 #define CHECK_PARSE_BOOL(FIELD)                                                \
6364   Style.FIELD = false;                                                         \
6365   EXPECT_EQ(0, parseConfiguration(#FIELD ": true", &Style).value());           \
6366   EXPECT_TRUE(Style.FIELD);                                                    \
6367   EXPECT_EQ(0, parseConfiguration(#FIELD ": false", &Style).value());          \
6368   EXPECT_FALSE(Style.FIELD);
6369 
6370   CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
6371   CHECK_PARSE_BOOL(AlignTrailingComments);
6372   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
6373   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
6374   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
6375   CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
6376   CHECK_PARSE_BOOL(BinPackParameters);
6377   CHECK_PARSE_BOOL(BreakBeforeBinaryOperators);
6378   CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
6379   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
6380   CHECK_PARSE_BOOL(DerivePointerBinding);
6381   CHECK_PARSE_BOOL(IndentCaseLabels);
6382   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
6383   CHECK_PARSE_BOOL(PointerBindsToType);
6384   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
6385   CHECK_PARSE_BOOL(IndentFunctionDeclarationAfterType);
6386   CHECK_PARSE_BOOL(SpacesInParentheses);
6387   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
6388   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
6389   CHECK_PARSE_BOOL(SpaceAfterControlStatementKeyword);
6390   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
6391 
6392   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
6393   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
6394               ConstructorInitializerIndentWidth, 1234u);
6395   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
6396   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
6397   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
6398   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
6399               PenaltyReturnTypeOnItsOwnLine, 1234u);
6400   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
6401               SpacesBeforeTrailingComments, 1234u);
6402   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
6403 
6404   Style.Standard = FormatStyle::LS_Auto;
6405   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
6406   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
6407   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
6408   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
6409   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
6410 
6411   Style.UseTab = FormatStyle::UT_ForIndentation;
6412   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
6413   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
6414   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
6415   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
6416   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
6417 
6418   Style.ColumnLimit = 123;
6419   FormatStyle BaseStyle = getLLVMStyle();
6420   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
6421   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
6422 
6423   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6424   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
6425               FormatStyle::BS_Attach);
6426   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
6427               FormatStyle::BS_Linux);
6428   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
6429               FormatStyle::BS_Stroustrup);
6430 
6431   Style.NamespaceIndentation = FormatStyle::NI_All;
6432   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
6433               FormatStyle::NI_None);
6434   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
6435               FormatStyle::NI_Inner);
6436   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
6437               FormatStyle::NI_All);
6438 
6439 #undef CHECK_PARSE
6440 #undef CHECK_PARSE_BOOL
6441 }
6442 
6443 TEST_F(FormatTest, ConfigurationRoundTripTest) {
6444   FormatStyle Style = getLLVMStyle();
6445   std::string YAML = configurationAsText(Style);
6446   FormatStyle ParsedStyle = {};
6447   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
6448   EXPECT_EQ(Style, ParsedStyle);
6449 }
6450 
6451 TEST_F(FormatTest, WorksFor8bitEncodings) {
6452   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
6453             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
6454             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
6455             "\"\xef\xee\xf0\xf3...\"",
6456             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
6457                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
6458                    "\xef\xee\xf0\xf3...\"",
6459                    getLLVMStyleWithColumns(12)));
6460 }
6461 
6462 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
6463 #if !defined(_MSC_VER)
6464 
6465 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
6466   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
6467                getLLVMStyleWithColumns(35));
6468   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
6469                getLLVMStyleWithColumns(31));
6470   verifyFormat("// Однажды в студёную зимнюю пору...",
6471                getLLVMStyleWithColumns(36));
6472   verifyFormat("// 一 二 三 四 五 六 七 八 九 十",
6473                getLLVMStyleWithColumns(32));
6474   verifyFormat("/* Однажды в студёную зимнюю пору... */",
6475                getLLVMStyleWithColumns(39));
6476   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
6477                getLLVMStyleWithColumns(35));
6478 }
6479 
6480 TEST_F(FormatTest, SplitsUTF8Strings) {
6481   EXPECT_EQ(
6482       "\"Однажды, в \"\n"
6483       "\"студёную \"\n"
6484       "\"зимнюю \"\n"
6485       "\"пору,\"",
6486       format("\"Однажды, в студёную зимнюю пору,\"",
6487              getLLVMStyleWithColumns(13)));
6488   EXPECT_EQ("\"一 二 三 \"\n"
6489             "\"四 五六 \"\n"
6490             "\"七 八 九 \"\n"
6491             "\"十\"",
6492             format("\"一 二 三 四 五六 七 八 九 十\"",
6493                    getLLVMStyleWithColumns(11)));
6494   EXPECT_EQ("\"一\t二 \"\n"
6495             "\"\t三 \"\n"
6496             "\"四 五\t六 \"\n"
6497             "\"\t七 \"\n"
6498             "\"八九十\tqq\"",
6499             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
6500                    getLLVMStyleWithColumns(11)));
6501 }
6502 
6503 
6504 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
6505   EXPECT_EQ("const char *sssss =\n"
6506             "    \"一二三四五六七八\\\n"
6507             " 九 十\";",
6508             format("const char *sssss = \"一二三四五六七八\\\n"
6509                    " 九 十\";",
6510                    getLLVMStyleWithColumns(30)));
6511 }
6512 
6513 TEST_F(FormatTest, SplitsUTF8LineComments) {
6514   EXPECT_EQ("// Я из лесу\n"
6515             "// вышел; был\n"
6516             "// сильный\n"
6517             "// мороз.",
6518             format("// Я из лесу вышел; был сильный мороз.",
6519                    getLLVMStyleWithColumns(13)));
6520   EXPECT_EQ("// 一二三\n"
6521             "// 四五六七\n"
6522             "// 八  九\n"
6523             "// 十",
6524             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
6525 }
6526 
6527 TEST_F(FormatTest, SplitsUTF8BlockComments) {
6528   EXPECT_EQ("/* Гляжу,\n"
6529             " * поднимается\n"
6530             " * медленно в\n"
6531             " * гору\n"
6532             " * Лошадка,\n"
6533             " * везущая\n"
6534             " * хворосту\n"
6535             " * воз. */",
6536             format("/* Гляжу, поднимается медленно в гору\n"
6537                    " * Лошадка, везущая хворосту воз. */",
6538                    getLLVMStyleWithColumns(13)));
6539   EXPECT_EQ(
6540       "/* 一二三\n"
6541       " * 四五六七\n"
6542       " * 八  九\n"
6543       " * 十  */",
6544       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
6545   EXPECT_EQ("/* �������� ��������\n"
6546             " * ��������\n"
6547             " * ������-�� */",
6548             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
6549 }
6550 
6551 #endif // _MSC_VER
6552 
6553 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
6554   FormatStyle Style = getLLVMStyle();
6555 
6556   Style.ConstructorInitializerIndentWidth = 4;
6557   verifyFormat(
6558       "SomeClass::Constructor()\n"
6559       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
6560       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
6561       Style);
6562 
6563   Style.ConstructorInitializerIndentWidth = 2;
6564   verifyFormat(
6565       "SomeClass::Constructor()\n"
6566       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
6567       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
6568       Style);
6569 
6570   Style.ConstructorInitializerIndentWidth = 0;
6571   verifyFormat(
6572       "SomeClass::Constructor()\n"
6573       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
6574       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
6575       Style);
6576 
6577   Style.BreakConstructorInitializersBeforeComma = true;
6578   Style.ConstructorInitializerIndentWidth = 4;
6579   verifyFormat("SomeClass::Constructor()\n"
6580                "    : a(a)\n"
6581                "    , b(b)\n"
6582                "    , c(c) {}",
6583                Style);
6584 
6585   Style.ConstructorInitializerIndentWidth = 2;
6586   verifyFormat("SomeClass::Constructor()\n"
6587                "  : a(a)\n"
6588                "  , b(b)\n"
6589                "  , c(c) {}",
6590                Style);
6591 
6592   Style.ConstructorInitializerIndentWidth = 0;
6593   verifyFormat("SomeClass::Constructor()\n"
6594                ": a(a)\n"
6595                ", b(b)\n"
6596                ", c(c) {}",
6597                Style);
6598 
6599   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
6600   Style.ConstructorInitializerIndentWidth = 4;
6601   verifyFormat(
6602       "SomeClass::Constructor()\n"
6603       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
6604       Style);
6605   Style.ConstructorInitializerIndentWidth = 4;
6606   Style.ColumnLimit = 60;
6607   verifyFormat("SomeClass::Constructor()\n"
6608                "    : aaaaaaaa(aaaaaaaa)\n"
6609                "    , aaaaaaaa(aaaaaaaa)\n"
6610                "    , aaaaaaaa(aaaaaaaa) {}",
6611                Style);
6612 }
6613 
6614 TEST_F(FormatTest, FormatsWithWebKitStyle) {
6615   FormatStyle Style = getWebKitStyle();
6616 
6617   // Don't indent in outer namespaces.
6618   verifyFormat("namespace outer {\n"
6619                "int i;\n"
6620                "namespace inner {\n"
6621                "    int i;\n"
6622                "} // namespace inner\n"
6623                "} // namespace outer\n"
6624                "namespace other_outer {\n"
6625                "int i;\n"
6626                "}",
6627                Style);
6628 
6629   // Don't indent case labels.
6630   verifyFormat("switch (variable) {\n"
6631                "case 1:\n"
6632                "case 2:\n"
6633                "    doSomething();\n"
6634                "    break;\n"
6635                "default:\n"
6636                "    ++variable;\n"
6637                "}",
6638                Style);
6639 
6640   // Wrap before binary operators.
6641   EXPECT_EQ(
6642       "void f()\n"
6643       "{\n"
6644       "    if (aaaaaaaaaaaaaaaa\n"
6645       "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
6646       "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
6647       "        return;\n"
6648       "}",
6649       format(
6650           "void f() {\n"
6651           "if (aaaaaaaaaaaaaaaa\n"
6652           "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
6653           "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
6654           "return;\n"
6655           "}",
6656           Style));
6657 
6658   // Constructor initializers are formatted one per line with the "," on the
6659   // new line.
6660   verifyFormat("Constructor()\n"
6661                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6662                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
6663                "                               aaaaaaaaaaaaaa)\n"
6664                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n{\n}",
6665                Style);
6666 
6667   // Access specifiers should be aligned left.
6668   verifyFormat("class C {\n"
6669                "public:\n"
6670                "    int i;\n"
6671                "};",
6672                Style);
6673 
6674   // Do not align comments.
6675   verifyFormat("int a; // Do not\n"
6676                "double b; // align comments.",
6677                Style);
6678 
6679   // Accept input's line breaks.
6680   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
6681             "    || bbbbbbbbbbbbbbb) {\n"
6682             "    i++;\n"
6683             "}",
6684             format("if (aaaaaaaaaaaaaaa\n"
6685                    "|| bbbbbbbbbbbbbbb) { i++; }",
6686                    Style));
6687   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
6688             "    i++;\n"
6689             "}",
6690             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
6691 }
6692 
6693 TEST_F(FormatTest, FormatsProtocolBufferDefinitions) {
6694   // It seems that clang-format can format protocol buffer definitions
6695   // (see https://code.google.com/p/protobuf/).
6696   verifyFormat("message SomeMessage {\n"
6697                "  required int32 field1 = 1;\n"
6698                "  optional string field2 = 2 [default = \"2\"]\n"
6699                "}");
6700 }
6701 
6702 TEST_F(FormatTest, FormatsLambdas) {
6703   verifyFormat("int c = [b]() mutable {\n"
6704                "  return [&b] { return b++; }();\n"
6705                "}();\n");
6706   verifyFormat("int c = [&] {\n"
6707                "  [=] { return b++; }();\n"
6708                "}();\n");
6709   verifyFormat("int c = [&, &a, a] {\n"
6710                "  [=, c, &d] { return b++; }();\n"
6711                "}();\n");
6712   verifyFormat("int c = [&a, &a, a] {\n"
6713                "  [=, a, b, &c] { return b++; }();\n"
6714                "}();\n");
6715   verifyFormat("auto c = { [&a, &a, a] {\n"
6716                "  [=, a, b, &c] { return b++; }();\n"
6717                "} }\n");
6718   verifyFormat("auto c = { [&a, &a, a] { [=, a, b, &c] {}(); } }\n");
6719   verifyFormat("void f() {\n"
6720                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
6721                "}\n");
6722   verifyFormat("void f() {\n"
6723                "  other(x.begin(), //\n"
6724                "        x.end(),   //\n"
6725                "        [&](int, int) { return 1; });\n"
6726                "}\n");
6727 
6728   // Not lambdas.
6729   verifyFormat("constexpr char hello[]{ \"hello\" };");
6730   verifyFormat("double &operator[](int i) { return 0; }\n"
6731                "int i;");
6732 }
6733 
6734 TEST_F(FormatTest, FormatsBlocks) {
6735   // FIXME: Make whitespace formatting consistent. Ask a ObjC dev how
6736   // it would ideally look.
6737   verifyFormat("[operation setCompletionBlock:^{ [self onOperationDone]; }];");
6738   verifyFormat("int i = {[operation setCompletionBlock : ^{ [self "
6739                "onOperationDone]; }] };");
6740 }
6741 
6742 TEST_F(FormatTest, SupportsCRLF) {
6743   EXPECT_EQ("int a;\r\n"
6744             "int b;\r\n"
6745             "int c;\r\n",
6746             format("int a;\r\n"
6747                    "  int b;\r\n"
6748                    "    int c;\r\n",
6749                    getLLVMStyle()));
6750   EXPECT_EQ("int a;\r\n"
6751             "int b;\r\n"
6752             "int c;\r\n",
6753             format("int a;\r\n"
6754                    "  int b;\n"
6755                    "    int c;\r\n",
6756                    getLLVMStyle()));
6757   EXPECT_EQ("int a;\n"
6758             "int b;\n"
6759             "int c;\n",
6760             format("int a;\r\n"
6761                    "  int b;\n"
6762                    "    int c;\n",
6763                    getLLVMStyle()));
6764   EXPECT_EQ("\"aaaaaaa \"\r\n"
6765             "\"bbbbbbb\";\r\n",
6766             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
6767   EXPECT_EQ("#define A \\\r\n"
6768             "  b;      \\\r\n"
6769             "  c;      \\\r\n"
6770             "  d;\r\n",
6771             format("#define A \\\r\n"
6772                    "  b; \\\r\n"
6773                    "  c; d; \r\n",
6774                    getGoogleStyle()));
6775 }
6776 
6777 } // end namespace tooling
6778 } // end namespace clang
6779