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