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