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