xref: /aosp_15_r20/external/clang/unittests/Format/FormatTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "clang/Format/Format.h"
11*67e74705SXin Li 
12*67e74705SXin Li #include "../Tooling/RewriterTestContext.h"
13*67e74705SXin Li #include "FormatTestUtils.h"
14*67e74705SXin Li 
15*67e74705SXin Li #include "clang/Frontend/TextDiagnosticPrinter.h"
16*67e74705SXin Li #include "llvm/Support/Debug.h"
17*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
18*67e74705SXin Li #include "gtest/gtest.h"
19*67e74705SXin Li 
20*67e74705SXin Li #define DEBUG_TYPE "format-test"
21*67e74705SXin Li 
22*67e74705SXin Li namespace clang {
23*67e74705SXin Li namespace format {
24*67e74705SXin Li namespace {
25*67e74705SXin Li 
getGoogleStyle()26*67e74705SXin Li FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
27*67e74705SXin Li 
28*67e74705SXin Li class FormatTest : public ::testing::Test {
29*67e74705SXin Li protected:
30*67e74705SXin Li   enum IncompleteCheck {
31*67e74705SXin Li     IC_ExpectComplete,
32*67e74705SXin Li     IC_ExpectIncomplete,
33*67e74705SXin Li     IC_DoNotCheck
34*67e74705SXin Li   };
35*67e74705SXin Li 
format(llvm::StringRef Code,const FormatStyle & Style=getLLVMStyle (),IncompleteCheck CheckIncomplete=IC_ExpectComplete)36*67e74705SXin Li   std::string format(llvm::StringRef Code,
37*67e74705SXin Li                      const FormatStyle &Style = getLLVMStyle(),
38*67e74705SXin Li                      IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
39*67e74705SXin Li     DEBUG(llvm::errs() << "---\n");
40*67e74705SXin Li     DEBUG(llvm::errs() << Code << "\n\n");
41*67e74705SXin Li     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
42*67e74705SXin Li     bool IncompleteFormat = false;
43*67e74705SXin Li     tooling::Replacements Replaces =
44*67e74705SXin Li         reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
45*67e74705SXin Li     if (CheckIncomplete != IC_DoNotCheck) {
46*67e74705SXin Li       bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
47*67e74705SXin Li       EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
48*67e74705SXin Li     }
49*67e74705SXin Li     ReplacementCount = Replaces.size();
50*67e74705SXin Li     auto Result = applyAllReplacements(Code, Replaces);
51*67e74705SXin Li     EXPECT_TRUE(static_cast<bool>(Result));
52*67e74705SXin Li     DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
53*67e74705SXin Li     return *Result;
54*67e74705SXin Li   }
55*67e74705SXin Li 
getLLVMStyleWithColumns(unsigned ColumnLimit)56*67e74705SXin Li   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
57*67e74705SXin Li     FormatStyle Style = getLLVMStyle();
58*67e74705SXin Li     Style.ColumnLimit = ColumnLimit;
59*67e74705SXin Li     return Style;
60*67e74705SXin Li   }
61*67e74705SXin Li 
getGoogleStyleWithColumns(unsigned ColumnLimit)62*67e74705SXin Li   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
63*67e74705SXin Li     FormatStyle Style = getGoogleStyle();
64*67e74705SXin Li     Style.ColumnLimit = ColumnLimit;
65*67e74705SXin Li     return Style;
66*67e74705SXin Li   }
67*67e74705SXin Li 
verifyFormat(llvm::StringRef Code,const FormatStyle & Style=getLLVMStyle ())68*67e74705SXin Li   void verifyFormat(llvm::StringRef Code,
69*67e74705SXin Li                     const FormatStyle &Style = getLLVMStyle()) {
70*67e74705SXin Li     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
71*67e74705SXin Li   }
72*67e74705SXin Li 
verifyIncompleteFormat(llvm::StringRef Code,const FormatStyle & Style=getLLVMStyle ())73*67e74705SXin Li   void verifyIncompleteFormat(llvm::StringRef Code,
74*67e74705SXin Li                               const FormatStyle &Style = getLLVMStyle()) {
75*67e74705SXin Li     EXPECT_EQ(Code.str(),
76*67e74705SXin Li               format(test::messUp(Code), Style, IC_ExpectIncomplete));
77*67e74705SXin Li   }
78*67e74705SXin Li 
verifyGoogleFormat(llvm::StringRef Code)79*67e74705SXin Li   void verifyGoogleFormat(llvm::StringRef Code) {
80*67e74705SXin Li     verifyFormat(Code, getGoogleStyle());
81*67e74705SXin Li   }
82*67e74705SXin Li 
verifyIndependentOfContext(llvm::StringRef text)83*67e74705SXin Li   void verifyIndependentOfContext(llvm::StringRef text) {
84*67e74705SXin Li     verifyFormat(text);
85*67e74705SXin Li     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
86*67e74705SXin Li   }
87*67e74705SXin Li 
88*67e74705SXin Li   /// \brief Verify that clang-format does not crash on the given input.
verifyNoCrash(llvm::StringRef Code,const FormatStyle & Style=getLLVMStyle ())89*67e74705SXin Li   void verifyNoCrash(llvm::StringRef Code,
90*67e74705SXin Li                      const FormatStyle &Style = getLLVMStyle()) {
91*67e74705SXin Li     format(Code, Style, IC_DoNotCheck);
92*67e74705SXin Li   }
93*67e74705SXin Li 
94*67e74705SXin Li   int ReplacementCount;
95*67e74705SXin Li };
96*67e74705SXin Li 
TEST_F(FormatTest,MessUp)97*67e74705SXin Li TEST_F(FormatTest, MessUp) {
98*67e74705SXin Li   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
99*67e74705SXin Li   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
100*67e74705SXin Li   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
101*67e74705SXin Li   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
102*67e74705SXin Li   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li //===----------------------------------------------------------------------===//
106*67e74705SXin Li // Basic function tests.
107*67e74705SXin Li //===----------------------------------------------------------------------===//
108*67e74705SXin Li 
TEST_F(FormatTest,DoesNotChangeCorrectlyFormattedCode)109*67e74705SXin Li TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
110*67e74705SXin Li   EXPECT_EQ(";", format(";"));
111*67e74705SXin Li }
112*67e74705SXin Li 
TEST_F(FormatTest,FormatsGlobalStatementsAt0)113*67e74705SXin Li TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
114*67e74705SXin Li   EXPECT_EQ("int i;", format("  int i;"));
115*67e74705SXin Li   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
116*67e74705SXin Li   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
117*67e74705SXin Li   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
118*67e74705SXin Li }
119*67e74705SXin Li 
TEST_F(FormatTest,FormatsUnwrappedLinesAtFirstFormat)120*67e74705SXin Li TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
121*67e74705SXin Li   EXPECT_EQ("int i;", format("int\ni;"));
122*67e74705SXin Li }
123*67e74705SXin Li 
TEST_F(FormatTest,FormatsNestedBlockStatements)124*67e74705SXin Li TEST_F(FormatTest, FormatsNestedBlockStatements) {
125*67e74705SXin Li   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
126*67e74705SXin Li }
127*67e74705SXin Li 
TEST_F(FormatTest,FormatsNestedCall)128*67e74705SXin Li TEST_F(FormatTest, FormatsNestedCall) {
129*67e74705SXin Li   verifyFormat("Method(f1, f2(f3));");
130*67e74705SXin Li   verifyFormat("Method(f1(f2, f3()));");
131*67e74705SXin Li   verifyFormat("Method(f1(f2, (f3())));");
132*67e74705SXin Li }
133*67e74705SXin Li 
TEST_F(FormatTest,NestedNameSpecifiers)134*67e74705SXin Li TEST_F(FormatTest, NestedNameSpecifiers) {
135*67e74705SXin Li   verifyFormat("vector<::Type> v;");
136*67e74705SXin Li   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
137*67e74705SXin Li   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
138*67e74705SXin Li   verifyFormat("bool a = 2 < ::SomeFunction();");
139*67e74705SXin Li }
140*67e74705SXin Li 
TEST_F(FormatTest,OnlyGeneratesNecessaryReplacements)141*67e74705SXin Li TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
142*67e74705SXin Li   EXPECT_EQ("if (a) {\n"
143*67e74705SXin Li             "  f();\n"
144*67e74705SXin Li             "}",
145*67e74705SXin Li             format("if(a){f();}"));
146*67e74705SXin Li   EXPECT_EQ(4, ReplacementCount);
147*67e74705SXin Li   EXPECT_EQ("if (a) {\n"
148*67e74705SXin Li             "  f();\n"
149*67e74705SXin Li             "}",
150*67e74705SXin Li             format("if (a) {\n"
151*67e74705SXin Li                    "  f();\n"
152*67e74705SXin Li                    "}"));
153*67e74705SXin Li   EXPECT_EQ(0, ReplacementCount);
154*67e74705SXin Li   EXPECT_EQ("/*\r\n"
155*67e74705SXin Li             "\r\n"
156*67e74705SXin Li             "*/\r\n",
157*67e74705SXin Li             format("/*\r\n"
158*67e74705SXin Li                    "\r\n"
159*67e74705SXin Li                    "*/\r\n"));
160*67e74705SXin Li   EXPECT_EQ(0, ReplacementCount);
161*67e74705SXin Li }
162*67e74705SXin Li 
TEST_F(FormatTest,RemovesEmptyLines)163*67e74705SXin Li TEST_F(FormatTest, RemovesEmptyLines) {
164*67e74705SXin Li   EXPECT_EQ("class C {\n"
165*67e74705SXin Li             "  int i;\n"
166*67e74705SXin Li             "};",
167*67e74705SXin Li             format("class C {\n"
168*67e74705SXin Li                    " int i;\n"
169*67e74705SXin Li                    "\n"
170*67e74705SXin Li                    "};"));
171*67e74705SXin Li 
172*67e74705SXin Li   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
173*67e74705SXin Li   EXPECT_EQ("namespace N {\n"
174*67e74705SXin Li             "\n"
175*67e74705SXin Li             "int i;\n"
176*67e74705SXin Li             "}",
177*67e74705SXin Li             format("namespace N {\n"
178*67e74705SXin Li                    "\n"
179*67e74705SXin Li                    "int    i;\n"
180*67e74705SXin Li                    "}",
181*67e74705SXin Li                    getGoogleStyle()));
182*67e74705SXin Li   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
183*67e74705SXin Li             "\n"
184*67e74705SXin Li             "int i;\n"
185*67e74705SXin Li             "}",
186*67e74705SXin Li             format("extern /**/ \"C\" /**/ {\n"
187*67e74705SXin Li                    "\n"
188*67e74705SXin Li                    "int    i;\n"
189*67e74705SXin Li                    "}",
190*67e74705SXin Li                    getGoogleStyle()));
191*67e74705SXin Li 
192*67e74705SXin Li   // ...but do keep inlining and removing empty lines for non-block extern "C"
193*67e74705SXin Li   // functions.
194*67e74705SXin Li   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
195*67e74705SXin Li   EXPECT_EQ("extern \"C\" int f() {\n"
196*67e74705SXin Li             "  int i = 42;\n"
197*67e74705SXin Li             "  return i;\n"
198*67e74705SXin Li             "}",
199*67e74705SXin Li             format("extern \"C\" int f() {\n"
200*67e74705SXin Li                    "\n"
201*67e74705SXin Li                    "  int i = 42;\n"
202*67e74705SXin Li                    "  return i;\n"
203*67e74705SXin Li                    "}",
204*67e74705SXin Li                    getGoogleStyle()));
205*67e74705SXin Li 
206*67e74705SXin Li   // Remove empty lines at the beginning and end of blocks.
207*67e74705SXin Li   EXPECT_EQ("void f() {\n"
208*67e74705SXin Li             "\n"
209*67e74705SXin Li             "  if (a) {\n"
210*67e74705SXin Li             "\n"
211*67e74705SXin Li             "    f();\n"
212*67e74705SXin Li             "  }\n"
213*67e74705SXin Li             "}",
214*67e74705SXin Li             format("void f() {\n"
215*67e74705SXin Li                    "\n"
216*67e74705SXin Li                    "  if (a) {\n"
217*67e74705SXin Li                    "\n"
218*67e74705SXin Li                    "    f();\n"
219*67e74705SXin Li                    "\n"
220*67e74705SXin Li                    "  }\n"
221*67e74705SXin Li                    "\n"
222*67e74705SXin Li                    "}",
223*67e74705SXin Li                    getLLVMStyle()));
224*67e74705SXin Li   EXPECT_EQ("void f() {\n"
225*67e74705SXin Li             "  if (a) {\n"
226*67e74705SXin Li             "    f();\n"
227*67e74705SXin Li             "  }\n"
228*67e74705SXin Li             "}",
229*67e74705SXin Li             format("void f() {\n"
230*67e74705SXin Li                    "\n"
231*67e74705SXin Li                    "  if (a) {\n"
232*67e74705SXin Li                    "\n"
233*67e74705SXin Li                    "    f();\n"
234*67e74705SXin Li                    "\n"
235*67e74705SXin Li                    "  }\n"
236*67e74705SXin Li                    "\n"
237*67e74705SXin Li                    "}",
238*67e74705SXin Li                    getGoogleStyle()));
239*67e74705SXin Li 
240*67e74705SXin Li   // Don't remove empty lines in more complex control statements.
241*67e74705SXin Li   EXPECT_EQ("void f() {\n"
242*67e74705SXin Li             "  if (a) {\n"
243*67e74705SXin Li             "    f();\n"
244*67e74705SXin Li             "\n"
245*67e74705SXin Li             "  } else if (b) {\n"
246*67e74705SXin Li             "    f();\n"
247*67e74705SXin Li             "  }\n"
248*67e74705SXin Li             "}",
249*67e74705SXin Li             format("void f() {\n"
250*67e74705SXin Li                    "  if (a) {\n"
251*67e74705SXin Li                    "    f();\n"
252*67e74705SXin Li                    "\n"
253*67e74705SXin Li                    "  } else if (b) {\n"
254*67e74705SXin Li                    "    f();\n"
255*67e74705SXin Li                    "\n"
256*67e74705SXin Li                    "  }\n"
257*67e74705SXin Li                    "\n"
258*67e74705SXin Li                    "}"));
259*67e74705SXin Li 
260*67e74705SXin Li   // FIXME: This is slightly inconsistent.
261*67e74705SXin Li   EXPECT_EQ("namespace {\n"
262*67e74705SXin Li             "int i;\n"
263*67e74705SXin Li             "}",
264*67e74705SXin Li             format("namespace {\n"
265*67e74705SXin Li                    "int i;\n"
266*67e74705SXin Li                    "\n"
267*67e74705SXin Li                    "}"));
268*67e74705SXin Li   EXPECT_EQ("namespace {\n"
269*67e74705SXin Li             "int i;\n"
270*67e74705SXin Li             "\n"
271*67e74705SXin Li             "} // namespace",
272*67e74705SXin Li             format("namespace {\n"
273*67e74705SXin Li                    "int i;\n"
274*67e74705SXin Li                    "\n"
275*67e74705SXin Li                    "}  // namespace"));
276*67e74705SXin Li }
277*67e74705SXin Li 
TEST_F(FormatTest,RecognizesBinaryOperatorKeywords)278*67e74705SXin Li TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
279*67e74705SXin Li   verifyFormat("x = (a) and (b);");
280*67e74705SXin Li   verifyFormat("x = (a) or (b);");
281*67e74705SXin Li   verifyFormat("x = (a) bitand (b);");
282*67e74705SXin Li   verifyFormat("x = (a) bitor (b);");
283*67e74705SXin Li   verifyFormat("x = (a) not_eq (b);");
284*67e74705SXin Li   verifyFormat("x = (a) and_eq (b);");
285*67e74705SXin Li   verifyFormat("x = (a) or_eq (b);");
286*67e74705SXin Li   verifyFormat("x = (a) xor (b);");
287*67e74705SXin Li }
288*67e74705SXin Li 
289*67e74705SXin Li //===----------------------------------------------------------------------===//
290*67e74705SXin Li // Tests for control statements.
291*67e74705SXin Li //===----------------------------------------------------------------------===//
292*67e74705SXin Li 
TEST_F(FormatTest,FormatIfWithoutCompoundStatement)293*67e74705SXin Li TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
294*67e74705SXin Li   verifyFormat("if (true)\n  f();\ng();");
295*67e74705SXin Li   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
296*67e74705SXin Li   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
297*67e74705SXin Li 
298*67e74705SXin Li   FormatStyle AllowsMergedIf = getLLVMStyle();
299*67e74705SXin Li   AllowsMergedIf.AlignEscapedNewlinesLeft = true;
300*67e74705SXin Li   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
301*67e74705SXin Li   verifyFormat("if (a)\n"
302*67e74705SXin Li                "  // comment\n"
303*67e74705SXin Li                "  f();",
304*67e74705SXin Li                AllowsMergedIf);
305*67e74705SXin Li   verifyFormat("{\n"
306*67e74705SXin Li                "  if (a)\n"
307*67e74705SXin Li                "  label:\n"
308*67e74705SXin Li                "    f();\n"
309*67e74705SXin Li                "}",
310*67e74705SXin Li                AllowsMergedIf);
311*67e74705SXin Li   verifyFormat("#define A \\\n"
312*67e74705SXin Li                "  if (a)  \\\n"
313*67e74705SXin Li                "  label:  \\\n"
314*67e74705SXin Li                "    f()",
315*67e74705SXin Li                AllowsMergedIf);
316*67e74705SXin Li   verifyFormat("if (a)\n"
317*67e74705SXin Li                "  ;",
318*67e74705SXin Li                AllowsMergedIf);
319*67e74705SXin Li   verifyFormat("if (a)\n"
320*67e74705SXin Li                "  if (b) return;",
321*67e74705SXin Li                AllowsMergedIf);
322*67e74705SXin Li 
323*67e74705SXin Li   verifyFormat("if (a) // Can't merge this\n"
324*67e74705SXin Li                "  f();\n",
325*67e74705SXin Li                AllowsMergedIf);
326*67e74705SXin Li   verifyFormat("if (a) /* still don't merge */\n"
327*67e74705SXin Li                "  f();",
328*67e74705SXin Li                AllowsMergedIf);
329*67e74705SXin Li   verifyFormat("if (a) { // Never merge this\n"
330*67e74705SXin Li                "  f();\n"
331*67e74705SXin Li                "}",
332*67e74705SXin Li                AllowsMergedIf);
333*67e74705SXin Li   verifyFormat("if (a) { /* Never merge this */\n"
334*67e74705SXin Li                "  f();\n"
335*67e74705SXin Li                "}",
336*67e74705SXin Li                AllowsMergedIf);
337*67e74705SXin Li 
338*67e74705SXin Li   AllowsMergedIf.ColumnLimit = 14;
339*67e74705SXin Li   verifyFormat("if (a) return;", AllowsMergedIf);
340*67e74705SXin Li   verifyFormat("if (aaaaaaaaa)\n"
341*67e74705SXin Li                "  return;",
342*67e74705SXin Li                AllowsMergedIf);
343*67e74705SXin Li 
344*67e74705SXin Li   AllowsMergedIf.ColumnLimit = 13;
345*67e74705SXin Li   verifyFormat("if (a)\n  return;", AllowsMergedIf);
346*67e74705SXin Li }
347*67e74705SXin Li 
TEST_F(FormatTest,FormatLoopsWithoutCompoundStatement)348*67e74705SXin Li TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
349*67e74705SXin Li   FormatStyle AllowsMergedLoops = getLLVMStyle();
350*67e74705SXin Li   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
351*67e74705SXin Li   verifyFormat("while (true) continue;", AllowsMergedLoops);
352*67e74705SXin Li   verifyFormat("for (;;) continue;", AllowsMergedLoops);
353*67e74705SXin Li   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
354*67e74705SXin Li   verifyFormat("while (true)\n"
355*67e74705SXin Li                "  ;",
356*67e74705SXin Li                AllowsMergedLoops);
357*67e74705SXin Li   verifyFormat("for (;;)\n"
358*67e74705SXin Li                "  ;",
359*67e74705SXin Li                AllowsMergedLoops);
360*67e74705SXin Li   verifyFormat("for (;;)\n"
361*67e74705SXin Li                "  for (;;) continue;",
362*67e74705SXin Li                AllowsMergedLoops);
363*67e74705SXin Li   verifyFormat("for (;;) // Can't merge this\n"
364*67e74705SXin Li                "  continue;",
365*67e74705SXin Li                AllowsMergedLoops);
366*67e74705SXin Li   verifyFormat("for (;;) /* still don't merge */\n"
367*67e74705SXin Li                "  continue;",
368*67e74705SXin Li                AllowsMergedLoops);
369*67e74705SXin Li }
370*67e74705SXin Li 
TEST_F(FormatTest,FormatShortBracedStatements)371*67e74705SXin Li TEST_F(FormatTest, FormatShortBracedStatements) {
372*67e74705SXin Li   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
373*67e74705SXin Li   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
374*67e74705SXin Li 
375*67e74705SXin Li   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
376*67e74705SXin Li   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
377*67e74705SXin Li 
378*67e74705SXin Li   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
379*67e74705SXin Li   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
380*67e74705SXin Li   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
381*67e74705SXin Li   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
382*67e74705SXin Li   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
383*67e74705SXin Li   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
384*67e74705SXin Li   verifyFormat("if (true) { //\n"
385*67e74705SXin Li                "  f();\n"
386*67e74705SXin Li                "}",
387*67e74705SXin Li                AllowSimpleBracedStatements);
388*67e74705SXin Li   verifyFormat("if (true) {\n"
389*67e74705SXin Li                "  f();\n"
390*67e74705SXin Li                "  f();\n"
391*67e74705SXin Li                "}",
392*67e74705SXin Li                AllowSimpleBracedStatements);
393*67e74705SXin Li   verifyFormat("if (true) {\n"
394*67e74705SXin Li                "  f();\n"
395*67e74705SXin Li                "} else {\n"
396*67e74705SXin Li                "  f();\n"
397*67e74705SXin Li                "}",
398*67e74705SXin Li                AllowSimpleBracedStatements);
399*67e74705SXin Li 
400*67e74705SXin Li   verifyFormat("template <int> struct A2 {\n"
401*67e74705SXin Li                "  struct B {};\n"
402*67e74705SXin Li                "};",
403*67e74705SXin Li                AllowSimpleBracedStatements);
404*67e74705SXin Li 
405*67e74705SXin Li   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
406*67e74705SXin Li   verifyFormat("if (true) {\n"
407*67e74705SXin Li                "  f();\n"
408*67e74705SXin Li                "}",
409*67e74705SXin Li                AllowSimpleBracedStatements);
410*67e74705SXin Li   verifyFormat("if (true) {\n"
411*67e74705SXin Li                "  f();\n"
412*67e74705SXin Li                "} else {\n"
413*67e74705SXin Li                "  f();\n"
414*67e74705SXin Li                "}",
415*67e74705SXin Li                AllowSimpleBracedStatements);
416*67e74705SXin Li 
417*67e74705SXin Li   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
418*67e74705SXin Li   verifyFormat("while (true) {\n"
419*67e74705SXin Li                "  f();\n"
420*67e74705SXin Li                "}",
421*67e74705SXin Li                AllowSimpleBracedStatements);
422*67e74705SXin Li   verifyFormat("for (;;) {\n"
423*67e74705SXin Li                "  f();\n"
424*67e74705SXin Li                "}",
425*67e74705SXin Li                AllowSimpleBracedStatements);
426*67e74705SXin Li }
427*67e74705SXin Li 
TEST_F(FormatTest,ParseIfElse)428*67e74705SXin Li TEST_F(FormatTest, ParseIfElse) {
429*67e74705SXin Li   verifyFormat("if (true)\n"
430*67e74705SXin Li                "  if (true)\n"
431*67e74705SXin Li                "    if (true)\n"
432*67e74705SXin Li                "      f();\n"
433*67e74705SXin Li                "    else\n"
434*67e74705SXin Li                "      g();\n"
435*67e74705SXin Li                "  else\n"
436*67e74705SXin Li                "    h();\n"
437*67e74705SXin Li                "else\n"
438*67e74705SXin Li                "  i();");
439*67e74705SXin Li   verifyFormat("if (true)\n"
440*67e74705SXin Li                "  if (true)\n"
441*67e74705SXin Li                "    if (true) {\n"
442*67e74705SXin Li                "      if (true)\n"
443*67e74705SXin Li                "        f();\n"
444*67e74705SXin Li                "    } else {\n"
445*67e74705SXin Li                "      g();\n"
446*67e74705SXin Li                "    }\n"
447*67e74705SXin Li                "  else\n"
448*67e74705SXin Li                "    h();\n"
449*67e74705SXin Li                "else {\n"
450*67e74705SXin Li                "  i();\n"
451*67e74705SXin Li                "}");
452*67e74705SXin Li   verifyFormat("void f() {\n"
453*67e74705SXin Li                "  if (a) {\n"
454*67e74705SXin Li                "  } else {\n"
455*67e74705SXin Li                "  }\n"
456*67e74705SXin Li                "}");
457*67e74705SXin Li }
458*67e74705SXin Li 
TEST_F(FormatTest,ElseIf)459*67e74705SXin Li TEST_F(FormatTest, ElseIf) {
460*67e74705SXin Li   verifyFormat("if (a) {\n} else if (b) {\n}");
461*67e74705SXin Li   verifyFormat("if (a)\n"
462*67e74705SXin Li                "  f();\n"
463*67e74705SXin Li                "else if (b)\n"
464*67e74705SXin Li                "  g();\n"
465*67e74705SXin Li                "else\n"
466*67e74705SXin Li                "  h();");
467*67e74705SXin Li   verifyFormat("if (a) {\n"
468*67e74705SXin Li                "  f();\n"
469*67e74705SXin Li                "}\n"
470*67e74705SXin Li                "// or else ..\n"
471*67e74705SXin Li                "else {\n"
472*67e74705SXin Li                "  g()\n"
473*67e74705SXin Li                "}");
474*67e74705SXin Li 
475*67e74705SXin Li   verifyFormat("if (a) {\n"
476*67e74705SXin Li                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
477*67e74705SXin Li                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
478*67e74705SXin Li                "}");
479*67e74705SXin Li   verifyFormat("if (a) {\n"
480*67e74705SXin Li                "} else if (\n"
481*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
482*67e74705SXin Li                "}",
483*67e74705SXin Li                getLLVMStyleWithColumns(62));
484*67e74705SXin Li }
485*67e74705SXin Li 
TEST_F(FormatTest,FormatsForLoop)486*67e74705SXin Li TEST_F(FormatTest, FormatsForLoop) {
487*67e74705SXin Li   verifyFormat(
488*67e74705SXin Li       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
489*67e74705SXin Li       "     ++VeryVeryLongLoopVariable)\n"
490*67e74705SXin Li       "  ;");
491*67e74705SXin Li   verifyFormat("for (;;)\n"
492*67e74705SXin Li                "  f();");
493*67e74705SXin Li   verifyFormat("for (;;) {\n}");
494*67e74705SXin Li   verifyFormat("for (;;) {\n"
495*67e74705SXin Li                "  f();\n"
496*67e74705SXin Li                "}");
497*67e74705SXin Li   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
498*67e74705SXin Li 
499*67e74705SXin Li   verifyFormat(
500*67e74705SXin Li       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
501*67e74705SXin Li       "                                          E = UnwrappedLines.end();\n"
502*67e74705SXin Li       "     I != E; ++I) {\n}");
503*67e74705SXin Li 
504*67e74705SXin Li   verifyFormat(
505*67e74705SXin Li       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
506*67e74705SXin Li       "     ++IIIII) {\n}");
507*67e74705SXin Li   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
508*67e74705SXin Li                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
509*67e74705SXin Li                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
510*67e74705SXin Li   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
511*67e74705SXin Li                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
512*67e74705SXin Li                "         E = FD->getDeclsInPrototypeScope().end();\n"
513*67e74705SXin Li                "     I != E; ++I) {\n}");
514*67e74705SXin Li   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
515*67e74705SXin Li                "         I = Container.begin(),\n"
516*67e74705SXin Li                "         E = Container.end();\n"
517*67e74705SXin Li                "     I != E; ++I) {\n}",
518*67e74705SXin Li                getLLVMStyleWithColumns(76));
519*67e74705SXin Li 
520*67e74705SXin Li   verifyFormat(
521*67e74705SXin Li       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
522*67e74705SXin Li       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
523*67e74705SXin Li       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
524*67e74705SXin Li       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
525*67e74705SXin Li       "     ++aaaaaaaaaaa) {\n}");
526*67e74705SXin Li   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
527*67e74705SXin Li                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
528*67e74705SXin Li                "     ++i) {\n}");
529*67e74705SXin Li   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
530*67e74705SXin Li                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
531*67e74705SXin Li                "}");
532*67e74705SXin Li   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
533*67e74705SXin Li                "         aaaaaaaaaa);\n"
534*67e74705SXin Li                "     iter; ++iter) {\n"
535*67e74705SXin Li                "}");
536*67e74705SXin Li   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
537*67e74705SXin Li                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
538*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
539*67e74705SXin Li                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
540*67e74705SXin Li 
541*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
542*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
543*67e74705SXin Li   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
544*67e74705SXin Li                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
545*67e74705SXin Li                "                                           aaaaaaaaaaaaaaaa,\n"
546*67e74705SXin Li                "                                           aaaaaaaaaaaaaaaa,\n"
547*67e74705SXin Li                "                                           aaaaaaaaaaaaaaaa);\n"
548*67e74705SXin Li                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
549*67e74705SXin Li                "}",
550*67e74705SXin Li                NoBinPacking);
551*67e74705SXin Li   verifyFormat(
552*67e74705SXin Li       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
553*67e74705SXin Li       "                                          E = UnwrappedLines.end();\n"
554*67e74705SXin Li       "     I != E;\n"
555*67e74705SXin Li       "     ++I) {\n}",
556*67e74705SXin Li       NoBinPacking);
557*67e74705SXin Li }
558*67e74705SXin Li 
TEST_F(FormatTest,RangeBasedForLoops)559*67e74705SXin Li TEST_F(FormatTest, RangeBasedForLoops) {
560*67e74705SXin Li   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
561*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
562*67e74705SXin Li   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
563*67e74705SXin Li                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
564*67e74705SXin Li   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
565*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
566*67e74705SXin Li   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
567*67e74705SXin Li                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
568*67e74705SXin Li }
569*67e74705SXin Li 
TEST_F(FormatTest,ForEachLoops)570*67e74705SXin Li TEST_F(FormatTest, ForEachLoops) {
571*67e74705SXin Li   verifyFormat("void f() {\n"
572*67e74705SXin Li                "  foreach (Item *item, itemlist) {}\n"
573*67e74705SXin Li                "  Q_FOREACH (Item *item, itemlist) {}\n"
574*67e74705SXin Li                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
575*67e74705SXin Li                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
576*67e74705SXin Li                "}");
577*67e74705SXin Li 
578*67e74705SXin Li   // As function-like macros.
579*67e74705SXin Li   verifyFormat("#define foreach(x, y)\n"
580*67e74705SXin Li                "#define Q_FOREACH(x, y)\n"
581*67e74705SXin Li                "#define BOOST_FOREACH(x, y)\n"
582*67e74705SXin Li                "#define UNKNOWN_FOREACH(x, y)\n");
583*67e74705SXin Li 
584*67e74705SXin Li   // Not as function-like macros.
585*67e74705SXin Li   verifyFormat("#define foreach (x, y)\n"
586*67e74705SXin Li                "#define Q_FOREACH (x, y)\n"
587*67e74705SXin Li                "#define BOOST_FOREACH (x, y)\n"
588*67e74705SXin Li                "#define UNKNOWN_FOREACH (x, y)\n");
589*67e74705SXin Li }
590*67e74705SXin Li 
TEST_F(FormatTest,FormatsWhileLoop)591*67e74705SXin Li TEST_F(FormatTest, FormatsWhileLoop) {
592*67e74705SXin Li   verifyFormat("while (true) {\n}");
593*67e74705SXin Li   verifyFormat("while (true)\n"
594*67e74705SXin Li                "  f();");
595*67e74705SXin Li   verifyFormat("while () {\n}");
596*67e74705SXin Li   verifyFormat("while () {\n"
597*67e74705SXin Li                "  f();\n"
598*67e74705SXin Li                "}");
599*67e74705SXin Li }
600*67e74705SXin Li 
TEST_F(FormatTest,FormatsDoWhile)601*67e74705SXin Li TEST_F(FormatTest, FormatsDoWhile) {
602*67e74705SXin Li   verifyFormat("do {\n"
603*67e74705SXin Li                "  do_something();\n"
604*67e74705SXin Li                "} while (something());");
605*67e74705SXin Li   verifyFormat("do\n"
606*67e74705SXin Li                "  do_something();\n"
607*67e74705SXin Li                "while (something());");
608*67e74705SXin Li }
609*67e74705SXin Li 
TEST_F(FormatTest,FormatsSwitchStatement)610*67e74705SXin Li TEST_F(FormatTest, FormatsSwitchStatement) {
611*67e74705SXin Li   verifyFormat("switch (x) {\n"
612*67e74705SXin Li                "case 1:\n"
613*67e74705SXin Li                "  f();\n"
614*67e74705SXin Li                "  break;\n"
615*67e74705SXin Li                "case kFoo:\n"
616*67e74705SXin Li                "case ns::kBar:\n"
617*67e74705SXin Li                "case kBaz:\n"
618*67e74705SXin Li                "  break;\n"
619*67e74705SXin Li                "default:\n"
620*67e74705SXin Li                "  g();\n"
621*67e74705SXin Li                "  break;\n"
622*67e74705SXin Li                "}");
623*67e74705SXin Li   verifyFormat("switch (x) {\n"
624*67e74705SXin Li                "case 1: {\n"
625*67e74705SXin Li                "  f();\n"
626*67e74705SXin Li                "  break;\n"
627*67e74705SXin Li                "}\n"
628*67e74705SXin Li                "case 2: {\n"
629*67e74705SXin Li                "  break;\n"
630*67e74705SXin Li                "}\n"
631*67e74705SXin Li                "}");
632*67e74705SXin Li   verifyFormat("switch (x) {\n"
633*67e74705SXin Li                "case 1: {\n"
634*67e74705SXin Li                "  f();\n"
635*67e74705SXin Li                "  {\n"
636*67e74705SXin Li                "    g();\n"
637*67e74705SXin Li                "    h();\n"
638*67e74705SXin Li                "  }\n"
639*67e74705SXin Li                "  break;\n"
640*67e74705SXin Li                "}\n"
641*67e74705SXin Li                "}");
642*67e74705SXin Li   verifyFormat("switch (x) {\n"
643*67e74705SXin Li                "case 1: {\n"
644*67e74705SXin Li                "  f();\n"
645*67e74705SXin Li                "  if (foo) {\n"
646*67e74705SXin Li                "    g();\n"
647*67e74705SXin Li                "    h();\n"
648*67e74705SXin Li                "  }\n"
649*67e74705SXin Li                "  break;\n"
650*67e74705SXin Li                "}\n"
651*67e74705SXin Li                "}");
652*67e74705SXin Li   verifyFormat("switch (x) {\n"
653*67e74705SXin Li                "case 1: {\n"
654*67e74705SXin Li                "  f();\n"
655*67e74705SXin Li                "  g();\n"
656*67e74705SXin Li                "} break;\n"
657*67e74705SXin Li                "}");
658*67e74705SXin Li   verifyFormat("switch (test)\n"
659*67e74705SXin Li                "  ;");
660*67e74705SXin Li   verifyFormat("switch (x) {\n"
661*67e74705SXin Li                "default: {\n"
662*67e74705SXin Li                "  // Do nothing.\n"
663*67e74705SXin Li                "}\n"
664*67e74705SXin Li                "}");
665*67e74705SXin Li   verifyFormat("switch (x) {\n"
666*67e74705SXin Li                "// comment\n"
667*67e74705SXin Li                "// if 1, do f()\n"
668*67e74705SXin Li                "case 1:\n"
669*67e74705SXin Li                "  f();\n"
670*67e74705SXin Li                "}");
671*67e74705SXin Li   verifyFormat("switch (x) {\n"
672*67e74705SXin Li                "case 1:\n"
673*67e74705SXin Li                "  // Do amazing stuff\n"
674*67e74705SXin Li                "  {\n"
675*67e74705SXin Li                "    f();\n"
676*67e74705SXin Li                "    g();\n"
677*67e74705SXin Li                "  }\n"
678*67e74705SXin Li                "  break;\n"
679*67e74705SXin Li                "}");
680*67e74705SXin Li   verifyFormat("#define A          \\\n"
681*67e74705SXin Li                "  switch (x) {     \\\n"
682*67e74705SXin Li                "  case a:          \\\n"
683*67e74705SXin Li                "    foo = b;       \\\n"
684*67e74705SXin Li                "  }",
685*67e74705SXin Li                getLLVMStyleWithColumns(20));
686*67e74705SXin Li   verifyFormat("#define OPERATION_CASE(name)           \\\n"
687*67e74705SXin Li                "  case OP_name:                        \\\n"
688*67e74705SXin Li                "    return operations::Operation##name\n",
689*67e74705SXin Li                getLLVMStyleWithColumns(40));
690*67e74705SXin Li   verifyFormat("switch (x) {\n"
691*67e74705SXin Li                "case 1:;\n"
692*67e74705SXin Li                "default:;\n"
693*67e74705SXin Li                "  int i;\n"
694*67e74705SXin Li                "}");
695*67e74705SXin Li 
696*67e74705SXin Li   verifyGoogleFormat("switch (x) {\n"
697*67e74705SXin Li                      "  case 1:\n"
698*67e74705SXin Li                      "    f();\n"
699*67e74705SXin Li                      "    break;\n"
700*67e74705SXin Li                      "  case kFoo:\n"
701*67e74705SXin Li                      "  case ns::kBar:\n"
702*67e74705SXin Li                      "  case kBaz:\n"
703*67e74705SXin Li                      "    break;\n"
704*67e74705SXin Li                      "  default:\n"
705*67e74705SXin Li                      "    g();\n"
706*67e74705SXin Li                      "    break;\n"
707*67e74705SXin Li                      "}");
708*67e74705SXin Li   verifyGoogleFormat("switch (x) {\n"
709*67e74705SXin Li                      "  case 1: {\n"
710*67e74705SXin Li                      "    f();\n"
711*67e74705SXin Li                      "    break;\n"
712*67e74705SXin Li                      "  }\n"
713*67e74705SXin Li                      "}");
714*67e74705SXin Li   verifyGoogleFormat("switch (test)\n"
715*67e74705SXin Li                      "  ;");
716*67e74705SXin Li 
717*67e74705SXin Li   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
718*67e74705SXin Li                      "  case OP_name:              \\\n"
719*67e74705SXin Li                      "    return operations::Operation##name\n");
720*67e74705SXin Li   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
721*67e74705SXin Li                      "  // Get the correction operation class.\n"
722*67e74705SXin Li                      "  switch (OpCode) {\n"
723*67e74705SXin Li                      "    CASE(Add);\n"
724*67e74705SXin Li                      "    CASE(Subtract);\n"
725*67e74705SXin Li                      "    default:\n"
726*67e74705SXin Li                      "      return operations::Unknown;\n"
727*67e74705SXin Li                      "  }\n"
728*67e74705SXin Li                      "#undef OPERATION_CASE\n"
729*67e74705SXin Li                      "}");
730*67e74705SXin Li   verifyFormat("DEBUG({\n"
731*67e74705SXin Li                "  switch (x) {\n"
732*67e74705SXin Li                "  case A:\n"
733*67e74705SXin Li                "    f();\n"
734*67e74705SXin Li                "    break;\n"
735*67e74705SXin Li                "  // On B:\n"
736*67e74705SXin Li                "  case B:\n"
737*67e74705SXin Li                "    g();\n"
738*67e74705SXin Li                "    break;\n"
739*67e74705SXin Li                "  }\n"
740*67e74705SXin Li                "});");
741*67e74705SXin Li   verifyFormat("switch (a) {\n"
742*67e74705SXin Li                "case (b):\n"
743*67e74705SXin Li                "  return;\n"
744*67e74705SXin Li                "}");
745*67e74705SXin Li 
746*67e74705SXin Li   verifyFormat("switch (a) {\n"
747*67e74705SXin Li                "case some_namespace::\n"
748*67e74705SXin Li                "    some_constant:\n"
749*67e74705SXin Li                "  return;\n"
750*67e74705SXin Li                "}",
751*67e74705SXin Li                getLLVMStyleWithColumns(34));
752*67e74705SXin Li }
753*67e74705SXin Li 
TEST_F(FormatTest,CaseRanges)754*67e74705SXin Li TEST_F(FormatTest, CaseRanges) {
755*67e74705SXin Li   verifyFormat("switch (x) {\n"
756*67e74705SXin Li                "case 'A' ... 'Z':\n"
757*67e74705SXin Li                "case 1 ... 5:\n"
758*67e74705SXin Li                "case a ... b:\n"
759*67e74705SXin Li                "  break;\n"
760*67e74705SXin Li                "}");
761*67e74705SXin Li }
762*67e74705SXin Li 
TEST_F(FormatTest,ShortCaseLabels)763*67e74705SXin Li TEST_F(FormatTest, ShortCaseLabels) {
764*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
765*67e74705SXin Li   Style.AllowShortCaseLabelsOnASingleLine = true;
766*67e74705SXin Li   verifyFormat("switch (a) {\n"
767*67e74705SXin Li                "case 1: x = 1; break;\n"
768*67e74705SXin Li                "case 2: return;\n"
769*67e74705SXin Li                "case 3:\n"
770*67e74705SXin Li                "case 4:\n"
771*67e74705SXin Li                "case 5: return;\n"
772*67e74705SXin Li                "case 6: // comment\n"
773*67e74705SXin Li                "  return;\n"
774*67e74705SXin Li                "case 7:\n"
775*67e74705SXin Li                "  // comment\n"
776*67e74705SXin Li                "  return;\n"
777*67e74705SXin Li                "case 8:\n"
778*67e74705SXin Li                "  x = 8; // comment\n"
779*67e74705SXin Li                "  break;\n"
780*67e74705SXin Li                "default: y = 1; break;\n"
781*67e74705SXin Li                "}",
782*67e74705SXin Li                Style);
783*67e74705SXin Li   verifyFormat("switch (a) {\n"
784*67e74705SXin Li                "#if FOO\n"
785*67e74705SXin Li                "case 0: return 0;\n"
786*67e74705SXin Li                "#endif\n"
787*67e74705SXin Li                "}",
788*67e74705SXin Li                Style);
789*67e74705SXin Li   verifyFormat("switch (a) {\n"
790*67e74705SXin Li                "case 1: {\n"
791*67e74705SXin Li                "}\n"
792*67e74705SXin Li                "case 2: {\n"
793*67e74705SXin Li                "  return;\n"
794*67e74705SXin Li                "}\n"
795*67e74705SXin Li                "case 3: {\n"
796*67e74705SXin Li                "  x = 1;\n"
797*67e74705SXin Li                "  return;\n"
798*67e74705SXin Li                "}\n"
799*67e74705SXin Li                "case 4:\n"
800*67e74705SXin Li                "  if (x)\n"
801*67e74705SXin Li                "    return;\n"
802*67e74705SXin Li                "}",
803*67e74705SXin Li                Style);
804*67e74705SXin Li   Style.ColumnLimit = 21;
805*67e74705SXin Li   verifyFormat("switch (a) {\n"
806*67e74705SXin Li                "case 1: x = 1; break;\n"
807*67e74705SXin Li                "case 2: return;\n"
808*67e74705SXin Li                "case 3:\n"
809*67e74705SXin Li                "case 4:\n"
810*67e74705SXin Li                "case 5: return;\n"
811*67e74705SXin Li                "default:\n"
812*67e74705SXin Li                "  y = 1;\n"
813*67e74705SXin Li                "  break;\n"
814*67e74705SXin Li                "}",
815*67e74705SXin Li                Style);
816*67e74705SXin Li }
817*67e74705SXin Li 
TEST_F(FormatTest,FormatsLabels)818*67e74705SXin Li TEST_F(FormatTest, FormatsLabels) {
819*67e74705SXin Li   verifyFormat("void f() {\n"
820*67e74705SXin Li                "  some_code();\n"
821*67e74705SXin Li                "test_label:\n"
822*67e74705SXin Li                "  some_other_code();\n"
823*67e74705SXin Li                "  {\n"
824*67e74705SXin Li                "    some_more_code();\n"
825*67e74705SXin Li                "  another_label:\n"
826*67e74705SXin Li                "    some_more_code();\n"
827*67e74705SXin Li                "  }\n"
828*67e74705SXin Li                "}");
829*67e74705SXin Li   verifyFormat("{\n"
830*67e74705SXin Li                "  some_code();\n"
831*67e74705SXin Li                "test_label:\n"
832*67e74705SXin Li                "  some_other_code();\n"
833*67e74705SXin Li                "}");
834*67e74705SXin Li   verifyFormat("{\n"
835*67e74705SXin Li                "  some_code();\n"
836*67e74705SXin Li                "test_label:;\n"
837*67e74705SXin Li                "  int i = 0;\n"
838*67e74705SXin Li                "}");
839*67e74705SXin Li }
840*67e74705SXin Li 
841*67e74705SXin Li //===----------------------------------------------------------------------===//
842*67e74705SXin Li // Tests for comments.
843*67e74705SXin Li //===----------------------------------------------------------------------===//
844*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsSingleLineComments)845*67e74705SXin Li TEST_F(FormatTest, UnderstandsSingleLineComments) {
846*67e74705SXin Li   verifyFormat("//* */");
847*67e74705SXin Li   verifyFormat("// line 1\n"
848*67e74705SXin Li                "// line 2\n"
849*67e74705SXin Li                "void f() {}\n");
850*67e74705SXin Li 
851*67e74705SXin Li   verifyFormat("void f() {\n"
852*67e74705SXin Li                "  // Doesn't do anything\n"
853*67e74705SXin Li                "}");
854*67e74705SXin Li   verifyFormat("SomeObject\n"
855*67e74705SXin Li                "    // Calling someFunction on SomeObject\n"
856*67e74705SXin Li                "    .someFunction();");
857*67e74705SXin Li   verifyFormat("auto result = SomeObject\n"
858*67e74705SXin Li                "                  // Calling someFunction on SomeObject\n"
859*67e74705SXin Li                "                  .someFunction();");
860*67e74705SXin Li   verifyFormat("void f(int i,  // some comment (probably for i)\n"
861*67e74705SXin Li                "       int j,  // some comment (probably for j)\n"
862*67e74705SXin Li                "       int k); // some comment (probably for k)");
863*67e74705SXin Li   verifyFormat("void f(int i,\n"
864*67e74705SXin Li                "       // some comment (probably for j)\n"
865*67e74705SXin Li                "       int j,\n"
866*67e74705SXin Li                "       // some comment (probably for k)\n"
867*67e74705SXin Li                "       int k);");
868*67e74705SXin Li 
869*67e74705SXin Li   verifyFormat("int i    // This is a fancy variable\n"
870*67e74705SXin Li                "    = 5; // with nicely aligned comment.");
871*67e74705SXin Li 
872*67e74705SXin Li   verifyFormat("// Leading comment.\n"
873*67e74705SXin Li                "int a; // Trailing comment.");
874*67e74705SXin Li   verifyFormat("int a; // Trailing comment\n"
875*67e74705SXin Li                "       // on 2\n"
876*67e74705SXin Li                "       // or 3 lines.\n"
877*67e74705SXin Li                "int b;");
878*67e74705SXin Li   verifyFormat("int a; // Trailing comment\n"
879*67e74705SXin Li                "\n"
880*67e74705SXin Li                "// Leading comment.\n"
881*67e74705SXin Li                "int b;");
882*67e74705SXin Li   verifyFormat("int a;    // Comment.\n"
883*67e74705SXin Li                "          // More details.\n"
884*67e74705SXin Li                "int bbbb; // Another comment.");
885*67e74705SXin Li   verifyFormat(
886*67e74705SXin Li       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
887*67e74705SXin Li       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   // comment\n"
888*67e74705SXin Li       "int cccccccccccccccccccccccccccccc;       // comment\n"
889*67e74705SXin Li       "int ddd;                     // looooooooooooooooooooooooong comment\n"
890*67e74705SXin Li       "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
891*67e74705SXin Li       "int bbbbbbbbbbbbbbbbbbbbb;   // comment\n"
892*67e74705SXin Li       "int ccccccccccccccccccc;     // comment");
893*67e74705SXin Li 
894*67e74705SXin Li   verifyFormat("#include \"a\"     // comment\n"
895*67e74705SXin Li                "#include \"a/b/c\" // comment");
896*67e74705SXin Li   verifyFormat("#include <a>     // comment\n"
897*67e74705SXin Li                "#include <a/b/c> // comment");
898*67e74705SXin Li   EXPECT_EQ("#include \"a\"     // comment\n"
899*67e74705SXin Li             "#include \"a/b/c\" // comment",
900*67e74705SXin Li             format("#include \\\n"
901*67e74705SXin Li                    "  \"a\" // comment\n"
902*67e74705SXin Li                    "#include \"a/b/c\" // comment"));
903*67e74705SXin Li 
904*67e74705SXin Li   verifyFormat("enum E {\n"
905*67e74705SXin Li                "  // comment\n"
906*67e74705SXin Li                "  VAL_A, // comment\n"
907*67e74705SXin Li                "  VAL_B\n"
908*67e74705SXin Li                "};");
909*67e74705SXin Li 
910*67e74705SXin Li   verifyFormat(
911*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
912*67e74705SXin Li       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
913*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
914*67e74705SXin Li                "    // Comment inside a statement.\n"
915*67e74705SXin Li                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
916*67e74705SXin Li   verifyFormat("SomeFunction(a,\n"
917*67e74705SXin Li                "             // comment\n"
918*67e74705SXin Li                "             b + x);");
919*67e74705SXin Li   verifyFormat("SomeFunction(a, a,\n"
920*67e74705SXin Li                "             // comment\n"
921*67e74705SXin Li                "             b + x);");
922*67e74705SXin Li   verifyFormat(
923*67e74705SXin Li       "bool aaaaaaaaaaaaa = // comment\n"
924*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
925*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
926*67e74705SXin Li 
927*67e74705SXin Li   verifyFormat("int aaaa; // aaaaa\n"
928*67e74705SXin Li                "int aa;   // aaaaaaa",
929*67e74705SXin Li                getLLVMStyleWithColumns(20));
930*67e74705SXin Li 
931*67e74705SXin Li   EXPECT_EQ("void f() { // This does something ..\n"
932*67e74705SXin Li             "}\n"
933*67e74705SXin Li             "int a; // This is unrelated",
934*67e74705SXin Li             format("void f()    {     // This does something ..\n"
935*67e74705SXin Li                    "  }\n"
936*67e74705SXin Li                    "int   a;     // This is unrelated"));
937*67e74705SXin Li   EXPECT_EQ("class C {\n"
938*67e74705SXin Li             "  void f() { // This does something ..\n"
939*67e74705SXin Li             "  }          // awesome..\n"
940*67e74705SXin Li             "\n"
941*67e74705SXin Li             "  int a; // This is unrelated\n"
942*67e74705SXin Li             "};",
943*67e74705SXin Li             format("class C{void f()    { // This does something ..\n"
944*67e74705SXin Li                    "      } // awesome..\n"
945*67e74705SXin Li                    " \n"
946*67e74705SXin Li                    "int a;    // This is unrelated\n"
947*67e74705SXin Li                    "};"));
948*67e74705SXin Li 
949*67e74705SXin Li   EXPECT_EQ("int i; // single line trailing comment",
950*67e74705SXin Li             format("int i;\\\n// single line trailing comment"));
951*67e74705SXin Li 
952*67e74705SXin Li   verifyGoogleFormat("int a;  // Trailing comment.");
953*67e74705SXin Li 
954*67e74705SXin Li   verifyFormat("someFunction(anotherFunction( // Force break.\n"
955*67e74705SXin Li                "    parameter));");
956*67e74705SXin Li 
957*67e74705SXin Li   verifyGoogleFormat("#endif  // HEADER_GUARD");
958*67e74705SXin Li 
959*67e74705SXin Li   verifyFormat("const char *test[] = {\n"
960*67e74705SXin Li                "    // A\n"
961*67e74705SXin Li                "    \"aaaa\",\n"
962*67e74705SXin Li                "    // B\n"
963*67e74705SXin Li                "    \"aaaaa\"};");
964*67e74705SXin Li   verifyGoogleFormat(
965*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
966*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaa);  // 81_cols_with_this_comment");
967*67e74705SXin Li   EXPECT_EQ("D(a, {\n"
968*67e74705SXin Li             "  // test\n"
969*67e74705SXin Li             "  int a;\n"
970*67e74705SXin Li             "});",
971*67e74705SXin Li             format("D(a, {\n"
972*67e74705SXin Li                    "// test\n"
973*67e74705SXin Li                    "int a;\n"
974*67e74705SXin Li                    "});"));
975*67e74705SXin Li 
976*67e74705SXin Li   EXPECT_EQ("lineWith(); // comment\n"
977*67e74705SXin Li             "// at start\n"
978*67e74705SXin Li             "otherLine();",
979*67e74705SXin Li             format("lineWith();   // comment\n"
980*67e74705SXin Li                    "// at start\n"
981*67e74705SXin Li                    "otherLine();"));
982*67e74705SXin Li   EXPECT_EQ("lineWith(); // comment\n"
983*67e74705SXin Li             "/*\n"
984*67e74705SXin Li             " * at start */\n"
985*67e74705SXin Li             "otherLine();",
986*67e74705SXin Li             format("lineWith();   // comment\n"
987*67e74705SXin Li                    "/*\n"
988*67e74705SXin Li                    " * at start */\n"
989*67e74705SXin Li                    "otherLine();"));
990*67e74705SXin Li   EXPECT_EQ("lineWith(); // comment\n"
991*67e74705SXin Li             "            // at start\n"
992*67e74705SXin Li             "otherLine();",
993*67e74705SXin Li             format("lineWith();   // comment\n"
994*67e74705SXin Li                    " // at start\n"
995*67e74705SXin Li                    "otherLine();"));
996*67e74705SXin Li 
997*67e74705SXin Li   EXPECT_EQ("lineWith(); // comment\n"
998*67e74705SXin Li             "// at start\n"
999*67e74705SXin Li             "otherLine(); // comment",
1000*67e74705SXin Li             format("lineWith();   // comment\n"
1001*67e74705SXin Li                    "// at start\n"
1002*67e74705SXin Li                    "otherLine();   // comment"));
1003*67e74705SXin Li   EXPECT_EQ("lineWith();\n"
1004*67e74705SXin Li             "// at start\n"
1005*67e74705SXin Li             "otherLine(); // comment",
1006*67e74705SXin Li             format("lineWith();\n"
1007*67e74705SXin Li                    " // at start\n"
1008*67e74705SXin Li                    "otherLine();   // comment"));
1009*67e74705SXin Li   EXPECT_EQ("// first\n"
1010*67e74705SXin Li             "// at start\n"
1011*67e74705SXin Li             "otherLine(); // comment",
1012*67e74705SXin Li             format("// first\n"
1013*67e74705SXin Li                    " // at start\n"
1014*67e74705SXin Li                    "otherLine();   // comment"));
1015*67e74705SXin Li   EXPECT_EQ("f();\n"
1016*67e74705SXin Li             "// first\n"
1017*67e74705SXin Li             "// at start\n"
1018*67e74705SXin Li             "otherLine(); // comment",
1019*67e74705SXin Li             format("f();\n"
1020*67e74705SXin Li                    "// first\n"
1021*67e74705SXin Li                    " // at start\n"
1022*67e74705SXin Li                    "otherLine();   // comment"));
1023*67e74705SXin Li   verifyFormat("f(); // comment\n"
1024*67e74705SXin Li                "// first\n"
1025*67e74705SXin Li                "// at start\n"
1026*67e74705SXin Li                "otherLine();");
1027*67e74705SXin Li   EXPECT_EQ("f(); // comment\n"
1028*67e74705SXin Li             "// first\n"
1029*67e74705SXin Li             "// at start\n"
1030*67e74705SXin Li             "otherLine();",
1031*67e74705SXin Li             format("f();   // comment\n"
1032*67e74705SXin Li                    "// first\n"
1033*67e74705SXin Li                    " // at start\n"
1034*67e74705SXin Li                    "otherLine();"));
1035*67e74705SXin Li   EXPECT_EQ("f(); // comment\n"
1036*67e74705SXin Li             "     // first\n"
1037*67e74705SXin Li             "// at start\n"
1038*67e74705SXin Li             "otherLine();",
1039*67e74705SXin Li             format("f();   // comment\n"
1040*67e74705SXin Li                    " // first\n"
1041*67e74705SXin Li                    "// at start\n"
1042*67e74705SXin Li                    "otherLine();"));
1043*67e74705SXin Li   EXPECT_EQ("void f() {\n"
1044*67e74705SXin Li             "  lineWith(); // comment\n"
1045*67e74705SXin Li             "  // at start\n"
1046*67e74705SXin Li             "}",
1047*67e74705SXin Li             format("void              f() {\n"
1048*67e74705SXin Li                    "  lineWith(); // comment\n"
1049*67e74705SXin Li                    "  // at start\n"
1050*67e74705SXin Li                    "}"));
1051*67e74705SXin Li   EXPECT_EQ("int xy; // a\n"
1052*67e74705SXin Li             "int z;  // b",
1053*67e74705SXin Li             format("int xy;    // a\n"
1054*67e74705SXin Li                    "int z;    //b"));
1055*67e74705SXin Li   EXPECT_EQ("int xy; // a\n"
1056*67e74705SXin Li             "int z; // bb",
1057*67e74705SXin Li             format("int xy;    // a\n"
1058*67e74705SXin Li                    "int z;    //bb",
1059*67e74705SXin Li                    getLLVMStyleWithColumns(12)));
1060*67e74705SXin Li 
1061*67e74705SXin Li   verifyFormat("#define A                                                  \\\n"
1062*67e74705SXin Li                "  int i; /* iiiiiiiiiiiiiiiiiiiii */                       \\\n"
1063*67e74705SXin Li                "  int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1064*67e74705SXin Li                getLLVMStyleWithColumns(60));
1065*67e74705SXin Li   verifyFormat(
1066*67e74705SXin Li       "#define A                                                   \\\n"
1067*67e74705SXin Li       "  int i;                        /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1068*67e74705SXin Li       "  int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1069*67e74705SXin Li       getLLVMStyleWithColumns(61));
1070*67e74705SXin Li 
1071*67e74705SXin Li   verifyFormat("if ( // This is some comment\n"
1072*67e74705SXin Li                "    x + 3) {\n"
1073*67e74705SXin Li                "}");
1074*67e74705SXin Li   EXPECT_EQ("if ( // This is some comment\n"
1075*67e74705SXin Li             "     // spanning two lines\n"
1076*67e74705SXin Li             "    x + 3) {\n"
1077*67e74705SXin Li             "}",
1078*67e74705SXin Li             format("if( // This is some comment\n"
1079*67e74705SXin Li                    "     // spanning two lines\n"
1080*67e74705SXin Li                    " x + 3) {\n"
1081*67e74705SXin Li                    "}"));
1082*67e74705SXin Li 
1083*67e74705SXin Li   verifyNoCrash("/\\\n/");
1084*67e74705SXin Li   verifyNoCrash("/\\\n* */");
1085*67e74705SXin Li   // The 0-character somehow makes the lexer return a proper comment.
1086*67e74705SXin Li   verifyNoCrash(StringRef("/*\\\0\n/", 6));
1087*67e74705SXin Li }
1088*67e74705SXin Li 
TEST_F(FormatTest,KeepsParameterWithTrailingCommentsOnTheirOwnLine)1089*67e74705SXin Li TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1090*67e74705SXin Li   EXPECT_EQ("SomeFunction(a,\n"
1091*67e74705SXin Li             "             b, // comment\n"
1092*67e74705SXin Li             "             c);",
1093*67e74705SXin Li             format("SomeFunction(a,\n"
1094*67e74705SXin Li                    "          b, // comment\n"
1095*67e74705SXin Li                    "      c);"));
1096*67e74705SXin Li   EXPECT_EQ("SomeFunction(a, b,\n"
1097*67e74705SXin Li             "             // comment\n"
1098*67e74705SXin Li             "             c);",
1099*67e74705SXin Li             format("SomeFunction(a,\n"
1100*67e74705SXin Li                    "          b,\n"
1101*67e74705SXin Li                    "  // comment\n"
1102*67e74705SXin Li                    "      c);"));
1103*67e74705SXin Li   EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1104*67e74705SXin Li             "             c);",
1105*67e74705SXin Li             format("SomeFunction(a, b, // comment (unclear relation)\n"
1106*67e74705SXin Li                    "      c);"));
1107*67e74705SXin Li   EXPECT_EQ("SomeFunction(a, // comment\n"
1108*67e74705SXin Li             "             b,\n"
1109*67e74705SXin Li             "             c); // comment",
1110*67e74705SXin Li             format("SomeFunction(a,     // comment\n"
1111*67e74705SXin Li                    "          b,\n"
1112*67e74705SXin Li                    "      c); // comment"));
1113*67e74705SXin Li }
1114*67e74705SXin Li 
TEST_F(FormatTest,RemovesTrailingWhitespaceOfComments)1115*67e74705SXin Li TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1116*67e74705SXin Li   EXPECT_EQ("// comment", format("// comment  "));
1117*67e74705SXin Li   EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1118*67e74705SXin Li             format("int aaaaaaa, bbbbbbb; // comment                   ",
1119*67e74705SXin Li                    getLLVMStyleWithColumns(33)));
1120*67e74705SXin Li   EXPECT_EQ("// comment\\\n", format("// comment\\\n  \t \v   \f   "));
1121*67e74705SXin Li   EXPECT_EQ("// comment    \\\n", format("// comment    \\\n  \t \v   \f   "));
1122*67e74705SXin Li }
1123*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsBlockComments)1124*67e74705SXin Li TEST_F(FormatTest, UnderstandsBlockComments) {
1125*67e74705SXin Li   verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
1126*67e74705SXin Li   verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
1127*67e74705SXin Li   EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1128*67e74705SXin Li             "  bbbbbbbbbbbbbbbbbbbbbbbbb);",
1129*67e74705SXin Li             format("f(aaaaaaaaaaaaaaaaaaaaaaaaa ,   \\\n"
1130*67e74705SXin Li                    "/* Trailing comment for aa... */\n"
1131*67e74705SXin Li                    "  bbbbbbbbbbbbbbbbbbbbbbbbb);"));
1132*67e74705SXin Li   EXPECT_EQ(
1133*67e74705SXin Li       "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1134*67e74705SXin Li       "  /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1135*67e74705SXin Li       format("f(aaaaaaaaaaaaaaaaaaaaaaaaa    ,   \n"
1136*67e74705SXin Li              "/* Leading comment for bb... */   bbbbbbbbbbbbbbbbbbbbbbbbb);"));
1137*67e74705SXin Li   EXPECT_EQ(
1138*67e74705SXin Li       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1139*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaa,\n"
1140*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
1141*67e74705SXin Li       "}",
1142*67e74705SXin Li       format("void      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1143*67e74705SXin Li              "                      aaaaaaaaaaaaaaaaaa  ,\n"
1144*67e74705SXin Li              "    aaaaaaaaaaaaaaaaaa) {   /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
1145*67e74705SXin Li              "}"));
1146*67e74705SXin Li   verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1147*67e74705SXin Li                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
1148*67e74705SXin Li 
1149*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
1150*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
1151*67e74705SXin Li   verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1152*67e74705SXin Li                "         /* parameter 2 */ aaaaaa,\n"
1153*67e74705SXin Li                "         /* parameter 3 */ aaaaaa,\n"
1154*67e74705SXin Li                "         /* parameter 4 */ aaaaaa);",
1155*67e74705SXin Li                NoBinPacking);
1156*67e74705SXin Li 
1157*67e74705SXin Li   // Aligning block comments in macros.
1158*67e74705SXin Li   verifyGoogleFormat("#define A        \\\n"
1159*67e74705SXin Li                      "  int i;   /*a*/ \\\n"
1160*67e74705SXin Li                      "  int jjj; /*b*/");
1161*67e74705SXin Li }
1162*67e74705SXin Li 
TEST_F(FormatTest,AlignsBlockComments)1163*67e74705SXin Li TEST_F(FormatTest, AlignsBlockComments) {
1164*67e74705SXin Li   EXPECT_EQ("/*\n"
1165*67e74705SXin Li             " * Really multi-line\n"
1166*67e74705SXin Li             " * comment.\n"
1167*67e74705SXin Li             " */\n"
1168*67e74705SXin Li             "void f() {}",
1169*67e74705SXin Li             format("  /*\n"
1170*67e74705SXin Li                    "   * Really multi-line\n"
1171*67e74705SXin Li                    "   * comment.\n"
1172*67e74705SXin Li                    "   */\n"
1173*67e74705SXin Li                    "  void f() {}"));
1174*67e74705SXin Li   EXPECT_EQ("class C {\n"
1175*67e74705SXin Li             "  /*\n"
1176*67e74705SXin Li             "   * Another multi-line\n"
1177*67e74705SXin Li             "   * comment.\n"
1178*67e74705SXin Li             "   */\n"
1179*67e74705SXin Li             "  void f() {}\n"
1180*67e74705SXin Li             "};",
1181*67e74705SXin Li             format("class C {\n"
1182*67e74705SXin Li                    "/*\n"
1183*67e74705SXin Li                    " * Another multi-line\n"
1184*67e74705SXin Li                    " * comment.\n"
1185*67e74705SXin Li                    " */\n"
1186*67e74705SXin Li                    "void f() {}\n"
1187*67e74705SXin Li                    "};"));
1188*67e74705SXin Li   EXPECT_EQ("/*\n"
1189*67e74705SXin Li             "  1. This is a comment with non-trivial formatting.\n"
1190*67e74705SXin Li             "     1.1. We have to indent/outdent all lines equally\n"
1191*67e74705SXin Li             "         1.1.1. to keep the formatting.\n"
1192*67e74705SXin Li             " */",
1193*67e74705SXin Li             format("  /*\n"
1194*67e74705SXin Li                    "    1. This is a comment with non-trivial formatting.\n"
1195*67e74705SXin Li                    "       1.1. We have to indent/outdent all lines equally\n"
1196*67e74705SXin Li                    "           1.1.1. to keep the formatting.\n"
1197*67e74705SXin Li                    "   */"));
1198*67e74705SXin Li   EXPECT_EQ("/*\n"
1199*67e74705SXin Li             "Don't try to outdent if there's not enough indentation.\n"
1200*67e74705SXin Li             "*/",
1201*67e74705SXin Li             format("  /*\n"
1202*67e74705SXin Li                    " Don't try to outdent if there's not enough indentation.\n"
1203*67e74705SXin Li                    " */"));
1204*67e74705SXin Li 
1205*67e74705SXin Li   EXPECT_EQ("int i; /* Comment with empty...\n"
1206*67e74705SXin Li             "        *\n"
1207*67e74705SXin Li             "        * line. */",
1208*67e74705SXin Li             format("int i; /* Comment with empty...\n"
1209*67e74705SXin Li                    "        *\n"
1210*67e74705SXin Li                    "        * line. */"));
1211*67e74705SXin Li   EXPECT_EQ("int foobar = 0; /* comment */\n"
1212*67e74705SXin Li             "int bar = 0;    /* multiline\n"
1213*67e74705SXin Li             "                   comment 1 */\n"
1214*67e74705SXin Li             "int baz = 0;    /* multiline\n"
1215*67e74705SXin Li             "                   comment 2 */\n"
1216*67e74705SXin Li             "int bzz = 0;    /* multiline\n"
1217*67e74705SXin Li             "                   comment 3 */",
1218*67e74705SXin Li             format("int foobar = 0; /* comment */\n"
1219*67e74705SXin Li                    "int bar = 0;    /* multiline\n"
1220*67e74705SXin Li                    "                   comment 1 */\n"
1221*67e74705SXin Li                    "int baz = 0; /* multiline\n"
1222*67e74705SXin Li                    "                comment 2 */\n"
1223*67e74705SXin Li                    "int bzz = 0;         /* multiline\n"
1224*67e74705SXin Li                    "                        comment 3 */"));
1225*67e74705SXin Li   EXPECT_EQ("int foobar = 0; /* comment */\n"
1226*67e74705SXin Li             "int bar = 0;    /* multiline\n"
1227*67e74705SXin Li             "   comment */\n"
1228*67e74705SXin Li             "int baz = 0;    /* multiline\n"
1229*67e74705SXin Li             "comment */",
1230*67e74705SXin Li             format("int foobar = 0; /* comment */\n"
1231*67e74705SXin Li                    "int bar = 0; /* multiline\n"
1232*67e74705SXin Li                    "comment */\n"
1233*67e74705SXin Li                    "int baz = 0;        /* multiline\n"
1234*67e74705SXin Li                    "comment */"));
1235*67e74705SXin Li }
1236*67e74705SXin Li 
TEST_F(FormatTest,CommentReflowingCanBeTurnedOff)1237*67e74705SXin Li TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1238*67e74705SXin Li   FormatStyle Style = getLLVMStyleWithColumns(20);
1239*67e74705SXin Li   Style.ReflowComments = false;
1240*67e74705SXin Li   verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1241*67e74705SXin Li   verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1242*67e74705SXin Li }
1243*67e74705SXin Li 
TEST_F(FormatTest,CorrectlyHandlesLengthOfBlockComments)1244*67e74705SXin Li TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1245*67e74705SXin Li   EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1246*67e74705SXin Li             "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1247*67e74705SXin Li             format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1248*67e74705SXin Li                    "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
1249*67e74705SXin Li   EXPECT_EQ(
1250*67e74705SXin Li       "void ffffffffffff(\n"
1251*67e74705SXin Li       "    int aaaaaaaa, int bbbbbbbb,\n"
1252*67e74705SXin Li       "    int cccccccccccc) { /*\n"
1253*67e74705SXin Li       "                           aaaaaaaaaa\n"
1254*67e74705SXin Li       "                           aaaaaaaaaaaaa\n"
1255*67e74705SXin Li       "                           bbbbbbbbbbbbbb\n"
1256*67e74705SXin Li       "                           bbbbbbbbbb\n"
1257*67e74705SXin Li       "                         */\n"
1258*67e74705SXin Li       "}",
1259*67e74705SXin Li       format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1260*67e74705SXin Li              "{ /*\n"
1261*67e74705SXin Li              "     aaaaaaaaaa aaaaaaaaaaaaa\n"
1262*67e74705SXin Li              "     bbbbbbbbbbbbbb bbbbbbbbbb\n"
1263*67e74705SXin Li              "   */\n"
1264*67e74705SXin Li              "}",
1265*67e74705SXin Li              getLLVMStyleWithColumns(40)));
1266*67e74705SXin Li }
1267*67e74705SXin Li 
TEST_F(FormatTest,DontBreakNonTrailingBlockComments)1268*67e74705SXin Li TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
1269*67e74705SXin Li   EXPECT_EQ("void ffffffffff(\n"
1270*67e74705SXin Li             "    int aaaaa /* test */);",
1271*67e74705SXin Li             format("void ffffffffff(int aaaaa /* test */);",
1272*67e74705SXin Li                    getLLVMStyleWithColumns(35)));
1273*67e74705SXin Li }
1274*67e74705SXin Li 
TEST_F(FormatTest,SplitsLongCxxComments)1275*67e74705SXin Li TEST_F(FormatTest, SplitsLongCxxComments) {
1276*67e74705SXin Li   EXPECT_EQ("// A comment that\n"
1277*67e74705SXin Li             "// doesn't fit on\n"
1278*67e74705SXin Li             "// one line",
1279*67e74705SXin Li             format("// A comment that doesn't fit on one line",
1280*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1281*67e74705SXin Li   EXPECT_EQ("/// A comment that\n"
1282*67e74705SXin Li             "/// doesn't fit on\n"
1283*67e74705SXin Li             "/// one line",
1284*67e74705SXin Li             format("/// A comment that doesn't fit on one line",
1285*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1286*67e74705SXin Li   EXPECT_EQ("//! A comment that\n"
1287*67e74705SXin Li             "//! doesn't fit on\n"
1288*67e74705SXin Li             "//! one line",
1289*67e74705SXin Li             format("//! A comment that doesn't fit on one line",
1290*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1291*67e74705SXin Li   EXPECT_EQ("// a b c d\n"
1292*67e74705SXin Li             "// e f  g\n"
1293*67e74705SXin Li             "// h i j k",
1294*67e74705SXin Li             format("// a b c d e f  g h i j k", getLLVMStyleWithColumns(10)));
1295*67e74705SXin Li   EXPECT_EQ(
1296*67e74705SXin Li       "// a b c d\n"
1297*67e74705SXin Li       "// e f  g\n"
1298*67e74705SXin Li       "// h i j k",
1299*67e74705SXin Li       format("\\\n// a b c d e f  g h i j k", getLLVMStyleWithColumns(10)));
1300*67e74705SXin Li   EXPECT_EQ("if (true) // A comment that\n"
1301*67e74705SXin Li             "          // doesn't fit on\n"
1302*67e74705SXin Li             "          // one line",
1303*67e74705SXin Li             format("if (true) // A comment that doesn't fit on one line   ",
1304*67e74705SXin Li                    getLLVMStyleWithColumns(30)));
1305*67e74705SXin Li   EXPECT_EQ("//    Don't_touch_leading_whitespace",
1306*67e74705SXin Li             format("//    Don't_touch_leading_whitespace",
1307*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1308*67e74705SXin Li   EXPECT_EQ("// Add leading\n"
1309*67e74705SXin Li             "// whitespace",
1310*67e74705SXin Li             format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
1311*67e74705SXin Li   EXPECT_EQ("/// Add leading\n"
1312*67e74705SXin Li             "/// whitespace",
1313*67e74705SXin Li             format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1314*67e74705SXin Li   EXPECT_EQ("//! Add leading\n"
1315*67e74705SXin Li             "//! whitespace",
1316*67e74705SXin Li             format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
1317*67e74705SXin Li   EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1318*67e74705SXin Li   EXPECT_EQ("// Even if it makes the line exceed the column\n"
1319*67e74705SXin Li             "// limit",
1320*67e74705SXin Li             format("//Even if it makes the line exceed the column limit",
1321*67e74705SXin Li                    getLLVMStyleWithColumns(51)));
1322*67e74705SXin Li   EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
1323*67e74705SXin Li 
1324*67e74705SXin Li   EXPECT_EQ("// aa bb cc dd",
1325*67e74705SXin Li             format("// aa bb             cc dd                   ",
1326*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
1327*67e74705SXin Li 
1328*67e74705SXin Li   EXPECT_EQ("// A comment before\n"
1329*67e74705SXin Li             "// a macro\n"
1330*67e74705SXin Li             "// definition\n"
1331*67e74705SXin Li             "#define a b",
1332*67e74705SXin Li             format("// A comment before a macro definition\n"
1333*67e74705SXin Li                    "#define a b",
1334*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1335*67e74705SXin Li   EXPECT_EQ("void ffffff(\n"
1336*67e74705SXin Li             "    int aaaaaaaaa,  // wwww\n"
1337*67e74705SXin Li             "    int bbbbbbbbbb, // xxxxxxx\n"
1338*67e74705SXin Li             "                    // yyyyyyyyyy\n"
1339*67e74705SXin Li             "    int c, int d, int e) {}",
1340*67e74705SXin Li             format("void ffffff(\n"
1341*67e74705SXin Li                    "    int aaaaaaaaa, // wwww\n"
1342*67e74705SXin Li                    "    int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
1343*67e74705SXin Li                    "    int c, int d, int e) {}",
1344*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
1345*67e74705SXin Li   EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1346*67e74705SXin Li             format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1347*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1348*67e74705SXin Li   EXPECT_EQ(
1349*67e74705SXin Li       "#define XXX // a b c d\n"
1350*67e74705SXin Li       "            // e f g h",
1351*67e74705SXin Li       format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1352*67e74705SXin Li   EXPECT_EQ(
1353*67e74705SXin Li       "#define XXX // q w e r\n"
1354*67e74705SXin Li       "            // t y u i",
1355*67e74705SXin Li       format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
1356*67e74705SXin Li }
1357*67e74705SXin Li 
TEST_F(FormatTest,PreservesHangingIndentInCxxComments)1358*67e74705SXin Li TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1359*67e74705SXin Li   EXPECT_EQ("//     A comment\n"
1360*67e74705SXin Li             "//     that doesn't\n"
1361*67e74705SXin Li             "//     fit on one\n"
1362*67e74705SXin Li             "//     line",
1363*67e74705SXin Li             format("//     A comment that doesn't fit on one line",
1364*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1365*67e74705SXin Li   EXPECT_EQ("///     A comment\n"
1366*67e74705SXin Li             "///     that doesn't\n"
1367*67e74705SXin Li             "///     fit on one\n"
1368*67e74705SXin Li             "///     line",
1369*67e74705SXin Li             format("///     A comment that doesn't fit on one line",
1370*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1371*67e74705SXin Li }
1372*67e74705SXin Li 
TEST_F(FormatTest,DontSplitLineCommentsWithEscapedNewlines)1373*67e74705SXin Li TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1374*67e74705SXin Li   EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1375*67e74705SXin Li             "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1376*67e74705SXin Li             "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1377*67e74705SXin Li             format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1378*67e74705SXin Li                    "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1379*67e74705SXin Li                    "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1380*67e74705SXin Li   EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1381*67e74705SXin Li             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1382*67e74705SXin Li             "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1383*67e74705SXin Li             format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1384*67e74705SXin Li                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1385*67e74705SXin Li                    "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1386*67e74705SXin Li                    getLLVMStyleWithColumns(50)));
1387*67e74705SXin Li   // FIXME: One day we might want to implement adjustment of leading whitespace
1388*67e74705SXin Li   // of the consecutive lines in this kind of comment:
1389*67e74705SXin Li   EXPECT_EQ("double\n"
1390*67e74705SXin Li             "    a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1391*67e74705SXin Li             "          // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1392*67e74705SXin Li             "          // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1393*67e74705SXin Li             format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1394*67e74705SXin Li                    "          // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1395*67e74705SXin Li                    "          // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1396*67e74705SXin Li                    getLLVMStyleWithColumns(49)));
1397*67e74705SXin Li }
1398*67e74705SXin Li 
TEST_F(FormatTest,DontSplitLineCommentsWithPragmas)1399*67e74705SXin Li TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1400*67e74705SXin Li   FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1401*67e74705SXin Li   Pragmas.CommentPragmas = "^ IWYU pragma:";
1402*67e74705SXin Li   EXPECT_EQ(
1403*67e74705SXin Li       "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1404*67e74705SXin Li       format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1405*67e74705SXin Li   EXPECT_EQ(
1406*67e74705SXin Li       "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1407*67e74705SXin Li       format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1408*67e74705SXin Li }
1409*67e74705SXin Li 
TEST_F(FormatTest,PriorityOfCommentBreaking)1410*67e74705SXin Li TEST_F(FormatTest, PriorityOfCommentBreaking) {
1411*67e74705SXin Li   EXPECT_EQ("if (xxx ==\n"
1412*67e74705SXin Li             "        yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1413*67e74705SXin Li             "    zzz)\n"
1414*67e74705SXin Li             "  q();",
1415*67e74705SXin Li             format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1416*67e74705SXin Li                    "    zzz) q();",
1417*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
1418*67e74705SXin Li   EXPECT_EQ("if (xxxxxxxxxx ==\n"
1419*67e74705SXin Li             "        yyy && // aaaaaa bbbbbbbb cccc\n"
1420*67e74705SXin Li             "    zzz)\n"
1421*67e74705SXin Li             "  q();",
1422*67e74705SXin Li             format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1423*67e74705SXin Li                    "    zzz) q();",
1424*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
1425*67e74705SXin Li   EXPECT_EQ("if (xxxxxxxxxx &&\n"
1426*67e74705SXin Li             "        yyy || // aaaaaa bbbbbbbb cccc\n"
1427*67e74705SXin Li             "    zzz)\n"
1428*67e74705SXin Li             "  q();",
1429*67e74705SXin Li             format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1430*67e74705SXin Li                    "    zzz) q();",
1431*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
1432*67e74705SXin Li   EXPECT_EQ("fffffffff(\n"
1433*67e74705SXin Li             "    &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1434*67e74705SXin Li             "    zzz);",
1435*67e74705SXin Li             format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1436*67e74705SXin Li                    " zzz);",
1437*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
1438*67e74705SXin Li }
1439*67e74705SXin Li 
TEST_F(FormatTest,MultiLineCommentsInDefines)1440*67e74705SXin Li TEST_F(FormatTest, MultiLineCommentsInDefines) {
1441*67e74705SXin Li   EXPECT_EQ("#define A(x) /* \\\n"
1442*67e74705SXin Li             "  a comment     \\\n"
1443*67e74705SXin Li             "  inside */     \\\n"
1444*67e74705SXin Li             "  f();",
1445*67e74705SXin Li             format("#define A(x) /* \\\n"
1446*67e74705SXin Li                    "  a comment     \\\n"
1447*67e74705SXin Li                    "  inside */     \\\n"
1448*67e74705SXin Li                    "  f();",
1449*67e74705SXin Li                    getLLVMStyleWithColumns(17)));
1450*67e74705SXin Li   EXPECT_EQ("#define A(      \\\n"
1451*67e74705SXin Li             "    x) /*       \\\n"
1452*67e74705SXin Li             "  a comment     \\\n"
1453*67e74705SXin Li             "  inside */     \\\n"
1454*67e74705SXin Li             "  f();",
1455*67e74705SXin Li             format("#define A(      \\\n"
1456*67e74705SXin Li                    "    x) /*       \\\n"
1457*67e74705SXin Li                    "  a comment     \\\n"
1458*67e74705SXin Li                    "  inside */     \\\n"
1459*67e74705SXin Li                    "  f();",
1460*67e74705SXin Li                    getLLVMStyleWithColumns(17)));
1461*67e74705SXin Li }
1462*67e74705SXin Li 
TEST_F(FormatTest,ParsesCommentsAdjacentToPPDirectives)1463*67e74705SXin Li TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
1464*67e74705SXin Li   EXPECT_EQ("namespace {}\n// Test\n#define A",
1465*67e74705SXin Li             format("namespace {}\n   // Test\n#define A"));
1466*67e74705SXin Li   EXPECT_EQ("namespace {}\n/* Test */\n#define A",
1467*67e74705SXin Li             format("namespace {}\n   /* Test */\n#define A"));
1468*67e74705SXin Li   EXPECT_EQ("namespace {}\n/* Test */ #define A",
1469*67e74705SXin Li             format("namespace {}\n   /* Test */    #define A"));
1470*67e74705SXin Li }
1471*67e74705SXin Li 
TEST_F(FormatTest,SplitsLongLinesInComments)1472*67e74705SXin Li TEST_F(FormatTest, SplitsLongLinesInComments) {
1473*67e74705SXin Li   EXPECT_EQ("/* This is a long\n"
1474*67e74705SXin Li             " * comment that\n"
1475*67e74705SXin Li             " * doesn't\n"
1476*67e74705SXin Li             " * fit on one line.\n"
1477*67e74705SXin Li             " */",
1478*67e74705SXin Li             format("/* "
1479*67e74705SXin Li                    "This is a long                                         "
1480*67e74705SXin Li                    "comment that "
1481*67e74705SXin Li                    "doesn't                                    "
1482*67e74705SXin Li                    "fit on one line.  */",
1483*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1484*67e74705SXin Li   EXPECT_EQ(
1485*67e74705SXin Li       "/* a b c d\n"
1486*67e74705SXin Li       " * e f  g\n"
1487*67e74705SXin Li       " * h i j k\n"
1488*67e74705SXin Li       " */",
1489*67e74705SXin Li       format("/* a b c d e f  g h i j k */", getLLVMStyleWithColumns(10)));
1490*67e74705SXin Li   EXPECT_EQ(
1491*67e74705SXin Li       "/* a b c d\n"
1492*67e74705SXin Li       " * e f  g\n"
1493*67e74705SXin Li       " * h i j k\n"
1494*67e74705SXin Li       " */",
1495*67e74705SXin Li       format("\\\n/* a b c d e f  g h i j k */", getLLVMStyleWithColumns(10)));
1496*67e74705SXin Li   EXPECT_EQ("/*\n"
1497*67e74705SXin Li             "This is a long\n"
1498*67e74705SXin Li             "comment that doesn't\n"
1499*67e74705SXin Li             "fit on one line.\n"
1500*67e74705SXin Li             "*/",
1501*67e74705SXin Li             format("/*\n"
1502*67e74705SXin Li                    "This is a long                                         "
1503*67e74705SXin Li                    "comment that doesn't                                    "
1504*67e74705SXin Li                    "fit on one line.                                      \n"
1505*67e74705SXin Li                    "*/",
1506*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1507*67e74705SXin Li   EXPECT_EQ("/*\n"
1508*67e74705SXin Li             " * This is a long\n"
1509*67e74705SXin Li             " * comment that\n"
1510*67e74705SXin Li             " * doesn't fit on\n"
1511*67e74705SXin Li             " * one line.\n"
1512*67e74705SXin Li             " */",
1513*67e74705SXin Li             format("/*      \n"
1514*67e74705SXin Li                    " * This is a long "
1515*67e74705SXin Li                    "   comment that     "
1516*67e74705SXin Li                    "   doesn't fit on   "
1517*67e74705SXin Li                    "   one line.                                            \n"
1518*67e74705SXin Li                    " */",
1519*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1520*67e74705SXin Li   EXPECT_EQ("/*\n"
1521*67e74705SXin Li             " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1522*67e74705SXin Li             " * so_it_should_be_broken\n"
1523*67e74705SXin Li             " * wherever_a_space_occurs\n"
1524*67e74705SXin Li             " */",
1525*67e74705SXin Li             format("/*\n"
1526*67e74705SXin Li                    " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1527*67e74705SXin Li                    "   so_it_should_be_broken "
1528*67e74705SXin Li                    "   wherever_a_space_occurs                             \n"
1529*67e74705SXin Li                    " */",
1530*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1531*67e74705SXin Li   EXPECT_EQ("/*\n"
1532*67e74705SXin Li             " *    This_comment_can_not_be_broken_into_lines\n"
1533*67e74705SXin Li             " */",
1534*67e74705SXin Li             format("/*\n"
1535*67e74705SXin Li                    " *    This_comment_can_not_be_broken_into_lines\n"
1536*67e74705SXin Li                    " */",
1537*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1538*67e74705SXin Li   EXPECT_EQ("{\n"
1539*67e74705SXin Li             "  /*\n"
1540*67e74705SXin Li             "  This is another\n"
1541*67e74705SXin Li             "  long comment that\n"
1542*67e74705SXin Li             "  doesn't fit on one\n"
1543*67e74705SXin Li             "  line    1234567890\n"
1544*67e74705SXin Li             "  */\n"
1545*67e74705SXin Li             "}",
1546*67e74705SXin Li             format("{\n"
1547*67e74705SXin Li                    "/*\n"
1548*67e74705SXin Li                    "This is another     "
1549*67e74705SXin Li                    "  long comment that "
1550*67e74705SXin Li                    "  doesn't fit on one"
1551*67e74705SXin Li                    "  line    1234567890\n"
1552*67e74705SXin Li                    "*/\n"
1553*67e74705SXin Li                    "}",
1554*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1555*67e74705SXin Li   EXPECT_EQ("{\n"
1556*67e74705SXin Li             "  /*\n"
1557*67e74705SXin Li             "   * This        i s\n"
1558*67e74705SXin Li             "   * another comment\n"
1559*67e74705SXin Li             "   * t hat  doesn' t\n"
1560*67e74705SXin Li             "   * fit on one l i\n"
1561*67e74705SXin Li             "   * n e\n"
1562*67e74705SXin Li             "   */\n"
1563*67e74705SXin Li             "}",
1564*67e74705SXin Li             format("{\n"
1565*67e74705SXin Li                    "/*\n"
1566*67e74705SXin Li                    " * This        i s"
1567*67e74705SXin Li                    "   another comment"
1568*67e74705SXin Li                    "   t hat  doesn' t"
1569*67e74705SXin Li                    "   fit on one l i"
1570*67e74705SXin Li                    "   n e\n"
1571*67e74705SXin Li                    " */\n"
1572*67e74705SXin Li                    "}",
1573*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1574*67e74705SXin Li   EXPECT_EQ("/*\n"
1575*67e74705SXin Li             " * This is a long\n"
1576*67e74705SXin Li             " * comment that\n"
1577*67e74705SXin Li             " * doesn't fit on\n"
1578*67e74705SXin Li             " * one line\n"
1579*67e74705SXin Li             " */",
1580*67e74705SXin Li             format("   /*\n"
1581*67e74705SXin Li                    "    * This is a long comment that doesn't fit on one line\n"
1582*67e74705SXin Li                    "    */",
1583*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1584*67e74705SXin Li   EXPECT_EQ("{\n"
1585*67e74705SXin Li             "  if (something) /* This is a\n"
1586*67e74705SXin Li             "                    long\n"
1587*67e74705SXin Li             "                    comment */\n"
1588*67e74705SXin Li             "    ;\n"
1589*67e74705SXin Li             "}",
1590*67e74705SXin Li             format("{\n"
1591*67e74705SXin Li                    "  if (something) /* This is a long comment */\n"
1592*67e74705SXin Li                    "    ;\n"
1593*67e74705SXin Li                    "}",
1594*67e74705SXin Li                    getLLVMStyleWithColumns(30)));
1595*67e74705SXin Li 
1596*67e74705SXin Li   EXPECT_EQ("/* A comment before\n"
1597*67e74705SXin Li             " * a macro\n"
1598*67e74705SXin Li             " * definition */\n"
1599*67e74705SXin Li             "#define a b",
1600*67e74705SXin Li             format("/* A comment before a macro definition */\n"
1601*67e74705SXin Li                    "#define a b",
1602*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1603*67e74705SXin Li 
1604*67e74705SXin Li   EXPECT_EQ("/* some comment\n"
1605*67e74705SXin Li             "     *   a comment\n"
1606*67e74705SXin Li             "* that we break\n"
1607*67e74705SXin Li             " * another comment\n"
1608*67e74705SXin Li             "* we have to break\n"
1609*67e74705SXin Li             "* a left comment\n"
1610*67e74705SXin Li             " */",
1611*67e74705SXin Li             format("  /* some comment\n"
1612*67e74705SXin Li                    "       *   a comment that we break\n"
1613*67e74705SXin Li                    "   * another comment we have to break\n"
1614*67e74705SXin Li                    "* a left comment\n"
1615*67e74705SXin Li                    "   */",
1616*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1617*67e74705SXin Li 
1618*67e74705SXin Li   EXPECT_EQ("/**\n"
1619*67e74705SXin Li             " * multiline block\n"
1620*67e74705SXin Li             " * comment\n"
1621*67e74705SXin Li             " *\n"
1622*67e74705SXin Li             " */",
1623*67e74705SXin Li             format("/**\n"
1624*67e74705SXin Li                    " * multiline block comment\n"
1625*67e74705SXin Li                    " *\n"
1626*67e74705SXin Li                    " */",
1627*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1628*67e74705SXin Li 
1629*67e74705SXin Li   EXPECT_EQ("/*\n"
1630*67e74705SXin Li             "\n"
1631*67e74705SXin Li             "\n"
1632*67e74705SXin Li             "    */\n",
1633*67e74705SXin Li             format("  /*       \n"
1634*67e74705SXin Li                    "      \n"
1635*67e74705SXin Li                    "               \n"
1636*67e74705SXin Li                    "      */\n"));
1637*67e74705SXin Li 
1638*67e74705SXin Li   EXPECT_EQ("/* a a */",
1639*67e74705SXin Li             format("/* a a            */", getLLVMStyleWithColumns(15)));
1640*67e74705SXin Li   EXPECT_EQ("/* a a bc  */",
1641*67e74705SXin Li             format("/* a a            bc  */", getLLVMStyleWithColumns(15)));
1642*67e74705SXin Li   EXPECT_EQ("/* aaa aaa\n"
1643*67e74705SXin Li             " * aaaaa */",
1644*67e74705SXin Li             format("/* aaa aaa aaaaa       */", getLLVMStyleWithColumns(15)));
1645*67e74705SXin Li   EXPECT_EQ("/* aaa aaa\n"
1646*67e74705SXin Li             " * aaaaa     */",
1647*67e74705SXin Li             format("/* aaa aaa aaaaa     */", getLLVMStyleWithColumns(15)));
1648*67e74705SXin Li }
1649*67e74705SXin Li 
TEST_F(FormatTest,SplitsLongLinesInCommentsInPreprocessor)1650*67e74705SXin Li TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1651*67e74705SXin Li   EXPECT_EQ("#define X          \\\n"
1652*67e74705SXin Li             "  /*               \\\n"
1653*67e74705SXin Li             "   Test            \\\n"
1654*67e74705SXin Li             "   Macro comment   \\\n"
1655*67e74705SXin Li             "   with a long     \\\n"
1656*67e74705SXin Li             "   line            \\\n"
1657*67e74705SXin Li             "   */              \\\n"
1658*67e74705SXin Li             "  A + B",
1659*67e74705SXin Li             format("#define X \\\n"
1660*67e74705SXin Li                    "  /*\n"
1661*67e74705SXin Li                    "   Test\n"
1662*67e74705SXin Li                    "   Macro comment with a long  line\n"
1663*67e74705SXin Li                    "   */ \\\n"
1664*67e74705SXin Li                    "  A + B",
1665*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1666*67e74705SXin Li   EXPECT_EQ("#define X          \\\n"
1667*67e74705SXin Li             "  /* Macro comment \\\n"
1668*67e74705SXin Li             "     with a long   \\\n"
1669*67e74705SXin Li             "     line */       \\\n"
1670*67e74705SXin Li             "  A + B",
1671*67e74705SXin Li             format("#define X \\\n"
1672*67e74705SXin Li                    "  /* Macro comment with a long\n"
1673*67e74705SXin Li                    "     line */ \\\n"
1674*67e74705SXin Li                    "  A + B",
1675*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1676*67e74705SXin Li   EXPECT_EQ("#define X          \\\n"
1677*67e74705SXin Li             "  /* Macro comment \\\n"
1678*67e74705SXin Li             "   * with a long   \\\n"
1679*67e74705SXin Li             "   * line */       \\\n"
1680*67e74705SXin Li             "  A + B",
1681*67e74705SXin Li             format("#define X \\\n"
1682*67e74705SXin Li                    "  /* Macro comment with a long  line */ \\\n"
1683*67e74705SXin Li                    "  A + B",
1684*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
1685*67e74705SXin Li }
1686*67e74705SXin Li 
TEST_F(FormatTest,CommentsInStaticInitializers)1687*67e74705SXin Li TEST_F(FormatTest, CommentsInStaticInitializers) {
1688*67e74705SXin Li   EXPECT_EQ(
1689*67e74705SXin Li       "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1690*67e74705SXin Li       "                        aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1691*67e74705SXin Li       "                        /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1692*67e74705SXin Li       "                        aaaaaaaaaaaaaaaaaaaa, // comment\n"
1693*67e74705SXin Li       "                        aaaaaaaaaaaaaaaaaaaa};",
1694*67e74705SXin Li       format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa  ,  /* comment */\n"
1695*67e74705SXin Li              "                   aaaaaaaaaaaaaaaaaaaa   /* comment */ ,\n"
1696*67e74705SXin Li              "                     /* comment */   aaaaaaaaaaaaaaaaaaaa ,\n"
1697*67e74705SXin Li              "              aaaaaaaaaaaaaaaaaaaa ,   // comment\n"
1698*67e74705SXin Li              "                  aaaaaaaaaaaaaaaaaaaa };"));
1699*67e74705SXin Li   verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1700*67e74705SXin Li                "                        bbbbbbbbbbb, ccccccccccc};");
1701*67e74705SXin Li   verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1702*67e74705SXin Li                "                        // comment for bb....\n"
1703*67e74705SXin Li                "                        bbbbbbbbbbb, ccccccccccc};");
1704*67e74705SXin Li   verifyGoogleFormat(
1705*67e74705SXin Li       "static SomeType type = {aaaaaaaaaaa,  // comment for aa...\n"
1706*67e74705SXin Li       "                        bbbbbbbbbbb, ccccccccccc};");
1707*67e74705SXin Li   verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1708*67e74705SXin Li                      "                        // comment for bb....\n"
1709*67e74705SXin Li                      "                        bbbbbbbbbbb, ccccccccccc};");
1710*67e74705SXin Li 
1711*67e74705SXin Li   verifyFormat("S s = {{a, b, c},  // Group #1\n"
1712*67e74705SXin Li                "       {d, e, f},  // Group #2\n"
1713*67e74705SXin Li                "       {g, h, i}}; // Group #3");
1714*67e74705SXin Li   verifyFormat("S s = {{// Group #1\n"
1715*67e74705SXin Li                "        a, b, c},\n"
1716*67e74705SXin Li                "       {// Group #2\n"
1717*67e74705SXin Li                "        d, e, f},\n"
1718*67e74705SXin Li                "       {// Group #3\n"
1719*67e74705SXin Li                "        g, h, i}};");
1720*67e74705SXin Li 
1721*67e74705SXin Li   EXPECT_EQ("S s = {\n"
1722*67e74705SXin Li             "    // Some comment\n"
1723*67e74705SXin Li             "    a,\n"
1724*67e74705SXin Li             "\n"
1725*67e74705SXin Li             "    // Comment after empty line\n"
1726*67e74705SXin Li             "    b}",
1727*67e74705SXin Li             format("S s =    {\n"
1728*67e74705SXin Li                    "      // Some comment\n"
1729*67e74705SXin Li                    "  a,\n"
1730*67e74705SXin Li                    "  \n"
1731*67e74705SXin Li                    "     // Comment after empty line\n"
1732*67e74705SXin Li                    "      b\n"
1733*67e74705SXin Li                    "}"));
1734*67e74705SXin Li   EXPECT_EQ("S s = {\n"
1735*67e74705SXin Li             "    /* Some comment */\n"
1736*67e74705SXin Li             "    a,\n"
1737*67e74705SXin Li             "\n"
1738*67e74705SXin Li             "    /* Comment after empty line */\n"
1739*67e74705SXin Li             "    b}",
1740*67e74705SXin Li             format("S s =    {\n"
1741*67e74705SXin Li                    "      /* Some comment */\n"
1742*67e74705SXin Li                    "  a,\n"
1743*67e74705SXin Li                    "  \n"
1744*67e74705SXin Li                    "     /* Comment after empty line */\n"
1745*67e74705SXin Li                    "      b\n"
1746*67e74705SXin Li                    "}"));
1747*67e74705SXin Li   verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
1748*67e74705SXin Li                "    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1749*67e74705SXin Li                "    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1750*67e74705SXin Li                "    0x00, 0x00, 0x00, 0x00};            // comment\n");
1751*67e74705SXin Li }
1752*67e74705SXin Li 
TEST_F(FormatTest,IgnoresIf0Contents)1753*67e74705SXin Li TEST_F(FormatTest, IgnoresIf0Contents) {
1754*67e74705SXin Li   EXPECT_EQ("#if 0\n"
1755*67e74705SXin Li             "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1756*67e74705SXin Li             "#endif\n"
1757*67e74705SXin Li             "void f() {}",
1758*67e74705SXin Li             format("#if 0\n"
1759*67e74705SXin Li                    "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1760*67e74705SXin Li                    "#endif\n"
1761*67e74705SXin Li                    "void f(  ) {  }"));
1762*67e74705SXin Li   EXPECT_EQ("#if false\n"
1763*67e74705SXin Li             "void f(  ) {  }\n"
1764*67e74705SXin Li             "#endif\n"
1765*67e74705SXin Li             "void g() {}\n",
1766*67e74705SXin Li             format("#if false\n"
1767*67e74705SXin Li                    "void f(  ) {  }\n"
1768*67e74705SXin Li                    "#endif\n"
1769*67e74705SXin Li                    "void g(  ) {  }\n"));
1770*67e74705SXin Li   EXPECT_EQ("enum E {\n"
1771*67e74705SXin Li             "  One,\n"
1772*67e74705SXin Li             "  Two,\n"
1773*67e74705SXin Li             "#if 0\n"
1774*67e74705SXin Li             "Three,\n"
1775*67e74705SXin Li             "      Four,\n"
1776*67e74705SXin Li             "#endif\n"
1777*67e74705SXin Li             "  Five\n"
1778*67e74705SXin Li             "};",
1779*67e74705SXin Li             format("enum E {\n"
1780*67e74705SXin Li                    "  One,Two,\n"
1781*67e74705SXin Li                    "#if 0\n"
1782*67e74705SXin Li                    "Three,\n"
1783*67e74705SXin Li                    "      Four,\n"
1784*67e74705SXin Li                    "#endif\n"
1785*67e74705SXin Li                    "  Five};"));
1786*67e74705SXin Li   EXPECT_EQ("enum F {\n"
1787*67e74705SXin Li             "  One,\n"
1788*67e74705SXin Li             "#if 1\n"
1789*67e74705SXin Li             "  Two,\n"
1790*67e74705SXin Li             "#if 0\n"
1791*67e74705SXin Li             "Three,\n"
1792*67e74705SXin Li             "      Four,\n"
1793*67e74705SXin Li             "#endif\n"
1794*67e74705SXin Li             "  Five\n"
1795*67e74705SXin Li             "#endif\n"
1796*67e74705SXin Li             "};",
1797*67e74705SXin Li             format("enum F {\n"
1798*67e74705SXin Li                    "One,\n"
1799*67e74705SXin Li                    "#if 1\n"
1800*67e74705SXin Li                    "Two,\n"
1801*67e74705SXin Li                    "#if 0\n"
1802*67e74705SXin Li                    "Three,\n"
1803*67e74705SXin Li                    "      Four,\n"
1804*67e74705SXin Li                    "#endif\n"
1805*67e74705SXin Li                    "Five\n"
1806*67e74705SXin Li                    "#endif\n"
1807*67e74705SXin Li                    "};"));
1808*67e74705SXin Li   EXPECT_EQ("enum G {\n"
1809*67e74705SXin Li             "  One,\n"
1810*67e74705SXin Li             "#if 0\n"
1811*67e74705SXin Li             "Two,\n"
1812*67e74705SXin Li             "#else\n"
1813*67e74705SXin Li             "  Three,\n"
1814*67e74705SXin Li             "#endif\n"
1815*67e74705SXin Li             "  Four\n"
1816*67e74705SXin Li             "};",
1817*67e74705SXin Li             format("enum G {\n"
1818*67e74705SXin Li                    "One,\n"
1819*67e74705SXin Li                    "#if 0\n"
1820*67e74705SXin Li                    "Two,\n"
1821*67e74705SXin Li                    "#else\n"
1822*67e74705SXin Li                    "Three,\n"
1823*67e74705SXin Li                    "#endif\n"
1824*67e74705SXin Li                    "Four\n"
1825*67e74705SXin Li                    "};"));
1826*67e74705SXin Li   EXPECT_EQ("enum H {\n"
1827*67e74705SXin Li             "  One,\n"
1828*67e74705SXin Li             "#if 0\n"
1829*67e74705SXin Li             "#ifdef Q\n"
1830*67e74705SXin Li             "Two,\n"
1831*67e74705SXin Li             "#else\n"
1832*67e74705SXin Li             "Three,\n"
1833*67e74705SXin Li             "#endif\n"
1834*67e74705SXin Li             "#endif\n"
1835*67e74705SXin Li             "  Four\n"
1836*67e74705SXin Li             "};",
1837*67e74705SXin Li             format("enum H {\n"
1838*67e74705SXin Li                    "One,\n"
1839*67e74705SXin Li                    "#if 0\n"
1840*67e74705SXin Li                    "#ifdef Q\n"
1841*67e74705SXin Li                    "Two,\n"
1842*67e74705SXin Li                    "#else\n"
1843*67e74705SXin Li                    "Three,\n"
1844*67e74705SXin Li                    "#endif\n"
1845*67e74705SXin Li                    "#endif\n"
1846*67e74705SXin Li                    "Four\n"
1847*67e74705SXin Li                    "};"));
1848*67e74705SXin Li   EXPECT_EQ("enum I {\n"
1849*67e74705SXin Li             "  One,\n"
1850*67e74705SXin Li             "#if /* test */ 0 || 1\n"
1851*67e74705SXin Li             "Two,\n"
1852*67e74705SXin Li             "Three,\n"
1853*67e74705SXin Li             "#endif\n"
1854*67e74705SXin Li             "  Four\n"
1855*67e74705SXin Li             "};",
1856*67e74705SXin Li             format("enum I {\n"
1857*67e74705SXin Li                    "One,\n"
1858*67e74705SXin Li                    "#if /* test */ 0 || 1\n"
1859*67e74705SXin Li                    "Two,\n"
1860*67e74705SXin Li                    "Three,\n"
1861*67e74705SXin Li                    "#endif\n"
1862*67e74705SXin Li                    "Four\n"
1863*67e74705SXin Li                    "};"));
1864*67e74705SXin Li   EXPECT_EQ("enum J {\n"
1865*67e74705SXin Li             "  One,\n"
1866*67e74705SXin Li             "#if 0\n"
1867*67e74705SXin Li             "#if 0\n"
1868*67e74705SXin Li             "Two,\n"
1869*67e74705SXin Li             "#else\n"
1870*67e74705SXin Li             "Three,\n"
1871*67e74705SXin Li             "#endif\n"
1872*67e74705SXin Li             "Four,\n"
1873*67e74705SXin Li             "#endif\n"
1874*67e74705SXin Li             "  Five\n"
1875*67e74705SXin Li             "};",
1876*67e74705SXin Li             format("enum J {\n"
1877*67e74705SXin Li                    "One,\n"
1878*67e74705SXin Li                    "#if 0\n"
1879*67e74705SXin Li                    "#if 0\n"
1880*67e74705SXin Li                    "Two,\n"
1881*67e74705SXin Li                    "#else\n"
1882*67e74705SXin Li                    "Three,\n"
1883*67e74705SXin Li                    "#endif\n"
1884*67e74705SXin Li                    "Four,\n"
1885*67e74705SXin Li                    "#endif\n"
1886*67e74705SXin Li                    "Five\n"
1887*67e74705SXin Li                    "};"));
1888*67e74705SXin Li }
1889*67e74705SXin Li 
1890*67e74705SXin Li //===----------------------------------------------------------------------===//
1891*67e74705SXin Li // Tests for classes, namespaces, etc.
1892*67e74705SXin Li //===----------------------------------------------------------------------===//
1893*67e74705SXin Li 
TEST_F(FormatTest,DoesNotBreakSemiAfterClassDecl)1894*67e74705SXin Li TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1895*67e74705SXin Li   verifyFormat("class A {};");
1896*67e74705SXin Li }
1897*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsAccessSpecifiers)1898*67e74705SXin Li TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1899*67e74705SXin Li   verifyFormat("class A {\n"
1900*67e74705SXin Li                "public:\n"
1901*67e74705SXin Li                "public: // comment\n"
1902*67e74705SXin Li                "protected:\n"
1903*67e74705SXin Li                "private:\n"
1904*67e74705SXin Li                "  void f() {}\n"
1905*67e74705SXin Li                "};");
1906*67e74705SXin Li   verifyGoogleFormat("class A {\n"
1907*67e74705SXin Li                      " public:\n"
1908*67e74705SXin Li                      " protected:\n"
1909*67e74705SXin Li                      " private:\n"
1910*67e74705SXin Li                      "  void f() {}\n"
1911*67e74705SXin Li                      "};");
1912*67e74705SXin Li   verifyFormat("class A {\n"
1913*67e74705SXin Li                "public slots:\n"
1914*67e74705SXin Li                "  void f1() {}\n"
1915*67e74705SXin Li                "public Q_SLOTS:\n"
1916*67e74705SXin Li                "  void f2() {}\n"
1917*67e74705SXin Li                "protected slots:\n"
1918*67e74705SXin Li                "  void f3() {}\n"
1919*67e74705SXin Li                "protected Q_SLOTS:\n"
1920*67e74705SXin Li                "  void f4() {}\n"
1921*67e74705SXin Li                "private slots:\n"
1922*67e74705SXin Li                "  void f5() {}\n"
1923*67e74705SXin Li                "private Q_SLOTS:\n"
1924*67e74705SXin Li                "  void f6() {}\n"
1925*67e74705SXin Li                "signals:\n"
1926*67e74705SXin Li                "  void g1();\n"
1927*67e74705SXin Li                "Q_SIGNALS:\n"
1928*67e74705SXin Li                "  void g2();\n"
1929*67e74705SXin Li                "};");
1930*67e74705SXin Li 
1931*67e74705SXin Li   // Don't interpret 'signals' the wrong way.
1932*67e74705SXin Li   verifyFormat("signals.set();");
1933*67e74705SXin Li   verifyFormat("for (Signals signals : f()) {\n}");
1934*67e74705SXin Li   verifyFormat("{\n"
1935*67e74705SXin Li                "  signals.set(); // This needs indentation.\n"
1936*67e74705SXin Li                "}");
1937*67e74705SXin Li }
1938*67e74705SXin Li 
TEST_F(FormatTest,SeparatesLogicalBlocks)1939*67e74705SXin Li TEST_F(FormatTest, SeparatesLogicalBlocks) {
1940*67e74705SXin Li   EXPECT_EQ("class A {\n"
1941*67e74705SXin Li             "public:\n"
1942*67e74705SXin Li             "  void f();\n"
1943*67e74705SXin Li             "\n"
1944*67e74705SXin Li             "private:\n"
1945*67e74705SXin Li             "  void g() {}\n"
1946*67e74705SXin Li             "  // test\n"
1947*67e74705SXin Li             "protected:\n"
1948*67e74705SXin Li             "  int h;\n"
1949*67e74705SXin Li             "};",
1950*67e74705SXin Li             format("class A {\n"
1951*67e74705SXin Li                    "public:\n"
1952*67e74705SXin Li                    "void f();\n"
1953*67e74705SXin Li                    "private:\n"
1954*67e74705SXin Li                    "void g() {}\n"
1955*67e74705SXin Li                    "// test\n"
1956*67e74705SXin Li                    "protected:\n"
1957*67e74705SXin Li                    "int h;\n"
1958*67e74705SXin Li                    "};"));
1959*67e74705SXin Li   EXPECT_EQ("class A {\n"
1960*67e74705SXin Li             "protected:\n"
1961*67e74705SXin Li             "public:\n"
1962*67e74705SXin Li             "  void f();\n"
1963*67e74705SXin Li             "};",
1964*67e74705SXin Li             format("class A {\n"
1965*67e74705SXin Li                    "protected:\n"
1966*67e74705SXin Li                    "\n"
1967*67e74705SXin Li                    "public:\n"
1968*67e74705SXin Li                    "\n"
1969*67e74705SXin Li                    "  void f();\n"
1970*67e74705SXin Li                    "};"));
1971*67e74705SXin Li 
1972*67e74705SXin Li   // Even ensure proper spacing inside macros.
1973*67e74705SXin Li   EXPECT_EQ("#define B     \\\n"
1974*67e74705SXin Li             "  class A {   \\\n"
1975*67e74705SXin Li             "   protected: \\\n"
1976*67e74705SXin Li             "   public:    \\\n"
1977*67e74705SXin Li             "    void f(); \\\n"
1978*67e74705SXin Li             "  };",
1979*67e74705SXin Li             format("#define B     \\\n"
1980*67e74705SXin Li                    "  class A {   \\\n"
1981*67e74705SXin Li                    "   protected: \\\n"
1982*67e74705SXin Li                    "              \\\n"
1983*67e74705SXin Li                    "   public:    \\\n"
1984*67e74705SXin Li                    "              \\\n"
1985*67e74705SXin Li                    "    void f(); \\\n"
1986*67e74705SXin Li                    "  };",
1987*67e74705SXin Li                    getGoogleStyle()));
1988*67e74705SXin Li   // But don't remove empty lines after macros ending in access specifiers.
1989*67e74705SXin Li   EXPECT_EQ("#define A private:\n"
1990*67e74705SXin Li             "\n"
1991*67e74705SXin Li             "int i;",
1992*67e74705SXin Li             format("#define A         private:\n"
1993*67e74705SXin Li                    "\n"
1994*67e74705SXin Li                    "int              i;"));
1995*67e74705SXin Li }
1996*67e74705SXin Li 
TEST_F(FormatTest,FormatsClasses)1997*67e74705SXin Li TEST_F(FormatTest, FormatsClasses) {
1998*67e74705SXin Li   verifyFormat("class A : public B {};");
1999*67e74705SXin Li   verifyFormat("class A : public ::B {};");
2000*67e74705SXin Li 
2001*67e74705SXin Li   verifyFormat(
2002*67e74705SXin Li       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
2003*67e74705SXin Li       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
2004*67e74705SXin Li   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2005*67e74705SXin Li                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
2006*67e74705SXin Li                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
2007*67e74705SXin Li   verifyFormat(
2008*67e74705SXin Li       "class A : public B, public C, public D, public E, public F {};");
2009*67e74705SXin Li   verifyFormat("class AAAAAAAAAAAA : public B,\n"
2010*67e74705SXin Li                "                     public C,\n"
2011*67e74705SXin Li                "                     public D,\n"
2012*67e74705SXin Li                "                     public E,\n"
2013*67e74705SXin Li                "                     public F,\n"
2014*67e74705SXin Li                "                     public G {};");
2015*67e74705SXin Li 
2016*67e74705SXin Li   verifyFormat("class\n"
2017*67e74705SXin Li                "    ReallyReallyLongClassName {\n"
2018*67e74705SXin Li                "  int i;\n"
2019*67e74705SXin Li                "};",
2020*67e74705SXin Li                getLLVMStyleWithColumns(32));
2021*67e74705SXin Li   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2022*67e74705SXin Li                "                           aaaaaaaaaaaaaaaa> {};");
2023*67e74705SXin Li   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2024*67e74705SXin Li                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2025*67e74705SXin Li                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
2026*67e74705SXin Li   verifyFormat("template <class R, class C>\n"
2027*67e74705SXin Li                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2028*67e74705SXin Li                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
2029*67e74705SXin Li   verifyFormat("class ::A::B {};");
2030*67e74705SXin Li }
2031*67e74705SXin Li 
TEST_F(FormatTest,FormatsVariableDeclarationsAfterStructOrClass)2032*67e74705SXin Li TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
2033*67e74705SXin Li   verifyFormat("class A {\n} a, b;");
2034*67e74705SXin Li   verifyFormat("struct A {\n} a, b;");
2035*67e74705SXin Li   verifyFormat("union A {\n} a;");
2036*67e74705SXin Li }
2037*67e74705SXin Li 
TEST_F(FormatTest,FormatsEnum)2038*67e74705SXin Li TEST_F(FormatTest, FormatsEnum) {
2039*67e74705SXin Li   verifyFormat("enum {\n"
2040*67e74705SXin Li                "  Zero,\n"
2041*67e74705SXin Li                "  One = 1,\n"
2042*67e74705SXin Li                "  Two = One + 1,\n"
2043*67e74705SXin Li                "  Three = (One + Two),\n"
2044*67e74705SXin Li                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2045*67e74705SXin Li                "  Five = (One, Two, Three, Four, 5)\n"
2046*67e74705SXin Li                "};");
2047*67e74705SXin Li   verifyGoogleFormat("enum {\n"
2048*67e74705SXin Li                      "  Zero,\n"
2049*67e74705SXin Li                      "  One = 1,\n"
2050*67e74705SXin Li                      "  Two = One + 1,\n"
2051*67e74705SXin Li                      "  Three = (One + Two),\n"
2052*67e74705SXin Li                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2053*67e74705SXin Li                      "  Five = (One, Two, Three, Four, 5)\n"
2054*67e74705SXin Li                      "};");
2055*67e74705SXin Li   verifyFormat("enum Enum {};");
2056*67e74705SXin Li   verifyFormat("enum {};");
2057*67e74705SXin Li   verifyFormat("enum X E {} d;");
2058*67e74705SXin Li   verifyFormat("enum __attribute__((...)) E {} d;");
2059*67e74705SXin Li   verifyFormat("enum __declspec__((...)) E {} d;");
2060*67e74705SXin Li   verifyFormat("enum {\n"
2061*67e74705SXin Li                "  Bar = Foo<int, int>::value\n"
2062*67e74705SXin Li                "};",
2063*67e74705SXin Li                getLLVMStyleWithColumns(30));
2064*67e74705SXin Li 
2065*67e74705SXin Li   verifyFormat("enum ShortEnum { A, B, C };");
2066*67e74705SXin Li   verifyGoogleFormat("enum ShortEnum { A, B, C };");
2067*67e74705SXin Li 
2068*67e74705SXin Li   EXPECT_EQ("enum KeepEmptyLines {\n"
2069*67e74705SXin Li             "  ONE,\n"
2070*67e74705SXin Li             "\n"
2071*67e74705SXin Li             "  TWO,\n"
2072*67e74705SXin Li             "\n"
2073*67e74705SXin Li             "  THREE\n"
2074*67e74705SXin Li             "}",
2075*67e74705SXin Li             format("enum KeepEmptyLines {\n"
2076*67e74705SXin Li                    "  ONE,\n"
2077*67e74705SXin Li                    "\n"
2078*67e74705SXin Li                    "  TWO,\n"
2079*67e74705SXin Li                    "\n"
2080*67e74705SXin Li                    "\n"
2081*67e74705SXin Li                    "  THREE\n"
2082*67e74705SXin Li                    "}"));
2083*67e74705SXin Li   verifyFormat("enum E { // comment\n"
2084*67e74705SXin Li                "  ONE,\n"
2085*67e74705SXin Li                "  TWO\n"
2086*67e74705SXin Li                "};\n"
2087*67e74705SXin Li                "int i;");
2088*67e74705SXin Li   // Not enums.
2089*67e74705SXin Li   verifyFormat("enum X f() {\n"
2090*67e74705SXin Li                "  a();\n"
2091*67e74705SXin Li                "  return 42;\n"
2092*67e74705SXin Li                "}");
2093*67e74705SXin Li   verifyFormat("enum X Type::f() {\n"
2094*67e74705SXin Li                "  a();\n"
2095*67e74705SXin Li                "  return 42;\n"
2096*67e74705SXin Li                "}");
2097*67e74705SXin Li   verifyFormat("enum ::X f() {\n"
2098*67e74705SXin Li                "  a();\n"
2099*67e74705SXin Li                "  return 42;\n"
2100*67e74705SXin Li                "}");
2101*67e74705SXin Li   verifyFormat("enum ns::X f() {\n"
2102*67e74705SXin Li                "  a();\n"
2103*67e74705SXin Li                "  return 42;\n"
2104*67e74705SXin Li                "}");
2105*67e74705SXin Li }
2106*67e74705SXin Li 
TEST_F(FormatTest,FormatsEnumsWithErrors)2107*67e74705SXin Li TEST_F(FormatTest, FormatsEnumsWithErrors) {
2108*67e74705SXin Li   verifyFormat("enum Type {\n"
2109*67e74705SXin Li                "  One = 0; // These semicolons should be commas.\n"
2110*67e74705SXin Li                "  Two = 1;\n"
2111*67e74705SXin Li                "};");
2112*67e74705SXin Li   verifyFormat("namespace n {\n"
2113*67e74705SXin Li                "enum Type {\n"
2114*67e74705SXin Li                "  One,\n"
2115*67e74705SXin Li                "  Two, // missing };\n"
2116*67e74705SXin Li                "  int i;\n"
2117*67e74705SXin Li                "}\n"
2118*67e74705SXin Li                "void g() {}");
2119*67e74705SXin Li }
2120*67e74705SXin Li 
TEST_F(FormatTest,FormatsEnumStruct)2121*67e74705SXin Li TEST_F(FormatTest, FormatsEnumStruct) {
2122*67e74705SXin Li   verifyFormat("enum struct {\n"
2123*67e74705SXin Li                "  Zero,\n"
2124*67e74705SXin Li                "  One = 1,\n"
2125*67e74705SXin Li                "  Two = One + 1,\n"
2126*67e74705SXin Li                "  Three = (One + Two),\n"
2127*67e74705SXin Li                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2128*67e74705SXin Li                "  Five = (One, Two, Three, Four, 5)\n"
2129*67e74705SXin Li                "};");
2130*67e74705SXin Li   verifyFormat("enum struct Enum {};");
2131*67e74705SXin Li   verifyFormat("enum struct {};");
2132*67e74705SXin Li   verifyFormat("enum struct X E {} d;");
2133*67e74705SXin Li   verifyFormat("enum struct __attribute__((...)) E {} d;");
2134*67e74705SXin Li   verifyFormat("enum struct __declspec__((...)) E {} d;");
2135*67e74705SXin Li   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
2136*67e74705SXin Li }
2137*67e74705SXin Li 
TEST_F(FormatTest,FormatsEnumClass)2138*67e74705SXin Li TEST_F(FormatTest, FormatsEnumClass) {
2139*67e74705SXin Li   verifyFormat("enum class {\n"
2140*67e74705SXin Li                "  Zero,\n"
2141*67e74705SXin Li                "  One = 1,\n"
2142*67e74705SXin Li                "  Two = One + 1,\n"
2143*67e74705SXin Li                "  Three = (One + Two),\n"
2144*67e74705SXin Li                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2145*67e74705SXin Li                "  Five = (One, Two, Three, Four, 5)\n"
2146*67e74705SXin Li                "};");
2147*67e74705SXin Li   verifyFormat("enum class Enum {};");
2148*67e74705SXin Li   verifyFormat("enum class {};");
2149*67e74705SXin Li   verifyFormat("enum class X E {} d;");
2150*67e74705SXin Li   verifyFormat("enum class __attribute__((...)) E {} d;");
2151*67e74705SXin Li   verifyFormat("enum class __declspec__((...)) E {} d;");
2152*67e74705SXin Li   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
2153*67e74705SXin Li }
2154*67e74705SXin Li 
TEST_F(FormatTest,FormatsEnumTypes)2155*67e74705SXin Li TEST_F(FormatTest, FormatsEnumTypes) {
2156*67e74705SXin Li   verifyFormat("enum X : int {\n"
2157*67e74705SXin Li                "  A, // Force multiple lines.\n"
2158*67e74705SXin Li                "  B\n"
2159*67e74705SXin Li                "};");
2160*67e74705SXin Li   verifyFormat("enum X : int { A, B };");
2161*67e74705SXin Li   verifyFormat("enum X : std::uint32_t { A, B };");
2162*67e74705SXin Li }
2163*67e74705SXin Li 
TEST_F(FormatTest,FormatsNSEnums)2164*67e74705SXin Li TEST_F(FormatTest, FormatsNSEnums) {
2165*67e74705SXin Li   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2166*67e74705SXin Li   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2167*67e74705SXin Li                      "  // Information about someDecentlyLongValue.\n"
2168*67e74705SXin Li                      "  someDecentlyLongValue,\n"
2169*67e74705SXin Li                      "  // Information about anotherDecentlyLongValue.\n"
2170*67e74705SXin Li                      "  anotherDecentlyLongValue,\n"
2171*67e74705SXin Li                      "  // Information about aThirdDecentlyLongValue.\n"
2172*67e74705SXin Li                      "  aThirdDecentlyLongValue\n"
2173*67e74705SXin Li                      "};");
2174*67e74705SXin Li   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2175*67e74705SXin Li                      "  a = 1,\n"
2176*67e74705SXin Li                      "  b = 2,\n"
2177*67e74705SXin Li                      "  c = 3,\n"
2178*67e74705SXin Li                      "};");
2179*67e74705SXin Li   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2180*67e74705SXin Li                      "  a = 1,\n"
2181*67e74705SXin Li                      "  b = 2,\n"
2182*67e74705SXin Li                      "  c = 3,\n"
2183*67e74705SXin Li                      "};");
2184*67e74705SXin Li   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2185*67e74705SXin Li                      "  a = 1,\n"
2186*67e74705SXin Li                      "  b = 2,\n"
2187*67e74705SXin Li                      "  c = 3,\n"
2188*67e74705SXin Li                      "};");
2189*67e74705SXin Li }
2190*67e74705SXin Li 
TEST_F(FormatTest,FormatsBitfields)2191*67e74705SXin Li TEST_F(FormatTest, FormatsBitfields) {
2192*67e74705SXin Li   verifyFormat("struct Bitfields {\n"
2193*67e74705SXin Li                "  unsigned sClass : 8;\n"
2194*67e74705SXin Li                "  unsigned ValueKind : 2;\n"
2195*67e74705SXin Li                "};");
2196*67e74705SXin Li   verifyFormat("struct A {\n"
2197*67e74705SXin Li                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2198*67e74705SXin Li                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2199*67e74705SXin Li                "};");
2200*67e74705SXin Li   verifyFormat("struct MyStruct {\n"
2201*67e74705SXin Li                "  uchar data;\n"
2202*67e74705SXin Li                "  uchar : 8;\n"
2203*67e74705SXin Li                "  uchar : 8;\n"
2204*67e74705SXin Li                "  uchar other;\n"
2205*67e74705SXin Li                "};");
2206*67e74705SXin Li }
2207*67e74705SXin Li 
TEST_F(FormatTest,FormatsNamespaces)2208*67e74705SXin Li TEST_F(FormatTest, FormatsNamespaces) {
2209*67e74705SXin Li   verifyFormat("namespace some_namespace {\n"
2210*67e74705SXin Li                "class A {};\n"
2211*67e74705SXin Li                "void f() { f(); }\n"
2212*67e74705SXin Li                "}");
2213*67e74705SXin Li   verifyFormat("namespace {\n"
2214*67e74705SXin Li                "class A {};\n"
2215*67e74705SXin Li                "void f() { f(); }\n"
2216*67e74705SXin Li                "}");
2217*67e74705SXin Li   verifyFormat("inline namespace X {\n"
2218*67e74705SXin Li                "class A {};\n"
2219*67e74705SXin Li                "void f() { f(); }\n"
2220*67e74705SXin Li                "}");
2221*67e74705SXin Li   verifyFormat("using namespace some_namespace;\n"
2222*67e74705SXin Li                "class A {};\n"
2223*67e74705SXin Li                "void f() { f(); }");
2224*67e74705SXin Li 
2225*67e74705SXin Li   // This code is more common than we thought; if we
2226*67e74705SXin Li   // layout this correctly the semicolon will go into
2227*67e74705SXin Li   // its own line, which is undesirable.
2228*67e74705SXin Li   verifyFormat("namespace {};");
2229*67e74705SXin Li   verifyFormat("namespace {\n"
2230*67e74705SXin Li                "class A {};\n"
2231*67e74705SXin Li                "};");
2232*67e74705SXin Li 
2233*67e74705SXin Li   verifyFormat("namespace {\n"
2234*67e74705SXin Li                "int SomeVariable = 0; // comment\n"
2235*67e74705SXin Li                "} // namespace");
2236*67e74705SXin Li   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2237*67e74705SXin Li             "#define HEADER_GUARD\n"
2238*67e74705SXin Li             "namespace my_namespace {\n"
2239*67e74705SXin Li             "int i;\n"
2240*67e74705SXin Li             "} // my_namespace\n"
2241*67e74705SXin Li             "#endif // HEADER_GUARD",
2242*67e74705SXin Li             format("#ifndef HEADER_GUARD\n"
2243*67e74705SXin Li                    " #define HEADER_GUARD\n"
2244*67e74705SXin Li                    "   namespace my_namespace {\n"
2245*67e74705SXin Li                    "int i;\n"
2246*67e74705SXin Li                    "}    // my_namespace\n"
2247*67e74705SXin Li                    "#endif    // HEADER_GUARD"));
2248*67e74705SXin Li 
2249*67e74705SXin Li   EXPECT_EQ("namespace A::B {\n"
2250*67e74705SXin Li             "class C {};\n"
2251*67e74705SXin Li             "}",
2252*67e74705SXin Li             format("namespace A::B {\n"
2253*67e74705SXin Li                    "class C {};\n"
2254*67e74705SXin Li                    "}"));
2255*67e74705SXin Li 
2256*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
2257*67e74705SXin Li   Style.NamespaceIndentation = FormatStyle::NI_All;
2258*67e74705SXin Li   EXPECT_EQ("namespace out {\n"
2259*67e74705SXin Li             "  int i;\n"
2260*67e74705SXin Li             "  namespace in {\n"
2261*67e74705SXin Li             "    int i;\n"
2262*67e74705SXin Li             "  } // namespace\n"
2263*67e74705SXin Li             "} // namespace",
2264*67e74705SXin Li             format("namespace out {\n"
2265*67e74705SXin Li                    "int i;\n"
2266*67e74705SXin Li                    "namespace in {\n"
2267*67e74705SXin Li                    "int i;\n"
2268*67e74705SXin Li                    "} // namespace\n"
2269*67e74705SXin Li                    "} // namespace",
2270*67e74705SXin Li                    Style));
2271*67e74705SXin Li 
2272*67e74705SXin Li   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2273*67e74705SXin Li   EXPECT_EQ("namespace out {\n"
2274*67e74705SXin Li             "int i;\n"
2275*67e74705SXin Li             "namespace in {\n"
2276*67e74705SXin Li             "  int i;\n"
2277*67e74705SXin Li             "} // namespace\n"
2278*67e74705SXin Li             "} // namespace",
2279*67e74705SXin Li             format("namespace out {\n"
2280*67e74705SXin Li                    "int i;\n"
2281*67e74705SXin Li                    "namespace in {\n"
2282*67e74705SXin Li                    "int i;\n"
2283*67e74705SXin Li                    "} // namespace\n"
2284*67e74705SXin Li                    "} // namespace",
2285*67e74705SXin Li                    Style));
2286*67e74705SXin Li }
2287*67e74705SXin Li 
TEST_F(FormatTest,FormatsExternC)2288*67e74705SXin Li TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
2289*67e74705SXin Li 
TEST_F(FormatTest,FormatsInlineASM)2290*67e74705SXin Li TEST_F(FormatTest, FormatsInlineASM) {
2291*67e74705SXin Li   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2292*67e74705SXin Li   verifyFormat("asm(\"nop\" ::: \"memory\");");
2293*67e74705SXin Li   verifyFormat(
2294*67e74705SXin Li       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2295*67e74705SXin Li       "    \"cpuid\\n\\t\"\n"
2296*67e74705SXin Li       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2297*67e74705SXin Li       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2298*67e74705SXin Li       "    : \"a\"(value));");
2299*67e74705SXin Li   EXPECT_EQ(
2300*67e74705SXin Li       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2301*67e74705SXin Li       "  __asm {\n"
2302*67e74705SXin Li       "        mov     edx,[that] // vtable in edx\n"
2303*67e74705SXin Li       "        mov     eax,methodIndex\n"
2304*67e74705SXin Li       "        call    [edx][eax*4] // stdcall\n"
2305*67e74705SXin Li       "  }\n"
2306*67e74705SXin Li       "}",
2307*67e74705SXin Li       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2308*67e74705SXin Li              "    __asm {\n"
2309*67e74705SXin Li              "        mov     edx,[that] // vtable in edx\n"
2310*67e74705SXin Li              "        mov     eax,methodIndex\n"
2311*67e74705SXin Li              "        call    [edx][eax*4] // stdcall\n"
2312*67e74705SXin Li              "    }\n"
2313*67e74705SXin Li              "}"));
2314*67e74705SXin Li   EXPECT_EQ("_asm {\n"
2315*67e74705SXin Li             "  xor eax, eax;\n"
2316*67e74705SXin Li             "  cpuid;\n"
2317*67e74705SXin Li             "}",
2318*67e74705SXin Li             format("_asm {\n"
2319*67e74705SXin Li                    "  xor eax, eax;\n"
2320*67e74705SXin Li                    "  cpuid;\n"
2321*67e74705SXin Li                    "}"));
2322*67e74705SXin Li   verifyFormat("void function() {\n"
2323*67e74705SXin Li                "  // comment\n"
2324*67e74705SXin Li                "  asm(\"\");\n"
2325*67e74705SXin Li                "}");
2326*67e74705SXin Li   EXPECT_EQ("__asm {\n"
2327*67e74705SXin Li             "}\n"
2328*67e74705SXin Li             "int i;",
2329*67e74705SXin Li             format("__asm   {\n"
2330*67e74705SXin Li                    "}\n"
2331*67e74705SXin Li                    "int   i;"));
2332*67e74705SXin Li }
2333*67e74705SXin Li 
TEST_F(FormatTest,FormatTryCatch)2334*67e74705SXin Li TEST_F(FormatTest, FormatTryCatch) {
2335*67e74705SXin Li   verifyFormat("try {\n"
2336*67e74705SXin Li                "  throw a * b;\n"
2337*67e74705SXin Li                "} catch (int a) {\n"
2338*67e74705SXin Li                "  // Do nothing.\n"
2339*67e74705SXin Li                "} catch (...) {\n"
2340*67e74705SXin Li                "  exit(42);\n"
2341*67e74705SXin Li                "}");
2342*67e74705SXin Li 
2343*67e74705SXin Li   // Function-level try statements.
2344*67e74705SXin Li   verifyFormat("int f() try { return 4; } catch (...) {\n"
2345*67e74705SXin Li                "  return 5;\n"
2346*67e74705SXin Li                "}");
2347*67e74705SXin Li   verifyFormat("class A {\n"
2348*67e74705SXin Li                "  int a;\n"
2349*67e74705SXin Li                "  A() try : a(0) {\n"
2350*67e74705SXin Li                "  } catch (...) {\n"
2351*67e74705SXin Li                "    throw;\n"
2352*67e74705SXin Li                "  }\n"
2353*67e74705SXin Li                "};\n");
2354*67e74705SXin Li 
2355*67e74705SXin Li   // Incomplete try-catch blocks.
2356*67e74705SXin Li   verifyIncompleteFormat("try {} catch (");
2357*67e74705SXin Li }
2358*67e74705SXin Li 
TEST_F(FormatTest,FormatSEHTryCatch)2359*67e74705SXin Li TEST_F(FormatTest, FormatSEHTryCatch) {
2360*67e74705SXin Li   verifyFormat("__try {\n"
2361*67e74705SXin Li                "  int a = b * c;\n"
2362*67e74705SXin Li                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2363*67e74705SXin Li                "  // Do nothing.\n"
2364*67e74705SXin Li                "}");
2365*67e74705SXin Li 
2366*67e74705SXin Li   verifyFormat("__try {\n"
2367*67e74705SXin Li                "  int a = b * c;\n"
2368*67e74705SXin Li                "} __finally {\n"
2369*67e74705SXin Li                "  // Do nothing.\n"
2370*67e74705SXin Li                "}");
2371*67e74705SXin Li 
2372*67e74705SXin Li   verifyFormat("DEBUG({\n"
2373*67e74705SXin Li                "  __try {\n"
2374*67e74705SXin Li                "  } __finally {\n"
2375*67e74705SXin Li                "  }\n"
2376*67e74705SXin Li                "});\n");
2377*67e74705SXin Li }
2378*67e74705SXin Li 
TEST_F(FormatTest,IncompleteTryCatchBlocks)2379*67e74705SXin Li TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2380*67e74705SXin Li   verifyFormat("try {\n"
2381*67e74705SXin Li                "  f();\n"
2382*67e74705SXin Li                "} catch {\n"
2383*67e74705SXin Li                "  g();\n"
2384*67e74705SXin Li                "}");
2385*67e74705SXin Li   verifyFormat("try {\n"
2386*67e74705SXin Li                "  f();\n"
2387*67e74705SXin Li                "} catch (A a) MACRO(x) {\n"
2388*67e74705SXin Li                "  g();\n"
2389*67e74705SXin Li                "} catch (B b) MACRO(x) {\n"
2390*67e74705SXin Li                "  g();\n"
2391*67e74705SXin Li                "}");
2392*67e74705SXin Li }
2393*67e74705SXin Li 
TEST_F(FormatTest,FormatTryCatchBraceStyles)2394*67e74705SXin Li TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2395*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
2396*67e74705SXin Li   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2397*67e74705SXin Li                           FormatStyle::BS_WebKit}) {
2398*67e74705SXin Li     Style.BreakBeforeBraces = BraceStyle;
2399*67e74705SXin Li     verifyFormat("try {\n"
2400*67e74705SXin Li                  "  // something\n"
2401*67e74705SXin Li                  "} catch (...) {\n"
2402*67e74705SXin Li                  "  // something\n"
2403*67e74705SXin Li                  "}",
2404*67e74705SXin Li                  Style);
2405*67e74705SXin Li   }
2406*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2407*67e74705SXin Li   verifyFormat("try {\n"
2408*67e74705SXin Li                "  // something\n"
2409*67e74705SXin Li                "}\n"
2410*67e74705SXin Li                "catch (...) {\n"
2411*67e74705SXin Li                "  // something\n"
2412*67e74705SXin Li                "}",
2413*67e74705SXin Li                Style);
2414*67e74705SXin Li   verifyFormat("__try {\n"
2415*67e74705SXin Li                "  // something\n"
2416*67e74705SXin Li                "}\n"
2417*67e74705SXin Li                "__finally {\n"
2418*67e74705SXin Li                "  // something\n"
2419*67e74705SXin Li                "}",
2420*67e74705SXin Li                Style);
2421*67e74705SXin Li   verifyFormat("@try {\n"
2422*67e74705SXin Li                "  // something\n"
2423*67e74705SXin Li                "}\n"
2424*67e74705SXin Li                "@finally {\n"
2425*67e74705SXin Li                "  // something\n"
2426*67e74705SXin Li                "}",
2427*67e74705SXin Li                Style);
2428*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2429*67e74705SXin Li   verifyFormat("try\n"
2430*67e74705SXin Li                "{\n"
2431*67e74705SXin Li                "  // something\n"
2432*67e74705SXin Li                "}\n"
2433*67e74705SXin Li                "catch (...)\n"
2434*67e74705SXin Li                "{\n"
2435*67e74705SXin Li                "  // something\n"
2436*67e74705SXin Li                "}",
2437*67e74705SXin Li                Style);
2438*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2439*67e74705SXin Li   verifyFormat("try\n"
2440*67e74705SXin Li                "  {\n"
2441*67e74705SXin Li                "    // something\n"
2442*67e74705SXin Li                "  }\n"
2443*67e74705SXin Li                "catch (...)\n"
2444*67e74705SXin Li                "  {\n"
2445*67e74705SXin Li                "    // something\n"
2446*67e74705SXin Li                "  }",
2447*67e74705SXin Li                Style);
2448*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2449*67e74705SXin Li   Style.BraceWrapping.BeforeCatch = true;
2450*67e74705SXin Li   verifyFormat("try {\n"
2451*67e74705SXin Li                "  // something\n"
2452*67e74705SXin Li                "}\n"
2453*67e74705SXin Li                "catch (...) {\n"
2454*67e74705SXin Li                "  // something\n"
2455*67e74705SXin Li                "}",
2456*67e74705SXin Li                Style);
2457*67e74705SXin Li }
2458*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCTryCatch)2459*67e74705SXin Li TEST_F(FormatTest, FormatObjCTryCatch) {
2460*67e74705SXin Li   verifyFormat("@try {\n"
2461*67e74705SXin Li                "  f();\n"
2462*67e74705SXin Li                "} @catch (NSException e) {\n"
2463*67e74705SXin Li                "  @throw;\n"
2464*67e74705SXin Li                "} @finally {\n"
2465*67e74705SXin Li                "  exit(42);\n"
2466*67e74705SXin Li                "}");
2467*67e74705SXin Li   verifyFormat("DEBUG({\n"
2468*67e74705SXin Li                "  @try {\n"
2469*67e74705SXin Li                "  } @finally {\n"
2470*67e74705SXin Li                "  }\n"
2471*67e74705SXin Li                "});\n");
2472*67e74705SXin Li }
2473*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCAutoreleasepool)2474*67e74705SXin Li TEST_F(FormatTest, FormatObjCAutoreleasepool) {
2475*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
2476*67e74705SXin Li   verifyFormat("@autoreleasepool {\n"
2477*67e74705SXin Li                "  f();\n"
2478*67e74705SXin Li                "}\n"
2479*67e74705SXin Li                "@autoreleasepool {\n"
2480*67e74705SXin Li                "  f();\n"
2481*67e74705SXin Li                "}\n",
2482*67e74705SXin Li                Style);
2483*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2484*67e74705SXin Li   verifyFormat("@autoreleasepool\n"
2485*67e74705SXin Li                "{\n"
2486*67e74705SXin Li                "  f();\n"
2487*67e74705SXin Li                "}\n"
2488*67e74705SXin Li                "@autoreleasepool\n"
2489*67e74705SXin Li                "{\n"
2490*67e74705SXin Li                "  f();\n"
2491*67e74705SXin Li                "}\n",
2492*67e74705SXin Li                Style);
2493*67e74705SXin Li }
2494*67e74705SXin Li 
TEST_F(FormatTest,StaticInitializers)2495*67e74705SXin Li TEST_F(FormatTest, StaticInitializers) {
2496*67e74705SXin Li   verifyFormat("static SomeClass SC = {1, 'a'};");
2497*67e74705SXin Li 
2498*67e74705SXin Li   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2499*67e74705SXin Li                "    100000000, "
2500*67e74705SXin Li                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2501*67e74705SXin Li 
2502*67e74705SXin Li   // Here, everything other than the "}" would fit on a line.
2503*67e74705SXin Li   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2504*67e74705SXin Li                "    10000000000000000000000000};");
2505*67e74705SXin Li   EXPECT_EQ("S s = {a,\n"
2506*67e74705SXin Li             "\n"
2507*67e74705SXin Li             "       b};",
2508*67e74705SXin Li             format("S s = {\n"
2509*67e74705SXin Li                    "  a,\n"
2510*67e74705SXin Li                    "\n"
2511*67e74705SXin Li                    "  b\n"
2512*67e74705SXin Li                    "};"));
2513*67e74705SXin Li 
2514*67e74705SXin Li   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2515*67e74705SXin Li   // line. However, the formatting looks a bit off and this probably doesn't
2516*67e74705SXin Li   // happen often in practice.
2517*67e74705SXin Li   verifyFormat("static int Variable[1] = {\n"
2518*67e74705SXin Li                "    {1000000000000000000000000000000000000}};",
2519*67e74705SXin Li                getLLVMStyleWithColumns(40));
2520*67e74705SXin Li }
2521*67e74705SXin Li 
TEST_F(FormatTest,DesignatedInitializers)2522*67e74705SXin Li TEST_F(FormatTest, DesignatedInitializers) {
2523*67e74705SXin Li   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2524*67e74705SXin Li   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2525*67e74705SXin Li                "                    .bbbbbbbbbb = 2,\n"
2526*67e74705SXin Li                "                    .cccccccccc = 3,\n"
2527*67e74705SXin Li                "                    .dddddddddd = 4,\n"
2528*67e74705SXin Li                "                    .eeeeeeeeee = 5};");
2529*67e74705SXin Li   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2530*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2531*67e74705SXin Li                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2532*67e74705SXin Li                "    .ccccccccccccccccccccccccccc = 3,\n"
2533*67e74705SXin Li                "    .ddddddddddddddddddddddddddd = 4,\n"
2534*67e74705SXin Li                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2535*67e74705SXin Li 
2536*67e74705SXin Li   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2537*67e74705SXin Li }
2538*67e74705SXin Li 
TEST_F(FormatTest,NestedStaticInitializers)2539*67e74705SXin Li TEST_F(FormatTest, NestedStaticInitializers) {
2540*67e74705SXin Li   verifyFormat("static A x = {{{}}};\n");
2541*67e74705SXin Li   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2542*67e74705SXin Li                "               {init1, init2, init3, init4}}};",
2543*67e74705SXin Li                getLLVMStyleWithColumns(50));
2544*67e74705SXin Li 
2545*67e74705SXin Li   verifyFormat("somes Status::global_reps[3] = {\n"
2546*67e74705SXin Li                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2547*67e74705SXin Li                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2548*67e74705SXin Li                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2549*67e74705SXin Li                getLLVMStyleWithColumns(60));
2550*67e74705SXin Li   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2551*67e74705SXin Li                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2552*67e74705SXin Li                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2553*67e74705SXin Li                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2554*67e74705SXin Li   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2555*67e74705SXin Li                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2556*67e74705SXin Li                "rect.fTop}};");
2557*67e74705SXin Li 
2558*67e74705SXin Li   verifyFormat(
2559*67e74705SXin Li       "SomeArrayOfSomeType a = {\n"
2560*67e74705SXin Li       "    {{1, 2, 3},\n"
2561*67e74705SXin Li       "     {1, 2, 3},\n"
2562*67e74705SXin Li       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2563*67e74705SXin Li       "      333333333333333333333333333333},\n"
2564*67e74705SXin Li       "     {1, 2, 3},\n"
2565*67e74705SXin Li       "     {1, 2, 3}}};");
2566*67e74705SXin Li   verifyFormat(
2567*67e74705SXin Li       "SomeArrayOfSomeType a = {\n"
2568*67e74705SXin Li       "    {{1, 2, 3}},\n"
2569*67e74705SXin Li       "    {{1, 2, 3}},\n"
2570*67e74705SXin Li       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2571*67e74705SXin Li       "      333333333333333333333333333333}},\n"
2572*67e74705SXin Li       "    {{1, 2, 3}},\n"
2573*67e74705SXin Li       "    {{1, 2, 3}}};");
2574*67e74705SXin Li 
2575*67e74705SXin Li   verifyFormat("struct {\n"
2576*67e74705SXin Li                "  unsigned bit;\n"
2577*67e74705SXin Li                "  const char *const name;\n"
2578*67e74705SXin Li                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2579*67e74705SXin Li                "                 {kOsWin, \"Windows\"},\n"
2580*67e74705SXin Li                "                 {kOsLinux, \"Linux\"},\n"
2581*67e74705SXin Li                "                 {kOsCrOS, \"Chrome OS\"}};");
2582*67e74705SXin Li   verifyFormat("struct {\n"
2583*67e74705SXin Li                "  unsigned bit;\n"
2584*67e74705SXin Li                "  const char *const name;\n"
2585*67e74705SXin Li                "} kBitsToOs[] = {\n"
2586*67e74705SXin Li                "    {kOsMac, \"Mac\"},\n"
2587*67e74705SXin Li                "    {kOsWin, \"Windows\"},\n"
2588*67e74705SXin Li                "    {kOsLinux, \"Linux\"},\n"
2589*67e74705SXin Li                "    {kOsCrOS, \"Chrome OS\"},\n"
2590*67e74705SXin Li                "};");
2591*67e74705SXin Li }
2592*67e74705SXin Li 
TEST_F(FormatTest,FormatsSmallMacroDefinitionsInSingleLine)2593*67e74705SXin Li TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2594*67e74705SXin Li   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2595*67e74705SXin Li                "                      \\\n"
2596*67e74705SXin Li                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2597*67e74705SXin Li }
2598*67e74705SXin Li 
TEST_F(FormatTest,DoesNotBreakPureVirtualFunctionDefinition)2599*67e74705SXin Li TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2600*67e74705SXin Li   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2601*67e74705SXin Li                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2602*67e74705SXin Li 
2603*67e74705SXin Li   // Do break defaulted and deleted functions.
2604*67e74705SXin Li   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2605*67e74705SXin Li                "    default;",
2606*67e74705SXin Li                getLLVMStyleWithColumns(40));
2607*67e74705SXin Li   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2608*67e74705SXin Li                "    delete;",
2609*67e74705SXin Li                getLLVMStyleWithColumns(40));
2610*67e74705SXin Li }
2611*67e74705SXin Li 
TEST_F(FormatTest,BreaksStringLiteralsOnlyInDefine)2612*67e74705SXin Li TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2613*67e74705SXin Li   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2614*67e74705SXin Li                getLLVMStyleWithColumns(40));
2615*67e74705SXin Li   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2616*67e74705SXin Li                getLLVMStyleWithColumns(40));
2617*67e74705SXin Li   EXPECT_EQ("#define Q                              \\\n"
2618*67e74705SXin Li             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2619*67e74705SXin Li             "  \"aaaaaaaa.cpp\"",
2620*67e74705SXin Li             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2621*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
2622*67e74705SXin Li }
2623*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsLinePPDirective)2624*67e74705SXin Li TEST_F(FormatTest, UnderstandsLinePPDirective) {
2625*67e74705SXin Li   EXPECT_EQ("# 123 \"A string literal\"",
2626*67e74705SXin Li             format("   #     123    \"A string literal\""));
2627*67e74705SXin Li }
2628*67e74705SXin Li 
TEST_F(FormatTest,LayoutUnknownPPDirective)2629*67e74705SXin Li TEST_F(FormatTest, LayoutUnknownPPDirective) {
2630*67e74705SXin Li   EXPECT_EQ("#;", format("#;"));
2631*67e74705SXin Li   verifyFormat("#\n;\n;\n;");
2632*67e74705SXin Li }
2633*67e74705SXin Li 
TEST_F(FormatTest,UnescapedEndOfLineEndsPPDirective)2634*67e74705SXin Li TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2635*67e74705SXin Li   EXPECT_EQ("#line 42 \"test\"\n",
2636*67e74705SXin Li             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2637*67e74705SXin Li   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2638*67e74705SXin Li                                     getLLVMStyleWithColumns(12)));
2639*67e74705SXin Li }
2640*67e74705SXin Li 
TEST_F(FormatTest,EndOfFileEndsPPDirective)2641*67e74705SXin Li TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2642*67e74705SXin Li   EXPECT_EQ("#line 42 \"test\"",
2643*67e74705SXin Li             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2644*67e74705SXin Li   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2645*67e74705SXin Li }
2646*67e74705SXin Li 
TEST_F(FormatTest,DoesntRemoveUnknownTokens)2647*67e74705SXin Li TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2648*67e74705SXin Li   verifyFormat("#define A \\x20");
2649*67e74705SXin Li   verifyFormat("#define A \\ x20");
2650*67e74705SXin Li   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2651*67e74705SXin Li   verifyFormat("#define A ''");
2652*67e74705SXin Li   verifyFormat("#define A ''qqq");
2653*67e74705SXin Li   verifyFormat("#define A `qqq");
2654*67e74705SXin Li   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2655*67e74705SXin Li   EXPECT_EQ("const char *c = STRINGIFY(\n"
2656*67e74705SXin Li             "\\na : b);",
2657*67e74705SXin Li             format("const char * c = STRINGIFY(\n"
2658*67e74705SXin Li                    "\\na : b);"));
2659*67e74705SXin Li 
2660*67e74705SXin Li   verifyFormat("a\r\\");
2661*67e74705SXin Li   verifyFormat("a\v\\");
2662*67e74705SXin Li   verifyFormat("a\f\\");
2663*67e74705SXin Li }
2664*67e74705SXin Li 
TEST_F(FormatTest,IndentsPPDirectiveInReducedSpace)2665*67e74705SXin Li TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2666*67e74705SXin Li   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2667*67e74705SXin Li   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2668*67e74705SXin Li   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2669*67e74705SXin Li   // FIXME: We never break before the macro name.
2670*67e74705SXin Li   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2671*67e74705SXin Li 
2672*67e74705SXin Li   verifyFormat("#define A A\n#define A A");
2673*67e74705SXin Li   verifyFormat("#define A(X) A\n#define A A");
2674*67e74705SXin Li 
2675*67e74705SXin Li   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2676*67e74705SXin Li   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2677*67e74705SXin Li }
2678*67e74705SXin Li 
TEST_F(FormatTest,HandlePreprocessorDirectiveContext)2679*67e74705SXin Li TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2680*67e74705SXin Li   EXPECT_EQ("// somecomment\n"
2681*67e74705SXin Li             "#include \"a.h\"\n"
2682*67e74705SXin Li             "#define A(  \\\n"
2683*67e74705SXin Li             "    A, B)\n"
2684*67e74705SXin Li             "#include \"b.h\"\n"
2685*67e74705SXin Li             "// somecomment\n",
2686*67e74705SXin Li             format("  // somecomment\n"
2687*67e74705SXin Li                    "  #include \"a.h\"\n"
2688*67e74705SXin Li                    "#define A(A,\\\n"
2689*67e74705SXin Li                    "    B)\n"
2690*67e74705SXin Li                    "    #include \"b.h\"\n"
2691*67e74705SXin Li                    " // somecomment\n",
2692*67e74705SXin Li                    getLLVMStyleWithColumns(13)));
2693*67e74705SXin Li }
2694*67e74705SXin Li 
TEST_F(FormatTest,LayoutSingleHash)2695*67e74705SXin Li TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2696*67e74705SXin Li 
TEST_F(FormatTest,LayoutCodeInMacroDefinitions)2697*67e74705SXin Li TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2698*67e74705SXin Li   EXPECT_EQ("#define A    \\\n"
2699*67e74705SXin Li             "  c;         \\\n"
2700*67e74705SXin Li             "  e;\n"
2701*67e74705SXin Li             "f;",
2702*67e74705SXin Li             format("#define A c; e;\n"
2703*67e74705SXin Li                    "f;",
2704*67e74705SXin Li                    getLLVMStyleWithColumns(14)));
2705*67e74705SXin Li }
2706*67e74705SXin Li 
TEST_F(FormatTest,LayoutRemainingTokens)2707*67e74705SXin Li TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2708*67e74705SXin Li 
TEST_F(FormatTest,MacroDefinitionInsideStatement)2709*67e74705SXin Li TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2710*67e74705SXin Li   EXPECT_EQ("int x,\n"
2711*67e74705SXin Li             "#define A\n"
2712*67e74705SXin Li             "    y;",
2713*67e74705SXin Li             format("int x,\n#define A\ny;"));
2714*67e74705SXin Li }
2715*67e74705SXin Li 
TEST_F(FormatTest,HashInMacroDefinition)2716*67e74705SXin Li TEST_F(FormatTest, HashInMacroDefinition) {
2717*67e74705SXin Li   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2718*67e74705SXin Li   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2719*67e74705SXin Li   verifyFormat("#define A  \\\n"
2720*67e74705SXin Li                "  {        \\\n"
2721*67e74705SXin Li                "    f(#c); \\\n"
2722*67e74705SXin Li                "  }",
2723*67e74705SXin Li                getLLVMStyleWithColumns(11));
2724*67e74705SXin Li 
2725*67e74705SXin Li   verifyFormat("#define A(X)         \\\n"
2726*67e74705SXin Li                "  void function##X()",
2727*67e74705SXin Li                getLLVMStyleWithColumns(22));
2728*67e74705SXin Li 
2729*67e74705SXin Li   verifyFormat("#define A(a, b, c)   \\\n"
2730*67e74705SXin Li                "  void a##b##c()",
2731*67e74705SXin Li                getLLVMStyleWithColumns(22));
2732*67e74705SXin Li 
2733*67e74705SXin Li   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2734*67e74705SXin Li }
2735*67e74705SXin Li 
TEST_F(FormatTest,RespectWhitespaceInMacroDefinitions)2736*67e74705SXin Li TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2737*67e74705SXin Li   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2738*67e74705SXin Li   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2739*67e74705SXin Li }
2740*67e74705SXin Li 
TEST_F(FormatTest,EmptyLinesInMacroDefinitions)2741*67e74705SXin Li TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2742*67e74705SXin Li   EXPECT_EQ("#define A b;", format("#define A \\\n"
2743*67e74705SXin Li                                    "          \\\n"
2744*67e74705SXin Li                                    "  b;",
2745*67e74705SXin Li                                    getLLVMStyleWithColumns(25)));
2746*67e74705SXin Li   EXPECT_EQ("#define A \\\n"
2747*67e74705SXin Li             "          \\\n"
2748*67e74705SXin Li             "  a;      \\\n"
2749*67e74705SXin Li             "  b;",
2750*67e74705SXin Li             format("#define A \\\n"
2751*67e74705SXin Li                    "          \\\n"
2752*67e74705SXin Li                    "  a;      \\\n"
2753*67e74705SXin Li                    "  b;",
2754*67e74705SXin Li                    getLLVMStyleWithColumns(11)));
2755*67e74705SXin Li   EXPECT_EQ("#define A \\\n"
2756*67e74705SXin Li             "  a;      \\\n"
2757*67e74705SXin Li             "          \\\n"
2758*67e74705SXin Li             "  b;",
2759*67e74705SXin Li             format("#define A \\\n"
2760*67e74705SXin Li                    "  a;      \\\n"
2761*67e74705SXin Li                    "          \\\n"
2762*67e74705SXin Li                    "  b;",
2763*67e74705SXin Li                    getLLVMStyleWithColumns(11)));
2764*67e74705SXin Li }
2765*67e74705SXin Li 
TEST_F(FormatTest,MacroDefinitionsWithIncompleteCode)2766*67e74705SXin Li TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2767*67e74705SXin Li   verifyIncompleteFormat("#define A :");
2768*67e74705SXin Li   verifyFormat("#define SOMECASES  \\\n"
2769*67e74705SXin Li                "  case 1:          \\\n"
2770*67e74705SXin Li                "  case 2\n",
2771*67e74705SXin Li                getLLVMStyleWithColumns(20));
2772*67e74705SXin Li   verifyFormat("#define MACRO(a) \\\n"
2773*67e74705SXin Li                "  if (a)         \\\n"
2774*67e74705SXin Li                "    f();         \\\n"
2775*67e74705SXin Li                "  else           \\\n"
2776*67e74705SXin Li                "    g()",
2777*67e74705SXin Li                getLLVMStyleWithColumns(18));
2778*67e74705SXin Li   verifyFormat("#define A template <typename T>");
2779*67e74705SXin Li   verifyIncompleteFormat("#define STR(x) #x\n"
2780*67e74705SXin Li                          "f(STR(this_is_a_string_literal{));");
2781*67e74705SXin Li   verifyFormat("#pragma omp threadprivate( \\\n"
2782*67e74705SXin Li                "    y)), // expected-warning",
2783*67e74705SXin Li                getLLVMStyleWithColumns(28));
2784*67e74705SXin Li   verifyFormat("#d, = };");
2785*67e74705SXin Li   verifyFormat("#if \"a");
2786*67e74705SXin Li   verifyIncompleteFormat("({\n"
2787*67e74705SXin Li                          "#define b     \\\n"
2788*67e74705SXin Li                          "  }           \\\n"
2789*67e74705SXin Li                          "  a\n"
2790*67e74705SXin Li                          "a",
2791*67e74705SXin Li                          getLLVMStyleWithColumns(15));
2792*67e74705SXin Li   verifyFormat("#define A     \\\n"
2793*67e74705SXin Li                "  {           \\\n"
2794*67e74705SXin Li                "    {\n"
2795*67e74705SXin Li                "#define B     \\\n"
2796*67e74705SXin Li                "  }           \\\n"
2797*67e74705SXin Li                "  }",
2798*67e74705SXin Li                getLLVMStyleWithColumns(15));
2799*67e74705SXin Li   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2800*67e74705SXin Li   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2801*67e74705SXin Li   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2802*67e74705SXin Li   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2803*67e74705SXin Li }
2804*67e74705SXin Li 
TEST_F(FormatTest,MacrosWithoutTrailingSemicolon)2805*67e74705SXin Li TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2806*67e74705SXin Li   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2807*67e74705SXin Li   EXPECT_EQ("class A : public QObject {\n"
2808*67e74705SXin Li             "  Q_OBJECT\n"
2809*67e74705SXin Li             "\n"
2810*67e74705SXin Li             "  A() {}\n"
2811*67e74705SXin Li             "};",
2812*67e74705SXin Li             format("class A  :  public QObject {\n"
2813*67e74705SXin Li                    "     Q_OBJECT\n"
2814*67e74705SXin Li                    "\n"
2815*67e74705SXin Li                    "  A() {\n}\n"
2816*67e74705SXin Li                    "}  ;"));
2817*67e74705SXin Li   EXPECT_EQ("MACRO\n"
2818*67e74705SXin Li             "/*static*/ int i;",
2819*67e74705SXin Li             format("MACRO\n"
2820*67e74705SXin Li                    " /*static*/ int   i;"));
2821*67e74705SXin Li   EXPECT_EQ("SOME_MACRO\n"
2822*67e74705SXin Li             "namespace {\n"
2823*67e74705SXin Li             "void f();\n"
2824*67e74705SXin Li             "}",
2825*67e74705SXin Li             format("SOME_MACRO\n"
2826*67e74705SXin Li                    "  namespace    {\n"
2827*67e74705SXin Li                    "void   f(  );\n"
2828*67e74705SXin Li                    "}"));
2829*67e74705SXin Li   // Only if the identifier contains at least 5 characters.
2830*67e74705SXin Li   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2831*67e74705SXin Li   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2832*67e74705SXin Li   // Only if everything is upper case.
2833*67e74705SXin Li   EXPECT_EQ("class A : public QObject {\n"
2834*67e74705SXin Li             "  Q_Object A() {}\n"
2835*67e74705SXin Li             "};",
2836*67e74705SXin Li             format("class A  :  public QObject {\n"
2837*67e74705SXin Li                    "     Q_Object\n"
2838*67e74705SXin Li                    "  A() {\n}\n"
2839*67e74705SXin Li                    "}  ;"));
2840*67e74705SXin Li 
2841*67e74705SXin Li   // Only if the next line can actually start an unwrapped line.
2842*67e74705SXin Li   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2843*67e74705SXin Li             format("SOME_WEIRD_LOG_MACRO\n"
2844*67e74705SXin Li                    "<< SomeThing;"));
2845*67e74705SXin Li 
2846*67e74705SXin Li   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2847*67e74705SXin Li                "(n, buffers))\n",
2848*67e74705SXin Li                getChromiumStyle(FormatStyle::LK_Cpp));
2849*67e74705SXin Li }
2850*67e74705SXin Li 
TEST_F(FormatTest,MacroCallsWithoutTrailingSemicolon)2851*67e74705SXin Li TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2852*67e74705SXin Li   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2853*67e74705SXin Li             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2854*67e74705SXin Li             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2855*67e74705SXin Li             "class X {};\n"
2856*67e74705SXin Li             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2857*67e74705SXin Li             "int *createScopDetectionPass() { return 0; }",
2858*67e74705SXin Li             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2859*67e74705SXin Li                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2860*67e74705SXin Li                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2861*67e74705SXin Li                    "  class X {};\n"
2862*67e74705SXin Li                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2863*67e74705SXin Li                    "  int *createScopDetectionPass() { return 0; }"));
2864*67e74705SXin Li   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2865*67e74705SXin Li   // braces, so that inner block is indented one level more.
2866*67e74705SXin Li   EXPECT_EQ("int q() {\n"
2867*67e74705SXin Li             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2868*67e74705SXin Li             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2869*67e74705SXin Li             "  IPC_END_MESSAGE_MAP()\n"
2870*67e74705SXin Li             "}",
2871*67e74705SXin Li             format("int q() {\n"
2872*67e74705SXin Li                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2873*67e74705SXin Li                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2874*67e74705SXin Li                    "  IPC_END_MESSAGE_MAP()\n"
2875*67e74705SXin Li                    "}"));
2876*67e74705SXin Li 
2877*67e74705SXin Li   // Same inside macros.
2878*67e74705SXin Li   EXPECT_EQ("#define LIST(L) \\\n"
2879*67e74705SXin Li             "  L(A)          \\\n"
2880*67e74705SXin Li             "  L(B)          \\\n"
2881*67e74705SXin Li             "  L(C)",
2882*67e74705SXin Li             format("#define LIST(L) \\\n"
2883*67e74705SXin Li                    "  L(A) \\\n"
2884*67e74705SXin Li                    "  L(B) \\\n"
2885*67e74705SXin Li                    "  L(C)",
2886*67e74705SXin Li                    getGoogleStyle()));
2887*67e74705SXin Li 
2888*67e74705SXin Li   // These must not be recognized as macros.
2889*67e74705SXin Li   EXPECT_EQ("int q() {\n"
2890*67e74705SXin Li             "  f(x);\n"
2891*67e74705SXin Li             "  f(x) {}\n"
2892*67e74705SXin Li             "  f(x)->g();\n"
2893*67e74705SXin Li             "  f(x)->*g();\n"
2894*67e74705SXin Li             "  f(x).g();\n"
2895*67e74705SXin Li             "  f(x) = x;\n"
2896*67e74705SXin Li             "  f(x) += x;\n"
2897*67e74705SXin Li             "  f(x) -= x;\n"
2898*67e74705SXin Li             "  f(x) *= x;\n"
2899*67e74705SXin Li             "  f(x) /= x;\n"
2900*67e74705SXin Li             "  f(x) %= x;\n"
2901*67e74705SXin Li             "  f(x) &= x;\n"
2902*67e74705SXin Li             "  f(x) |= x;\n"
2903*67e74705SXin Li             "  f(x) ^= x;\n"
2904*67e74705SXin Li             "  f(x) >>= x;\n"
2905*67e74705SXin Li             "  f(x) <<= x;\n"
2906*67e74705SXin Li             "  f(x)[y].z();\n"
2907*67e74705SXin Li             "  LOG(INFO) << x;\n"
2908*67e74705SXin Li             "  ifstream(x) >> x;\n"
2909*67e74705SXin Li             "}\n",
2910*67e74705SXin Li             format("int q() {\n"
2911*67e74705SXin Li                    "  f(x)\n;\n"
2912*67e74705SXin Li                    "  f(x)\n {}\n"
2913*67e74705SXin Li                    "  f(x)\n->g();\n"
2914*67e74705SXin Li                    "  f(x)\n->*g();\n"
2915*67e74705SXin Li                    "  f(x)\n.g();\n"
2916*67e74705SXin Li                    "  f(x)\n = x;\n"
2917*67e74705SXin Li                    "  f(x)\n += x;\n"
2918*67e74705SXin Li                    "  f(x)\n -= x;\n"
2919*67e74705SXin Li                    "  f(x)\n *= x;\n"
2920*67e74705SXin Li                    "  f(x)\n /= x;\n"
2921*67e74705SXin Li                    "  f(x)\n %= x;\n"
2922*67e74705SXin Li                    "  f(x)\n &= x;\n"
2923*67e74705SXin Li                    "  f(x)\n |= x;\n"
2924*67e74705SXin Li                    "  f(x)\n ^= x;\n"
2925*67e74705SXin Li                    "  f(x)\n >>= x;\n"
2926*67e74705SXin Li                    "  f(x)\n <<= x;\n"
2927*67e74705SXin Li                    "  f(x)\n[y].z();\n"
2928*67e74705SXin Li                    "  LOG(INFO)\n << x;\n"
2929*67e74705SXin Li                    "  ifstream(x)\n >> x;\n"
2930*67e74705SXin Li                    "}\n"));
2931*67e74705SXin Li   EXPECT_EQ("int q() {\n"
2932*67e74705SXin Li             "  F(x)\n"
2933*67e74705SXin Li             "  if (1) {\n"
2934*67e74705SXin Li             "  }\n"
2935*67e74705SXin Li             "  F(x)\n"
2936*67e74705SXin Li             "  while (1) {\n"
2937*67e74705SXin Li             "  }\n"
2938*67e74705SXin Li             "  F(x)\n"
2939*67e74705SXin Li             "  G(x);\n"
2940*67e74705SXin Li             "  F(x)\n"
2941*67e74705SXin Li             "  try {\n"
2942*67e74705SXin Li             "    Q();\n"
2943*67e74705SXin Li             "  } catch (...) {\n"
2944*67e74705SXin Li             "  }\n"
2945*67e74705SXin Li             "}\n",
2946*67e74705SXin Li             format("int q() {\n"
2947*67e74705SXin Li                    "F(x)\n"
2948*67e74705SXin Li                    "if (1) {}\n"
2949*67e74705SXin Li                    "F(x)\n"
2950*67e74705SXin Li                    "while (1) {}\n"
2951*67e74705SXin Li                    "F(x)\n"
2952*67e74705SXin Li                    "G(x);\n"
2953*67e74705SXin Li                    "F(x)\n"
2954*67e74705SXin Li                    "try { Q(); } catch (...) {}\n"
2955*67e74705SXin Li                    "}\n"));
2956*67e74705SXin Li   EXPECT_EQ("class A {\n"
2957*67e74705SXin Li             "  A() : t(0) {}\n"
2958*67e74705SXin Li             "  A(int i) noexcept() : {}\n"
2959*67e74705SXin Li             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2960*67e74705SXin Li             "  try : t(0) {\n"
2961*67e74705SXin Li             "  } catch (...) {\n"
2962*67e74705SXin Li             "  }\n"
2963*67e74705SXin Li             "};",
2964*67e74705SXin Li             format("class A {\n"
2965*67e74705SXin Li                    "  A()\n : t(0) {}\n"
2966*67e74705SXin Li                    "  A(int i)\n noexcept() : {}\n"
2967*67e74705SXin Li                    "  A(X x)\n"
2968*67e74705SXin Li                    "  try : t(0) {} catch (...) {}\n"
2969*67e74705SXin Li                    "};"));
2970*67e74705SXin Li   EXPECT_EQ("class SomeClass {\n"
2971*67e74705SXin Li             "public:\n"
2972*67e74705SXin Li             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2973*67e74705SXin Li             "};",
2974*67e74705SXin Li             format("class SomeClass {\n"
2975*67e74705SXin Li                    "public:\n"
2976*67e74705SXin Li                    "  SomeClass()\n"
2977*67e74705SXin Li                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2978*67e74705SXin Li                    "};"));
2979*67e74705SXin Li   EXPECT_EQ("class SomeClass {\n"
2980*67e74705SXin Li             "public:\n"
2981*67e74705SXin Li             "  SomeClass()\n"
2982*67e74705SXin Li             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2983*67e74705SXin Li             "};",
2984*67e74705SXin Li             format("class SomeClass {\n"
2985*67e74705SXin Li                    "public:\n"
2986*67e74705SXin Li                    "  SomeClass()\n"
2987*67e74705SXin Li                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2988*67e74705SXin Li                    "};",
2989*67e74705SXin Li                    getLLVMStyleWithColumns(40)));
2990*67e74705SXin Li 
2991*67e74705SXin Li   verifyFormat("MACRO(>)");
2992*67e74705SXin Li }
2993*67e74705SXin Li 
TEST_F(FormatTest,LayoutMacroDefinitionsStatementsSpanningBlocks)2994*67e74705SXin Li TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2995*67e74705SXin Li   verifyFormat("#define A \\\n"
2996*67e74705SXin Li                "  f({     \\\n"
2997*67e74705SXin Li                "    g();  \\\n"
2998*67e74705SXin Li                "  });",
2999*67e74705SXin Li                getLLVMStyleWithColumns(11));
3000*67e74705SXin Li }
3001*67e74705SXin Li 
TEST_F(FormatTest,IndentPreprocessorDirectivesAtZero)3002*67e74705SXin Li TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3003*67e74705SXin Li   EXPECT_EQ("{\n  {\n#define A\n  }\n}", format("{{\n#define A\n}}"));
3004*67e74705SXin Li }
3005*67e74705SXin Li 
TEST_F(FormatTest,FormatHashIfNotAtStartOfLine)3006*67e74705SXin Li TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3007*67e74705SXin Li   verifyFormat("{\n  { a #c; }\n}");
3008*67e74705SXin Li }
3009*67e74705SXin Li 
TEST_F(FormatTest,FormatUnbalancedStructuralElements)3010*67e74705SXin Li TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3011*67e74705SXin Li   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3012*67e74705SXin Li             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3013*67e74705SXin Li   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3014*67e74705SXin Li             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3015*67e74705SXin Li }
3016*67e74705SXin Li 
TEST_F(FormatTest,EscapedNewlines)3017*67e74705SXin Li TEST_F(FormatTest, EscapedNewlines) {
3018*67e74705SXin Li   EXPECT_EQ(
3019*67e74705SXin Li       "#define A \\\n  int i;  \\\n  int j;",
3020*67e74705SXin Li       format("#define A \\\nint i;\\\n  int j;", getLLVMStyleWithColumns(11)));
3021*67e74705SXin Li   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3022*67e74705SXin Li   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3023*67e74705SXin Li   EXPECT_EQ("/* \\  \\  \\\n*/", format("\\\n/* \\  \\  \\\n*/"));
3024*67e74705SXin Li   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3025*67e74705SXin Li }
3026*67e74705SXin Li 
TEST_F(FormatTest,DontCrashOnBlockComments)3027*67e74705SXin Li TEST_F(FormatTest, DontCrashOnBlockComments) {
3028*67e74705SXin Li   EXPECT_EQ(
3029*67e74705SXin Li       "int xxxxxxxxx; /* "
3030*67e74705SXin Li       "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3031*67e74705SXin Li       "zzzzzz\n"
3032*67e74705SXin Li       "0*/",
3033*67e74705SXin Li       format("int xxxxxxxxx;                          /* "
3034*67e74705SXin Li              "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3035*67e74705SXin Li              "0*/"));
3036*67e74705SXin Li }
3037*67e74705SXin Li 
TEST_F(FormatTest,CalculateSpaceOnConsecutiveLinesInMacro)3038*67e74705SXin Li TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3039*67e74705SXin Li   verifyFormat("#define A \\\n"
3040*67e74705SXin Li                "  int v(  \\\n"
3041*67e74705SXin Li                "      a); \\\n"
3042*67e74705SXin Li                "  int i;",
3043*67e74705SXin Li                getLLVMStyleWithColumns(11));
3044*67e74705SXin Li }
3045*67e74705SXin Li 
TEST_F(FormatTest,MixingPreprocessorDirectivesAndNormalCode)3046*67e74705SXin Li TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3047*67e74705SXin Li   EXPECT_EQ(
3048*67e74705SXin Li       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3049*67e74705SXin Li       "                      \\\n"
3050*67e74705SXin Li       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3051*67e74705SXin Li       "\n"
3052*67e74705SXin Li       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3053*67e74705SXin Li       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3054*67e74705SXin Li       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3055*67e74705SXin Li              "\\\n"
3056*67e74705SXin Li              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3057*67e74705SXin Li              "  \n"
3058*67e74705SXin Li              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3059*67e74705SXin Li              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3060*67e74705SXin Li }
3061*67e74705SXin Li 
TEST_F(FormatTest,LayoutStatementsAroundPreprocessorDirectives)3062*67e74705SXin Li TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3063*67e74705SXin Li   EXPECT_EQ("int\n"
3064*67e74705SXin Li             "#define A\n"
3065*67e74705SXin Li             "    a;",
3066*67e74705SXin Li             format("int\n#define A\na;"));
3067*67e74705SXin Li   verifyFormat("functionCallTo(\n"
3068*67e74705SXin Li                "    someOtherFunction(\n"
3069*67e74705SXin Li                "        withSomeParameters, whichInSequence,\n"
3070*67e74705SXin Li                "        areLongerThanALine(andAnotherCall,\n"
3071*67e74705SXin Li                "#define A B\n"
3072*67e74705SXin Li                "                           withMoreParamters,\n"
3073*67e74705SXin Li                "                           whichStronglyInfluenceTheLayout),\n"
3074*67e74705SXin Li                "        andMoreParameters),\n"
3075*67e74705SXin Li                "    trailing);",
3076*67e74705SXin Li                getLLVMStyleWithColumns(69));
3077*67e74705SXin Li   verifyFormat("Foo::Foo()\n"
3078*67e74705SXin Li                "#ifdef BAR\n"
3079*67e74705SXin Li                "    : baz(0)\n"
3080*67e74705SXin Li                "#endif\n"
3081*67e74705SXin Li                "{\n"
3082*67e74705SXin Li                "}");
3083*67e74705SXin Li   verifyFormat("void f() {\n"
3084*67e74705SXin Li                "  if (true)\n"
3085*67e74705SXin Li                "#ifdef A\n"
3086*67e74705SXin Li                "    f(42);\n"
3087*67e74705SXin Li                "  x();\n"
3088*67e74705SXin Li                "#else\n"
3089*67e74705SXin Li                "    g();\n"
3090*67e74705SXin Li                "  x();\n"
3091*67e74705SXin Li                "#endif\n"
3092*67e74705SXin Li                "}");
3093*67e74705SXin Li   verifyFormat("void f(param1, param2,\n"
3094*67e74705SXin Li                "       param3,\n"
3095*67e74705SXin Li                "#ifdef A\n"
3096*67e74705SXin Li                "       param4(param5,\n"
3097*67e74705SXin Li                "#ifdef A1\n"
3098*67e74705SXin Li                "              param6,\n"
3099*67e74705SXin Li                "#ifdef A2\n"
3100*67e74705SXin Li                "              param7),\n"
3101*67e74705SXin Li                "#else\n"
3102*67e74705SXin Li                "              param8),\n"
3103*67e74705SXin Li                "       param9,\n"
3104*67e74705SXin Li                "#endif\n"
3105*67e74705SXin Li                "       param10,\n"
3106*67e74705SXin Li                "#endif\n"
3107*67e74705SXin Li                "       param11)\n"
3108*67e74705SXin Li                "#else\n"
3109*67e74705SXin Li                "       param12)\n"
3110*67e74705SXin Li                "#endif\n"
3111*67e74705SXin Li                "{\n"
3112*67e74705SXin Li                "  x();\n"
3113*67e74705SXin Li                "}",
3114*67e74705SXin Li                getLLVMStyleWithColumns(28));
3115*67e74705SXin Li   verifyFormat("#if 1\n"
3116*67e74705SXin Li                "int i;");
3117*67e74705SXin Li   verifyFormat("#if 1\n"
3118*67e74705SXin Li                "#endif\n"
3119*67e74705SXin Li                "#if 1\n"
3120*67e74705SXin Li                "#else\n"
3121*67e74705SXin Li                "#endif\n");
3122*67e74705SXin Li   verifyFormat("DEBUG({\n"
3123*67e74705SXin Li                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3124*67e74705SXin Li                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3125*67e74705SXin Li                "});\n"
3126*67e74705SXin Li                "#if a\n"
3127*67e74705SXin Li                "#else\n"
3128*67e74705SXin Li                "#endif");
3129*67e74705SXin Li 
3130*67e74705SXin Li   verifyIncompleteFormat("void f(\n"
3131*67e74705SXin Li                          "#if A\n"
3132*67e74705SXin Li                          "    );\n"
3133*67e74705SXin Li                          "#else\n"
3134*67e74705SXin Li                          "#endif");
3135*67e74705SXin Li }
3136*67e74705SXin Li 
TEST_F(FormatTest,GraciouslyHandleIncorrectPreprocessorConditions)3137*67e74705SXin Li TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3138*67e74705SXin Li   verifyFormat("#endif\n"
3139*67e74705SXin Li                "#if B");
3140*67e74705SXin Li }
3141*67e74705SXin Li 
TEST_F(FormatTest,FormatsJoinedLinesOnSubsequentRuns)3142*67e74705SXin Li TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3143*67e74705SXin Li   FormatStyle SingleLine = getLLVMStyle();
3144*67e74705SXin Li   SingleLine.AllowShortIfStatementsOnASingleLine = true;
3145*67e74705SXin Li   verifyFormat("#if 0\n"
3146*67e74705SXin Li                "#elif 1\n"
3147*67e74705SXin Li                "#endif\n"
3148*67e74705SXin Li                "void foo() {\n"
3149*67e74705SXin Li                "  if (test) foo2();\n"
3150*67e74705SXin Li                "}",
3151*67e74705SXin Li                SingleLine);
3152*67e74705SXin Li }
3153*67e74705SXin Li 
TEST_F(FormatTest,LayoutBlockInsideParens)3154*67e74705SXin Li TEST_F(FormatTest, LayoutBlockInsideParens) {
3155*67e74705SXin Li   verifyFormat("functionCall({ int i; });");
3156*67e74705SXin Li   verifyFormat("functionCall({\n"
3157*67e74705SXin Li                "  int i;\n"
3158*67e74705SXin Li                "  int j;\n"
3159*67e74705SXin Li                "});");
3160*67e74705SXin Li   verifyFormat("functionCall(\n"
3161*67e74705SXin Li                "    {\n"
3162*67e74705SXin Li                "      int i;\n"
3163*67e74705SXin Li                "      int j;\n"
3164*67e74705SXin Li                "    },\n"
3165*67e74705SXin Li                "    aaaa, bbbb, cccc);");
3166*67e74705SXin Li   verifyFormat("functionA(functionB({\n"
3167*67e74705SXin Li                "            int i;\n"
3168*67e74705SXin Li                "            int j;\n"
3169*67e74705SXin Li                "          }),\n"
3170*67e74705SXin Li                "          aaaa, bbbb, cccc);");
3171*67e74705SXin Li   verifyFormat("functionCall(\n"
3172*67e74705SXin Li                "    {\n"
3173*67e74705SXin Li                "      int i;\n"
3174*67e74705SXin Li                "      int j;\n"
3175*67e74705SXin Li                "    },\n"
3176*67e74705SXin Li                "    aaaa, bbbb, // comment\n"
3177*67e74705SXin Li                "    cccc);");
3178*67e74705SXin Li   verifyFormat("functionA(functionB({\n"
3179*67e74705SXin Li                "            int i;\n"
3180*67e74705SXin Li                "            int j;\n"
3181*67e74705SXin Li                "          }),\n"
3182*67e74705SXin Li                "          aaaa, bbbb, // comment\n"
3183*67e74705SXin Li                "          cccc);");
3184*67e74705SXin Li   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3185*67e74705SXin Li   verifyFormat("functionCall(aaaa, bbbb, {\n"
3186*67e74705SXin Li                "  int i;\n"
3187*67e74705SXin Li                "  int j;\n"
3188*67e74705SXin Li                "});");
3189*67e74705SXin Li   verifyFormat(
3190*67e74705SXin Li       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3191*67e74705SXin Li       "    {\n"
3192*67e74705SXin Li       "      int i; // break\n"
3193*67e74705SXin Li       "    },\n"
3194*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3195*67e74705SXin Li       "                                     ccccccccccccccccc));");
3196*67e74705SXin Li   verifyFormat("DEBUG({\n"
3197*67e74705SXin Li                "  if (a)\n"
3198*67e74705SXin Li                "    f();\n"
3199*67e74705SXin Li                "});");
3200*67e74705SXin Li }
3201*67e74705SXin Li 
TEST_F(FormatTest,LayoutBlockInsideStatement)3202*67e74705SXin Li TEST_F(FormatTest, LayoutBlockInsideStatement) {
3203*67e74705SXin Li   EXPECT_EQ("SOME_MACRO { int i; }\n"
3204*67e74705SXin Li             "int i;",
3205*67e74705SXin Li             format("  SOME_MACRO  {int i;}  int i;"));
3206*67e74705SXin Li }
3207*67e74705SXin Li 
TEST_F(FormatTest,LayoutNestedBlocks)3208*67e74705SXin Li TEST_F(FormatTest, LayoutNestedBlocks) {
3209*67e74705SXin Li   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3210*67e74705SXin Li                "  struct s {\n"
3211*67e74705SXin Li                "    int i;\n"
3212*67e74705SXin Li                "  };\n"
3213*67e74705SXin Li                "  s kBitsToOs[] = {{10}};\n"
3214*67e74705SXin Li                "  for (int i = 0; i < 10; ++i)\n"
3215*67e74705SXin Li                "    return;\n"
3216*67e74705SXin Li                "}");
3217*67e74705SXin Li   verifyFormat("call(parameter, {\n"
3218*67e74705SXin Li                "  something();\n"
3219*67e74705SXin Li                "  // Comment using all columns.\n"
3220*67e74705SXin Li                "  somethingelse();\n"
3221*67e74705SXin Li                "});",
3222*67e74705SXin Li                getLLVMStyleWithColumns(40));
3223*67e74705SXin Li   verifyFormat("DEBUG( //\n"
3224*67e74705SXin Li                "    { f(); }, a);");
3225*67e74705SXin Li   verifyFormat("DEBUG( //\n"
3226*67e74705SXin Li                "    {\n"
3227*67e74705SXin Li                "      f(); //\n"
3228*67e74705SXin Li                "    },\n"
3229*67e74705SXin Li                "    a);");
3230*67e74705SXin Li 
3231*67e74705SXin Li   EXPECT_EQ("call(parameter, {\n"
3232*67e74705SXin Li             "  something();\n"
3233*67e74705SXin Li             "  // Comment too\n"
3234*67e74705SXin Li             "  // looooooooooong.\n"
3235*67e74705SXin Li             "  somethingElse();\n"
3236*67e74705SXin Li             "});",
3237*67e74705SXin Li             format("call(parameter, {\n"
3238*67e74705SXin Li                    "  something();\n"
3239*67e74705SXin Li                    "  // Comment too looooooooooong.\n"
3240*67e74705SXin Li                    "  somethingElse();\n"
3241*67e74705SXin Li                    "});",
3242*67e74705SXin Li                    getLLVMStyleWithColumns(29)));
3243*67e74705SXin Li   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3244*67e74705SXin Li   EXPECT_EQ("DEBUG({ // comment\n"
3245*67e74705SXin Li             "  int i;\n"
3246*67e74705SXin Li             "});",
3247*67e74705SXin Li             format("DEBUG({ // comment\n"
3248*67e74705SXin Li                    "int  i;\n"
3249*67e74705SXin Li                    "});"));
3250*67e74705SXin Li   EXPECT_EQ("DEBUG({\n"
3251*67e74705SXin Li             "  int i;\n"
3252*67e74705SXin Li             "\n"
3253*67e74705SXin Li             "  // comment\n"
3254*67e74705SXin Li             "  int j;\n"
3255*67e74705SXin Li             "});",
3256*67e74705SXin Li             format("DEBUG({\n"
3257*67e74705SXin Li                    "  int  i;\n"
3258*67e74705SXin Li                    "\n"
3259*67e74705SXin Li                    "  // comment\n"
3260*67e74705SXin Li                    "  int  j;\n"
3261*67e74705SXin Li                    "});"));
3262*67e74705SXin Li 
3263*67e74705SXin Li   verifyFormat("DEBUG({\n"
3264*67e74705SXin Li                "  if (a)\n"
3265*67e74705SXin Li                "    return;\n"
3266*67e74705SXin Li                "});");
3267*67e74705SXin Li   verifyGoogleFormat("DEBUG({\n"
3268*67e74705SXin Li                      "  if (a) return;\n"
3269*67e74705SXin Li                      "});");
3270*67e74705SXin Li   FormatStyle Style = getGoogleStyle();
3271*67e74705SXin Li   Style.ColumnLimit = 45;
3272*67e74705SXin Li   verifyFormat("Debug(aaaaa,\n"
3273*67e74705SXin Li                "      {\n"
3274*67e74705SXin Li                "        if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3275*67e74705SXin Li                "      },\n"
3276*67e74705SXin Li                "      a);",
3277*67e74705SXin Li                Style);
3278*67e74705SXin Li 
3279*67e74705SXin Li   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3280*67e74705SXin Li 
3281*67e74705SXin Li   verifyNoCrash("^{v^{a}}");
3282*67e74705SXin Li }
3283*67e74705SXin Li 
TEST_F(FormatTest,FormatNestedBlocksInMacros)3284*67e74705SXin Li TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3285*67e74705SXin Li   EXPECT_EQ("#define MACRO()                     \\\n"
3286*67e74705SXin Li             "  Debug(aaa, /* force line break */ \\\n"
3287*67e74705SXin Li             "        {                           \\\n"
3288*67e74705SXin Li             "          int i;                    \\\n"
3289*67e74705SXin Li             "          int j;                    \\\n"
3290*67e74705SXin Li             "        })",
3291*67e74705SXin Li             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3292*67e74705SXin Li                    "          {  int   i;  int  j;   })",
3293*67e74705SXin Li                    getGoogleStyle()));
3294*67e74705SXin Li 
3295*67e74705SXin Li   EXPECT_EQ("#define A                                       \\\n"
3296*67e74705SXin Li             "  [] {                                          \\\n"
3297*67e74705SXin Li             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3298*67e74705SXin Li             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3299*67e74705SXin Li             "  }",
3300*67e74705SXin Li             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3301*67e74705SXin Li                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3302*67e74705SXin Li                    getGoogleStyle()));
3303*67e74705SXin Li }
3304*67e74705SXin Li 
TEST_F(FormatTest,PutEmptyBlocksIntoOneLine)3305*67e74705SXin Li TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3306*67e74705SXin Li   EXPECT_EQ("{}", format("{}"));
3307*67e74705SXin Li   verifyFormat("enum E {};");
3308*67e74705SXin Li   verifyFormat("enum E {}");
3309*67e74705SXin Li }
3310*67e74705SXin Li 
TEST_F(FormatTest,FormatBeginBlockEndMacros)3311*67e74705SXin Li TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3312*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
3313*67e74705SXin Li   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3314*67e74705SXin Li   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3315*67e74705SXin Li   verifyFormat("FOO_BEGIN\n"
3316*67e74705SXin Li                "  FOO_ENTRY\n"
3317*67e74705SXin Li                "FOO_END", Style);
3318*67e74705SXin Li   verifyFormat("FOO_BEGIN\n"
3319*67e74705SXin Li                "  NESTED_FOO_BEGIN\n"
3320*67e74705SXin Li                "    NESTED_FOO_ENTRY\n"
3321*67e74705SXin Li                "  NESTED_FOO_END\n"
3322*67e74705SXin Li                "FOO_END", Style);
3323*67e74705SXin Li   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3324*67e74705SXin Li                "  int x;\n"
3325*67e74705SXin Li                "  x = 1;\n"
3326*67e74705SXin Li                "FOO_END(Baz)", Style);
3327*67e74705SXin Li }
3328*67e74705SXin Li 
3329*67e74705SXin Li //===----------------------------------------------------------------------===//
3330*67e74705SXin Li // Line break tests.
3331*67e74705SXin Li //===----------------------------------------------------------------------===//
3332*67e74705SXin Li 
TEST_F(FormatTest,PreventConfusingIndents)3333*67e74705SXin Li TEST_F(FormatTest, PreventConfusingIndents) {
3334*67e74705SXin Li   verifyFormat(
3335*67e74705SXin Li       "void f() {\n"
3336*67e74705SXin Li       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3337*67e74705SXin Li       "                         parameter, parameter, parameter)),\n"
3338*67e74705SXin Li       "                     SecondLongCall(parameter));\n"
3339*67e74705SXin Li       "}");
3340*67e74705SXin Li   verifyFormat(
3341*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3342*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3343*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3344*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3345*67e74705SXin Li   verifyFormat(
3346*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3347*67e74705SXin Li       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3348*67e74705SXin Li       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3349*67e74705SXin Li       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3350*67e74705SXin Li   verifyFormat(
3351*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3352*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3353*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3354*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3355*67e74705SXin Li   verifyFormat("int a = bbbb && ccc && fffff(\n"
3356*67e74705SXin Li                "#define A Just forcing a new line\n"
3357*67e74705SXin Li                "                           ddd);");
3358*67e74705SXin Li }
3359*67e74705SXin Li 
TEST_F(FormatTest,LineBreakingInBinaryExpressions)3360*67e74705SXin Li TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3361*67e74705SXin Li   verifyFormat(
3362*67e74705SXin Li       "bool aaaaaaa =\n"
3363*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3364*67e74705SXin Li       "    bbbbbbbb();");
3365*67e74705SXin Li   verifyFormat(
3366*67e74705SXin Li       "bool aaaaaaa =\n"
3367*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3368*67e74705SXin Li       "    bbbbbbbb();");
3369*67e74705SXin Li 
3370*67e74705SXin Li   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3371*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3372*67e74705SXin Li                "    ccccccccc == ddddddddddd;");
3373*67e74705SXin Li   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3374*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3375*67e74705SXin Li                "    ccccccccc == ddddddddddd;");
3376*67e74705SXin Li   verifyFormat(
3377*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3378*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3379*67e74705SXin Li       "    ccccccccc == ddddddddddd;");
3380*67e74705SXin Li 
3381*67e74705SXin Li   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3382*67e74705SXin Li                "                 aaaaaa) &&\n"
3383*67e74705SXin Li                "         bbbbbb && cccccc;");
3384*67e74705SXin Li   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3385*67e74705SXin Li                "                 aaaaaa) >>\n"
3386*67e74705SXin Li                "         bbbbbb;");
3387*67e74705SXin Li   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3388*67e74705SXin Li                "    SourceMgr.getSpellingColumnNumber(\n"
3389*67e74705SXin Li                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3390*67e74705SXin Li                "    1);");
3391*67e74705SXin Li 
3392*67e74705SXin Li   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3393*67e74705SXin Li                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3394*67e74705SXin Li                "    cccccc) {\n}");
3395*67e74705SXin Li   verifyFormat("b = a &&\n"
3396*67e74705SXin Li                "    // Comment\n"
3397*67e74705SXin Li                "    b.c && d;");
3398*67e74705SXin Li 
3399*67e74705SXin Li   // If the LHS of a comparison is not a binary expression itself, the
3400*67e74705SXin Li   // additional linebreak confuses many people.
3401*67e74705SXin Li   verifyFormat(
3402*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3403*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3404*67e74705SXin Li       "}");
3405*67e74705SXin Li   verifyFormat(
3406*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3407*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3408*67e74705SXin Li       "}");
3409*67e74705SXin Li   verifyFormat(
3410*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3411*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3412*67e74705SXin Li       "}");
3413*67e74705SXin Li   // Even explicit parentheses stress the precedence enough to make the
3414*67e74705SXin Li   // additional break unnecessary.
3415*67e74705SXin Li   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3416*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3417*67e74705SXin Li                "}");
3418*67e74705SXin Li   // This cases is borderline, but with the indentation it is still readable.
3419*67e74705SXin Li   verifyFormat(
3420*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3421*67e74705SXin Li       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3422*67e74705SXin Li       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3423*67e74705SXin Li       "}",
3424*67e74705SXin Li       getLLVMStyleWithColumns(75));
3425*67e74705SXin Li 
3426*67e74705SXin Li   // If the LHS is a binary expression, we should still use the additional break
3427*67e74705SXin Li   // as otherwise the formatting hides the operator precedence.
3428*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3429*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3430*67e74705SXin Li                "    5) {\n"
3431*67e74705SXin Li                "}");
3432*67e74705SXin Li 
3433*67e74705SXin Li   FormatStyle OnePerLine = getLLVMStyle();
3434*67e74705SXin Li   OnePerLine.BinPackParameters = false;
3435*67e74705SXin Li   verifyFormat(
3436*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3437*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3438*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3439*67e74705SXin Li       OnePerLine);
3440*67e74705SXin Li }
3441*67e74705SXin Li 
TEST_F(FormatTest,ExpressionIndentation)3442*67e74705SXin Li TEST_F(FormatTest, ExpressionIndentation) {
3443*67e74705SXin Li   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3444*67e74705SXin Li                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3445*67e74705SXin Li                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3446*67e74705SXin Li                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3447*67e74705SXin Li                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3448*67e74705SXin Li                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3449*67e74705SXin Li                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3450*67e74705SXin Li                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3451*67e74705SXin Li                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3452*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3453*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3454*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3455*67e74705SXin Li                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3456*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3457*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3458*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3459*67e74705SXin Li                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3460*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3461*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3462*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3463*67e74705SXin Li                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3464*67e74705SXin Li   verifyFormat("if () {\n"
3465*67e74705SXin Li                "} else if (aaaaa &&\n"
3466*67e74705SXin Li                "           bbbbb > // break\n"
3467*67e74705SXin Li                "               ccccc) {\n"
3468*67e74705SXin Li                "}");
3469*67e74705SXin Li 
3470*67e74705SXin Li   // Presence of a trailing comment used to change indentation of b.
3471*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3472*67e74705SXin Li                "       b;\n"
3473*67e74705SXin Li                "return aaaaaaaaaaaaaaaaaaa +\n"
3474*67e74705SXin Li                "       b; //",
3475*67e74705SXin Li                getLLVMStyleWithColumns(30));
3476*67e74705SXin Li }
3477*67e74705SXin Li 
TEST_F(FormatTest,ExpressionIndentationBreakingBeforeOperators)3478*67e74705SXin Li TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3479*67e74705SXin Li   // Not sure what the best system is here. Like this, the LHS can be found
3480*67e74705SXin Li   // immediately above an operator (everything with the same or a higher
3481*67e74705SXin Li   // indent). The RHS is aligned right of the operator and so compasses
3482*67e74705SXin Li   // everything until something with the same indent as the operator is found.
3483*67e74705SXin Li   // FIXME: Is this a good system?
3484*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
3485*67e74705SXin Li   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3486*67e74705SXin Li   verifyFormat(
3487*67e74705SXin Li       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3488*67e74705SXin Li       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3489*67e74705SXin Li       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3490*67e74705SXin Li       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3491*67e74705SXin Li       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3492*67e74705SXin Li       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3493*67e74705SXin Li       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3494*67e74705SXin Li       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3495*67e74705SXin Li       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3496*67e74705SXin Li       Style);
3497*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3498*67e74705SXin Li                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3499*67e74705SXin Li                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3500*67e74705SXin Li                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3501*67e74705SXin Li                Style);
3502*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3503*67e74705SXin Li                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3504*67e74705SXin Li                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3505*67e74705SXin Li                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3506*67e74705SXin Li                Style);
3507*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3508*67e74705SXin Li                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3509*67e74705SXin Li                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3510*67e74705SXin Li                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3511*67e74705SXin Li                Style);
3512*67e74705SXin Li   verifyFormat("if () {\n"
3513*67e74705SXin Li                "} else if (aaaaa\n"
3514*67e74705SXin Li                "           && bbbbb // break\n"
3515*67e74705SXin Li                "                  > ccccc) {\n"
3516*67e74705SXin Li                "}",
3517*67e74705SXin Li                Style);
3518*67e74705SXin Li   verifyFormat("return (a)\n"
3519*67e74705SXin Li                "       // comment\n"
3520*67e74705SXin Li                "       + b;",
3521*67e74705SXin Li                Style);
3522*67e74705SXin Li   verifyFormat(
3523*67e74705SXin Li       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3524*67e74705SXin Li       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3525*67e74705SXin Li       "             + cc;",
3526*67e74705SXin Li       Style);
3527*67e74705SXin Li 
3528*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3529*67e74705SXin Li                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3530*67e74705SXin Li                Style);
3531*67e74705SXin Li 
3532*67e74705SXin Li   // Forced by comments.
3533*67e74705SXin Li   verifyFormat(
3534*67e74705SXin Li       "unsigned ContentSize =\n"
3535*67e74705SXin Li       "    sizeof(int16_t)   // DWARF ARange version number\n"
3536*67e74705SXin Li       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3537*67e74705SXin Li       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3538*67e74705SXin Li       "    + sizeof(int8_t); // Segment Size (in bytes)");
3539*67e74705SXin Li 
3540*67e74705SXin Li   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3541*67e74705SXin Li                "       == boost::fusion::at_c<1>(iiii).second;",
3542*67e74705SXin Li                Style);
3543*67e74705SXin Li 
3544*67e74705SXin Li   Style.ColumnLimit = 60;
3545*67e74705SXin Li   verifyFormat("zzzzzzzzzz\n"
3546*67e74705SXin Li                "    = bbbbbbbbbbbbbbbbb\n"
3547*67e74705SXin Li                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3548*67e74705SXin Li                Style);
3549*67e74705SXin Li }
3550*67e74705SXin Li 
TEST_F(FormatTest,NoOperandAlignment)3551*67e74705SXin Li TEST_F(FormatTest, NoOperandAlignment) {
3552*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
3553*67e74705SXin Li   Style.AlignOperands = false;
3554*67e74705SXin Li   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3555*67e74705SXin Li   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556*67e74705SXin Li                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3557*67e74705SXin Li                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3558*67e74705SXin Li                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559*67e74705SXin Li                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3560*67e74705SXin Li                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3561*67e74705SXin Li                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3562*67e74705SXin Li                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563*67e74705SXin Li                "        > ccccccccccccccccccccccccccccccccccccccccc;",
3564*67e74705SXin Li                Style);
3565*67e74705SXin Li 
3566*67e74705SXin Li   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3567*67e74705SXin Li                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3568*67e74705SXin Li                "    + cc;",
3569*67e74705SXin Li                Style);
3570*67e74705SXin Li   verifyFormat("int a = aa\n"
3571*67e74705SXin Li                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3572*67e74705SXin Li                "        * cccccccccccccccccccccccccccccccccccc;",
3573*67e74705SXin Li                Style);
3574*67e74705SXin Li 
3575*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3576*67e74705SXin Li   verifyFormat("return (a > b\n"
3577*67e74705SXin Li                "    // comment1\n"
3578*67e74705SXin Li                "    // comment2\n"
3579*67e74705SXin Li                "    || c);",
3580*67e74705SXin Li                Style);
3581*67e74705SXin Li }
3582*67e74705SXin Li 
TEST_F(FormatTest,BreakingBeforeNonAssigmentOperators)3583*67e74705SXin Li TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3584*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
3585*67e74705SXin Li   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3586*67e74705SXin Li   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3587*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3588*67e74705SXin Li                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3589*67e74705SXin Li                Style);
3590*67e74705SXin Li }
3591*67e74705SXin Li 
TEST_F(FormatTest,ConstructorInitializers)3592*67e74705SXin Li TEST_F(FormatTest, ConstructorInitializers) {
3593*67e74705SXin Li   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3594*67e74705SXin Li   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3595*67e74705SXin Li                getLLVMStyleWithColumns(45));
3596*67e74705SXin Li   verifyFormat("Constructor()\n"
3597*67e74705SXin Li                "    : Inttializer(FitsOnTheLine) {}",
3598*67e74705SXin Li                getLLVMStyleWithColumns(44));
3599*67e74705SXin Li   verifyFormat("Constructor()\n"
3600*67e74705SXin Li                "    : Inttializer(FitsOnTheLine) {}",
3601*67e74705SXin Li                getLLVMStyleWithColumns(43));
3602*67e74705SXin Li 
3603*67e74705SXin Li   verifyFormat("template <typename T>\n"
3604*67e74705SXin Li                "Constructor() : Initializer(FitsOnTheLine) {}",
3605*67e74705SXin Li                getLLVMStyleWithColumns(45));
3606*67e74705SXin Li 
3607*67e74705SXin Li   verifyFormat(
3608*67e74705SXin Li       "SomeClass::Constructor()\n"
3609*67e74705SXin Li       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3610*67e74705SXin Li 
3611*67e74705SXin Li   verifyFormat(
3612*67e74705SXin Li       "SomeClass::Constructor()\n"
3613*67e74705SXin Li       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3614*67e74705SXin Li       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
3615*67e74705SXin Li   verifyFormat(
3616*67e74705SXin Li       "SomeClass::Constructor()\n"
3617*67e74705SXin Li       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3618*67e74705SXin Li       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3619*67e74705SXin Li   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3620*67e74705SXin Li                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3621*67e74705SXin Li                "    : aaaaaaaaaa(aaaaaa) {}");
3622*67e74705SXin Li 
3623*67e74705SXin Li   verifyFormat("Constructor()\n"
3624*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3625*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3626*67e74705SXin Li                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3627*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
3628*67e74705SXin Li 
3629*67e74705SXin Li   verifyFormat("Constructor()\n"
3630*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3631*67e74705SXin Li                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3632*67e74705SXin Li 
3633*67e74705SXin Li   verifyFormat("Constructor(int Parameter = 0)\n"
3634*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3635*67e74705SXin Li                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
3636*67e74705SXin Li   verifyFormat("Constructor()\n"
3637*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3638*67e74705SXin Li                "}",
3639*67e74705SXin Li                getLLVMStyleWithColumns(60));
3640*67e74705SXin Li   verifyFormat("Constructor()\n"
3641*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3642*67e74705SXin Li                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
3643*67e74705SXin Li 
3644*67e74705SXin Li   // Here a line could be saved by splitting the second initializer onto two
3645*67e74705SXin Li   // lines, but that is not desirable.
3646*67e74705SXin Li   verifyFormat("Constructor()\n"
3647*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3648*67e74705SXin Li                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
3649*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3650*67e74705SXin Li 
3651*67e74705SXin Li   FormatStyle OnePerLine = getLLVMStyle();
3652*67e74705SXin Li   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3653*67e74705SXin Li   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3654*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
3655*67e74705SXin Li                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3656*67e74705SXin Li                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3657*67e74705SXin Li                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3658*67e74705SXin Li                OnePerLine);
3659*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
3660*67e74705SXin Li                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3661*67e74705SXin Li                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3662*67e74705SXin Li                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3663*67e74705SXin Li                OnePerLine);
3664*67e74705SXin Li   verifyFormat("MyClass::MyClass(int var)\n"
3665*67e74705SXin Li                "    : some_var_(var),            // 4 space indent\n"
3666*67e74705SXin Li                "      some_other_var_(var + 1) { // lined up\n"
3667*67e74705SXin Li                "}",
3668*67e74705SXin Li                OnePerLine);
3669*67e74705SXin Li   verifyFormat("Constructor()\n"
3670*67e74705SXin Li                "    : aaaaa(aaaaaa),\n"
3671*67e74705SXin Li                "      aaaaa(aaaaaa),\n"
3672*67e74705SXin Li                "      aaaaa(aaaaaa),\n"
3673*67e74705SXin Li                "      aaaaa(aaaaaa),\n"
3674*67e74705SXin Li                "      aaaaa(aaaaaa) {}",
3675*67e74705SXin Li                OnePerLine);
3676*67e74705SXin Li   verifyFormat("Constructor()\n"
3677*67e74705SXin Li                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3678*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
3679*67e74705SXin Li                OnePerLine);
3680*67e74705SXin Li   OnePerLine.BinPackParameters = false;
3681*67e74705SXin Li   verifyFormat(
3682*67e74705SXin Li       "Constructor()\n"
3683*67e74705SXin Li       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3684*67e74705SXin Li       "          aaaaaaaaaaa().aaa(),\n"
3685*67e74705SXin Li       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3686*67e74705SXin Li       OnePerLine);
3687*67e74705SXin Li   OnePerLine.ColumnLimit = 60;
3688*67e74705SXin Li   verifyFormat("Constructor()\n"
3689*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
3690*67e74705SXin Li                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3691*67e74705SXin Li                OnePerLine);
3692*67e74705SXin Li 
3693*67e74705SXin Li   EXPECT_EQ("Constructor()\n"
3694*67e74705SXin Li             "    : // Comment forcing unwanted break.\n"
3695*67e74705SXin Li             "      aaaa(aaaa) {}",
3696*67e74705SXin Li             format("Constructor() :\n"
3697*67e74705SXin Li                    "    // Comment forcing unwanted break.\n"
3698*67e74705SXin Li                    "    aaaa(aaaa) {}"));
3699*67e74705SXin Li }
3700*67e74705SXin Li 
TEST_F(FormatTest,MemoizationTests)3701*67e74705SXin Li TEST_F(FormatTest, MemoizationTests) {
3702*67e74705SXin Li   // This breaks if the memoization lookup does not take \c Indent and
3703*67e74705SXin Li   // \c LastSpace into account.
3704*67e74705SXin Li   verifyFormat(
3705*67e74705SXin Li       "extern CFRunLoopTimerRef\n"
3706*67e74705SXin Li       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3707*67e74705SXin Li       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
3708*67e74705SXin Li       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
3709*67e74705SXin Li       "                     CFRunLoopTimerContext *context) {}");
3710*67e74705SXin Li 
3711*67e74705SXin Li   // Deep nesting somewhat works around our memoization.
3712*67e74705SXin Li   verifyFormat(
3713*67e74705SXin Li       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3714*67e74705SXin Li       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3715*67e74705SXin Li       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3716*67e74705SXin Li       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3717*67e74705SXin Li       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
3718*67e74705SXin Li       getLLVMStyleWithColumns(65));
3719*67e74705SXin Li   verifyFormat(
3720*67e74705SXin Li       "aaaaa(\n"
3721*67e74705SXin Li       "    aaaaa,\n"
3722*67e74705SXin Li       "    aaaaa(\n"
3723*67e74705SXin Li       "        aaaaa,\n"
3724*67e74705SXin Li       "        aaaaa(\n"
3725*67e74705SXin Li       "            aaaaa,\n"
3726*67e74705SXin Li       "            aaaaa(\n"
3727*67e74705SXin Li       "                aaaaa,\n"
3728*67e74705SXin Li       "                aaaaa(\n"
3729*67e74705SXin Li       "                    aaaaa,\n"
3730*67e74705SXin Li       "                    aaaaa(\n"
3731*67e74705SXin Li       "                        aaaaa,\n"
3732*67e74705SXin Li       "                        aaaaa(\n"
3733*67e74705SXin Li       "                            aaaaa,\n"
3734*67e74705SXin Li       "                            aaaaa(\n"
3735*67e74705SXin Li       "                                aaaaa,\n"
3736*67e74705SXin Li       "                                aaaaa(\n"
3737*67e74705SXin Li       "                                    aaaaa,\n"
3738*67e74705SXin Li       "                                    aaaaa(\n"
3739*67e74705SXin Li       "                                        aaaaa,\n"
3740*67e74705SXin Li       "                                        aaaaa(\n"
3741*67e74705SXin Li       "                                            aaaaa,\n"
3742*67e74705SXin Li       "                                            aaaaa(\n"
3743*67e74705SXin Li       "                                                aaaaa,\n"
3744*67e74705SXin Li       "                                                aaaaa))))))))))));",
3745*67e74705SXin Li       getLLVMStyleWithColumns(65));
3746*67e74705SXin Li   verifyFormat(
3747*67e74705SXin Li       "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"
3748*67e74705SXin Li       "                                  a),\n"
3749*67e74705SXin Li       "                                a),\n"
3750*67e74705SXin Li       "                              a),\n"
3751*67e74705SXin Li       "                            a),\n"
3752*67e74705SXin Li       "                          a),\n"
3753*67e74705SXin Li       "                        a),\n"
3754*67e74705SXin Li       "                      a),\n"
3755*67e74705SXin Li       "                    a),\n"
3756*67e74705SXin Li       "                  a),\n"
3757*67e74705SXin Li       "                a),\n"
3758*67e74705SXin Li       "              a),\n"
3759*67e74705SXin Li       "            a),\n"
3760*67e74705SXin Li       "          a),\n"
3761*67e74705SXin Li       "        a),\n"
3762*67e74705SXin Li       "      a),\n"
3763*67e74705SXin Li       "    a),\n"
3764*67e74705SXin Li       "  a)",
3765*67e74705SXin Li       getLLVMStyleWithColumns(65));
3766*67e74705SXin Li 
3767*67e74705SXin Li   // This test takes VERY long when memoization is broken.
3768*67e74705SXin Li   FormatStyle OnePerLine = getLLVMStyle();
3769*67e74705SXin Li   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3770*67e74705SXin Li   OnePerLine.BinPackParameters = false;
3771*67e74705SXin Li   std::string input = "Constructor()\n"
3772*67e74705SXin Li                       "    : aaaa(a,\n";
3773*67e74705SXin Li   for (unsigned i = 0, e = 80; i != e; ++i) {
3774*67e74705SXin Li     input += "           a,\n";
3775*67e74705SXin Li   }
3776*67e74705SXin Li   input += "           a) {}";
3777*67e74705SXin Li   verifyFormat(input, OnePerLine);
3778*67e74705SXin Li }
3779*67e74705SXin Li 
TEST_F(FormatTest,BreaksAsHighAsPossible)3780*67e74705SXin Li TEST_F(FormatTest, BreaksAsHighAsPossible) {
3781*67e74705SXin Li   verifyFormat(
3782*67e74705SXin Li       "void f() {\n"
3783*67e74705SXin Li       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3784*67e74705SXin Li       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3785*67e74705SXin Li       "    f();\n"
3786*67e74705SXin Li       "}");
3787*67e74705SXin Li   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
3788*67e74705SXin Li                "    Intervals[i - 1].getRange().getLast()) {\n}");
3789*67e74705SXin Li }
3790*67e74705SXin Li 
TEST_F(FormatTest,BreaksFunctionDeclarations)3791*67e74705SXin Li TEST_F(FormatTest, BreaksFunctionDeclarations) {
3792*67e74705SXin Li   // Principially, we break function declarations in a certain order:
3793*67e74705SXin Li   // 1) break amongst arguments.
3794*67e74705SXin Li   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3795*67e74705SXin Li                "                              Cccccccccccccc cccccccccccccc);");
3796*67e74705SXin Li   verifyFormat("template <class TemplateIt>\n"
3797*67e74705SXin Li                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3798*67e74705SXin Li                "                            TemplateIt *stop) {}");
3799*67e74705SXin Li 
3800*67e74705SXin Li   // 2) break after return type.
3801*67e74705SXin Li   verifyFormat(
3802*67e74705SXin Li       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3803*67e74705SXin Li       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
3804*67e74705SXin Li       getGoogleStyle());
3805*67e74705SXin Li 
3806*67e74705SXin Li   // 3) break after (.
3807*67e74705SXin Li   verifyFormat(
3808*67e74705SXin Li       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
3809*67e74705SXin Li       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3810*67e74705SXin Li       getGoogleStyle());
3811*67e74705SXin Li 
3812*67e74705SXin Li   // 4) break before after nested name specifiers.
3813*67e74705SXin Li   verifyFormat(
3814*67e74705SXin Li       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3815*67e74705SXin Li       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3816*67e74705SXin Li       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
3817*67e74705SXin Li       getGoogleStyle());
3818*67e74705SXin Li 
3819*67e74705SXin Li   // However, there are exceptions, if a sufficient amount of lines can be
3820*67e74705SXin Li   // saved.
3821*67e74705SXin Li   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3822*67e74705SXin Li   // more adjusting.
3823*67e74705SXin Li   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3824*67e74705SXin Li                "                                  Cccccccccccccc cccccccccc,\n"
3825*67e74705SXin Li                "                                  Cccccccccccccc cccccccccc,\n"
3826*67e74705SXin Li                "                                  Cccccccccccccc cccccccccc,\n"
3827*67e74705SXin Li                "                                  Cccccccccccccc cccccccccc);");
3828*67e74705SXin Li   verifyFormat(
3829*67e74705SXin Li       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3830*67e74705SXin Li       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3831*67e74705SXin Li       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3832*67e74705SXin Li       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
3833*67e74705SXin Li       getGoogleStyle());
3834*67e74705SXin Li   verifyFormat(
3835*67e74705SXin Li       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3836*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc,\n"
3837*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc,\n"
3838*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc,\n"
3839*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc,\n"
3840*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc,\n"
3841*67e74705SXin Li       "                                          Cccccccccccccc cccccccccc);");
3842*67e74705SXin Li   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3843*67e74705SXin Li                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3844*67e74705SXin Li                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3845*67e74705SXin Li                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3846*67e74705SXin Li                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
3847*67e74705SXin Li 
3848*67e74705SXin Li   // Break after multi-line parameters.
3849*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3850*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3851*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3852*67e74705SXin Li                "    bbbb bbbb);");
3853*67e74705SXin Li   verifyFormat("void SomeLoooooooooooongFunction(\n"
3854*67e74705SXin Li                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3855*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3856*67e74705SXin Li                "    int bbbbbbbbbbbbb);");
3857*67e74705SXin Li 
3858*67e74705SXin Li   // Treat overloaded operators like other functions.
3859*67e74705SXin Li   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3860*67e74705SXin Li                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
3861*67e74705SXin Li   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3862*67e74705SXin Li                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
3863*67e74705SXin Li   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3864*67e74705SXin Li                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3865*67e74705SXin Li   verifyGoogleFormat(
3866*67e74705SXin Li       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3867*67e74705SXin Li       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
3868*67e74705SXin Li   verifyGoogleFormat(
3869*67e74705SXin Li       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3870*67e74705SXin Li       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
3871*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3872*67e74705SXin Li                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3873*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3874*67e74705SXin Li                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3875*67e74705SXin Li   verifyGoogleFormat(
3876*67e74705SXin Li       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3877*67e74705SXin Li       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3878*67e74705SXin Li       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
3879*67e74705SXin Li   verifyGoogleFormat(
3880*67e74705SXin Li       "template <typename T>\n"
3881*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3882*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3883*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
3884*67e74705SXin Li 
3885*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
3886*67e74705SXin Li   Style.PointerAlignment = FormatStyle::PAS_Left;
3887*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3888*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3889*67e74705SXin Li                Style);
3890*67e74705SXin Li   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3891*67e74705SXin Li                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3892*67e74705SXin Li                Style);
3893*67e74705SXin Li }
3894*67e74705SXin Li 
TEST_F(FormatTest,TrailingReturnType)3895*67e74705SXin Li TEST_F(FormatTest, TrailingReturnType) {
3896*67e74705SXin Li   verifyFormat("auto foo() -> int;\n");
3897*67e74705SXin Li   verifyFormat("struct S {\n"
3898*67e74705SXin Li                "  auto bar() const -> int;\n"
3899*67e74705SXin Li                "};");
3900*67e74705SXin Li   verifyFormat("template <size_t Order, typename T>\n"
3901*67e74705SXin Li                "auto load_img(const std::string &filename)\n"
3902*67e74705SXin Li                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
3903*67e74705SXin Li   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3904*67e74705SXin Li                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
3905*67e74705SXin Li   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
3906*67e74705SXin Li   verifyFormat("template <typename T>\n"
3907*67e74705SXin Li                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3908*67e74705SXin Li                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
3909*67e74705SXin Li 
3910*67e74705SXin Li   // Not trailing return types.
3911*67e74705SXin Li   verifyFormat("void f() { auto a = b->c(); }");
3912*67e74705SXin Li }
3913*67e74705SXin Li 
TEST_F(FormatTest,BreaksFunctionDeclarationsWithTrailingTokens)3914*67e74705SXin Li TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
3915*67e74705SXin Li   // Avoid breaking before trailing 'const' or other trailing annotations, if
3916*67e74705SXin Li   // they are not function-like.
3917*67e74705SXin Li   FormatStyle Style = getGoogleStyle();
3918*67e74705SXin Li   Style.ColumnLimit = 47;
3919*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3920*67e74705SXin Li                "    int someLoooooooooooooongParameter) const {\n}",
3921*67e74705SXin Li                getLLVMStyleWithColumns(47));
3922*67e74705SXin Li   verifyFormat("LoooooongReturnType\n"
3923*67e74705SXin Li                "someLoooooooongFunction() const {}",
3924*67e74705SXin Li                getLLVMStyleWithColumns(47));
3925*67e74705SXin Li   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3926*67e74705SXin Li                "    const {}",
3927*67e74705SXin Li                Style);
3928*67e74705SXin Li   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3929*67e74705SXin Li                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3930*67e74705SXin Li   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3931*67e74705SXin Li                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3932*67e74705SXin Li   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3933*67e74705SXin Li                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
3934*67e74705SXin Li   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3935*67e74705SXin Li                "                   aaaaaaaaaaa aaaaa) const override;");
3936*67e74705SXin Li   verifyGoogleFormat(
3937*67e74705SXin Li       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3938*67e74705SXin Li       "    const override;");
3939*67e74705SXin Li 
3940*67e74705SXin Li   // Even if the first parameter has to be wrapped.
3941*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3942*67e74705SXin Li                "    int someLongParameter) const {}",
3943*67e74705SXin Li                getLLVMStyleWithColumns(46));
3944*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3945*67e74705SXin Li                "    int someLongParameter) const {}",
3946*67e74705SXin Li                Style);
3947*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3948*67e74705SXin Li                "    int someLongParameter) override {}",
3949*67e74705SXin Li                Style);
3950*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3951*67e74705SXin Li                "    int someLongParameter) OVERRIDE {}",
3952*67e74705SXin Li                Style);
3953*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3954*67e74705SXin Li                "    int someLongParameter) final {}",
3955*67e74705SXin Li                Style);
3956*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3957*67e74705SXin Li                "    int someLongParameter) FINAL {}",
3958*67e74705SXin Li                Style);
3959*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3960*67e74705SXin Li                "    int parameter) const override {}",
3961*67e74705SXin Li                Style);
3962*67e74705SXin Li 
3963*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3964*67e74705SXin Li   verifyFormat("void someLongFunction(\n"
3965*67e74705SXin Li                "    int someLongParameter) const\n"
3966*67e74705SXin Li                "{\n"
3967*67e74705SXin Li                "}",
3968*67e74705SXin Li                Style);
3969*67e74705SXin Li 
3970*67e74705SXin Li   // Unless these are unknown annotations.
3971*67e74705SXin Li   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3972*67e74705SXin Li                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3973*67e74705SXin Li                "    LONG_AND_UGLY_ANNOTATION;");
3974*67e74705SXin Li 
3975*67e74705SXin Li   // Breaking before function-like trailing annotations is fine to keep them
3976*67e74705SXin Li   // close to their arguments.
3977*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3978*67e74705SXin Li                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3979*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3980*67e74705SXin Li                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3981*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3982*67e74705SXin Li                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
3983*67e74705SXin Li   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3984*67e74705SXin Li                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
3985*67e74705SXin Li   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
3986*67e74705SXin Li 
3987*67e74705SXin Li   verifyFormat(
3988*67e74705SXin Li       "void aaaaaaaaaaaaaaaaaa()\n"
3989*67e74705SXin Li       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3990*67e74705SXin Li       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
3991*67e74705SXin Li   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3992*67e74705SXin Li                "    __attribute__((unused));");
3993*67e74705SXin Li   verifyGoogleFormat(
3994*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3995*67e74705SXin Li       "    GUARDED_BY(aaaaaaaaaaaa);");
3996*67e74705SXin Li   verifyGoogleFormat(
3997*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3998*67e74705SXin Li       "    GUARDED_BY(aaaaaaaaaaaa);");
3999*67e74705SXin Li   verifyGoogleFormat(
4000*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4001*67e74705SXin Li       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4002*67e74705SXin Li   verifyGoogleFormat(
4003*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4004*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
4005*67e74705SXin Li }
4006*67e74705SXin Li 
TEST_F(FormatTest,FunctionAnnotations)4007*67e74705SXin Li TEST_F(FormatTest, FunctionAnnotations) {
4008*67e74705SXin Li   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4009*67e74705SXin Li                "int OldFunction(const string &parameter) {}");
4010*67e74705SXin Li   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4011*67e74705SXin Li                "string OldFunction(const string &parameter) {}");
4012*67e74705SXin Li   verifyFormat("template <typename T>\n"
4013*67e74705SXin Li                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4014*67e74705SXin Li                "string OldFunction(const string &parameter) {}");
4015*67e74705SXin Li 
4016*67e74705SXin Li   // Not function annotations.
4017*67e74705SXin Li   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4018*67e74705SXin Li                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
4019*67e74705SXin Li   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4020*67e74705SXin Li                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
4021*67e74705SXin Li   verifyFormat("MACRO(abc).function() // wrap\n"
4022*67e74705SXin Li                "    << abc;");
4023*67e74705SXin Li   verifyFormat("MACRO(abc)->function() // wrap\n"
4024*67e74705SXin Li                "    << abc;");
4025*67e74705SXin Li   verifyFormat("MACRO(abc)::function() // wrap\n"
4026*67e74705SXin Li                "    << abc;");
4027*67e74705SXin Li }
4028*67e74705SXin Li 
TEST_F(FormatTest,BreaksDesireably)4029*67e74705SXin Li TEST_F(FormatTest, BreaksDesireably) {
4030*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4031*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4032*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
4033*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4034*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4035*67e74705SXin Li                "}");
4036*67e74705SXin Li 
4037*67e74705SXin Li   verifyFormat(
4038*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4039*67e74705SXin Li       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4040*67e74705SXin Li 
4041*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4042*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4043*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4044*67e74705SXin Li 
4045*67e74705SXin Li   verifyFormat(
4046*67e74705SXin Li       "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4047*67e74705SXin Li       "                            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4048*67e74705SXin Li       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4049*67e74705SXin Li       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
4050*67e74705SXin Li 
4051*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4052*67e74705SXin Li                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4053*67e74705SXin Li 
4054*67e74705SXin Li   verifyFormat(
4055*67e74705SXin Li       "void f() {\n"
4056*67e74705SXin Li       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4057*67e74705SXin Li       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4058*67e74705SXin Li       "}");
4059*67e74705SXin Li   verifyFormat(
4060*67e74705SXin Li       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4061*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4062*67e74705SXin Li   verifyFormat(
4063*67e74705SXin Li       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4064*67e74705SXin Li       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4065*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4066*67e74705SXin Li                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4067*67e74705SXin Li                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4068*67e74705SXin Li 
4069*67e74705SXin Li   // Indent consistently independent of call expression and unary operator.
4070*67e74705SXin Li   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4071*67e74705SXin Li                "    dddddddddddddddddddddddddddddd));");
4072*67e74705SXin Li   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4073*67e74705SXin Li                "    dddddddddddddddddddddddddddddd));");
4074*67e74705SXin Li   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
4075*67e74705SXin Li                "    dddddddddddddddddddddddddddddd));");
4076*67e74705SXin Li 
4077*67e74705SXin Li   // This test case breaks on an incorrect memoization, i.e. an optimization not
4078*67e74705SXin Li   // taking into account the StopAt value.
4079*67e74705SXin Li   verifyFormat(
4080*67e74705SXin Li       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4081*67e74705SXin Li       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4082*67e74705SXin Li       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4083*67e74705SXin Li       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4084*67e74705SXin Li 
4085*67e74705SXin Li   verifyFormat("{\n  {\n    {\n"
4086*67e74705SXin Li                "      Annotation.SpaceRequiredBefore =\n"
4087*67e74705SXin Li                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4088*67e74705SXin Li                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4089*67e74705SXin Li                "    }\n  }\n}");
4090*67e74705SXin Li 
4091*67e74705SXin Li   // Break on an outer level if there was a break on an inner level.
4092*67e74705SXin Li   EXPECT_EQ("f(g(h(a, // comment\n"
4093*67e74705SXin Li             "      b, c),\n"
4094*67e74705SXin Li             "    d, e),\n"
4095*67e74705SXin Li             "  x, y);",
4096*67e74705SXin Li             format("f(g(h(a, // comment\n"
4097*67e74705SXin Li                    "    b, c), d, e), x, y);"));
4098*67e74705SXin Li 
4099*67e74705SXin Li   // Prefer breaking similar line breaks.
4100*67e74705SXin Li   verifyFormat(
4101*67e74705SXin Li       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4102*67e74705SXin Li       "                             NSTrackingMouseEnteredAndExited |\n"
4103*67e74705SXin Li       "                             NSTrackingActiveAlways;");
4104*67e74705SXin Li }
4105*67e74705SXin Li 
TEST_F(FormatTest,FormatsDeclarationsOnePerLine)4106*67e74705SXin Li TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4107*67e74705SXin Li   FormatStyle NoBinPacking = getGoogleStyle();
4108*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
4109*67e74705SXin Li   NoBinPacking.BinPackArguments = true;
4110*67e74705SXin Li   verifyFormat("void f() {\n"
4111*67e74705SXin Li                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4112*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4113*67e74705SXin Li                "}",
4114*67e74705SXin Li                NoBinPacking);
4115*67e74705SXin Li   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4116*67e74705SXin Li                "       int aaaaaaaaaaaaaaaaaaaa,\n"
4117*67e74705SXin Li                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4118*67e74705SXin Li                NoBinPacking);
4119*67e74705SXin Li 
4120*67e74705SXin Li   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4121*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4122*67e74705SXin Li                "                        vector<int> bbbbbbbbbbbbbbb);",
4123*67e74705SXin Li                NoBinPacking);
4124*67e74705SXin Li   // FIXME: This behavior difference is probably not wanted. However, currently
4125*67e74705SXin Li   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4126*67e74705SXin Li   // template arguments from BreakBeforeParameter being set because of the
4127*67e74705SXin Li   // one-per-line formatting.
4128*67e74705SXin Li   verifyFormat(
4129*67e74705SXin Li       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4130*67e74705SXin Li       "                                             aaaaaaaaaa> aaaaaaaaaa);",
4131*67e74705SXin Li       NoBinPacking);
4132*67e74705SXin Li   verifyFormat(
4133*67e74705SXin Li       "void fffffffffff(\n"
4134*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4135*67e74705SXin Li       "        aaaaaaaaaa);");
4136*67e74705SXin Li }
4137*67e74705SXin Li 
TEST_F(FormatTest,FormatsOneParameterPerLineIfNecessary)4138*67e74705SXin Li TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
4139*67e74705SXin Li   FormatStyle NoBinPacking = getGoogleStyle();
4140*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
4141*67e74705SXin Li   NoBinPacking.BinPackArguments = false;
4142*67e74705SXin Li   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4143*67e74705SXin Li                "  aaaaaaaaaaaaaaaaaaaa,\n"
4144*67e74705SXin Li                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4145*67e74705SXin Li                NoBinPacking);
4146*67e74705SXin Li   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4147*67e74705SXin Li                "        aaaaaaaaaaaaa,\n"
4148*67e74705SXin Li                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4149*67e74705SXin Li                NoBinPacking);
4150*67e74705SXin Li   verifyFormat(
4151*67e74705SXin Li       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4152*67e74705SXin Li       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4153*67e74705SXin Li       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4154*67e74705SXin Li       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4155*67e74705SXin Li       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4156*67e74705SXin Li       NoBinPacking);
4157*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4158*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaa();",
4159*67e74705SXin Li                NoBinPacking);
4160*67e74705SXin Li   verifyFormat("void f() {\n"
4161*67e74705SXin Li                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4162*67e74705SXin Li                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4163*67e74705SXin Li                "}",
4164*67e74705SXin Li                NoBinPacking);
4165*67e74705SXin Li 
4166*67e74705SXin Li   verifyFormat(
4167*67e74705SXin Li       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4168*67e74705SXin Li       "             aaaaaaaaaaaa,\n"
4169*67e74705SXin Li       "             aaaaaaaaaaaa);",
4170*67e74705SXin Li       NoBinPacking);
4171*67e74705SXin Li   verifyFormat(
4172*67e74705SXin Li       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4173*67e74705SXin Li       "                               ddddddddddddddddddddddddddddd),\n"
4174*67e74705SXin Li       "             test);",
4175*67e74705SXin Li       NoBinPacking);
4176*67e74705SXin Li 
4177*67e74705SXin Li   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4178*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
4179*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
4180*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaa;",
4181*67e74705SXin Li                NoBinPacking);
4182*67e74705SXin Li   verifyFormat("a(\"a\"\n"
4183*67e74705SXin Li                "  \"a\",\n"
4184*67e74705SXin Li                "  a);");
4185*67e74705SXin Li 
4186*67e74705SXin Li   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4187*67e74705SXin Li   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
4188*67e74705SXin Li                "                aaaaaaaaa,\n"
4189*67e74705SXin Li                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4190*67e74705SXin Li                NoBinPacking);
4191*67e74705SXin Li   verifyFormat(
4192*67e74705SXin Li       "void f() {\n"
4193*67e74705SXin Li       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4194*67e74705SXin Li       "      .aaaaaaa();\n"
4195*67e74705SXin Li       "}",
4196*67e74705SXin Li       NoBinPacking);
4197*67e74705SXin Li   verifyFormat(
4198*67e74705SXin Li       "template <class SomeType, class SomeOtherType>\n"
4199*67e74705SXin Li       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4200*67e74705SXin Li       NoBinPacking);
4201*67e74705SXin Li }
4202*67e74705SXin Li 
TEST_F(FormatTest,AdaptiveOnePerLineFormatting)4203*67e74705SXin Li TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4204*67e74705SXin Li   FormatStyle Style = getLLVMStyleWithColumns(15);
4205*67e74705SXin Li   Style.ExperimentalAutoDetectBinPacking = true;
4206*67e74705SXin Li   EXPECT_EQ("aaa(aaaa,\n"
4207*67e74705SXin Li             "    aaaa,\n"
4208*67e74705SXin Li             "    aaaa);\n"
4209*67e74705SXin Li             "aaa(aaaa,\n"
4210*67e74705SXin Li             "    aaaa,\n"
4211*67e74705SXin Li             "    aaaa);",
4212*67e74705SXin Li             format("aaa(aaaa,\n" // one-per-line
4213*67e74705SXin Li                    "  aaaa,\n"
4214*67e74705SXin Li                    "    aaaa  );\n"
4215*67e74705SXin Li                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4216*67e74705SXin Li                    Style));
4217*67e74705SXin Li   EXPECT_EQ("aaa(aaaa, aaaa,\n"
4218*67e74705SXin Li             "    aaaa);\n"
4219*67e74705SXin Li             "aaa(aaaa, aaaa,\n"
4220*67e74705SXin Li             "    aaaa);",
4221*67e74705SXin Li             format("aaa(aaaa,  aaaa,\n" // bin-packed
4222*67e74705SXin Li                    "    aaaa  );\n"
4223*67e74705SXin Li                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4224*67e74705SXin Li                    Style));
4225*67e74705SXin Li }
4226*67e74705SXin Li 
TEST_F(FormatTest,FormatsBuilderPattern)4227*67e74705SXin Li TEST_F(FormatTest, FormatsBuilderPattern) {
4228*67e74705SXin Li   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4229*67e74705SXin Li                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4230*67e74705SXin Li                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4231*67e74705SXin Li                "    .StartsWith(\".init\", ORDER_INIT)\n"
4232*67e74705SXin Li                "    .StartsWith(\".fini\", ORDER_FINI)\n"
4233*67e74705SXin Li                "    .StartsWith(\".hash\", ORDER_HASH)\n"
4234*67e74705SXin Li                "    .Default(ORDER_TEXT);\n");
4235*67e74705SXin Li 
4236*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
4237*67e74705SXin Li                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
4238*67e74705SXin Li   verifyFormat(
4239*67e74705SXin Li       "aaaaaaa->aaaaaaa\n"
4240*67e74705SXin Li       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4241*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4242*67e74705SXin Li       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4243*67e74705SXin Li   verifyFormat(
4244*67e74705SXin Li       "aaaaaaa->aaaaaaa\n"
4245*67e74705SXin Li       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4246*67e74705SXin Li       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4247*67e74705SXin Li   verifyFormat(
4248*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
4249*67e74705SXin Li       "    aaaaaaaaaaaaaa);");
4250*67e74705SXin Li   verifyFormat(
4251*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4252*67e74705SXin Li       "    aaaaaa->aaaaaaaaaaaa()\n"
4253*67e74705SXin Li       "        ->aaaaaaaaaaaaaaaa(\n"
4254*67e74705SXin Li       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4255*67e74705SXin Li       "        ->aaaaaaaaaaaaaaaaa();");
4256*67e74705SXin Li   verifyGoogleFormat(
4257*67e74705SXin Li       "void f() {\n"
4258*67e74705SXin Li       "  someo->Add((new util::filetools::Handler(dir))\n"
4259*67e74705SXin Li       "                 ->OnEvent1(NewPermanentCallback(\n"
4260*67e74705SXin Li       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
4261*67e74705SXin Li       "                 ->OnEvent2(NewPermanentCallback(\n"
4262*67e74705SXin Li       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
4263*67e74705SXin Li       "                 ->OnEvent3(NewPermanentCallback(\n"
4264*67e74705SXin Li       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
4265*67e74705SXin Li       "                 ->OnEvent5(NewPermanentCallback(\n"
4266*67e74705SXin Li       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
4267*67e74705SXin Li       "                 ->OnEvent6(NewPermanentCallback(\n"
4268*67e74705SXin Li       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
4269*67e74705SXin Li       "}");
4270*67e74705SXin Li 
4271*67e74705SXin Li   verifyFormat(
4272*67e74705SXin Li       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4273*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaa()\n"
4274*67e74705SXin Li                "    .aaaaaaaaaaaaaaa()\n"
4275*67e74705SXin Li                "    .aaaaaaaaaaaaaaa()\n"
4276*67e74705SXin Li                "    .aaaaaaaaaaaaaaa()\n"
4277*67e74705SXin Li                "    .aaaaaaaaaaaaaaa();");
4278*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4279*67e74705SXin Li                "    .aaaaaaaaaaaaaaa()\n"
4280*67e74705SXin Li                "    .aaaaaaaaaaaaaaa()\n"
4281*67e74705SXin Li                "    .aaaaaaaaaaaaaaa();");
4282*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4283*67e74705SXin Li                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4284*67e74705SXin Li                "    .aaaaaaaaaaaaaaa();");
4285*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4286*67e74705SXin Li                "    ->aaaaaaaaaaaaaae(0)\n"
4287*67e74705SXin Li                "    ->aaaaaaaaaaaaaaa();");
4288*67e74705SXin Li 
4289*67e74705SXin Li   // Don't linewrap after very short segments.
4290*67e74705SXin Li   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4291*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4292*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4293*67e74705SXin Li   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4294*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4295*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4296*67e74705SXin Li   verifyFormat("aaa()\n"
4297*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4298*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4299*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4300*67e74705SXin Li 
4301*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4302*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4303*67e74705SXin Li                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
4304*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4305*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4306*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
4307*67e74705SXin Li 
4308*67e74705SXin Li   // Prefer not to break after empty parentheses.
4309*67e74705SXin Li   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4310*67e74705SXin Li                "    First->LastNewlineOffset);");
4311*67e74705SXin Li 
4312*67e74705SXin Li   // Prefer not to create "hanging" indents.
4313*67e74705SXin Li   verifyFormat(
4314*67e74705SXin Li       "return !soooooooooooooome_map\n"
4315*67e74705SXin Li       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4316*67e74705SXin Li       "            .second;");
4317*67e74705SXin Li   verifyFormat(
4318*67e74705SXin Li       "return aaaaaaaaaaaaaaaa\n"
4319*67e74705SXin Li       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4320*67e74705SXin Li       "    .aaaa(aaaaaaaaaaaaaa);");
4321*67e74705SXin Li   // No hanging indent here.
4322*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4323*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4324*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4325*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4326*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4327*67e74705SXin Li                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4328*67e74705SXin Li                getLLVMStyleWithColumns(60));
4329*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4330*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4331*67e74705SXin Li                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4332*67e74705SXin Li                getLLVMStyleWithColumns(59));
4333*67e74705SXin Li   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4334*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4335*67e74705SXin Li                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4336*67e74705SXin Li }
4337*67e74705SXin Li 
TEST_F(FormatTest,BreaksAccordingToOperatorPrecedence)4338*67e74705SXin Li TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4339*67e74705SXin Li   verifyFormat(
4340*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4341*67e74705SXin Li       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
4342*67e74705SXin Li   verifyFormat(
4343*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4344*67e74705SXin Li       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4345*67e74705SXin Li 
4346*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
4347*67e74705SXin Li                "    ccccccccccccccccccccccccc) {\n}");
4348*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4349*67e74705SXin Li                "    ccccccccccccccccccccccccc) {\n}");
4350*67e74705SXin Li 
4351*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
4352*67e74705SXin Li                "    ccccccccccccccccccccccccc) {\n}");
4353*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4354*67e74705SXin Li                "    ccccccccccccccccccccccccc) {\n}");
4355*67e74705SXin Li 
4356*67e74705SXin Li   verifyFormat(
4357*67e74705SXin Li       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
4358*67e74705SXin Li       "    ccccccccccccccccccccccccc) {\n}");
4359*67e74705SXin Li   verifyFormat(
4360*67e74705SXin Li       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4361*67e74705SXin Li       "    ccccccccccccccccccccccccc) {\n}");
4362*67e74705SXin Li 
4363*67e74705SXin Li   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4364*67e74705SXin Li                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4365*67e74705SXin Li                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4366*67e74705SXin Li                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4367*67e74705SXin Li   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4368*67e74705SXin Li                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4369*67e74705SXin Li                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4370*67e74705SXin Li                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4371*67e74705SXin Li 
4372*67e74705SXin Li   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4373*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4374*67e74705SXin Li                "    aaaaaaaaaaaaaaa != aa) {\n}");
4375*67e74705SXin Li   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4376*67e74705SXin Li                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4377*67e74705SXin Li                "    aaaaaaaaaaaaaaa != aa) {\n}");
4378*67e74705SXin Li }
4379*67e74705SXin Li 
TEST_F(FormatTest,BreaksAfterAssignments)4380*67e74705SXin Li TEST_F(FormatTest, BreaksAfterAssignments) {
4381*67e74705SXin Li   verifyFormat(
4382*67e74705SXin Li       "unsigned Cost =\n"
4383*67e74705SXin Li       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4384*67e74705SXin Li       "                        SI->getPointerAddressSpaceee());\n");
4385*67e74705SXin Li   verifyFormat(
4386*67e74705SXin Li       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4387*67e74705SXin Li       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
4388*67e74705SXin Li 
4389*67e74705SXin Li   verifyFormat(
4390*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4391*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
4392*67e74705SXin Li   verifyFormat("unsigned OriginalStartColumn =\n"
4393*67e74705SXin Li                "    SourceMgr.getSpellingColumnNumber(\n"
4394*67e74705SXin Li                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
4395*67e74705SXin Li                "    1;");
4396*67e74705SXin Li }
4397*67e74705SXin Li 
TEST_F(FormatTest,AlignsAfterAssignments)4398*67e74705SXin Li TEST_F(FormatTest, AlignsAfterAssignments) {
4399*67e74705SXin Li   verifyFormat(
4400*67e74705SXin Li       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4401*67e74705SXin Li       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
4402*67e74705SXin Li   verifyFormat(
4403*67e74705SXin Li       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4404*67e74705SXin Li       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
4405*67e74705SXin Li   verifyFormat(
4406*67e74705SXin Li       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4407*67e74705SXin Li       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
4408*67e74705SXin Li   verifyFormat(
4409*67e74705SXin Li       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4410*67e74705SXin Li       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
4411*67e74705SXin Li   verifyFormat(
4412*67e74705SXin Li       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4413*67e74705SXin Li       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4414*67e74705SXin Li       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
4415*67e74705SXin Li }
4416*67e74705SXin Li 
TEST_F(FormatTest,AlignsAfterReturn)4417*67e74705SXin Li TEST_F(FormatTest, AlignsAfterReturn) {
4418*67e74705SXin Li   verifyFormat(
4419*67e74705SXin Li       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4420*67e74705SXin Li       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
4421*67e74705SXin Li   verifyFormat(
4422*67e74705SXin Li       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4423*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
4424*67e74705SXin Li   verifyFormat(
4425*67e74705SXin Li       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
4426*67e74705SXin Li       "       aaaaaaaaaaaaaaaaaaaaaa();");
4427*67e74705SXin Li   verifyFormat(
4428*67e74705SXin Li       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
4429*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaa());");
4430*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4431*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4432*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4433*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4434*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4435*67e74705SXin Li   verifyFormat("return\n"
4436*67e74705SXin Li                "    // true if code is one of a or b.\n"
4437*67e74705SXin Li                "    code == a || code == b;");
4438*67e74705SXin Li }
4439*67e74705SXin Li 
TEST_F(FormatTest,AlignsAfterOpenBracket)4440*67e74705SXin Li TEST_F(FormatTest, AlignsAfterOpenBracket) {
4441*67e74705SXin Li   verifyFormat(
4442*67e74705SXin Li       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4443*67e74705SXin Li       "                                                aaaaaaaaa aaaaaaa) {}");
4444*67e74705SXin Li   verifyFormat(
4445*67e74705SXin Li       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4446*67e74705SXin Li       "                                               aaaaaaaaaaa aaaaaaaaa);");
4447*67e74705SXin Li   verifyFormat(
4448*67e74705SXin Li       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4449*67e74705SXin Li       "                                             aaaaaaaaaaaaaaaaaaaaa));");
4450*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
4451*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4452*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4453*67e74705SXin Li                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4454*67e74705SXin Li                Style);
4455*67e74705SXin Li   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4456*67e74705SXin Li                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4457*67e74705SXin Li                Style);
4458*67e74705SXin Li   verifyFormat("SomeLongVariableName->someFunction(\n"
4459*67e74705SXin Li                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4460*67e74705SXin Li                Style);
4461*67e74705SXin Li   verifyFormat(
4462*67e74705SXin Li       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4463*67e74705SXin Li       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4464*67e74705SXin Li       Style);
4465*67e74705SXin Li   verifyFormat(
4466*67e74705SXin Li       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4467*67e74705SXin Li       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4468*67e74705SXin Li       Style);
4469*67e74705SXin Li   verifyFormat(
4470*67e74705SXin Li       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4471*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4472*67e74705SXin Li       Style);
4473*67e74705SXin Li 
4474*67e74705SXin Li   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4475*67e74705SXin Li                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
4476*67e74705SXin Li                "        b));",
4477*67e74705SXin Li                Style);
4478*67e74705SXin Li 
4479*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4480*67e74705SXin Li   Style.BinPackArguments = false;
4481*67e74705SXin Li   Style.BinPackParameters = false;
4482*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4483*67e74705SXin Li                "    aaaaaaaaaaa aaaaaaaa,\n"
4484*67e74705SXin Li                "    aaaaaaaaa aaaaaaa,\n"
4485*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4486*67e74705SXin Li                Style);
4487*67e74705SXin Li   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4488*67e74705SXin Li                "    aaaaaaaaaaa aaaaaaaaa,\n"
4489*67e74705SXin Li                "    aaaaaaaaaaa aaaaaaaaa,\n"
4490*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4491*67e74705SXin Li                Style);
4492*67e74705SXin Li   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4493*67e74705SXin Li                "    aaaaaaaaaaaaaaa,\n"
4494*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaa,\n"
4495*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4496*67e74705SXin Li                Style);
4497*67e74705SXin Li   verifyFormat(
4498*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4499*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4500*67e74705SXin Li       Style);
4501*67e74705SXin Li   verifyFormat(
4502*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4503*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4504*67e74705SXin Li       Style);
4505*67e74705SXin Li   verifyFormat(
4506*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4507*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaa(\n"
4508*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4509*67e74705SXin Li       "    aaaaaaaaaaaaaaaa);",
4510*67e74705SXin Li       Style);
4511*67e74705SXin Li   verifyFormat(
4512*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4513*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaa(\n"
4514*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4515*67e74705SXin Li       "    aaaaaaaaaaaaaaaa);",
4516*67e74705SXin Li       Style);
4517*67e74705SXin Li }
4518*67e74705SXin Li 
TEST_F(FormatTest,ParenthesesAndOperandAlignment)4519*67e74705SXin Li TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4520*67e74705SXin Li   FormatStyle Style = getLLVMStyleWithColumns(40);
4521*67e74705SXin Li   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4522*67e74705SXin Li                "          bbbbbbbbbbbbbbbbbbbbbb);",
4523*67e74705SXin Li                Style);
4524*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
4525*67e74705SXin Li   Style.AlignOperands = false;
4526*67e74705SXin Li   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4527*67e74705SXin Li                "          bbbbbbbbbbbbbbbbbbbbbb);",
4528*67e74705SXin Li                Style);
4529*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4530*67e74705SXin Li   Style.AlignOperands = true;
4531*67e74705SXin Li   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4532*67e74705SXin Li                "          bbbbbbbbbbbbbbbbbbbbbb);",
4533*67e74705SXin Li                Style);
4534*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4535*67e74705SXin Li   Style.AlignOperands = false;
4536*67e74705SXin Li   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4537*67e74705SXin Li                "    bbbbbbbbbbbbbbbbbbbbbb);",
4538*67e74705SXin Li                Style);
4539*67e74705SXin Li }
4540*67e74705SXin Li 
TEST_F(FormatTest,BreaksConditionalExpressions)4541*67e74705SXin Li TEST_F(FormatTest, BreaksConditionalExpressions) {
4542*67e74705SXin Li   verifyFormat(
4543*67e74705SXin Li       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4544*67e74705SXin Li       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4545*67e74705SXin Li       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4546*67e74705SXin Li   verifyFormat(
4547*67e74705SXin Li       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4548*67e74705SXin Li       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4549*67e74705SXin Li   verifyFormat(
4550*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4551*67e74705SXin Li       "                                                    : aaaaaaaaaaaaa);");
4552*67e74705SXin Li   verifyFormat(
4553*67e74705SXin Li       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4554*67e74705SXin Li       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4555*67e74705SXin Li       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4556*67e74705SXin Li       "                   aaaaaaaaaaaaa);");
4557*67e74705SXin Li   verifyFormat(
4558*67e74705SXin Li       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4559*67e74705SXin Li       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4560*67e74705SXin Li       "                   aaaaaaaaaaaaa);");
4561*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4562*67e74705SXin Li                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4563*67e74705SXin Li                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4564*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4565*67e74705SXin Li                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4566*67e74705SXin Li   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4568*67e74705SXin Li                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4569*67e74705SXin Li                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4570*67e74705SXin Li                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4571*67e74705SXin Li                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4572*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4573*67e74705SXin Li   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4574*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575*67e74705SXin Li                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4576*67e74705SXin Li                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4577*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4578*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4579*67e74705SXin Li                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4580*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4581*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4582*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4583*67e74705SXin Li                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4584*67e74705SXin Li                "        : aaaaaaaaaaaaaaaa;");
4585*67e74705SXin Li   verifyFormat(
4586*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4587*67e74705SXin Li       "    ? aaaaaaaaaaaaaaa\n"
4588*67e74705SXin Li       "    : aaaaaaaaaaaaaaa;");
4589*67e74705SXin Li   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4590*67e74705SXin Li                "          aaaaaaaaa\n"
4591*67e74705SXin Li                "      ? b\n"
4592*67e74705SXin Li                "      : c);");
4593*67e74705SXin Li   verifyFormat("return aaaa == bbbb\n"
4594*67e74705SXin Li                "           // comment\n"
4595*67e74705SXin Li                "           ? aaaa\n"
4596*67e74705SXin Li                "           : bbbb;");
4597*67e74705SXin Li   verifyFormat("unsigned Indent =\n"
4598*67e74705SXin Li                "    format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n"
4599*67e74705SXin Li                "                              ? IndentForLevel[TheLine.Level]\n"
4600*67e74705SXin Li                "                              : TheLine * 2,\n"
4601*67e74705SXin Li                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
4602*67e74705SXin Li                getLLVMStyleWithColumns(70));
4603*67e74705SXin Li   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4604*67e74705SXin Li                "                  ? aaaaaaaaaaaaaaa\n"
4605*67e74705SXin Li                "                  : bbbbbbbbbbbbbbb //\n"
4606*67e74705SXin Li                "                        ? ccccccccccccccc\n"
4607*67e74705SXin Li                "                        : ddddddddddddddd;");
4608*67e74705SXin Li   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4609*67e74705SXin Li                "                  ? aaaaaaaaaaaaaaa\n"
4610*67e74705SXin Li                "                  : (bbbbbbbbbbbbbbb //\n"
4611*67e74705SXin Li                "                         ? ccccccccccccccc\n"
4612*67e74705SXin Li                "                         : ddddddddddddddd);");
4613*67e74705SXin Li   verifyFormat(
4614*67e74705SXin Li       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4615*67e74705SXin Li       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4616*67e74705SXin Li       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
4617*67e74705SXin Li       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
4618*67e74705SXin Li       "                                      : aaaaaaaaaa;");
4619*67e74705SXin Li   verifyFormat(
4620*67e74705SXin Li       "aaaaaa = aaaaaaaaaaaa\n"
4621*67e74705SXin Li       "             ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622*67e74705SXin Li       "                          : aaaaaaaaaaaaaaaaaaaaaa\n"
4623*67e74705SXin Li       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4624*67e74705SXin Li 
4625*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
4626*67e74705SXin Li   NoBinPacking.BinPackArguments = false;
4627*67e74705SXin Li   verifyFormat(
4628*67e74705SXin Li       "void f() {\n"
4629*67e74705SXin Li       "  g(aaa,\n"
4630*67e74705SXin Li       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4631*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4632*67e74705SXin Li       "        ? aaaaaaaaaaaaaaa\n"
4633*67e74705SXin Li       "        : aaaaaaaaaaaaaaa);\n"
4634*67e74705SXin Li       "}",
4635*67e74705SXin Li       NoBinPacking);
4636*67e74705SXin Li   verifyFormat(
4637*67e74705SXin Li       "void f() {\n"
4638*67e74705SXin Li       "  g(aaa,\n"
4639*67e74705SXin Li       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4640*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4641*67e74705SXin Li       "        ?: aaaaaaaaaaaaaaa);\n"
4642*67e74705SXin Li       "}",
4643*67e74705SXin Li       NoBinPacking);
4644*67e74705SXin Li 
4645*67e74705SXin Li   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4646*67e74705SXin Li                "             // comment.\n"
4647*67e74705SXin Li                "             ccccccccccccccccccccccccccccccccccccccc\n"
4648*67e74705SXin Li                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4649*67e74705SXin Li                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
4650*67e74705SXin Li 
4651*67e74705SXin Li   // Assignments in conditional expressions. Apparently not uncommon :-(.
4652*67e74705SXin Li   verifyFormat("return a != b\n"
4653*67e74705SXin Li                "           // comment\n"
4654*67e74705SXin Li                "           ? a = b\n"
4655*67e74705SXin Li                "           : a = b;");
4656*67e74705SXin Li   verifyFormat("return a != b\n"
4657*67e74705SXin Li                "           // comment\n"
4658*67e74705SXin Li                "           ? a = a != b\n"
4659*67e74705SXin Li                "                     // comment\n"
4660*67e74705SXin Li                "                     ? a = b\n"
4661*67e74705SXin Li                "                     : a\n"
4662*67e74705SXin Li                "           : a;\n");
4663*67e74705SXin Li   verifyFormat("return a != b\n"
4664*67e74705SXin Li                "           // comment\n"
4665*67e74705SXin Li                "           ? a\n"
4666*67e74705SXin Li                "           : a = a != b\n"
4667*67e74705SXin Li                "                     // comment\n"
4668*67e74705SXin Li                "                     ? a = b\n"
4669*67e74705SXin Li                "                     : a;");
4670*67e74705SXin Li }
4671*67e74705SXin Li 
TEST_F(FormatTest,BreaksConditionalExpressionsAfterOperator)4672*67e74705SXin Li TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4673*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
4674*67e74705SXin Li   Style.BreakBeforeTernaryOperators = false;
4675*67e74705SXin Li   Style.ColumnLimit = 70;
4676*67e74705SXin Li   verifyFormat(
4677*67e74705SXin Li       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4678*67e74705SXin Li       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4679*67e74705SXin Li       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4680*67e74705SXin Li       Style);
4681*67e74705SXin Li   verifyFormat(
4682*67e74705SXin Li       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4683*67e74705SXin Li       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4684*67e74705SXin Li       Style);
4685*67e74705SXin Li   verifyFormat(
4686*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4687*67e74705SXin Li       "                                                      aaaaaaaaaaaaa);",
4688*67e74705SXin Li       Style);
4689*67e74705SXin Li   verifyFormat(
4690*67e74705SXin Li       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4691*67e74705SXin Li       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4692*67e74705SXin Li       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4693*67e74705SXin Li       "                   aaaaaaaaaaaaa);",
4694*67e74705SXin Li       Style);
4695*67e74705SXin Li   verifyFormat(
4696*67e74705SXin Li       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4697*67e74705SXin Li       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4698*67e74705SXin Li       "                   aaaaaaaaaaaaa);",
4699*67e74705SXin Li       Style);
4700*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4701*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4702*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4703*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4704*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4705*67e74705SXin Li                Style);
4706*67e74705SXin Li   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4707*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4708*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4709*67e74705SXin Li                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4710*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4711*67e74705SXin Li                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4712*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4713*67e74705SXin Li                Style);
4714*67e74705SXin Li   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4715*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4716*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4717*67e74705SXin Li                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4718*67e74705SXin Li                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4719*67e74705SXin Li                Style);
4720*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4721*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4722*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4723*67e74705SXin Li                Style);
4724*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4725*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4726*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4727*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4728*67e74705SXin Li                Style);
4729*67e74705SXin Li   verifyFormat(
4730*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4731*67e74705SXin Li       "    aaaaaaaaaaaaaaa :\n"
4732*67e74705SXin Li       "    aaaaaaaaaaaaaaa;",
4733*67e74705SXin Li       Style);
4734*67e74705SXin Li   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4735*67e74705SXin Li                "          aaaaaaaaa ?\n"
4736*67e74705SXin Li                "      b :\n"
4737*67e74705SXin Li                "      c);",
4738*67e74705SXin Li                Style);
4739*67e74705SXin Li   verifyFormat(
4740*67e74705SXin Li       "unsigned Indent =\n"
4741*67e74705SXin Li       "    format(TheLine.First, IndentForLevel[TheLine.Level] >= 0 ?\n"
4742*67e74705SXin Li       "                              IndentForLevel[TheLine.Level] :\n"
4743*67e74705SXin Li       "                              TheLine * 2,\n"
4744*67e74705SXin Li       "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
4745*67e74705SXin Li       Style);
4746*67e74705SXin Li   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4747*67e74705SXin Li                "                  aaaaaaaaaaaaaaa :\n"
4748*67e74705SXin Li                "                  bbbbbbbbbbbbbbb ? //\n"
4749*67e74705SXin Li                "                      ccccccccccccccc :\n"
4750*67e74705SXin Li                "                      ddddddddddddddd;",
4751*67e74705SXin Li                Style);
4752*67e74705SXin Li   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4753*67e74705SXin Li                "                  aaaaaaaaaaaaaaa :\n"
4754*67e74705SXin Li                "                  (bbbbbbbbbbbbbbb ? //\n"
4755*67e74705SXin Li                "                       ccccccccccccccc :\n"
4756*67e74705SXin Li                "                       ddddddddddddddd);",
4757*67e74705SXin Li                Style);
4758*67e74705SXin Li   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4759*67e74705SXin Li                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4760*67e74705SXin Li                "            ccccccccccccccccccccccccccc;",
4761*67e74705SXin Li                Style);
4762*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4763*67e74705SXin Li                "           aaaaa :\n"
4764*67e74705SXin Li                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
4765*67e74705SXin Li                Style);
4766*67e74705SXin Li }
4767*67e74705SXin Li 
TEST_F(FormatTest,DeclarationsOfMultipleVariables)4768*67e74705SXin Li TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4769*67e74705SXin Li   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4770*67e74705SXin Li                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4771*67e74705SXin Li   verifyFormat("bool a = true, b = false;");
4772*67e74705SXin Li 
4773*67e74705SXin Li   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4774*67e74705SXin Li                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
4775*67e74705SXin Li                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
4776*67e74705SXin Li                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
4777*67e74705SXin Li   verifyFormat(
4778*67e74705SXin Li       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4779*67e74705SXin Li       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
4780*67e74705SXin Li       "     d = e && f;");
4781*67e74705SXin Li   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4782*67e74705SXin Li                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4783*67e74705SXin Li   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4784*67e74705SXin Li                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4785*67e74705SXin Li   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4786*67e74705SXin Li                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
4787*67e74705SXin Li 
4788*67e74705SXin Li   FormatStyle Style = getGoogleStyle();
4789*67e74705SXin Li   Style.PointerAlignment = FormatStyle::PAS_Left;
4790*67e74705SXin Li   Style.DerivePointerAlignment = false;
4791*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4792*67e74705SXin Li                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4793*67e74705SXin Li                "    *b = bbbbbbbbbbbbbbbbbbb;",
4794*67e74705SXin Li                Style);
4795*67e74705SXin Li   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4796*67e74705SXin Li                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4797*67e74705SXin Li                Style);
4798*67e74705SXin Li }
4799*67e74705SXin Li 
TEST_F(FormatTest,ConditionalExpressionsInBrackets)4800*67e74705SXin Li TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4801*67e74705SXin Li   verifyFormat("arr[foo ? bar : baz];");
4802*67e74705SXin Li   verifyFormat("f()[foo ? bar : baz];");
4803*67e74705SXin Li   verifyFormat("(a + b)[foo ? bar : baz];");
4804*67e74705SXin Li   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4805*67e74705SXin Li }
4806*67e74705SXin Li 
TEST_F(FormatTest,AlignsStringLiterals)4807*67e74705SXin Li TEST_F(FormatTest, AlignsStringLiterals) {
4808*67e74705SXin Li   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4809*67e74705SXin Li                "                                      \"short literal\");");
4810*67e74705SXin Li   verifyFormat(
4811*67e74705SXin Li       "looooooooooooooooooooooooongFunction(\n"
4812*67e74705SXin Li       "    \"short literal\"\n"
4813*67e74705SXin Li       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
4814*67e74705SXin Li   verifyFormat("someFunction(\"Always break between multi-line\"\n"
4815*67e74705SXin Li                "             \" string literals\",\n"
4816*67e74705SXin Li                "             and, other, parameters);");
4817*67e74705SXin Li   EXPECT_EQ("fun + \"1243\" /* comment */\n"
4818*67e74705SXin Li             "      \"5678\";",
4819*67e74705SXin Li             format("fun + \"1243\" /* comment */\n"
4820*67e74705SXin Li                    "      \"5678\";",
4821*67e74705SXin Li                    getLLVMStyleWithColumns(28)));
4822*67e74705SXin Li   EXPECT_EQ(
4823*67e74705SXin Li       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4824*67e74705SXin Li       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4825*67e74705SXin Li       "         \"aaaaaaaaaaaaaaaa\";",
4826*67e74705SXin Li       format("aaaaaa ="
4827*67e74705SXin Li              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4828*67e74705SXin Li              "aaaaaaaaaaaaaaaaaaaaa\" "
4829*67e74705SXin Li              "\"aaaaaaaaaaaaaaaa\";"));
4830*67e74705SXin Li   verifyFormat("a = a + \"a\"\n"
4831*67e74705SXin Li                "        \"a\"\n"
4832*67e74705SXin Li                "        \"a\";");
4833*67e74705SXin Li   verifyFormat("f(\"a\", \"b\"\n"
4834*67e74705SXin Li                "       \"c\");");
4835*67e74705SXin Li 
4836*67e74705SXin Li   verifyFormat(
4837*67e74705SXin Li       "#define LL_FORMAT \"ll\"\n"
4838*67e74705SXin Li       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4839*67e74705SXin Li       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
4840*67e74705SXin Li 
4841*67e74705SXin Li   verifyFormat("#define A(X)          \\\n"
4842*67e74705SXin Li                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
4843*67e74705SXin Li                "  \"ccccc\"",
4844*67e74705SXin Li                getLLVMStyleWithColumns(23));
4845*67e74705SXin Li   verifyFormat("#define A \"def\"\n"
4846*67e74705SXin Li                "f(\"abc\" A \"ghi\"\n"
4847*67e74705SXin Li                "  \"jkl\");");
4848*67e74705SXin Li 
4849*67e74705SXin Li   verifyFormat("f(L\"a\"\n"
4850*67e74705SXin Li                "  L\"b\");");
4851*67e74705SXin Li   verifyFormat("#define A(X)            \\\n"
4852*67e74705SXin Li                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4853*67e74705SXin Li                "  L\"ccccc\"",
4854*67e74705SXin Li                getLLVMStyleWithColumns(25));
4855*67e74705SXin Li 
4856*67e74705SXin Li   verifyFormat("f(@\"a\"\n"
4857*67e74705SXin Li                "  @\"b\");");
4858*67e74705SXin Li   verifyFormat("NSString s = @\"a\"\n"
4859*67e74705SXin Li                "             @\"b\"\n"
4860*67e74705SXin Li                "             @\"c\";");
4861*67e74705SXin Li   verifyFormat("NSString s = @\"a\"\n"
4862*67e74705SXin Li                "              \"b\"\n"
4863*67e74705SXin Li                "              \"c\";");
4864*67e74705SXin Li }
4865*67e74705SXin Li 
TEST_F(FormatTest,ReturnTypeBreakingStyle)4866*67e74705SXin Li TEST_F(FormatTest, ReturnTypeBreakingStyle) {
4867*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
4868*67e74705SXin Li   // No declarations or definitions should be moved to own line.
4869*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4870*67e74705SXin Li   verifyFormat("class A {\n"
4871*67e74705SXin Li                "  int f() { return 1; }\n"
4872*67e74705SXin Li                "  int g();\n"
4873*67e74705SXin Li                "};\n"
4874*67e74705SXin Li                "int f() { return 1; }\n"
4875*67e74705SXin Li                "int g();\n",
4876*67e74705SXin Li                Style);
4877*67e74705SXin Li 
4878*67e74705SXin Li   // All declarations and definitions should have the return type moved to its
4879*67e74705SXin Li   // own
4880*67e74705SXin Li   // line.
4881*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4882*67e74705SXin Li   verifyFormat("class E {\n"
4883*67e74705SXin Li                "  int\n"
4884*67e74705SXin Li                "  f() {\n"
4885*67e74705SXin Li                "    return 1;\n"
4886*67e74705SXin Li                "  }\n"
4887*67e74705SXin Li                "  int\n"
4888*67e74705SXin Li                "  g();\n"
4889*67e74705SXin Li                "};\n"
4890*67e74705SXin Li                "int\n"
4891*67e74705SXin Li                "f() {\n"
4892*67e74705SXin Li                "  return 1;\n"
4893*67e74705SXin Li                "}\n"
4894*67e74705SXin Li                "int\n"
4895*67e74705SXin Li                "g();\n",
4896*67e74705SXin Li                Style);
4897*67e74705SXin Li 
4898*67e74705SXin Li   // Top-level definitions, and no kinds of declarations should have the
4899*67e74705SXin Li   // return type moved to its own line.
4900*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4901*67e74705SXin Li   verifyFormat("class B {\n"
4902*67e74705SXin Li                "  int f() { return 1; }\n"
4903*67e74705SXin Li                "  int g();\n"
4904*67e74705SXin Li                "};\n"
4905*67e74705SXin Li                "int\n"
4906*67e74705SXin Li                "f() {\n"
4907*67e74705SXin Li                "  return 1;\n"
4908*67e74705SXin Li                "}\n"
4909*67e74705SXin Li                "int g();\n",
4910*67e74705SXin Li                Style);
4911*67e74705SXin Li 
4912*67e74705SXin Li   // Top-level definitions and declarations should have the return type moved
4913*67e74705SXin Li   // to its own line.
4914*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4915*67e74705SXin Li   verifyFormat("class C {\n"
4916*67e74705SXin Li                "  int f() { return 1; }\n"
4917*67e74705SXin Li                "  int g();\n"
4918*67e74705SXin Li                "};\n"
4919*67e74705SXin Li                "int\n"
4920*67e74705SXin Li                "f() {\n"
4921*67e74705SXin Li                "  return 1;\n"
4922*67e74705SXin Li                "}\n"
4923*67e74705SXin Li                "int\n"
4924*67e74705SXin Li                "g();\n",
4925*67e74705SXin Li                Style);
4926*67e74705SXin Li 
4927*67e74705SXin Li   // All definitions should have the return type moved to its own line, but no
4928*67e74705SXin Li   // kinds of declarations.
4929*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4930*67e74705SXin Li   verifyFormat("class D {\n"
4931*67e74705SXin Li                "  int\n"
4932*67e74705SXin Li                "  f() {\n"
4933*67e74705SXin Li                "    return 1;\n"
4934*67e74705SXin Li                "  }\n"
4935*67e74705SXin Li                "  int g();\n"
4936*67e74705SXin Li                "};\n"
4937*67e74705SXin Li                "int\n"
4938*67e74705SXin Li                "f() {\n"
4939*67e74705SXin Li                "  return 1;\n"
4940*67e74705SXin Li                "}\n"
4941*67e74705SXin Li                "int g();\n",
4942*67e74705SXin Li                Style);
4943*67e74705SXin Li   verifyFormat("const char *\n"
4944*67e74705SXin Li                "f(void) {\n" // Break here.
4945*67e74705SXin Li                "  return \"\";\n"
4946*67e74705SXin Li                "}\n"
4947*67e74705SXin Li                "const char *bar(void);\n", // No break here.
4948*67e74705SXin Li                Style);
4949*67e74705SXin Li   verifyFormat("template <class T>\n"
4950*67e74705SXin Li                "T *\n"
4951*67e74705SXin Li                "f(T &c) {\n" // Break here.
4952*67e74705SXin Li                "  return NULL;\n"
4953*67e74705SXin Li                "}\n"
4954*67e74705SXin Li                "template <class T> T *f(T &c);\n", // No break here.
4955*67e74705SXin Li                Style);
4956*67e74705SXin Li   verifyFormat("class C {\n"
4957*67e74705SXin Li                "  int\n"
4958*67e74705SXin Li                "  operator+() {\n"
4959*67e74705SXin Li                "    return 1;\n"
4960*67e74705SXin Li                "  }\n"
4961*67e74705SXin Li                "  int\n"
4962*67e74705SXin Li                "  operator()() {\n"
4963*67e74705SXin Li                "    return 1;\n"
4964*67e74705SXin Li                "  }\n"
4965*67e74705SXin Li                "};\n",
4966*67e74705SXin Li                Style);
4967*67e74705SXin Li   verifyFormat("void\n"
4968*67e74705SXin Li                "A::operator()() {}\n"
4969*67e74705SXin Li                "void\n"
4970*67e74705SXin Li                "A::operator>>() {}\n"
4971*67e74705SXin Li                "void\n"
4972*67e74705SXin Li                "A::operator+() {}\n",
4973*67e74705SXin Li                Style);
4974*67e74705SXin Li   verifyFormat("void *operator new(std::size_t s);", // No break here.
4975*67e74705SXin Li                Style);
4976*67e74705SXin Li   verifyFormat("void *\n"
4977*67e74705SXin Li                "operator new(std::size_t s) {}",
4978*67e74705SXin Li                Style);
4979*67e74705SXin Li   verifyFormat("void *\n"
4980*67e74705SXin Li                "operator delete[](void *ptr) {}",
4981*67e74705SXin Li                Style);
4982*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
4983*67e74705SXin Li   verifyFormat("const char *\n"
4984*67e74705SXin Li                "f(void)\n" // Break here.
4985*67e74705SXin Li                "{\n"
4986*67e74705SXin Li                "  return \"\";\n"
4987*67e74705SXin Li                "}\n"
4988*67e74705SXin Li                "const char *bar(void);\n", // No break here.
4989*67e74705SXin Li                Style);
4990*67e74705SXin Li   verifyFormat("template <class T>\n"
4991*67e74705SXin Li                "T *\n"     // Problem here: no line break
4992*67e74705SXin Li                "f(T &c)\n" // Break here.
4993*67e74705SXin Li                "{\n"
4994*67e74705SXin Li                "  return NULL;\n"
4995*67e74705SXin Li                "}\n"
4996*67e74705SXin Li                "template <class T> T *f(T &c);\n", // No break here.
4997*67e74705SXin Li                Style);
4998*67e74705SXin Li }
4999*67e74705SXin Li 
TEST_F(FormatTest,AlwaysBreakBeforeMultilineStrings)5000*67e74705SXin Li TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5001*67e74705SXin Li   FormatStyle NoBreak = getLLVMStyle();
5002*67e74705SXin Li   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5003*67e74705SXin Li   FormatStyle Break = getLLVMStyle();
5004*67e74705SXin Li   Break.AlwaysBreakBeforeMultilineStrings = true;
5005*67e74705SXin Li   verifyFormat("aaaa = \"bbbb\"\n"
5006*67e74705SXin Li                "       \"cccc\";",
5007*67e74705SXin Li                NoBreak);
5008*67e74705SXin Li   verifyFormat("aaaa =\n"
5009*67e74705SXin Li                "    \"bbbb\"\n"
5010*67e74705SXin Li                "    \"cccc\";",
5011*67e74705SXin Li                Break);
5012*67e74705SXin Li   verifyFormat("aaaa(\"bbbb\"\n"
5013*67e74705SXin Li                "     \"cccc\");",
5014*67e74705SXin Li                NoBreak);
5015*67e74705SXin Li   verifyFormat("aaaa(\n"
5016*67e74705SXin Li                "    \"bbbb\"\n"
5017*67e74705SXin Li                "    \"cccc\");",
5018*67e74705SXin Li                Break);
5019*67e74705SXin Li   verifyFormat("aaaa(qqq, \"bbbb\"\n"
5020*67e74705SXin Li                "          \"cccc\");",
5021*67e74705SXin Li                NoBreak);
5022*67e74705SXin Li   verifyFormat("aaaa(qqq,\n"
5023*67e74705SXin Li                "     \"bbbb\"\n"
5024*67e74705SXin Li                "     \"cccc\");",
5025*67e74705SXin Li                Break);
5026*67e74705SXin Li   verifyFormat("aaaa(qqq,\n"
5027*67e74705SXin Li                "     L\"bbbb\"\n"
5028*67e74705SXin Li                "     L\"cccc\");",
5029*67e74705SXin Li                Break);
5030*67e74705SXin Li   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5031*67e74705SXin Li                "                      \"bbbb\"));",
5032*67e74705SXin Li                Break);
5033*67e74705SXin Li   verifyFormat("string s = someFunction(\n"
5034*67e74705SXin Li                "    \"abc\"\n"
5035*67e74705SXin Li                "    \"abc\");",
5036*67e74705SXin Li                Break);
5037*67e74705SXin Li 
5038*67e74705SXin Li   // As we break before unary operators, breaking right after them is bad.
5039*67e74705SXin Li   verifyFormat("string foo = abc ? \"x\"\n"
5040*67e74705SXin Li                "                   \"blah blah blah blah blah blah\"\n"
5041*67e74705SXin Li                "                 : \"y\";",
5042*67e74705SXin Li                Break);
5043*67e74705SXin Li 
5044*67e74705SXin Li   // Don't break if there is no column gain.
5045*67e74705SXin Li   verifyFormat("f(\"aaaa\"\n"
5046*67e74705SXin Li                "  \"bbbb\");",
5047*67e74705SXin Li                Break);
5048*67e74705SXin Li 
5049*67e74705SXin Li   // Treat literals with escaped newlines like multi-line string literals.
5050*67e74705SXin Li   EXPECT_EQ("x = \"a\\\n"
5051*67e74705SXin Li             "b\\\n"
5052*67e74705SXin Li             "c\";",
5053*67e74705SXin Li             format("x = \"a\\\n"
5054*67e74705SXin Li                    "b\\\n"
5055*67e74705SXin Li                    "c\";",
5056*67e74705SXin Li                    NoBreak));
5057*67e74705SXin Li   EXPECT_EQ("xxxx =\n"
5058*67e74705SXin Li             "    \"a\\\n"
5059*67e74705SXin Li             "b\\\n"
5060*67e74705SXin Li             "c\";",
5061*67e74705SXin Li             format("xxxx = \"a\\\n"
5062*67e74705SXin Li                    "b\\\n"
5063*67e74705SXin Li                    "c\";",
5064*67e74705SXin Li                    Break));
5065*67e74705SXin Li 
5066*67e74705SXin Li   // Exempt ObjC strings for now.
5067*67e74705SXin Li   EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
5068*67e74705SXin Li             "                          @\"bbbb\";",
5069*67e74705SXin Li             format("NSString *const kString = @\"aaaa\"\n"
5070*67e74705SXin Li                    "@\"bbbb\";",
5071*67e74705SXin Li                    Break));
5072*67e74705SXin Li 
5073*67e74705SXin Li   Break.ColumnLimit = 0;
5074*67e74705SXin Li   verifyFormat("const char *hello = \"hello llvm\";", Break);
5075*67e74705SXin Li }
5076*67e74705SXin Li 
TEST_F(FormatTest,AlignsPipes)5077*67e74705SXin Li TEST_F(FormatTest, AlignsPipes) {
5078*67e74705SXin Li   verifyFormat(
5079*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5080*67e74705SXin Li       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5081*67e74705SXin Li       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5082*67e74705SXin Li   verifyFormat(
5083*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5084*67e74705SXin Li       "                     << aaaaaaaaaaaaaaaaaaaa;");
5085*67e74705SXin Li   verifyFormat(
5086*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5087*67e74705SXin Li       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5088*67e74705SXin Li   verifyFormat(
5089*67e74705SXin Li       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5090*67e74705SXin Li       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5091*67e74705SXin Li       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5092*67e74705SXin Li   verifyFormat(
5093*67e74705SXin Li       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5094*67e74705SXin Li       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5095*67e74705SXin Li       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5096*67e74705SXin Li   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5097*67e74705SXin Li                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5098*67e74705SXin Li                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5099*67e74705SXin Li                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5100*67e74705SXin Li   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5101*67e74705SXin Li                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
5102*67e74705SXin Li   verifyFormat(
5103*67e74705SXin Li       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5104*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5105*67e74705SXin Li 
5106*67e74705SXin Li   verifyFormat("return out << \"somepacket = {\\n\"\n"
5107*67e74705SXin Li                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5108*67e74705SXin Li                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5109*67e74705SXin Li                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5110*67e74705SXin Li                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5111*67e74705SXin Li                "           << \"}\";");
5112*67e74705SXin Li 
5113*67e74705SXin Li   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5114*67e74705SXin Li                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5115*67e74705SXin Li                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5116*67e74705SXin Li   verifyFormat(
5117*67e74705SXin Li       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5118*67e74705SXin Li       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5119*67e74705SXin Li       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5120*67e74705SXin Li       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5121*67e74705SXin Li       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5122*67e74705SXin Li   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5123*67e74705SXin Li                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5124*67e74705SXin Li   verifyFormat(
5125*67e74705SXin Li       "void f() {\n"
5126*67e74705SXin Li       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5127*67e74705SXin Li       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5128*67e74705SXin Li       "}");
5129*67e74705SXin Li   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5130*67e74705SXin Li                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
5131*67e74705SXin Li   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5132*67e74705SXin Li                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5133*67e74705SXin Li                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
5134*67e74705SXin Li                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
5135*67e74705SXin Li   verifyFormat("LOG_IF(aaa == //\n"
5136*67e74705SXin Li                "       bbb)\n"
5137*67e74705SXin Li                "    << a << b;");
5138*67e74705SXin Li 
5139*67e74705SXin Li   // Breaking before the first "<<" is generally not desirable.
5140*67e74705SXin Li   verifyFormat(
5141*67e74705SXin Li       "llvm::errs()\n"
5142*67e74705SXin Li       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5143*67e74705SXin Li       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5144*67e74705SXin Li       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5145*67e74705SXin Li       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5146*67e74705SXin Li       getLLVMStyleWithColumns(70));
5147*67e74705SXin Li   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5148*67e74705SXin Li                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5149*67e74705SXin Li                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5150*67e74705SXin Li                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5151*67e74705SXin Li                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5152*67e74705SXin Li                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5153*67e74705SXin Li                getLLVMStyleWithColumns(70));
5154*67e74705SXin Li 
5155*67e74705SXin Li   // But sometimes, breaking before the first "<<" is desirable.
5156*67e74705SXin Li   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5157*67e74705SXin Li                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
5158*67e74705SXin Li   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5159*67e74705SXin Li                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5160*67e74705SXin Li                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5161*67e74705SXin Li   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5162*67e74705SXin Li                "    << BEF << IsTemplate << Description << E->getType();");
5163*67e74705SXin Li   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5164*67e74705SXin Li                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5165*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5166*67e74705SXin Li   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5167*67e74705SXin Li                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5168*67e74705SXin Li                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5169*67e74705SXin Li                "    << aaa;");
5170*67e74705SXin Li 
5171*67e74705SXin Li   verifyFormat(
5172*67e74705SXin Li       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5173*67e74705SXin Li       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5174*67e74705SXin Li 
5175*67e74705SXin Li   // Incomplete string literal.
5176*67e74705SXin Li   EXPECT_EQ("llvm::errs() << \"\n"
5177*67e74705SXin Li             "             << a;",
5178*67e74705SXin Li             format("llvm::errs() << \"\n<<a;"));
5179*67e74705SXin Li 
5180*67e74705SXin Li   verifyFormat("void f() {\n"
5181*67e74705SXin Li                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5182*67e74705SXin Li                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5183*67e74705SXin Li                "}");
5184*67e74705SXin Li 
5185*67e74705SXin Li   // Handle 'endl'.
5186*67e74705SXin Li   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5187*67e74705SXin Li                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5188*67e74705SXin Li   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5189*67e74705SXin Li 
5190*67e74705SXin Li   // Handle '\n'.
5191*67e74705SXin Li   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5192*67e74705SXin Li                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5193*67e74705SXin Li   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5194*67e74705SXin Li                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5195*67e74705SXin Li   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5196*67e74705SXin Li                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5197*67e74705SXin Li   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5198*67e74705SXin Li }
5199*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsEquals)5200*67e74705SXin Li TEST_F(FormatTest, UnderstandsEquals) {
5201*67e74705SXin Li   verifyFormat(
5202*67e74705SXin Li       "aaaaaaaaaaaaaaaaa =\n"
5203*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5204*67e74705SXin Li   verifyFormat(
5205*67e74705SXin Li       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5206*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
5207*67e74705SXin Li   verifyFormat(
5208*67e74705SXin Li       "if (a) {\n"
5209*67e74705SXin Li       "  f();\n"
5210*67e74705SXin Li       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5211*67e74705SXin Li       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5212*67e74705SXin Li       "}");
5213*67e74705SXin Li 
5214*67e74705SXin Li   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5215*67e74705SXin Li                "        100000000 + 10000000) {\n}");
5216*67e74705SXin Li }
5217*67e74705SXin Li 
TEST_F(FormatTest,WrapsAtFunctionCallsIfNecessary)5218*67e74705SXin Li TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
5219*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5220*67e74705SXin Li                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
5221*67e74705SXin Li 
5222*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5223*67e74705SXin Li                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
5224*67e74705SXin Li 
5225*67e74705SXin Li   verifyFormat(
5226*67e74705SXin Li       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5227*67e74705SXin Li       "                                                          Parameter2);");
5228*67e74705SXin Li 
5229*67e74705SXin Li   verifyFormat(
5230*67e74705SXin Li       "ShortObject->shortFunction(\n"
5231*67e74705SXin Li       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5232*67e74705SXin Li       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5233*67e74705SXin Li 
5234*67e74705SXin Li   verifyFormat("loooooooooooooongFunction(\n"
5235*67e74705SXin Li                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
5236*67e74705SXin Li 
5237*67e74705SXin Li   verifyFormat(
5238*67e74705SXin Li       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5239*67e74705SXin Li       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5240*67e74705SXin Li 
5241*67e74705SXin Li   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5242*67e74705SXin Li                "    .WillRepeatedly(Return(SomeValue));");
5243*67e74705SXin Li   verifyFormat("void f() {\n"
5244*67e74705SXin Li                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5245*67e74705SXin Li                "      .Times(2)\n"
5246*67e74705SXin Li                "      .WillRepeatedly(Return(SomeValue));\n"
5247*67e74705SXin Li                "}");
5248*67e74705SXin Li   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5249*67e74705SXin Li                "    ccccccccccccccccccccccc);");
5250*67e74705SXin Li   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5251*67e74705SXin Li                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5252*67e74705SXin Li                "          .aaaaa(aaaaa),\n"
5253*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaa);");
5254*67e74705SXin Li   verifyFormat("void f() {\n"
5255*67e74705SXin Li                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5256*67e74705SXin Li                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5257*67e74705SXin Li                "}");
5258*67e74705SXin Li   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5259*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5260*67e74705SXin Li                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5261*67e74705SXin Li                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5262*67e74705SXin Li                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5263*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5264*67e74705SXin Li                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5265*67e74705SXin Li                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5266*67e74705SXin Li                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5267*67e74705SXin Li                "}");
5268*67e74705SXin Li 
5269*67e74705SXin Li   // Here, it is not necessary to wrap at "." or "->".
5270*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
5271*67e74705SXin Li                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
5272*67e74705SXin Li   verifyFormat(
5273*67e74705SXin Li       "aaaaaaaaaaa->aaaaaaaaa(\n"
5274*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5275*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
5276*67e74705SXin Li 
5277*67e74705SXin Li   verifyFormat(
5278*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5279*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
5280*67e74705SXin Li   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5281*67e74705SXin Li                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
5282*67e74705SXin Li   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5283*67e74705SXin Li                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
5284*67e74705SXin Li 
5285*67e74705SXin Li   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5286*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5287*67e74705SXin Li                "    .a();");
5288*67e74705SXin Li 
5289*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
5290*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
5291*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5292*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5293*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5294*67e74705SXin Li                "                         aaaaaaaaaaaaaaaaaaa,\n"
5295*67e74705SXin Li                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5296*67e74705SXin Li                NoBinPacking);
5297*67e74705SXin Li 
5298*67e74705SXin Li   // If there is a subsequent call, change to hanging indentation.
5299*67e74705SXin Li   verifyFormat(
5300*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5301*67e74705SXin Li       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5302*67e74705SXin Li       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5303*67e74705SXin Li   verifyFormat(
5304*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5305*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
5306*67e74705SXin Li   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5307*67e74705SXin Li                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5308*67e74705SXin Li                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5309*67e74705SXin Li   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5310*67e74705SXin Li                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5311*67e74705SXin Li                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5312*67e74705SXin Li }
5313*67e74705SXin Li 
TEST_F(FormatTest,WrapsTemplateDeclarations)5314*67e74705SXin Li TEST_F(FormatTest, WrapsTemplateDeclarations) {
5315*67e74705SXin Li   verifyFormat("template <typename T>\n"
5316*67e74705SXin Li                "virtual void loooooooooooongFunction(int Param1, int Param2);");
5317*67e74705SXin Li   verifyFormat("template <typename T>\n"
5318*67e74705SXin Li                "// T should be one of {A, B}.\n"
5319*67e74705SXin Li                "virtual void loooooooooooongFunction(int Param1, int Param2);");
5320*67e74705SXin Li   verifyFormat(
5321*67e74705SXin Li       "template <typename T>\n"
5322*67e74705SXin Li       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
5323*67e74705SXin Li   verifyFormat("template <typename T>\n"
5324*67e74705SXin Li                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5325*67e74705SXin Li                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
5326*67e74705SXin Li   verifyFormat(
5327*67e74705SXin Li       "template <typename T>\n"
5328*67e74705SXin Li       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5329*67e74705SXin Li       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
5330*67e74705SXin Li   verifyFormat(
5331*67e74705SXin Li       "template <typename T>\n"
5332*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5333*67e74705SXin Li       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5334*67e74705SXin Li       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5335*67e74705SXin Li   verifyFormat("template <typename T>\n"
5336*67e74705SXin Li                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5337*67e74705SXin Li                "    int aaaaaaaaaaaaaaaaaaaaaa);");
5338*67e74705SXin Li   verifyFormat(
5339*67e74705SXin Li       "template <typename T1, typename T2 = char, typename T3 = char,\n"
5340*67e74705SXin Li       "          typename T4 = char>\n"
5341*67e74705SXin Li       "void f();");
5342*67e74705SXin Li   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5343*67e74705SXin Li                "          template <typename> class cccccccccccccccccccccc,\n"
5344*67e74705SXin Li                "          typename ddddddddddddd>\n"
5345*67e74705SXin Li                "class C {};");
5346*67e74705SXin Li   verifyFormat(
5347*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5348*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5349*67e74705SXin Li 
5350*67e74705SXin Li   verifyFormat("void f() {\n"
5351*67e74705SXin Li                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5352*67e74705SXin Li                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5353*67e74705SXin Li                "}");
5354*67e74705SXin Li 
5355*67e74705SXin Li   verifyFormat("template <typename T> class C {};");
5356*67e74705SXin Li   verifyFormat("template <typename T> void f();");
5357*67e74705SXin Li   verifyFormat("template <typename T> void f() {}");
5358*67e74705SXin Li   verifyFormat(
5359*67e74705SXin Li       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5360*67e74705SXin Li       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5361*67e74705SXin Li       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5362*67e74705SXin Li       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5363*67e74705SXin Li       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5364*67e74705SXin Li       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5365*67e74705SXin Li       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
5366*67e74705SXin Li       getLLVMStyleWithColumns(72));
5367*67e74705SXin Li   EXPECT_EQ("static_cast<A< //\n"
5368*67e74705SXin Li             "    B> *>(\n"
5369*67e74705SXin Li             "\n"
5370*67e74705SXin Li             "    );",
5371*67e74705SXin Li             format("static_cast<A<//\n"
5372*67e74705SXin Li                    "    B>*>(\n"
5373*67e74705SXin Li                    "\n"
5374*67e74705SXin Li                    "    );"));
5375*67e74705SXin Li   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5376*67e74705SXin Li                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
5377*67e74705SXin Li 
5378*67e74705SXin Li   FormatStyle AlwaysBreak = getLLVMStyle();
5379*67e74705SXin Li   AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5380*67e74705SXin Li   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5381*67e74705SXin Li   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5382*67e74705SXin Li   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5383*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5384*67e74705SXin Li                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5385*67e74705SXin Li                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
5386*67e74705SXin Li   verifyFormat("template <template <typename> class Fooooooo,\n"
5387*67e74705SXin Li                "          template <typename> class Baaaaaaar>\n"
5388*67e74705SXin Li                "struct C {};",
5389*67e74705SXin Li                AlwaysBreak);
5390*67e74705SXin Li   verifyFormat("template <typename T> // T can be A, B or C.\n"
5391*67e74705SXin Li                "struct C {};",
5392*67e74705SXin Li                AlwaysBreak);
5393*67e74705SXin Li   verifyFormat("template <enum E> class A {\n"
5394*67e74705SXin Li                "public:\n"
5395*67e74705SXin Li                "  E *f();\n"
5396*67e74705SXin Li                "};");
5397*67e74705SXin Li }
5398*67e74705SXin Li 
TEST_F(FormatTest,WrapsAtNestedNameSpecifiers)5399*67e74705SXin Li TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5400*67e74705SXin Li   verifyFormat(
5401*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5402*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5403*67e74705SXin Li   verifyFormat(
5404*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5405*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5406*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5407*67e74705SXin Li 
5408*67e74705SXin Li   // FIXME: Should we have the extra indent after the second break?
5409*67e74705SXin Li   verifyFormat(
5410*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5411*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5412*67e74705SXin Li       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5413*67e74705SXin Li 
5414*67e74705SXin Li   verifyFormat(
5415*67e74705SXin Li       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
5416*67e74705SXin Li       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
5417*67e74705SXin Li 
5418*67e74705SXin Li   // Breaking at nested name specifiers is generally not desirable.
5419*67e74705SXin Li   verifyFormat(
5420*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5421*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaa);");
5422*67e74705SXin Li 
5423*67e74705SXin Li   verifyFormat(
5424*67e74705SXin Li       "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5425*67e74705SXin Li       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5426*67e74705SXin Li       "                   aaaaaaaaaaaaaaaaaaaaa);",
5427*67e74705SXin Li       getLLVMStyleWithColumns(74));
5428*67e74705SXin Li 
5429*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5430*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5431*67e74705SXin Li                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5432*67e74705SXin Li }
5433*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsTemplateParameters)5434*67e74705SXin Li TEST_F(FormatTest, UnderstandsTemplateParameters) {
5435*67e74705SXin Li   verifyFormat("A<int> a;");
5436*67e74705SXin Li   verifyFormat("A<A<A<int>>> a;");
5437*67e74705SXin Li   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5438*67e74705SXin Li   verifyFormat("bool x = a < 1 || 2 > a;");
5439*67e74705SXin Li   verifyFormat("bool x = 5 < f<int>();");
5440*67e74705SXin Li   verifyFormat("bool x = f<int>() > 5;");
5441*67e74705SXin Li   verifyFormat("bool x = 5 < a<int>::x;");
5442*67e74705SXin Li   verifyFormat("bool x = a < 4 ? a > 2 : false;");
5443*67e74705SXin Li   verifyFormat("bool x = f() ? a < 2 : a > 2;");
5444*67e74705SXin Li 
5445*67e74705SXin Li   verifyGoogleFormat("A<A<int>> a;");
5446*67e74705SXin Li   verifyGoogleFormat("A<A<A<int>>> a;");
5447*67e74705SXin Li   verifyGoogleFormat("A<A<A<A<int>>>> a;");
5448*67e74705SXin Li   verifyGoogleFormat("A<A<int> > a;");
5449*67e74705SXin Li   verifyGoogleFormat("A<A<A<int> > > a;");
5450*67e74705SXin Li   verifyGoogleFormat("A<A<A<A<int> > > > a;");
5451*67e74705SXin Li   verifyGoogleFormat("A<::A<int>> a;");
5452*67e74705SXin Li   verifyGoogleFormat("A<::A> a;");
5453*67e74705SXin Li   verifyGoogleFormat("A< ::A> a;");
5454*67e74705SXin Li   verifyGoogleFormat("A< ::A<int> > a;");
5455*67e74705SXin Li   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5456*67e74705SXin Li   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
5457*67e74705SXin Li   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5458*67e74705SXin Li   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
5459*67e74705SXin Li   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5460*67e74705SXin Li             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
5461*67e74705SXin Li 
5462*67e74705SXin Li   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5463*67e74705SXin Li 
5464*67e74705SXin Li   verifyFormat("test >> a >> b;");
5465*67e74705SXin Li   verifyFormat("test << a >> b;");
5466*67e74705SXin Li 
5467*67e74705SXin Li   verifyFormat("f<int>();");
5468*67e74705SXin Li   verifyFormat("template <typename T> void f() {}");
5469*67e74705SXin Li   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
5470*67e74705SXin Li   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5471*67e74705SXin Li                "sizeof(char)>::type>;");
5472*67e74705SXin Li   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
5473*67e74705SXin Li   verifyFormat("f(a.operator()<A>());");
5474*67e74705SXin Li   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5475*67e74705SXin Li                "      .template operator()<A>());",
5476*67e74705SXin Li                getLLVMStyleWithColumns(35));
5477*67e74705SXin Li 
5478*67e74705SXin Li   // Not template parameters.
5479*67e74705SXin Li   verifyFormat("return a < b && c > d;");
5480*67e74705SXin Li   verifyFormat("void f() {\n"
5481*67e74705SXin Li                "  while (a < b && c > d) {\n"
5482*67e74705SXin Li                "  }\n"
5483*67e74705SXin Li                "}");
5484*67e74705SXin Li   verifyFormat("template <typename... Types>\n"
5485*67e74705SXin Li                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
5486*67e74705SXin Li 
5487*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5488*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5489*67e74705SXin Li                getLLVMStyleWithColumns(60));
5490*67e74705SXin Li   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
5491*67e74705SXin Li   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
5492*67e74705SXin Li   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
5493*67e74705SXin Li }
5494*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsBinaryOperators)5495*67e74705SXin Li TEST_F(FormatTest, UnderstandsBinaryOperators) {
5496*67e74705SXin Li   verifyFormat("COMPARE(a, ==, b);");
5497*67e74705SXin Li   verifyFormat("auto s = sizeof...(Ts) - 1;");
5498*67e74705SXin Li }
5499*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsPointersToMembers)5500*67e74705SXin Li TEST_F(FormatTest, UnderstandsPointersToMembers) {
5501*67e74705SXin Li   verifyFormat("int A::*x;");
5502*67e74705SXin Li   verifyFormat("int (S::*func)(void *);");
5503*67e74705SXin Li   verifyFormat("void f() { int (S::*func)(void *); }");
5504*67e74705SXin Li   verifyFormat("typedef bool *(Class::*Member)() const;");
5505*67e74705SXin Li   verifyFormat("void f() {\n"
5506*67e74705SXin Li                "  (a->*f)();\n"
5507*67e74705SXin Li                "  a->*x;\n"
5508*67e74705SXin Li                "  (a.*f)();\n"
5509*67e74705SXin Li                "  ((*a).*f)();\n"
5510*67e74705SXin Li                "  a.*x;\n"
5511*67e74705SXin Li                "}");
5512*67e74705SXin Li   verifyFormat("void f() {\n"
5513*67e74705SXin Li                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5514*67e74705SXin Li                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5515*67e74705SXin Li                "}");
5516*67e74705SXin Li   verifyFormat(
5517*67e74705SXin Li       "(aaaaaaaaaa->*bbbbbbb)(\n"
5518*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5519*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
5520*67e74705SXin Li   Style.PointerAlignment = FormatStyle::PAS_Left;
5521*67e74705SXin Li   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
5522*67e74705SXin Li }
5523*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsUnaryOperators)5524*67e74705SXin Li TEST_F(FormatTest, UnderstandsUnaryOperators) {
5525*67e74705SXin Li   verifyFormat("int a = -2;");
5526*67e74705SXin Li   verifyFormat("f(-1, -2, -3);");
5527*67e74705SXin Li   verifyFormat("a[-1] = 5;");
5528*67e74705SXin Li   verifyFormat("int a = 5 + -2;");
5529*67e74705SXin Li   verifyFormat("if (i == -1) {\n}");
5530*67e74705SXin Li   verifyFormat("if (i != -1) {\n}");
5531*67e74705SXin Li   verifyFormat("if (i > -1) {\n}");
5532*67e74705SXin Li   verifyFormat("if (i < -1) {\n}");
5533*67e74705SXin Li   verifyFormat("++(a->f());");
5534*67e74705SXin Li   verifyFormat("--(a->f());");
5535*67e74705SXin Li   verifyFormat("(a->f())++;");
5536*67e74705SXin Li   verifyFormat("a[42]++;");
5537*67e74705SXin Li   verifyFormat("if (!(a->f())) {\n}");
5538*67e74705SXin Li 
5539*67e74705SXin Li   verifyFormat("a-- > b;");
5540*67e74705SXin Li   verifyFormat("b ? -a : c;");
5541*67e74705SXin Li   verifyFormat("n * sizeof char16;");
5542*67e74705SXin Li   verifyFormat("n * alignof char16;", getGoogleStyle());
5543*67e74705SXin Li   verifyFormat("sizeof(char);");
5544*67e74705SXin Li   verifyFormat("alignof(char);", getGoogleStyle());
5545*67e74705SXin Li 
5546*67e74705SXin Li   verifyFormat("return -1;");
5547*67e74705SXin Li   verifyFormat("switch (a) {\n"
5548*67e74705SXin Li                "case -1:\n"
5549*67e74705SXin Li                "  break;\n"
5550*67e74705SXin Li                "}");
5551*67e74705SXin Li   verifyFormat("#define X -1");
5552*67e74705SXin Li   verifyFormat("#define X -kConstant");
5553*67e74705SXin Li 
5554*67e74705SXin Li   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5555*67e74705SXin Li   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
5556*67e74705SXin Li 
5557*67e74705SXin Li   verifyFormat("int a = /* confusing comment */ -1;");
5558*67e74705SXin Li   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5559*67e74705SXin Li   verifyFormat("int a = i /* confusing comment */++;");
5560*67e74705SXin Li }
5561*67e74705SXin Li 
TEST_F(FormatTest,DoesNotIndentRelativeToUnaryOperators)5562*67e74705SXin Li TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
5563*67e74705SXin Li   verifyFormat("if (!aaaaaaaaaa( // break\n"
5564*67e74705SXin Li                "        aaaaa)) {\n"
5565*67e74705SXin Li                "}");
5566*67e74705SXin Li   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
5567*67e74705SXin Li                "    aaaaa));");
5568*67e74705SXin Li   verifyFormat("*aaa = aaaaaaa( // break\n"
5569*67e74705SXin Li                "    bbbbbb);");
5570*67e74705SXin Li }
5571*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsOverloadedOperators)5572*67e74705SXin Li TEST_F(FormatTest, UnderstandsOverloadedOperators) {
5573*67e74705SXin Li   verifyFormat("bool operator<();");
5574*67e74705SXin Li   verifyFormat("bool operator>();");
5575*67e74705SXin Li   verifyFormat("bool operator=();");
5576*67e74705SXin Li   verifyFormat("bool operator==();");
5577*67e74705SXin Li   verifyFormat("bool operator!=();");
5578*67e74705SXin Li   verifyFormat("int operator+();");
5579*67e74705SXin Li   verifyFormat("int operator++();");
5580*67e74705SXin Li   verifyFormat("bool operator,();");
5581*67e74705SXin Li   verifyFormat("bool operator();");
5582*67e74705SXin Li   verifyFormat("bool operator()();");
5583*67e74705SXin Li   verifyFormat("bool operator[]();");
5584*67e74705SXin Li   verifyFormat("operator bool();");
5585*67e74705SXin Li   verifyFormat("operator int();");
5586*67e74705SXin Li   verifyFormat("operator void *();");
5587*67e74705SXin Li   verifyFormat("operator SomeType<int>();");
5588*67e74705SXin Li   verifyFormat("operator SomeType<int, int>();");
5589*67e74705SXin Li   verifyFormat("operator SomeType<SomeType<int>>();");
5590*67e74705SXin Li   verifyFormat("void *operator new(std::size_t size);");
5591*67e74705SXin Li   verifyFormat("void *operator new[](std::size_t size);");
5592*67e74705SXin Li   verifyFormat("void operator delete(void *ptr);");
5593*67e74705SXin Li   verifyFormat("void operator delete[](void *ptr);");
5594*67e74705SXin Li   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5595*67e74705SXin Li                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
5596*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
5597*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
5598*67e74705SXin Li 
5599*67e74705SXin Li   verifyFormat(
5600*67e74705SXin Li       "ostream &operator<<(ostream &OutputStream,\n"
5601*67e74705SXin Li       "                    SomeReallyLongType WithSomeReallyLongValue);");
5602*67e74705SXin Li   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5603*67e74705SXin Li                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5604*67e74705SXin Li                "  return left.group < right.group;\n"
5605*67e74705SXin Li                "}");
5606*67e74705SXin Li   verifyFormat("SomeType &operator=(const SomeType &S);");
5607*67e74705SXin Li   verifyFormat("f.template operator()<int>();");
5608*67e74705SXin Li 
5609*67e74705SXin Li   verifyGoogleFormat("operator void*();");
5610*67e74705SXin Li   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
5611*67e74705SXin Li   verifyGoogleFormat("operator ::A();");
5612*67e74705SXin Li 
5613*67e74705SXin Li   verifyFormat("using A::operator+;");
5614*67e74705SXin Li   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5615*67e74705SXin Li                "int i;");
5616*67e74705SXin Li }
5617*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsFunctionRefQualification)5618*67e74705SXin Li TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
5619*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5620*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5621*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5622*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5623*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) &;");
5624*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) &&;");
5625*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5626*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5627*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5628*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5629*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
5630*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
5631*67e74705SXin Li 
5632*67e74705SXin Li   FormatStyle AlignLeft = getLLVMStyle();
5633*67e74705SXin Li   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
5634*67e74705SXin Li   verifyFormat("void A::b() && {}", AlignLeft);
5635*67e74705SXin Li   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5636*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5637*67e74705SXin Li                AlignLeft);
5638*67e74705SXin Li   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5639*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
5640*67e74705SXin Li   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5641*67e74705SXin Li   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5642*67e74705SXin Li   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5643*67e74705SXin Li   verifyFormat("auto Function(T) & -> void;", AlignLeft);
5644*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
5645*67e74705SXin Li 
5646*67e74705SXin Li   FormatStyle Spaces = getLLVMStyle();
5647*67e74705SXin Li   Spaces.SpacesInCStyleCastParentheses = true;
5648*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5649*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5650*67e74705SXin Li   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5651*67e74705SXin Li   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
5652*67e74705SXin Li 
5653*67e74705SXin Li   Spaces.SpacesInCStyleCastParentheses = false;
5654*67e74705SXin Li   Spaces.SpacesInParentheses = true;
5655*67e74705SXin Li   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5656*67e74705SXin Li   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5657*67e74705SXin Li   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5658*67e74705SXin Li   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
5659*67e74705SXin Li }
5660*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsNewAndDelete)5661*67e74705SXin Li TEST_F(FormatTest, UnderstandsNewAndDelete) {
5662*67e74705SXin Li   verifyFormat("void f() {\n"
5663*67e74705SXin Li                "  A *a = new A;\n"
5664*67e74705SXin Li                "  A *a = new (placement) A;\n"
5665*67e74705SXin Li                "  delete a;\n"
5666*67e74705SXin Li                "  delete (A *)a;\n"
5667*67e74705SXin Li                "}");
5668*67e74705SXin Li   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5669*67e74705SXin Li                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
5670*67e74705SXin Li   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5671*67e74705SXin Li                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5672*67e74705SXin Li                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
5673*67e74705SXin Li   verifyFormat("delete[] h->p;");
5674*67e74705SXin Li }
5675*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsUsesOfStarAndAmp)5676*67e74705SXin Li TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
5677*67e74705SXin Li   verifyFormat("int *f(int *a) {}");
5678*67e74705SXin Li   verifyFormat("int main(int argc, char **argv) {}");
5679*67e74705SXin Li   verifyFormat("Test::Test(int b) : a(b * b) {}");
5680*67e74705SXin Li   verifyIndependentOfContext("f(a, *a);");
5681*67e74705SXin Li   verifyFormat("void g() { f(*a); }");
5682*67e74705SXin Li   verifyIndependentOfContext("int a = b * 10;");
5683*67e74705SXin Li   verifyIndependentOfContext("int a = 10 * b;");
5684*67e74705SXin Li   verifyIndependentOfContext("int a = b * c;");
5685*67e74705SXin Li   verifyIndependentOfContext("int a += b * c;");
5686*67e74705SXin Li   verifyIndependentOfContext("int a -= b * c;");
5687*67e74705SXin Li   verifyIndependentOfContext("int a *= b * c;");
5688*67e74705SXin Li   verifyIndependentOfContext("int a /= b * c;");
5689*67e74705SXin Li   verifyIndependentOfContext("int a = *b;");
5690*67e74705SXin Li   verifyIndependentOfContext("int a = *b * c;");
5691*67e74705SXin Li   verifyIndependentOfContext("int a = b * *c;");
5692*67e74705SXin Li   verifyIndependentOfContext("int a = b * (10);");
5693*67e74705SXin Li   verifyIndependentOfContext("S << b * (10);");
5694*67e74705SXin Li   verifyIndependentOfContext("return 10 * b;");
5695*67e74705SXin Li   verifyIndependentOfContext("return *b * *c;");
5696*67e74705SXin Li   verifyIndependentOfContext("return a & ~b;");
5697*67e74705SXin Li   verifyIndependentOfContext("f(b ? *c : *d);");
5698*67e74705SXin Li   verifyIndependentOfContext("int a = b ? *c : *d;");
5699*67e74705SXin Li   verifyIndependentOfContext("*b = a;");
5700*67e74705SXin Li   verifyIndependentOfContext("a * ~b;");
5701*67e74705SXin Li   verifyIndependentOfContext("a * !b;");
5702*67e74705SXin Li   verifyIndependentOfContext("a * +b;");
5703*67e74705SXin Li   verifyIndependentOfContext("a * -b;");
5704*67e74705SXin Li   verifyIndependentOfContext("a * ++b;");
5705*67e74705SXin Li   verifyIndependentOfContext("a * --b;");
5706*67e74705SXin Li   verifyIndependentOfContext("a[4] * b;");
5707*67e74705SXin Li   verifyIndependentOfContext("a[a * a] = 1;");
5708*67e74705SXin Li   verifyIndependentOfContext("f() * b;");
5709*67e74705SXin Li   verifyIndependentOfContext("a * [self dostuff];");
5710*67e74705SXin Li   verifyIndependentOfContext("int x = a * (a + b);");
5711*67e74705SXin Li   verifyIndependentOfContext("(a *)(a + b);");
5712*67e74705SXin Li   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
5713*67e74705SXin Li   verifyIndependentOfContext("int *pa = (int *)&a;");
5714*67e74705SXin Li   verifyIndependentOfContext("return sizeof(int **);");
5715*67e74705SXin Li   verifyIndependentOfContext("return sizeof(int ******);");
5716*67e74705SXin Li   verifyIndependentOfContext("return (int **&)a;");
5717*67e74705SXin Li   verifyIndependentOfContext("f((*PointerToArray)[10]);");
5718*67e74705SXin Li   verifyFormat("void f(Type (*parameter)[10]) {}");
5719*67e74705SXin Li   verifyFormat("void f(Type (&parameter)[10]) {}");
5720*67e74705SXin Li   verifyGoogleFormat("return sizeof(int**);");
5721*67e74705SXin Li   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5722*67e74705SXin Li   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
5723*67e74705SXin Li   verifyFormat("auto a = [](int **&, int ***) {};");
5724*67e74705SXin Li   verifyFormat("auto PointerBinding = [](const char *S) {};");
5725*67e74705SXin Li   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
5726*67e74705SXin Li   verifyFormat("[](const decltype(*a) &value) {}");
5727*67e74705SXin Li   verifyFormat("decltype(a * b) F();");
5728*67e74705SXin Li   verifyFormat("#define MACRO() [](A *a) { return 1; }");
5729*67e74705SXin Li   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
5730*67e74705SXin Li   verifyIndependentOfContext("typedef void (*f)(int *a);");
5731*67e74705SXin Li   verifyIndependentOfContext("int i{a * b};");
5732*67e74705SXin Li   verifyIndependentOfContext("aaa && aaa->f();");
5733*67e74705SXin Li   verifyIndependentOfContext("int x = ~*p;");
5734*67e74705SXin Li   verifyFormat("Constructor() : a(a), area(width * height) {}");
5735*67e74705SXin Li   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
5736*67e74705SXin Li   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
5737*67e74705SXin Li   verifyFormat("void f() { f(a, c * d); }");
5738*67e74705SXin Li   verifyFormat("void f() { f(new a(), c * d); }");
5739*67e74705SXin Li 
5740*67e74705SXin Li   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
5741*67e74705SXin Li 
5742*67e74705SXin Li   verifyIndependentOfContext("A<int *> a;");
5743*67e74705SXin Li   verifyIndependentOfContext("A<int **> a;");
5744*67e74705SXin Li   verifyIndependentOfContext("A<int *, int *> a;");
5745*67e74705SXin Li   verifyIndependentOfContext("A<int *[]> a;");
5746*67e74705SXin Li   verifyIndependentOfContext(
5747*67e74705SXin Li       "const char *const p = reinterpret_cast<const char *const>(q);");
5748*67e74705SXin Li   verifyIndependentOfContext("A<int **, int **> a;");
5749*67e74705SXin Li   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
5750*67e74705SXin Li   verifyFormat("for (char **a = b; *a; ++a) {\n}");
5751*67e74705SXin Li   verifyFormat("for (; a && b;) {\n}");
5752*67e74705SXin Li   verifyFormat("bool foo = true && [] { return false; }();");
5753*67e74705SXin Li 
5754*67e74705SXin Li   verifyFormat(
5755*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5756*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5757*67e74705SXin Li 
5758*67e74705SXin Li   verifyGoogleFormat("int const* a = &b;");
5759*67e74705SXin Li   verifyGoogleFormat("**outparam = 1;");
5760*67e74705SXin Li   verifyGoogleFormat("*outparam = a * b;");
5761*67e74705SXin Li   verifyGoogleFormat("int main(int argc, char** argv) {}");
5762*67e74705SXin Li   verifyGoogleFormat("A<int*> a;");
5763*67e74705SXin Li   verifyGoogleFormat("A<int**> a;");
5764*67e74705SXin Li   verifyGoogleFormat("A<int*, int*> a;");
5765*67e74705SXin Li   verifyGoogleFormat("A<int**, int**> a;");
5766*67e74705SXin Li   verifyGoogleFormat("f(b ? *c : *d);");
5767*67e74705SXin Li   verifyGoogleFormat("int a = b ? *c : *d;");
5768*67e74705SXin Li   verifyGoogleFormat("Type* t = **x;");
5769*67e74705SXin Li   verifyGoogleFormat("Type* t = *++*x;");
5770*67e74705SXin Li   verifyGoogleFormat("*++*x;");
5771*67e74705SXin Li   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5772*67e74705SXin Li   verifyGoogleFormat("Type* t = x++ * y;");
5773*67e74705SXin Li   verifyGoogleFormat(
5774*67e74705SXin Li       "const char* const p = reinterpret_cast<const char* const>(q);");
5775*67e74705SXin Li   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
5776*67e74705SXin Li   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5777*67e74705SXin Li   verifyGoogleFormat("template <typename T>\n"
5778*67e74705SXin Li                      "void f(int i = 0, SomeType** temps = NULL);");
5779*67e74705SXin Li 
5780*67e74705SXin Li   FormatStyle Left = getLLVMStyle();
5781*67e74705SXin Li   Left.PointerAlignment = FormatStyle::PAS_Left;
5782*67e74705SXin Li   verifyFormat("x = *a(x) = *a(y);", Left);
5783*67e74705SXin Li   verifyFormat("for (;; * = b) {\n}", Left);
5784*67e74705SXin Li   verifyFormat("return *this += 1;", Left);
5785*67e74705SXin Li 
5786*67e74705SXin Li   verifyIndependentOfContext("a = *(x + y);");
5787*67e74705SXin Li   verifyIndependentOfContext("a = &(x + y);");
5788*67e74705SXin Li   verifyIndependentOfContext("*(x + y).call();");
5789*67e74705SXin Li   verifyIndependentOfContext("&(x + y)->call();");
5790*67e74705SXin Li   verifyFormat("void f() { &(*I).first; }");
5791*67e74705SXin Li 
5792*67e74705SXin Li   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
5793*67e74705SXin Li   verifyFormat(
5794*67e74705SXin Li       "int *MyValues = {\n"
5795*67e74705SXin Li       "    *A, // Operator detection might be confused by the '{'\n"
5796*67e74705SXin Li       "    *BB // Operator detection might be confused by previous comment\n"
5797*67e74705SXin Li       "};");
5798*67e74705SXin Li 
5799*67e74705SXin Li   verifyIndependentOfContext("if (int *a = &b)");
5800*67e74705SXin Li   verifyIndependentOfContext("if (int &a = *b)");
5801*67e74705SXin Li   verifyIndependentOfContext("if (a & b[i])");
5802*67e74705SXin Li   verifyIndependentOfContext("if (a::b::c::d & b[i])");
5803*67e74705SXin Li   verifyIndependentOfContext("if (*b[i])");
5804*67e74705SXin Li   verifyIndependentOfContext("if (int *a = (&b))");
5805*67e74705SXin Li   verifyIndependentOfContext("while (int *a = &b)");
5806*67e74705SXin Li   verifyIndependentOfContext("size = sizeof *a;");
5807*67e74705SXin Li   verifyIndependentOfContext("if (a && (b = c))");
5808*67e74705SXin Li   verifyFormat("void f() {\n"
5809*67e74705SXin Li                "  for (const int &v : Values) {\n"
5810*67e74705SXin Li                "  }\n"
5811*67e74705SXin Li                "}");
5812*67e74705SXin Li   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5813*67e74705SXin Li   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
5814*67e74705SXin Li   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
5815*67e74705SXin Li 
5816*67e74705SXin Li   verifyFormat("#define A (!a * b)");
5817*67e74705SXin Li   verifyFormat("#define MACRO     \\\n"
5818*67e74705SXin Li                "  int *i = a * b; \\\n"
5819*67e74705SXin Li                "  void f(a *b);",
5820*67e74705SXin Li                getLLVMStyleWithColumns(19));
5821*67e74705SXin Li 
5822*67e74705SXin Li   verifyIndependentOfContext("A = new SomeType *[Length];");
5823*67e74705SXin Li   verifyIndependentOfContext("A = new SomeType *[Length]();");
5824*67e74705SXin Li   verifyIndependentOfContext("T **t = new T *;");
5825*67e74705SXin Li   verifyIndependentOfContext("T **t = new T *();");
5826*67e74705SXin Li   verifyGoogleFormat("A = new SomeType*[Length]();");
5827*67e74705SXin Li   verifyGoogleFormat("A = new SomeType*[Length];");
5828*67e74705SXin Li   verifyGoogleFormat("T** t = new T*;");
5829*67e74705SXin Li   verifyGoogleFormat("T** t = new T*();");
5830*67e74705SXin Li 
5831*67e74705SXin Li   FormatStyle PointerLeft = getLLVMStyle();
5832*67e74705SXin Li   PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
5833*67e74705SXin Li   verifyFormat("delete *x;", PointerLeft);
5834*67e74705SXin Li   verifyFormat("STATIC_ASSERT((a & b) == 0);");
5835*67e74705SXin Li   verifyFormat("STATIC_ASSERT(0 == (a & b));");
5836*67e74705SXin Li   verifyFormat("template <bool a, bool b> "
5837*67e74705SXin Li                "typename t::if<x && y>::type f() {}");
5838*67e74705SXin Li   verifyFormat("template <int *y> f() {}");
5839*67e74705SXin Li   verifyFormat("vector<int *> v;");
5840*67e74705SXin Li   verifyFormat("vector<int *const> v;");
5841*67e74705SXin Li   verifyFormat("vector<int *const **const *> v;");
5842*67e74705SXin Li   verifyFormat("vector<int *volatile> v;");
5843*67e74705SXin Li   verifyFormat("vector<a * b> v;");
5844*67e74705SXin Li   verifyFormat("foo<b && false>();");
5845*67e74705SXin Li   verifyFormat("foo<b & 1>();");
5846*67e74705SXin Li   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
5847*67e74705SXin Li   verifyFormat(
5848*67e74705SXin Li       "template <class T, class = typename std::enable_if<\n"
5849*67e74705SXin Li       "                       std::is_integral<T>::value &&\n"
5850*67e74705SXin Li       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5851*67e74705SXin Li       "void F();",
5852*67e74705SXin Li       getLLVMStyleWithColumns(76));
5853*67e74705SXin Li   verifyFormat(
5854*67e74705SXin Li       "template <class T,\n"
5855*67e74705SXin Li       "          class = typename ::std::enable_if<\n"
5856*67e74705SXin Li       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5857*67e74705SXin Li       "void F();",
5858*67e74705SXin Li       getGoogleStyleWithColumns(68));
5859*67e74705SXin Li 
5860*67e74705SXin Li   verifyIndependentOfContext("MACRO(int *i);");
5861*67e74705SXin Li   verifyIndependentOfContext("MACRO(auto *a);");
5862*67e74705SXin Li   verifyIndependentOfContext("MACRO(const A *a);");
5863*67e74705SXin Li   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
5864*67e74705SXin Li   // FIXME: Is there a way to make this work?
5865*67e74705SXin Li   // verifyIndependentOfContext("MACRO(A *a);");
5866*67e74705SXin Li 
5867*67e74705SXin Li   verifyFormat("DatumHandle const *operator->() const { return input_; }");
5868*67e74705SXin Li   verifyFormat("return options != nullptr && operator==(*options);");
5869*67e74705SXin Li 
5870*67e74705SXin Li   EXPECT_EQ("#define OP(x)                                    \\\n"
5871*67e74705SXin Li             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
5872*67e74705SXin Li             "    return s << a.DebugString();                 \\\n"
5873*67e74705SXin Li             "  }",
5874*67e74705SXin Li             format("#define OP(x) \\\n"
5875*67e74705SXin Li                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
5876*67e74705SXin Li                    "    return s << a.DebugString(); \\\n"
5877*67e74705SXin Li                    "  }",
5878*67e74705SXin Li                    getLLVMStyleWithColumns(50)));
5879*67e74705SXin Li 
5880*67e74705SXin Li   // FIXME: We cannot handle this case yet; we might be able to figure out that
5881*67e74705SXin Li   // foo<x> d > v; doesn't make sense.
5882*67e74705SXin Li   verifyFormat("foo<a<b && c> d> v;");
5883*67e74705SXin Li 
5884*67e74705SXin Li   FormatStyle PointerMiddle = getLLVMStyle();
5885*67e74705SXin Li   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5886*67e74705SXin Li   verifyFormat("delete *x;", PointerMiddle);
5887*67e74705SXin Li   verifyFormat("int * x;", PointerMiddle);
5888*67e74705SXin Li   verifyFormat("template <int * y> f() {}", PointerMiddle);
5889*67e74705SXin Li   verifyFormat("int * f(int * a) {}", PointerMiddle);
5890*67e74705SXin Li   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5891*67e74705SXin Li   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5892*67e74705SXin Li   verifyFormat("A<int *> a;", PointerMiddle);
5893*67e74705SXin Li   verifyFormat("A<int **> a;", PointerMiddle);
5894*67e74705SXin Li   verifyFormat("A<int *, int *> a;", PointerMiddle);
5895*67e74705SXin Li   verifyFormat("A<int * []> a;", PointerMiddle);
5896*67e74705SXin Li   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5897*67e74705SXin Li   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
5898*67e74705SXin Li   verifyFormat("T ** t = new T *;", PointerMiddle);
5899*67e74705SXin Li 
5900*67e74705SXin Li   // Member function reference qualifiers aren't binary operators.
5901*67e74705SXin Li   verifyFormat("string // break\n"
5902*67e74705SXin Li                "operator()() & {}");
5903*67e74705SXin Li   verifyFormat("string // break\n"
5904*67e74705SXin Li                "operator()() && {}");
5905*67e74705SXin Li   verifyGoogleFormat("template <typename T>\n"
5906*67e74705SXin Li                      "auto x() & -> int {}");
5907*67e74705SXin Li }
5908*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsAttributes)5909*67e74705SXin Li TEST_F(FormatTest, UnderstandsAttributes) {
5910*67e74705SXin Li   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
5911*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5912*67e74705SXin Li                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
5913*67e74705SXin Li   FormatStyle AfterType = getLLVMStyle();
5914*67e74705SXin Li   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5915*67e74705SXin Li   verifyFormat("__attribute__((nodebug)) void\n"
5916*67e74705SXin Li                "foo() {}\n",
5917*67e74705SXin Li                AfterType);
5918*67e74705SXin Li }
5919*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsEllipsis)5920*67e74705SXin Li TEST_F(FormatTest, UnderstandsEllipsis) {
5921*67e74705SXin Li   verifyFormat("int printf(const char *fmt, ...);");
5922*67e74705SXin Li   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
5923*67e74705SXin Li   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5924*67e74705SXin Li 
5925*67e74705SXin Li   FormatStyle PointersLeft = getLLVMStyle();
5926*67e74705SXin Li   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
5927*67e74705SXin Li   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
5928*67e74705SXin Li }
5929*67e74705SXin Li 
TEST_F(FormatTest,AdaptivelyFormatsPointersAndReferences)5930*67e74705SXin Li TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
5931*67e74705SXin Li   EXPECT_EQ("int *a;\n"
5932*67e74705SXin Li             "int *a;\n"
5933*67e74705SXin Li             "int *a;",
5934*67e74705SXin Li             format("int *a;\n"
5935*67e74705SXin Li                    "int* a;\n"
5936*67e74705SXin Li                    "int *a;",
5937*67e74705SXin Li                    getGoogleStyle()));
5938*67e74705SXin Li   EXPECT_EQ("int* a;\n"
5939*67e74705SXin Li             "int* a;\n"
5940*67e74705SXin Li             "int* a;",
5941*67e74705SXin Li             format("int* a;\n"
5942*67e74705SXin Li                    "int* a;\n"
5943*67e74705SXin Li                    "int *a;",
5944*67e74705SXin Li                    getGoogleStyle()));
5945*67e74705SXin Li   EXPECT_EQ("int *a;\n"
5946*67e74705SXin Li             "int *a;\n"
5947*67e74705SXin Li             "int *a;",
5948*67e74705SXin Li             format("int *a;\n"
5949*67e74705SXin Li                    "int * a;\n"
5950*67e74705SXin Li                    "int *  a;",
5951*67e74705SXin Li                    getGoogleStyle()));
5952*67e74705SXin Li   EXPECT_EQ("auto x = [] {\n"
5953*67e74705SXin Li             "  int *a;\n"
5954*67e74705SXin Li             "  int *a;\n"
5955*67e74705SXin Li             "  int *a;\n"
5956*67e74705SXin Li             "};",
5957*67e74705SXin Li             format("auto x=[]{int *a;\n"
5958*67e74705SXin Li                    "int * a;\n"
5959*67e74705SXin Li                    "int *  a;};",
5960*67e74705SXin Li                    getGoogleStyle()));
5961*67e74705SXin Li }
5962*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsRvalueReferences)5963*67e74705SXin Li TEST_F(FormatTest, UnderstandsRvalueReferences) {
5964*67e74705SXin Li   verifyFormat("int f(int &&a) {}");
5965*67e74705SXin Li   verifyFormat("int f(int a, char &&b) {}");
5966*67e74705SXin Li   verifyFormat("void f() { int &&a = b; }");
5967*67e74705SXin Li   verifyGoogleFormat("int f(int a, char&& b) {}");
5968*67e74705SXin Li   verifyGoogleFormat("void f() { int&& a = b; }");
5969*67e74705SXin Li 
5970*67e74705SXin Li   verifyIndependentOfContext("A<int &&> a;");
5971*67e74705SXin Li   verifyIndependentOfContext("A<int &&, int &&> a;");
5972*67e74705SXin Li   verifyGoogleFormat("A<int&&> a;");
5973*67e74705SXin Li   verifyGoogleFormat("A<int&&, int&&> a;");
5974*67e74705SXin Li 
5975*67e74705SXin Li   // Not rvalue references:
5976*67e74705SXin Li   verifyFormat("template <bool B, bool C> class A {\n"
5977*67e74705SXin Li                "  static_assert(B && C, \"Something is wrong\");\n"
5978*67e74705SXin Li                "};");
5979*67e74705SXin Li   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5980*67e74705SXin Li   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
5981*67e74705SXin Li   verifyFormat("#define A(a, b) (a && b)");
5982*67e74705SXin Li }
5983*67e74705SXin Li 
TEST_F(FormatTest,FormatsBinaryOperatorsPrecedingEquals)5984*67e74705SXin Li TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5985*67e74705SXin Li   verifyFormat("void f() {\n"
5986*67e74705SXin Li                "  x[aaaaaaaaa -\n"
5987*67e74705SXin Li                "    b] = 23;\n"
5988*67e74705SXin Li                "}",
5989*67e74705SXin Li                getLLVMStyleWithColumns(15));
5990*67e74705SXin Li }
5991*67e74705SXin Li 
TEST_F(FormatTest,FormatsCasts)5992*67e74705SXin Li TEST_F(FormatTest, FormatsCasts) {
5993*67e74705SXin Li   verifyFormat("Type *A = static_cast<Type *>(P);");
5994*67e74705SXin Li   verifyFormat("Type *A = (Type *)P;");
5995*67e74705SXin Li   verifyFormat("Type *A = (vector<Type *, int *>)P;");
5996*67e74705SXin Li   verifyFormat("int a = (int)(2.0f);");
5997*67e74705SXin Li   verifyFormat("int a = (int)2.0f;");
5998*67e74705SXin Li   verifyFormat("x[(int32)y];");
5999*67e74705SXin Li   verifyFormat("x = (int32)y;");
6000*67e74705SXin Li   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6001*67e74705SXin Li   verifyFormat("int a = (int)*b;");
6002*67e74705SXin Li   verifyFormat("int a = (int)2.0f;");
6003*67e74705SXin Li   verifyFormat("int a = (int)~0;");
6004*67e74705SXin Li   verifyFormat("int a = (int)++a;");
6005*67e74705SXin Li   verifyFormat("int a = (int)sizeof(int);");
6006*67e74705SXin Li   verifyFormat("int a = (int)+2;");
6007*67e74705SXin Li   verifyFormat("my_int a = (my_int)2.0f;");
6008*67e74705SXin Li   verifyFormat("my_int a = (my_int)sizeof(int);");
6009*67e74705SXin Li   verifyFormat("return (my_int)aaa;");
6010*67e74705SXin Li   verifyFormat("#define x ((int)-1)");
6011*67e74705SXin Li   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
6012*67e74705SXin Li   verifyFormat("#define p(q) ((int *)&q)");
6013*67e74705SXin Li   verifyFormat("fn(a)(b) + 1;");
6014*67e74705SXin Li 
6015*67e74705SXin Li   verifyFormat("void f() { my_int a = (my_int)*b; }");
6016*67e74705SXin Li   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6017*67e74705SXin Li   verifyFormat("my_int a = (my_int)~0;");
6018*67e74705SXin Li   verifyFormat("my_int a = (my_int)++a;");
6019*67e74705SXin Li   verifyFormat("my_int a = (my_int)-2;");
6020*67e74705SXin Li   verifyFormat("my_int a = (my_int)1;");
6021*67e74705SXin Li   verifyFormat("my_int a = (my_int *)1;");
6022*67e74705SXin Li   verifyFormat("my_int a = (const my_int)-1;");
6023*67e74705SXin Li   verifyFormat("my_int a = (const my_int *)-1;");
6024*67e74705SXin Li   verifyFormat("my_int a = (my_int)(my_int)-1;");
6025*67e74705SXin Li   verifyFormat("my_int a = (ns::my_int)-2;");
6026*67e74705SXin Li   verifyFormat("case (my_int)ONE:");
6027*67e74705SXin Li   verifyFormat("auto x = (X)this;");
6028*67e74705SXin Li 
6029*67e74705SXin Li   // FIXME: single value wrapped with paren will be treated as cast.
6030*67e74705SXin Li   verifyFormat("void f(int i = (kValue)*kMask) {}");
6031*67e74705SXin Li 
6032*67e74705SXin Li   verifyFormat("{ (void)F; }");
6033*67e74705SXin Li 
6034*67e74705SXin Li   // Don't break after a cast's
6035*67e74705SXin Li   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6036*67e74705SXin Li                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6037*67e74705SXin Li                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
6038*67e74705SXin Li 
6039*67e74705SXin Li   // These are not casts.
6040*67e74705SXin Li   verifyFormat("void f(int *) {}");
6041*67e74705SXin Li   verifyFormat("f(foo)->b;");
6042*67e74705SXin Li   verifyFormat("f(foo).b;");
6043*67e74705SXin Li   verifyFormat("f(foo)(b);");
6044*67e74705SXin Li   verifyFormat("f(foo)[b];");
6045*67e74705SXin Li   verifyFormat("[](foo) { return 4; }(bar);");
6046*67e74705SXin Li   verifyFormat("(*funptr)(foo)[4];");
6047*67e74705SXin Li   verifyFormat("funptrs[4](foo)[4];");
6048*67e74705SXin Li   verifyFormat("void f(int *);");
6049*67e74705SXin Li   verifyFormat("void f(int *) = 0;");
6050*67e74705SXin Li   verifyFormat("void f(SmallVector<int>) {}");
6051*67e74705SXin Li   verifyFormat("void f(SmallVector<int>);");
6052*67e74705SXin Li   verifyFormat("void f(SmallVector<int>) = 0;");
6053*67e74705SXin Li   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
6054*67e74705SXin Li   verifyFormat("int a = sizeof(int) * b;");
6055*67e74705SXin Li   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
6056*67e74705SXin Li   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6057*67e74705SXin Li   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
6058*67e74705SXin Li   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
6059*67e74705SXin Li 
6060*67e74705SXin Li   // These are not casts, but at some point were confused with casts.
6061*67e74705SXin Li   verifyFormat("virtual void foo(int *) override;");
6062*67e74705SXin Li   verifyFormat("virtual void foo(char &) const;");
6063*67e74705SXin Li   verifyFormat("virtual void foo(int *a, char *) const;");
6064*67e74705SXin Li   verifyFormat("int a = sizeof(int *) + b;");
6065*67e74705SXin Li   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
6066*67e74705SXin Li   verifyFormat("bool b = f(g<int>) && c;");
6067*67e74705SXin Li   verifyFormat("typedef void (*f)(int i) func;");
6068*67e74705SXin Li 
6069*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6070*67e74705SXin Li                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6071*67e74705SXin Li   // FIXME: The indentation here is not ideal.
6072*67e74705SXin Li   verifyFormat(
6073*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6074*67e74705SXin Li       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6075*67e74705SXin Li       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
6076*67e74705SXin Li }
6077*67e74705SXin Li 
TEST_F(FormatTest,FormatsFunctionTypes)6078*67e74705SXin Li TEST_F(FormatTest, FormatsFunctionTypes) {
6079*67e74705SXin Li   verifyFormat("A<bool()> a;");
6080*67e74705SXin Li   verifyFormat("A<SomeType()> a;");
6081*67e74705SXin Li   verifyFormat("A<void (*)(int, std::string)> a;");
6082*67e74705SXin Li   verifyFormat("A<void *(int)>;");
6083*67e74705SXin Li   verifyFormat("void *(*a)(int *, SomeType *);");
6084*67e74705SXin Li   verifyFormat("int (*func)(void *);");
6085*67e74705SXin Li   verifyFormat("void f() { int (*func)(void *); }");
6086*67e74705SXin Li   verifyFormat("template <class CallbackClass>\n"
6087*67e74705SXin Li                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
6088*67e74705SXin Li 
6089*67e74705SXin Li   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6090*67e74705SXin Li   verifyGoogleFormat("void* (*a)(int);");
6091*67e74705SXin Li   verifyGoogleFormat(
6092*67e74705SXin Li       "template <class CallbackClass>\n"
6093*67e74705SXin Li       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
6094*67e74705SXin Li 
6095*67e74705SXin Li   // Other constructs can look somewhat like function types:
6096*67e74705SXin Li   verifyFormat("A<sizeof(*x)> a;");
6097*67e74705SXin Li   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
6098*67e74705SXin Li   verifyFormat("some_var = function(*some_pointer_var)[0];");
6099*67e74705SXin Li   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
6100*67e74705SXin Li   verifyFormat("int x = f(&h)();");
6101*67e74705SXin Li   verifyFormat("returnsFunction(&param1, &param2)(param);");
6102*67e74705SXin Li }
6103*67e74705SXin Li 
TEST_F(FormatTest,FormatsPointersToArrayTypes)6104*67e74705SXin Li TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6105*67e74705SXin Li   verifyFormat("A (*foo_)[6];");
6106*67e74705SXin Li   verifyFormat("vector<int> (*foo_)[6];");
6107*67e74705SXin Li }
6108*67e74705SXin Li 
TEST_F(FormatTest,BreaksLongVariableDeclarations)6109*67e74705SXin Li TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6110*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6111*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
6112*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6113*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
6114*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6115*67e74705SXin Li                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
6116*67e74705SXin Li 
6117*67e74705SXin Li   // Different ways of ()-initializiation.
6118*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6119*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6120*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6121*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6122*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6123*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
6124*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6125*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
6126*67e74705SXin Li }
6127*67e74705SXin Li 
TEST_F(FormatTest,BreaksLongDeclarations)6128*67e74705SXin Li TEST_F(FormatTest, BreaksLongDeclarations) {
6129*67e74705SXin Li   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
6130*67e74705SXin Li                "    AnotherNameForTheLongType;");
6131*67e74705SXin Li   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
6132*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6133*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6134*67e74705SXin Li                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
6135*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6136*67e74705SXin Li                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
6137*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6138*67e74705SXin Li                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6139*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6140*67e74705SXin Li                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6141*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6142*67e74705SXin Li                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6143*67e74705SXin Li   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6144*67e74705SXin Li                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6145*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6146*67e74705SXin Li                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6147*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6148*67e74705SXin Li                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
6149*67e74705SXin Li   FormatStyle Indented = getLLVMStyle();
6150*67e74705SXin Li   Indented.IndentWrappedFunctionNames = true;
6151*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6152*67e74705SXin Li                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6153*67e74705SXin Li                Indented);
6154*67e74705SXin Li   verifyFormat(
6155*67e74705SXin Li       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6156*67e74705SXin Li       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6157*67e74705SXin Li       Indented);
6158*67e74705SXin Li   verifyFormat(
6159*67e74705SXin Li       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6160*67e74705SXin Li       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6161*67e74705SXin Li       Indented);
6162*67e74705SXin Li   verifyFormat(
6163*67e74705SXin Li       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6164*67e74705SXin Li       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6165*67e74705SXin Li       Indented);
6166*67e74705SXin Li 
6167*67e74705SXin Li   // FIXME: Without the comment, this breaks after "(".
6168*67e74705SXin Li   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
6169*67e74705SXin Li                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6170*67e74705SXin Li                getGoogleStyle());
6171*67e74705SXin Li 
6172*67e74705SXin Li   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
6173*67e74705SXin Li                "                  int LoooooooooooooooooooongParam2) {}");
6174*67e74705SXin Li   verifyFormat(
6175*67e74705SXin Li       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6176*67e74705SXin Li       "                                   SourceLocation L, IdentifierIn *II,\n"
6177*67e74705SXin Li       "                                   Type *T) {}");
6178*67e74705SXin Li   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
6179*67e74705SXin Li                "ReallyReaaallyLongFunctionName(\n"
6180*67e74705SXin Li                "    const std::string &SomeParameter,\n"
6181*67e74705SXin Li                "    const SomeType<string, SomeOtherTemplateParameter>\n"
6182*67e74705SXin Li                "        &ReallyReallyLongParameterName,\n"
6183*67e74705SXin Li                "    const SomeType<string, SomeOtherTemplateParameter>\n"
6184*67e74705SXin Li                "        &AnotherLongParameterName) {}");
6185*67e74705SXin Li   verifyFormat("template <typename A>\n"
6186*67e74705SXin Li                "SomeLoooooooooooooooooooooongType<\n"
6187*67e74705SXin Li                "    typename some_namespace::SomeOtherType<A>::Type>\n"
6188*67e74705SXin Li                "Function() {}");
6189*67e74705SXin Li 
6190*67e74705SXin Li   verifyGoogleFormat(
6191*67e74705SXin Li       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6192*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaa;");
6193*67e74705SXin Li   verifyGoogleFormat(
6194*67e74705SXin Li       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6195*67e74705SXin Li       "                                   SourceLocation L) {}");
6196*67e74705SXin Li   verifyGoogleFormat(
6197*67e74705SXin Li       "some_namespace::LongReturnType\n"
6198*67e74705SXin Li       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
6199*67e74705SXin Li       "    int first_long_parameter, int second_parameter) {}");
6200*67e74705SXin Li 
6201*67e74705SXin Li   verifyGoogleFormat("template <typename T>\n"
6202*67e74705SXin Li                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6203*67e74705SXin Li                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
6204*67e74705SXin Li   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6205*67e74705SXin Li                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
6206*67e74705SXin Li 
6207*67e74705SXin Li   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6208*67e74705SXin Li                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6209*67e74705SXin Li                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6210*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6211*67e74705SXin Li                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6212*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
6213*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6214*67e74705SXin Li                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6215*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6216*67e74705SXin Li                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6217*67e74705SXin Li }
6218*67e74705SXin Li 
TEST_F(FormatTest,FormatsArrays)6219*67e74705SXin Li TEST_F(FormatTest, FormatsArrays) {
6220*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6221*67e74705SXin Li                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
6222*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6223*67e74705SXin Li                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
6224*67e74705SXin Li   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6225*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
6226*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6227*67e74705SXin Li                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6228*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6229*67e74705SXin Li                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6230*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6231*67e74705SXin Li                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6232*67e74705SXin Li                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6233*67e74705SXin Li   verifyFormat(
6234*67e74705SXin Li       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6235*67e74705SXin Li       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6236*67e74705SXin Li       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
6237*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6238*67e74705SXin Li                "    .aaaaaaaaaaaaaaaaaaaaaa();");
6239*67e74705SXin Li 
6240*67e74705SXin Li   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6241*67e74705SXin Li                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
6242*67e74705SXin Li   verifyFormat(
6243*67e74705SXin Li       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6244*67e74705SXin Li       "                                  .aaaaaaa[0]\n"
6245*67e74705SXin Li       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
6246*67e74705SXin Li   verifyFormat("a[::b::c];");
6247*67e74705SXin Li 
6248*67e74705SXin Li   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
6249*67e74705SXin Li 
6250*67e74705SXin Li   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6251*67e74705SXin Li   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
6252*67e74705SXin Li }
6253*67e74705SXin Li 
TEST_F(FormatTest,LineStartsWithSpecialCharacter)6254*67e74705SXin Li TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6255*67e74705SXin Li   verifyFormat("(a)->b();");
6256*67e74705SXin Li   verifyFormat("--a;");
6257*67e74705SXin Li }
6258*67e74705SXin Li 
TEST_F(FormatTest,HandlesIncludeDirectives)6259*67e74705SXin Li TEST_F(FormatTest, HandlesIncludeDirectives) {
6260*67e74705SXin Li   verifyFormat("#include <string>\n"
6261*67e74705SXin Li                "#include <a/b/c.h>\n"
6262*67e74705SXin Li                "#include \"a/b/string\"\n"
6263*67e74705SXin Li                "#include \"string.h\"\n"
6264*67e74705SXin Li                "#include \"string.h\"\n"
6265*67e74705SXin Li                "#include <a-a>\n"
6266*67e74705SXin Li                "#include < path with space >\n"
6267*67e74705SXin Li                "#include_next <test.h>"
6268*67e74705SXin Li                "#include \"abc.h\" // this is included for ABC\n"
6269*67e74705SXin Li                "#include \"some long include\" // with a comment\n"
6270*67e74705SXin Li                "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6271*67e74705SXin Li                getLLVMStyleWithColumns(35));
6272*67e74705SXin Li   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
6273*67e74705SXin Li   EXPECT_EQ("#include <a>", format("#include<a>"));
6274*67e74705SXin Li 
6275*67e74705SXin Li   verifyFormat("#import <string>");
6276*67e74705SXin Li   verifyFormat("#import <a/b/c.h>");
6277*67e74705SXin Li   verifyFormat("#import \"a/b/string\"");
6278*67e74705SXin Li   verifyFormat("#import \"string.h\"");
6279*67e74705SXin Li   verifyFormat("#import \"string.h\"");
6280*67e74705SXin Li   verifyFormat("#if __has_include(<strstream>)\n"
6281*67e74705SXin Li                "#include <strstream>\n"
6282*67e74705SXin Li                "#endif");
6283*67e74705SXin Li 
6284*67e74705SXin Li   verifyFormat("#define MY_IMPORT <a/b>");
6285*67e74705SXin Li 
6286*67e74705SXin Li   // Protocol buffer definition or missing "#".
6287*67e74705SXin Li   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6288*67e74705SXin Li                getLLVMStyleWithColumns(30));
6289*67e74705SXin Li 
6290*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
6291*67e74705SXin Li   Style.AlwaysBreakBeforeMultilineStrings = true;
6292*67e74705SXin Li   Style.ColumnLimit = 0;
6293*67e74705SXin Li   verifyFormat("#import \"abc.h\"", Style);
6294*67e74705SXin Li 
6295*67e74705SXin Li   // But 'import' might also be a regular C++ namespace.
6296*67e74705SXin Li   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6297*67e74705SXin Li                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6298*67e74705SXin Li }
6299*67e74705SXin Li 
6300*67e74705SXin Li //===----------------------------------------------------------------------===//
6301*67e74705SXin Li // Error recovery tests.
6302*67e74705SXin Li //===----------------------------------------------------------------------===//
6303*67e74705SXin Li 
TEST_F(FormatTest,IncompleteParameterLists)6304*67e74705SXin Li TEST_F(FormatTest, IncompleteParameterLists) {
6305*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
6306*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
6307*67e74705SXin Li   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6308*67e74705SXin Li                "                        double *min_x,\n"
6309*67e74705SXin Li                "                        double *max_x,\n"
6310*67e74705SXin Li                "                        double *min_y,\n"
6311*67e74705SXin Li                "                        double *max_y,\n"
6312*67e74705SXin Li                "                        double *min_z,\n"
6313*67e74705SXin Li                "                        double *max_z, ) {}",
6314*67e74705SXin Li                NoBinPacking);
6315*67e74705SXin Li }
6316*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeTrailingStuff)6317*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
6318*67e74705SXin Li   verifyFormat("void f() { return; }\n42");
6319*67e74705SXin Li   verifyFormat("void f() {\n"
6320*67e74705SXin Li                "  if (0)\n"
6321*67e74705SXin Li                "    return;\n"
6322*67e74705SXin Li                "}\n"
6323*67e74705SXin Li                "42");
6324*67e74705SXin Li   verifyFormat("void f() { return }\n42");
6325*67e74705SXin Li   verifyFormat("void f() {\n"
6326*67e74705SXin Li                "  if (0)\n"
6327*67e74705SXin Li                "    return\n"
6328*67e74705SXin Li                "}\n"
6329*67e74705SXin Li                "42");
6330*67e74705SXin Li }
6331*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeMissingSemicolon)6332*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6333*67e74705SXin Li   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
6334*67e74705SXin Li   EXPECT_EQ("void f() {\n"
6335*67e74705SXin Li             "  if (a)\n"
6336*67e74705SXin Li             "    return\n"
6337*67e74705SXin Li             "}",
6338*67e74705SXin Li             format("void  f  (  )  {  if  ( a )  return  }"));
6339*67e74705SXin Li   EXPECT_EQ("namespace N {\n"
6340*67e74705SXin Li             "void f()\n"
6341*67e74705SXin Li             "}",
6342*67e74705SXin Li             format("namespace  N  {  void f()  }"));
6343*67e74705SXin Li   EXPECT_EQ("namespace N {\n"
6344*67e74705SXin Li             "void f() {}\n"
6345*67e74705SXin Li             "void g()\n"
6346*67e74705SXin Li             "}",
6347*67e74705SXin Li             format("namespace N  { void f( ) { } void g( ) }"));
6348*67e74705SXin Li }
6349*67e74705SXin Li 
TEST_F(FormatTest,IndentationWithinColumnLimitNotPossible)6350*67e74705SXin Li TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6351*67e74705SXin Li   verifyFormat("int aaaaaaaa =\n"
6352*67e74705SXin Li                "    // Overlylongcomment\n"
6353*67e74705SXin Li                "    b;",
6354*67e74705SXin Li                getLLVMStyleWithColumns(20));
6355*67e74705SXin Li   verifyFormat("function(\n"
6356*67e74705SXin Li                "    ShortArgument,\n"
6357*67e74705SXin Li                "    LoooooooooooongArgument);\n",
6358*67e74705SXin Li                getLLVMStyleWithColumns(20));
6359*67e74705SXin Li }
6360*67e74705SXin Li 
TEST_F(FormatTest,IncorrectAccessSpecifier)6361*67e74705SXin Li TEST_F(FormatTest, IncorrectAccessSpecifier) {
6362*67e74705SXin Li   verifyFormat("public:");
6363*67e74705SXin Li   verifyFormat("class A {\n"
6364*67e74705SXin Li                "public\n"
6365*67e74705SXin Li                "  void f() {}\n"
6366*67e74705SXin Li                "};");
6367*67e74705SXin Li   verifyFormat("public\n"
6368*67e74705SXin Li                "int qwerty;");
6369*67e74705SXin Li   verifyFormat("public\n"
6370*67e74705SXin Li                "B {}");
6371*67e74705SXin Li   verifyFormat("public\n"
6372*67e74705SXin Li                "{}");
6373*67e74705SXin Li   verifyFormat("public\n"
6374*67e74705SXin Li                "B { int x; }");
6375*67e74705SXin Li }
6376*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeUnbalancedBraces)6377*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6378*67e74705SXin Li   verifyFormat("{");
6379*67e74705SXin Li   verifyFormat("#})");
6380*67e74705SXin Li   verifyNoCrash("(/**/[:!] ?[).");
6381*67e74705SXin Li }
6382*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeDoNoWhile)6383*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
6384*67e74705SXin Li   verifyFormat("do {\n}");
6385*67e74705SXin Li   verifyFormat("do {\n}\n"
6386*67e74705SXin Li                "f();");
6387*67e74705SXin Li   verifyFormat("do {\n}\n"
6388*67e74705SXin Li                "wheeee(fun);");
6389*67e74705SXin Li   verifyFormat("do {\n"
6390*67e74705SXin Li                "  f();\n"
6391*67e74705SXin Li                "}");
6392*67e74705SXin Li }
6393*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeMissingParens)6394*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeMissingParens) {
6395*67e74705SXin Li   verifyFormat("if {\n  foo;\n  foo();\n}");
6396*67e74705SXin Li   verifyFormat("switch {\n  foo;\n  foo();\n}");
6397*67e74705SXin Li   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
6398*67e74705SXin Li   verifyFormat("while {\n  foo;\n  foo();\n}");
6399*67e74705SXin Li   verifyFormat("do {\n  foo;\n  foo();\n} while;");
6400*67e74705SXin Li }
6401*67e74705SXin Li 
TEST_F(FormatTest,DoesNotTouchUnwrappedLinesWithErrors)6402*67e74705SXin Li TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
6403*67e74705SXin Li   verifyIncompleteFormat("namespace {\n"
6404*67e74705SXin Li                          "class Foo { Foo (\n"
6405*67e74705SXin Li                          "};\n"
6406*67e74705SXin Li                          "} // comment");
6407*67e74705SXin Li }
6408*67e74705SXin Li 
TEST_F(FormatTest,IncorrectCodeErrorDetection)6409*67e74705SXin Li TEST_F(FormatTest, IncorrectCodeErrorDetection) {
6410*67e74705SXin Li   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
6411*67e74705SXin Li   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
6412*67e74705SXin Li   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
6413*67e74705SXin Li   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
6414*67e74705SXin Li 
6415*67e74705SXin Li   EXPECT_EQ("{\n"
6416*67e74705SXin Li             "  {\n"
6417*67e74705SXin Li             "    breakme(\n"
6418*67e74705SXin Li             "        qwe);\n"
6419*67e74705SXin Li             "  }\n",
6420*67e74705SXin Li             format("{\n"
6421*67e74705SXin Li                    "    {\n"
6422*67e74705SXin Li                    " breakme(qwe);\n"
6423*67e74705SXin Li                    "}\n",
6424*67e74705SXin Li                    getLLVMStyleWithColumns(10)));
6425*67e74705SXin Li }
6426*67e74705SXin Li 
TEST_F(FormatTest,LayoutCallsInsideBraceInitializers)6427*67e74705SXin Li TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
6428*67e74705SXin Li   verifyFormat("int x = {\n"
6429*67e74705SXin Li                "    avariable,\n"
6430*67e74705SXin Li                "    b(alongervariable)};",
6431*67e74705SXin Li                getLLVMStyleWithColumns(25));
6432*67e74705SXin Li }
6433*67e74705SXin Li 
TEST_F(FormatTest,LayoutBraceInitializersInReturnStatement)6434*67e74705SXin Li TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
6435*67e74705SXin Li   verifyFormat("return (a)(b){1, 2, 3};");
6436*67e74705SXin Li }
6437*67e74705SXin Li 
TEST_F(FormatTest,LayoutCxx11BraceInitializers)6438*67e74705SXin Li TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
6439*67e74705SXin Li   verifyFormat("vector<int> x{1, 2, 3, 4};");
6440*67e74705SXin Li   verifyFormat("vector<int> x{\n"
6441*67e74705SXin Li                "    1, 2, 3, 4,\n"
6442*67e74705SXin Li                "};");
6443*67e74705SXin Li   verifyFormat("vector<T> x{{}, {}, {}, {}};");
6444*67e74705SXin Li   verifyFormat("f({1, 2});");
6445*67e74705SXin Li   verifyFormat("auto v = Foo{-1};");
6446*67e74705SXin Li   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6447*67e74705SXin Li   verifyFormat("Class::Class : member{1, 2, 3} {}");
6448*67e74705SXin Li   verifyFormat("new vector<int>{1, 2, 3};");
6449*67e74705SXin Li   verifyFormat("new int[3]{1, 2, 3};");
6450*67e74705SXin Li   verifyFormat("new int{1};");
6451*67e74705SXin Li   verifyFormat("return {arg1, arg2};");
6452*67e74705SXin Li   verifyFormat("return {arg1, SomeType{parameter}};");
6453*67e74705SXin Li   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6454*67e74705SXin Li   verifyFormat("new T{arg1, arg2};");
6455*67e74705SXin Li   verifyFormat("f(MyMap[{composite, key}]);");
6456*67e74705SXin Li   verifyFormat("class Class {\n"
6457*67e74705SXin Li                "  T member = {arg1, arg2};\n"
6458*67e74705SXin Li                "};");
6459*67e74705SXin Li   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
6460*67e74705SXin Li   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6461*67e74705SXin Li   verifyFormat("int a = std::is_integral<int>{} + 0;");
6462*67e74705SXin Li 
6463*67e74705SXin Li   verifyFormat("int foo(int i) { return fo1{}(i); }");
6464*67e74705SXin Li   verifyFormat("int foo(int i) { return fo1{}(i); }");
6465*67e74705SXin Li   verifyFormat("auto i = decltype(x){};");
6466*67e74705SXin Li   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
6467*67e74705SXin Li   verifyFormat("Node n{1, Node{1000}, //\n"
6468*67e74705SXin Li                "       2};");
6469*67e74705SXin Li   verifyFormat("Aaaa aaaaaaa{\n"
6470*67e74705SXin Li                "    {\n"
6471*67e74705SXin Li                "        aaaa,\n"
6472*67e74705SXin Li                "    },\n"
6473*67e74705SXin Li                "};");
6474*67e74705SXin Li   verifyFormat("class C : public D {\n"
6475*67e74705SXin Li                "  SomeClass SC{2};\n"
6476*67e74705SXin Li                "};");
6477*67e74705SXin Li   verifyFormat("class C : public A {\n"
6478*67e74705SXin Li                "  class D : public B {\n"
6479*67e74705SXin Li                "    void f() { int i{2}; }\n"
6480*67e74705SXin Li                "  };\n"
6481*67e74705SXin Li                "};");
6482*67e74705SXin Li   verifyFormat("#define A {a, a},");
6483*67e74705SXin Li 
6484*67e74705SXin Li   // In combination with BinPackArguments = false.
6485*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
6486*67e74705SXin Li   NoBinPacking.BinPackArguments = false;
6487*67e74705SXin Li   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6488*67e74705SXin Li                "                      bbbbb,\n"
6489*67e74705SXin Li                "                      ccccc,\n"
6490*67e74705SXin Li                "                      ddddd,\n"
6491*67e74705SXin Li                "                      eeeee,\n"
6492*67e74705SXin Li                "                      ffffff,\n"
6493*67e74705SXin Li                "                      ggggg,\n"
6494*67e74705SXin Li                "                      hhhhhh,\n"
6495*67e74705SXin Li                "                      iiiiii,\n"
6496*67e74705SXin Li                "                      jjjjjj,\n"
6497*67e74705SXin Li                "                      kkkkkk};",
6498*67e74705SXin Li                NoBinPacking);
6499*67e74705SXin Li   verifyFormat("const Aaaaaa aaaaa = {\n"
6500*67e74705SXin Li                "    aaaaa,\n"
6501*67e74705SXin Li                "    bbbbb,\n"
6502*67e74705SXin Li                "    ccccc,\n"
6503*67e74705SXin Li                "    ddddd,\n"
6504*67e74705SXin Li                "    eeeee,\n"
6505*67e74705SXin Li                "    ffffff,\n"
6506*67e74705SXin Li                "    ggggg,\n"
6507*67e74705SXin Li                "    hhhhhh,\n"
6508*67e74705SXin Li                "    iiiiii,\n"
6509*67e74705SXin Li                "    jjjjjj,\n"
6510*67e74705SXin Li                "    kkkkkk,\n"
6511*67e74705SXin Li                "};",
6512*67e74705SXin Li                NoBinPacking);
6513*67e74705SXin Li   verifyFormat(
6514*67e74705SXin Li       "const Aaaaaa aaaaa = {\n"
6515*67e74705SXin Li       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
6516*67e74705SXin Li       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
6517*67e74705SXin Li       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6518*67e74705SXin Li       "};",
6519*67e74705SXin Li       NoBinPacking);
6520*67e74705SXin Li 
6521*67e74705SXin Li   // FIXME: The alignment of these trailing comments might be bad. Then again,
6522*67e74705SXin Li   // this might be utterly useless in real code.
6523*67e74705SXin Li   verifyFormat("Constructor::Constructor()\n"
6524*67e74705SXin Li                "    : some_value{         //\n"
6525*67e74705SXin Li                "                 aaaaaaa, //\n"
6526*67e74705SXin Li                "                 bbbbbbb} {}");
6527*67e74705SXin Li 
6528*67e74705SXin Li   // In braced lists, the first comment is always assumed to belong to the
6529*67e74705SXin Li   // first element. Thus, it can be moved to the next or previous line as
6530*67e74705SXin Li   // appropriate.
6531*67e74705SXin Li   EXPECT_EQ("function({// First element:\n"
6532*67e74705SXin Li             "          1,\n"
6533*67e74705SXin Li             "          // Second element:\n"
6534*67e74705SXin Li             "          2});",
6535*67e74705SXin Li             format("function({\n"
6536*67e74705SXin Li                    "    // First element:\n"
6537*67e74705SXin Li                    "    1,\n"
6538*67e74705SXin Li                    "    // Second element:\n"
6539*67e74705SXin Li                    "    2});"));
6540*67e74705SXin Li   EXPECT_EQ("std::vector<int> MyNumbers{\n"
6541*67e74705SXin Li             "    // First element:\n"
6542*67e74705SXin Li             "    1,\n"
6543*67e74705SXin Li             "    // Second element:\n"
6544*67e74705SXin Li             "    2};",
6545*67e74705SXin Li             format("std::vector<int> MyNumbers{// First element:\n"
6546*67e74705SXin Li                    "                           1,\n"
6547*67e74705SXin Li                    "                           // Second element:\n"
6548*67e74705SXin Li                    "                           2};",
6549*67e74705SXin Li                    getLLVMStyleWithColumns(30)));
6550*67e74705SXin Li   // A trailing comma should still lead to an enforced line break.
6551*67e74705SXin Li   EXPECT_EQ("vector<int> SomeVector = {\n"
6552*67e74705SXin Li             "    // aaa\n"
6553*67e74705SXin Li             "    1, 2,\n"
6554*67e74705SXin Li             "};",
6555*67e74705SXin Li             format("vector<int> SomeVector = { // aaa\n"
6556*67e74705SXin Li                    "    1, 2, };"));
6557*67e74705SXin Li 
6558*67e74705SXin Li   FormatStyle ExtraSpaces = getLLVMStyle();
6559*67e74705SXin Li   ExtraSpaces.Cpp11BracedListStyle = false;
6560*67e74705SXin Li   ExtraSpaces.ColumnLimit = 75;
6561*67e74705SXin Li   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6562*67e74705SXin Li   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6563*67e74705SXin Li   verifyFormat("f({ 1, 2 });", ExtraSpaces);
6564*67e74705SXin Li   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6565*67e74705SXin Li   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6566*67e74705SXin Li   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6567*67e74705SXin Li   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6568*67e74705SXin Li   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6569*67e74705SXin Li   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6570*67e74705SXin Li   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6571*67e74705SXin Li   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6572*67e74705SXin Li   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6573*67e74705SXin Li   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6574*67e74705SXin Li   verifyFormat("class Class {\n"
6575*67e74705SXin Li                "  T member = { arg1, arg2 };\n"
6576*67e74705SXin Li                "};",
6577*67e74705SXin Li                ExtraSpaces);
6578*67e74705SXin Li   verifyFormat(
6579*67e74705SXin Li       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6580*67e74705SXin Li       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6581*67e74705SXin Li       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6582*67e74705SXin Li       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6583*67e74705SXin Li       ExtraSpaces);
6584*67e74705SXin Li   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
6585*67e74705SXin Li   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
6586*67e74705SXin Li                ExtraSpaces);
6587*67e74705SXin Li   verifyFormat(
6588*67e74705SXin Li       "someFunction(OtherParam,\n"
6589*67e74705SXin Li       "             BracedList{ // comment 1 (Forcing interesting break)\n"
6590*67e74705SXin Li       "                         param1, param2,\n"
6591*67e74705SXin Li       "                         // comment 2\n"
6592*67e74705SXin Li       "                         param3, param4 });",
6593*67e74705SXin Li       ExtraSpaces);
6594*67e74705SXin Li   verifyFormat(
6595*67e74705SXin Li       "std::this_thread::sleep_for(\n"
6596*67e74705SXin Li       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6597*67e74705SXin Li       ExtraSpaces);
6598*67e74705SXin Li   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6599*67e74705SXin Li                "    aaaaaaa,\n"
6600*67e74705SXin Li                "    aaaaaaaaaa,\n"
6601*67e74705SXin Li                "    aaaaa,\n"
6602*67e74705SXin Li                "    aaaaaaaaaaaaaaa,\n"
6603*67e74705SXin Li                "    aaa,\n"
6604*67e74705SXin Li                "    aaaaaaaaaa,\n"
6605*67e74705SXin Li                "    a,\n"
6606*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaa,\n"
6607*67e74705SXin Li                "    aaaaaaaaaaaa,\n"
6608*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6609*67e74705SXin Li                "    aaaaaaa,\n"
6610*67e74705SXin Li                "    a};");
6611*67e74705SXin Li   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
6612*67e74705SXin Li }
6613*67e74705SXin Li 
TEST_F(FormatTest,FormatsBracedListsInColumnLayout)6614*67e74705SXin Li TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
6615*67e74705SXin Li   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6616*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6617*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6618*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6619*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6620*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
6621*67e74705SXin Li   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
6622*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6623*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, //\n"
6624*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6625*67e74705SXin Li                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
6626*67e74705SXin Li   verifyFormat(
6627*67e74705SXin Li       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
6628*67e74705SXin Li       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
6629*67e74705SXin Li       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
6630*67e74705SXin Li       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6631*67e74705SXin Li       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6632*67e74705SXin Li       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6633*67e74705SXin Li       "                 7777777};");
6634*67e74705SXin Li   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6635*67e74705SXin Li                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6636*67e74705SXin Li                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
6637*67e74705SXin Li   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6638*67e74705SXin Li                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6639*67e74705SXin Li                "    // Separating comment.\n"
6640*67e74705SXin Li                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6641*67e74705SXin Li   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6642*67e74705SXin Li                "    // Leading comment\n"
6643*67e74705SXin Li                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6644*67e74705SXin Li                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
6645*67e74705SXin Li   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6646*67e74705SXin Li                "                 1, 1, 1, 1};",
6647*67e74705SXin Li                getLLVMStyleWithColumns(39));
6648*67e74705SXin Li   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6649*67e74705SXin Li                "                 1, 1, 1, 1};",
6650*67e74705SXin Li                getLLVMStyleWithColumns(38));
6651*67e74705SXin Li   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
6652*67e74705SXin Li                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6653*67e74705SXin Li                getLLVMStyleWithColumns(43));
6654*67e74705SXin Li   verifyFormat(
6655*67e74705SXin Li       "static unsigned SomeValues[10][3] = {\n"
6656*67e74705SXin Li       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
6657*67e74705SXin Li       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6658*67e74705SXin Li   verifyFormat("static auto fields = new vector<string>{\n"
6659*67e74705SXin Li                "    \"aaaaaaaaaaaaa\",\n"
6660*67e74705SXin Li                "    \"aaaaaaaaaaaaa\",\n"
6661*67e74705SXin Li                "    \"aaaaaaaaaaaa\",\n"
6662*67e74705SXin Li                "    \"aaaaaaaaaaaaaa\",\n"
6663*67e74705SXin Li                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6664*67e74705SXin Li                "    \"aaaaaaaaaaaa\",\n"
6665*67e74705SXin Li                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6666*67e74705SXin Li                "};");
6667*67e74705SXin Li   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6668*67e74705SXin Li   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6669*67e74705SXin Li                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6670*67e74705SXin Li                "                 3, cccccccccccccccccccccc};",
6671*67e74705SXin Li                getLLVMStyleWithColumns(60));
6672*67e74705SXin Li 
6673*67e74705SXin Li   // Trailing commas.
6674*67e74705SXin Li   verifyFormat("vector<int> x = {\n"
6675*67e74705SXin Li                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
6676*67e74705SXin Li                "};",
6677*67e74705SXin Li                getLLVMStyleWithColumns(39));
6678*67e74705SXin Li   verifyFormat("vector<int> x = {\n"
6679*67e74705SXin Li                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
6680*67e74705SXin Li                "};",
6681*67e74705SXin Li                getLLVMStyleWithColumns(39));
6682*67e74705SXin Li   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6683*67e74705SXin Li                "                 1, 1, 1, 1,\n"
6684*67e74705SXin Li                "                 /**/ /**/};",
6685*67e74705SXin Li                getLLVMStyleWithColumns(39));
6686*67e74705SXin Li 
6687*67e74705SXin Li   // Trailing comment in the first line.
6688*67e74705SXin Li   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
6689*67e74705SXin Li                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
6690*67e74705SXin Li                "    111111111,  222222222,  3333333333,  444444444,  //\n"
6691*67e74705SXin Li                "    11111111,   22222222,   333333333,   44444444};");
6692*67e74705SXin Li   // Trailing comment in the last line.
6693*67e74705SXin Li   verifyFormat("int aaaaa[] = {\n"
6694*67e74705SXin Li                "    1, 2, 3, // comment\n"
6695*67e74705SXin Li                "    4, 5, 6  // comment\n"
6696*67e74705SXin Li                "};");
6697*67e74705SXin Li 
6698*67e74705SXin Li   // With nested lists, we should either format one item per line or all nested
6699*67e74705SXin Li   // lists one on line.
6700*67e74705SXin Li   // FIXME: For some nested lists, we can do better.
6701*67e74705SXin Li   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6702*67e74705SXin Li                "        {aaaaaaaaaaaaaaaaaaa},\n"
6703*67e74705SXin Li                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
6704*67e74705SXin Li                "        {aaaaaaaaaaaaaaaaa}};",
6705*67e74705SXin Li                getLLVMStyleWithColumns(60));
6706*67e74705SXin Li   verifyFormat(
6707*67e74705SXin Li       "SomeStruct my_struct_array = {\n"
6708*67e74705SXin Li       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6709*67e74705SXin Li       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6710*67e74705SXin Li       "    {aaa, aaa},\n"
6711*67e74705SXin Li       "    {aaa, aaa},\n"
6712*67e74705SXin Li       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6713*67e74705SXin Li       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6714*67e74705SXin Li       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
6715*67e74705SXin Li 
6716*67e74705SXin Li   // No column layout should be used here.
6717*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6718*67e74705SXin Li                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
6719*67e74705SXin Li 
6720*67e74705SXin Li   verifyNoCrash("a<,");
6721*67e74705SXin Li 
6722*67e74705SXin Li   // No braced initializer here.
6723*67e74705SXin Li   verifyFormat("void f() {\n"
6724*67e74705SXin Li                "  struct Dummy {};\n"
6725*67e74705SXin Li                "  f(v);\n"
6726*67e74705SXin Li                "}");
6727*67e74705SXin Li 
6728*67e74705SXin Li   // Long lists should be formatted in columns even if they are nested.
6729*67e74705SXin Li   verifyFormat(
6730*67e74705SXin Li       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6731*67e74705SXin Li       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6732*67e74705SXin Li       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6733*67e74705SXin Li       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6734*67e74705SXin Li       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6735*67e74705SXin Li       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
6736*67e74705SXin Li }
6737*67e74705SXin Li 
TEST_F(FormatTest,PullTrivialFunctionDefinitionsIntoSingleLine)6738*67e74705SXin Li TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
6739*67e74705SXin Li   FormatStyle DoNotMerge = getLLVMStyle();
6740*67e74705SXin Li   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6741*67e74705SXin Li 
6742*67e74705SXin Li   verifyFormat("void f() { return 42; }");
6743*67e74705SXin Li   verifyFormat("void f() {\n"
6744*67e74705SXin Li                "  return 42;\n"
6745*67e74705SXin Li                "}",
6746*67e74705SXin Li                DoNotMerge);
6747*67e74705SXin Li   verifyFormat("void f() {\n"
6748*67e74705SXin Li                "  // Comment\n"
6749*67e74705SXin Li                "}");
6750*67e74705SXin Li   verifyFormat("{\n"
6751*67e74705SXin Li                "#error {\n"
6752*67e74705SXin Li                "  int a;\n"
6753*67e74705SXin Li                "}");
6754*67e74705SXin Li   verifyFormat("{\n"
6755*67e74705SXin Li                "  int a;\n"
6756*67e74705SXin Li                "#error {\n"
6757*67e74705SXin Li                "}");
6758*67e74705SXin Li   verifyFormat("void f() {} // comment");
6759*67e74705SXin Li   verifyFormat("void f() { int a; } // comment");
6760*67e74705SXin Li   verifyFormat("void f() {\n"
6761*67e74705SXin Li                "} // comment",
6762*67e74705SXin Li                DoNotMerge);
6763*67e74705SXin Li   verifyFormat("void f() {\n"
6764*67e74705SXin Li                "  int a;\n"
6765*67e74705SXin Li                "} // comment",
6766*67e74705SXin Li                DoNotMerge);
6767*67e74705SXin Li   verifyFormat("void f() {\n"
6768*67e74705SXin Li                "} // comment",
6769*67e74705SXin Li                getLLVMStyleWithColumns(15));
6770*67e74705SXin Li 
6771*67e74705SXin Li   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6772*67e74705SXin Li   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
6773*67e74705SXin Li 
6774*67e74705SXin Li   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6775*67e74705SXin Li   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
6776*67e74705SXin Li   verifyFormat("class C {\n"
6777*67e74705SXin Li                "  C()\n"
6778*67e74705SXin Li                "      : iiiiiiii(nullptr),\n"
6779*67e74705SXin Li                "        kkkkkkk(nullptr),\n"
6780*67e74705SXin Li                "        mmmmmmm(nullptr),\n"
6781*67e74705SXin Li                "        nnnnnnn(nullptr) {}\n"
6782*67e74705SXin Li                "};",
6783*67e74705SXin Li                getGoogleStyle());
6784*67e74705SXin Li 
6785*67e74705SXin Li   FormatStyle NoColumnLimit = getLLVMStyle();
6786*67e74705SXin Li   NoColumnLimit.ColumnLimit = 0;
6787*67e74705SXin Li   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6788*67e74705SXin Li   EXPECT_EQ("class C {\n"
6789*67e74705SXin Li             "  A() : b(0) {}\n"
6790*67e74705SXin Li             "};",
6791*67e74705SXin Li             format("class C{A():b(0){}};", NoColumnLimit));
6792*67e74705SXin Li   EXPECT_EQ("A()\n"
6793*67e74705SXin Li             "    : b(0) {\n"
6794*67e74705SXin Li             "}",
6795*67e74705SXin Li             format("A()\n:b(0)\n{\n}", NoColumnLimit));
6796*67e74705SXin Li 
6797*67e74705SXin Li   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
6798*67e74705SXin Li   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6799*67e74705SXin Li       FormatStyle::SFS_None;
6800*67e74705SXin Li   EXPECT_EQ("A()\n"
6801*67e74705SXin Li             "    : b(0) {\n"
6802*67e74705SXin Li             "}",
6803*67e74705SXin Li             format("A():b(0){}", DoNotMergeNoColumnLimit));
6804*67e74705SXin Li   EXPECT_EQ("A()\n"
6805*67e74705SXin Li             "    : b(0) {\n"
6806*67e74705SXin Li             "}",
6807*67e74705SXin Li             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
6808*67e74705SXin Li 
6809*67e74705SXin Li   verifyFormat("#define A          \\\n"
6810*67e74705SXin Li                "  void f() {       \\\n"
6811*67e74705SXin Li                "    int i;         \\\n"
6812*67e74705SXin Li                "  }",
6813*67e74705SXin Li                getLLVMStyleWithColumns(20));
6814*67e74705SXin Li   verifyFormat("#define A           \\\n"
6815*67e74705SXin Li                "  void f() { int i; }",
6816*67e74705SXin Li                getLLVMStyleWithColumns(21));
6817*67e74705SXin Li   verifyFormat("#define A            \\\n"
6818*67e74705SXin Li                "  void f() {         \\\n"
6819*67e74705SXin Li                "    int i;           \\\n"
6820*67e74705SXin Li                "  }                  \\\n"
6821*67e74705SXin Li                "  int j;",
6822*67e74705SXin Li                getLLVMStyleWithColumns(22));
6823*67e74705SXin Li   verifyFormat("#define A             \\\n"
6824*67e74705SXin Li                "  void f() { int i; } \\\n"
6825*67e74705SXin Li                "  int j;",
6826*67e74705SXin Li                getLLVMStyleWithColumns(23));
6827*67e74705SXin Li }
6828*67e74705SXin Li 
TEST_F(FormatTest,PullInlineFunctionDefinitionsIntoSingleLine)6829*67e74705SXin Li TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6830*67e74705SXin Li   FormatStyle MergeInlineOnly = getLLVMStyle();
6831*67e74705SXin Li   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6832*67e74705SXin Li   verifyFormat("class C {\n"
6833*67e74705SXin Li                "  int f() { return 42; }\n"
6834*67e74705SXin Li                "};",
6835*67e74705SXin Li                MergeInlineOnly);
6836*67e74705SXin Li   verifyFormat("int f() {\n"
6837*67e74705SXin Li                "  return 42;\n"
6838*67e74705SXin Li                "}",
6839*67e74705SXin Li                MergeInlineOnly);
6840*67e74705SXin Li }
6841*67e74705SXin Li 
TEST_F(FormatTest,UnderstandContextOfRecordTypeKeywords)6842*67e74705SXin Li TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6843*67e74705SXin Li   // Elaborate type variable declarations.
6844*67e74705SXin Li   verifyFormat("struct foo a = {bar};\nint n;");
6845*67e74705SXin Li   verifyFormat("class foo a = {bar};\nint n;");
6846*67e74705SXin Li   verifyFormat("union foo a = {bar};\nint n;");
6847*67e74705SXin Li 
6848*67e74705SXin Li   // Elaborate types inside function definitions.
6849*67e74705SXin Li   verifyFormat("struct foo f() {}\nint n;");
6850*67e74705SXin Li   verifyFormat("class foo f() {}\nint n;");
6851*67e74705SXin Li   verifyFormat("union foo f() {}\nint n;");
6852*67e74705SXin Li 
6853*67e74705SXin Li   // Templates.
6854*67e74705SXin Li   verifyFormat("template <class X> void f() {}\nint n;");
6855*67e74705SXin Li   verifyFormat("template <struct X> void f() {}\nint n;");
6856*67e74705SXin Li   verifyFormat("template <union X> void f() {}\nint n;");
6857*67e74705SXin Li 
6858*67e74705SXin Li   // Actual definitions...
6859*67e74705SXin Li   verifyFormat("struct {\n} n;");
6860*67e74705SXin Li   verifyFormat(
6861*67e74705SXin Li       "template <template <class T, class Y>, class Z> class X {\n} n;");
6862*67e74705SXin Li   verifyFormat("union Z {\n  int n;\n} x;");
6863*67e74705SXin Li   verifyFormat("class MACRO Z {\n} n;");
6864*67e74705SXin Li   verifyFormat("class MACRO(X) Z {\n} n;");
6865*67e74705SXin Li   verifyFormat("class __attribute__(X) Z {\n} n;");
6866*67e74705SXin Li   verifyFormat("class __declspec(X) Z {\n} n;");
6867*67e74705SXin Li   verifyFormat("class A##B##C {\n} n;");
6868*67e74705SXin Li   verifyFormat("class alignas(16) Z {\n} n;");
6869*67e74705SXin Li   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6870*67e74705SXin Li   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
6871*67e74705SXin Li 
6872*67e74705SXin Li   // Redefinition from nested context:
6873*67e74705SXin Li   verifyFormat("class A::B::C {\n} n;");
6874*67e74705SXin Li 
6875*67e74705SXin Li   // Template definitions.
6876*67e74705SXin Li   verifyFormat(
6877*67e74705SXin Li       "template <typename F>\n"
6878*67e74705SXin Li       "Matcher(const Matcher<F> &Other,\n"
6879*67e74705SXin Li       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
6880*67e74705SXin Li       "                             !is_same<F, T>::value>::type * = 0)\n"
6881*67e74705SXin Li       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6882*67e74705SXin Li 
6883*67e74705SXin Li   // FIXME: This is still incorrectly handled at the formatter side.
6884*67e74705SXin Li   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
6885*67e74705SXin Li   verifyFormat("int i = SomeFunction(a<b, a> b);");
6886*67e74705SXin Li 
6887*67e74705SXin Li   // FIXME:
6888*67e74705SXin Li   // This now gets parsed incorrectly as class definition.
6889*67e74705SXin Li   // verifyFormat("class A<int> f() {\n}\nint n;");
6890*67e74705SXin Li 
6891*67e74705SXin Li   // Elaborate types where incorrectly parsing the structural element would
6892*67e74705SXin Li   // break the indent.
6893*67e74705SXin Li   verifyFormat("if (true)\n"
6894*67e74705SXin Li                "  class X x;\n"
6895*67e74705SXin Li                "else\n"
6896*67e74705SXin Li                "  f();\n");
6897*67e74705SXin Li 
6898*67e74705SXin Li   // This is simply incomplete. Formatting is not important, but must not crash.
6899*67e74705SXin Li   verifyFormat("class A:");
6900*67e74705SXin Li }
6901*67e74705SXin Li 
TEST_F(FormatTest,DoNotInterfereWithErrorAndWarning)6902*67e74705SXin Li TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
6903*67e74705SXin Li   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
6904*67e74705SXin Li             format("#error Leave     all         white!!!!! space* alone!\n"));
6905*67e74705SXin Li   EXPECT_EQ(
6906*67e74705SXin Li       "#warning Leave     all         white!!!!! space* alone!\n",
6907*67e74705SXin Li       format("#warning Leave     all         white!!!!! space* alone!\n"));
6908*67e74705SXin Li   EXPECT_EQ("#error 1", format("  #  error   1"));
6909*67e74705SXin Li   EXPECT_EQ("#warning 1", format("  #  warning 1"));
6910*67e74705SXin Li }
6911*67e74705SXin Li 
TEST_F(FormatTest,FormatHashIfExpressions)6912*67e74705SXin Li TEST_F(FormatTest, FormatHashIfExpressions) {
6913*67e74705SXin Li   verifyFormat("#if AAAA && BBBB");
6914*67e74705SXin Li   verifyFormat("#if (AAAA && BBBB)");
6915*67e74705SXin Li   verifyFormat("#elif (AAAA && BBBB)");
6916*67e74705SXin Li   // FIXME: Come up with a better indentation for #elif.
6917*67e74705SXin Li   verifyFormat(
6918*67e74705SXin Li       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
6919*67e74705SXin Li       "    defined(BBBBBBBB)\n"
6920*67e74705SXin Li       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
6921*67e74705SXin Li       "    defined(BBBBBBBB)\n"
6922*67e74705SXin Li       "#endif",
6923*67e74705SXin Li       getLLVMStyleWithColumns(65));
6924*67e74705SXin Li }
6925*67e74705SXin Li 
TEST_F(FormatTest,MergeHandlingInTheFaceOfPreprocessorDirectives)6926*67e74705SXin Li TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6927*67e74705SXin Li   FormatStyle AllowsMergedIf = getGoogleStyle();
6928*67e74705SXin Li   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6929*67e74705SXin Li   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6930*67e74705SXin Li   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
6931*67e74705SXin Li   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
6932*67e74705SXin Li   EXPECT_EQ("if (true) return 42;",
6933*67e74705SXin Li             format("if (true)\nreturn 42;", AllowsMergedIf));
6934*67e74705SXin Li   FormatStyle ShortMergedIf = AllowsMergedIf;
6935*67e74705SXin Li   ShortMergedIf.ColumnLimit = 25;
6936*67e74705SXin Li   verifyFormat("#define A \\\n"
6937*67e74705SXin Li                "  if (true) return 42;",
6938*67e74705SXin Li                ShortMergedIf);
6939*67e74705SXin Li   verifyFormat("#define A \\\n"
6940*67e74705SXin Li                "  f();    \\\n"
6941*67e74705SXin Li                "  if (true)\n"
6942*67e74705SXin Li                "#define B",
6943*67e74705SXin Li                ShortMergedIf);
6944*67e74705SXin Li   verifyFormat("#define A \\\n"
6945*67e74705SXin Li                "  f();    \\\n"
6946*67e74705SXin Li                "  if (true)\n"
6947*67e74705SXin Li                "g();",
6948*67e74705SXin Li                ShortMergedIf);
6949*67e74705SXin Li   verifyFormat("{\n"
6950*67e74705SXin Li                "#ifdef A\n"
6951*67e74705SXin Li                "  // Comment\n"
6952*67e74705SXin Li                "  if (true) continue;\n"
6953*67e74705SXin Li                "#endif\n"
6954*67e74705SXin Li                "  // Comment\n"
6955*67e74705SXin Li                "  if (true) continue;\n"
6956*67e74705SXin Li                "}",
6957*67e74705SXin Li                ShortMergedIf);
6958*67e74705SXin Li   ShortMergedIf.ColumnLimit = 29;
6959*67e74705SXin Li   verifyFormat("#define A                   \\\n"
6960*67e74705SXin Li                "  if (aaaaaaaaaa) return 1; \\\n"
6961*67e74705SXin Li                "  return 2;",
6962*67e74705SXin Li                ShortMergedIf);
6963*67e74705SXin Li   ShortMergedIf.ColumnLimit = 28;
6964*67e74705SXin Li   verifyFormat("#define A         \\\n"
6965*67e74705SXin Li                "  if (aaaaaaaaaa) \\\n"
6966*67e74705SXin Li                "    return 1;     \\\n"
6967*67e74705SXin Li                "  return 2;",
6968*67e74705SXin Li                ShortMergedIf);
6969*67e74705SXin Li }
6970*67e74705SXin Li 
TEST_F(FormatTest,BlockCommentsInControlLoops)6971*67e74705SXin Li TEST_F(FormatTest, BlockCommentsInControlLoops) {
6972*67e74705SXin Li   verifyFormat("if (0) /* a comment in a strange place */ {\n"
6973*67e74705SXin Li                "  f();\n"
6974*67e74705SXin Li                "}");
6975*67e74705SXin Li   verifyFormat("if (0) /* a comment in a strange place */ {\n"
6976*67e74705SXin Li                "  f();\n"
6977*67e74705SXin Li                "} /* another comment */ else /* comment #3 */ {\n"
6978*67e74705SXin Li                "  g();\n"
6979*67e74705SXin Li                "}");
6980*67e74705SXin Li   verifyFormat("while (0) /* a comment in a strange place */ {\n"
6981*67e74705SXin Li                "  f();\n"
6982*67e74705SXin Li                "}");
6983*67e74705SXin Li   verifyFormat("for (;;) /* a comment in a strange place */ {\n"
6984*67e74705SXin Li                "  f();\n"
6985*67e74705SXin Li                "}");
6986*67e74705SXin Li   verifyFormat("do /* a comment in a strange place */ {\n"
6987*67e74705SXin Li                "  f();\n"
6988*67e74705SXin Li                "} /* another comment */ while (0);");
6989*67e74705SXin Li }
6990*67e74705SXin Li 
TEST_F(FormatTest,BlockComments)6991*67e74705SXin Li TEST_F(FormatTest, BlockComments) {
6992*67e74705SXin Li   EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
6993*67e74705SXin Li             format("/* *//* */  /* */\n/* *//* */  /* */"));
6994*67e74705SXin Li   EXPECT_EQ("/* */ a /* */ b;", format("  /* */  a/* */  b;"));
6995*67e74705SXin Li   EXPECT_EQ("#define A /*123*/ \\\n"
6996*67e74705SXin Li             "  b\n"
6997*67e74705SXin Li             "/* */\n"
6998*67e74705SXin Li             "someCall(\n"
6999*67e74705SXin Li             "    parameter);",
7000*67e74705SXin Li             format("#define A /*123*/ b\n"
7001*67e74705SXin Li                    "/* */\n"
7002*67e74705SXin Li                    "someCall(parameter);",
7003*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
7004*67e74705SXin Li 
7005*67e74705SXin Li   EXPECT_EQ("#define A\n"
7006*67e74705SXin Li             "/* */ someCall(\n"
7007*67e74705SXin Li             "    parameter);",
7008*67e74705SXin Li             format("#define A\n"
7009*67e74705SXin Li                    "/* */someCall(parameter);",
7010*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
7011*67e74705SXin Li   EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
7012*67e74705SXin Li   EXPECT_EQ("/*\n"
7013*67e74705SXin Li             "*\n"
7014*67e74705SXin Li             " * aaaaaa\n"
7015*67e74705SXin Li             " * aaaaaa\n"
7016*67e74705SXin Li             "*/",
7017*67e74705SXin Li             format("/*\n"
7018*67e74705SXin Li                    "*\n"
7019*67e74705SXin Li                    " * aaaaaa aaaaaa\n"
7020*67e74705SXin Li                    "*/",
7021*67e74705SXin Li                    getLLVMStyleWithColumns(10)));
7022*67e74705SXin Li   EXPECT_EQ("/*\n"
7023*67e74705SXin Li             "**\n"
7024*67e74705SXin Li             "* aaaaaa\n"
7025*67e74705SXin Li             "*aaaaaa\n"
7026*67e74705SXin Li             "*/",
7027*67e74705SXin Li             format("/*\n"
7028*67e74705SXin Li                    "**\n"
7029*67e74705SXin Li                    "* aaaaaa aaaaaa\n"
7030*67e74705SXin Li                    "*/",
7031*67e74705SXin Li                    getLLVMStyleWithColumns(10)));
7032*67e74705SXin Li   EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7033*67e74705SXin Li             "    /* line 1\n"
7034*67e74705SXin Li             "       bbbbbbbbbbbb */\n"
7035*67e74705SXin Li             "    bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7036*67e74705SXin Li             format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7037*67e74705SXin Li                    "    /* line 1\n"
7038*67e74705SXin Li                    "       bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7039*67e74705SXin Li             getLLVMStyleWithColumns(50)));
7040*67e74705SXin Li 
7041*67e74705SXin Li   FormatStyle NoBinPacking = getLLVMStyle();
7042*67e74705SXin Li   NoBinPacking.BinPackParameters = false;
7043*67e74705SXin Li   EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7044*67e74705SXin Li             "             2, /* comment 2 */\n"
7045*67e74705SXin Li             "             3, /* comment 3 */\n"
7046*67e74705SXin Li             "             aaaa,\n"
7047*67e74705SXin Li             "             bbbb);",
7048*67e74705SXin Li             format("someFunction (1,   /* comment 1 */\n"
7049*67e74705SXin Li                    "                2, /* comment 2 */  \n"
7050*67e74705SXin Li                    "               3,   /* comment 3 */\n"
7051*67e74705SXin Li                    "aaaa, bbbb );",
7052*67e74705SXin Li                    NoBinPacking));
7053*67e74705SXin Li   verifyFormat(
7054*67e74705SXin Li       "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7055*67e74705SXin Li       "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7056*67e74705SXin Li   EXPECT_EQ(
7057*67e74705SXin Li       "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7058*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7059*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7060*67e74705SXin Li       format(
7061*67e74705SXin Li           "bool       aaaaaaaaaaaaa =       /* trailing comment */\n"
7062*67e74705SXin Li           "    aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa    ||\n"
7063*67e74705SXin Li           "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa   || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
7064*67e74705SXin Li   EXPECT_EQ(
7065*67e74705SXin Li       "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7066*67e74705SXin Li       "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;   /* comment */\n"
7067*67e74705SXin Li       "int cccccccccccccccccccccccccccccc;       /* comment */\n",
7068*67e74705SXin Li       format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7069*67e74705SXin Li              "int      bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7070*67e74705SXin Li              "int    cccccccccccccccccccccccccccccc;  /* comment */\n"));
7071*67e74705SXin Li 
7072*67e74705SXin Li   verifyFormat("void f(int * /* unused */) {}");
7073*67e74705SXin Li 
7074*67e74705SXin Li   EXPECT_EQ("/*\n"
7075*67e74705SXin Li             " **\n"
7076*67e74705SXin Li             " */",
7077*67e74705SXin Li             format("/*\n"
7078*67e74705SXin Li                    " **\n"
7079*67e74705SXin Li                    " */"));
7080*67e74705SXin Li   EXPECT_EQ("/*\n"
7081*67e74705SXin Li             " *q\n"
7082*67e74705SXin Li             " */",
7083*67e74705SXin Li             format("/*\n"
7084*67e74705SXin Li                    " *q\n"
7085*67e74705SXin Li                    " */"));
7086*67e74705SXin Li   EXPECT_EQ("/*\n"
7087*67e74705SXin Li             " * q\n"
7088*67e74705SXin Li             " */",
7089*67e74705SXin Li             format("/*\n"
7090*67e74705SXin Li                    " * q\n"
7091*67e74705SXin Li                    " */"));
7092*67e74705SXin Li   EXPECT_EQ("/*\n"
7093*67e74705SXin Li             " **/",
7094*67e74705SXin Li             format("/*\n"
7095*67e74705SXin Li                    " **/"));
7096*67e74705SXin Li   EXPECT_EQ("/*\n"
7097*67e74705SXin Li             " ***/",
7098*67e74705SXin Li             format("/*\n"
7099*67e74705SXin Li                    " ***/"));
7100*67e74705SXin Li }
7101*67e74705SXin Li 
TEST_F(FormatTest,BlockCommentsInMacros)7102*67e74705SXin Li TEST_F(FormatTest, BlockCommentsInMacros) {
7103*67e74705SXin Li   EXPECT_EQ("#define A          \\\n"
7104*67e74705SXin Li             "  {                \\\n"
7105*67e74705SXin Li             "    /* one line */ \\\n"
7106*67e74705SXin Li             "    someCall();",
7107*67e74705SXin Li             format("#define A {        \\\n"
7108*67e74705SXin Li                    "  /* one line */   \\\n"
7109*67e74705SXin Li                    "  someCall();",
7110*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
7111*67e74705SXin Li   EXPECT_EQ("#define A          \\\n"
7112*67e74705SXin Li             "  {                \\\n"
7113*67e74705SXin Li             "    /* previous */ \\\n"
7114*67e74705SXin Li             "    /* one line */ \\\n"
7115*67e74705SXin Li             "    someCall();",
7116*67e74705SXin Li             format("#define A {        \\\n"
7117*67e74705SXin Li                    "  /* previous */   \\\n"
7118*67e74705SXin Li                    "  /* one line */   \\\n"
7119*67e74705SXin Li                    "  someCall();",
7120*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
7121*67e74705SXin Li }
7122*67e74705SXin Li 
TEST_F(FormatTest,BlockCommentsAtEndOfLine)7123*67e74705SXin Li TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7124*67e74705SXin Li   EXPECT_EQ("a = {\n"
7125*67e74705SXin Li             "    1111 /*    */\n"
7126*67e74705SXin Li             "};",
7127*67e74705SXin Li             format("a = {1111 /*    */\n"
7128*67e74705SXin Li                    "};",
7129*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
7130*67e74705SXin Li   EXPECT_EQ("a = {\n"
7131*67e74705SXin Li             "    1111 /*      */\n"
7132*67e74705SXin Li             "};",
7133*67e74705SXin Li             format("a = {1111 /*      */\n"
7134*67e74705SXin Li                    "};",
7135*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
7136*67e74705SXin Li 
7137*67e74705SXin Li   // FIXME: The formatting is still wrong here.
7138*67e74705SXin Li   EXPECT_EQ("a = {\n"
7139*67e74705SXin Li             "    1111 /*      a\n"
7140*67e74705SXin Li             "            */\n"
7141*67e74705SXin Li             "};",
7142*67e74705SXin Li             format("a = {1111 /*      a */\n"
7143*67e74705SXin Li                    "};",
7144*67e74705SXin Li                    getLLVMStyleWithColumns(15)));
7145*67e74705SXin Li }
7146*67e74705SXin Li 
TEST_F(FormatTest,IndentLineCommentsInStartOfBlockAtEndOfFile)7147*67e74705SXin Li TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
7148*67e74705SXin Li   verifyFormat("{\n"
7149*67e74705SXin Li                "  // a\n"
7150*67e74705SXin Li                "  // b");
7151*67e74705SXin Li }
7152*67e74705SXin Li 
TEST_F(FormatTest,FormatStarDependingOnContext)7153*67e74705SXin Li TEST_F(FormatTest, FormatStarDependingOnContext) {
7154*67e74705SXin Li   verifyFormat("void f(int *a);");
7155*67e74705SXin Li   verifyFormat("void f() { f(fint * b); }");
7156*67e74705SXin Li   verifyFormat("class A {\n  void f(int *a);\n};");
7157*67e74705SXin Li   verifyFormat("class A {\n  int *a;\n};");
7158*67e74705SXin Li   verifyFormat("namespace a {\n"
7159*67e74705SXin Li                "namespace b {\n"
7160*67e74705SXin Li                "class A {\n"
7161*67e74705SXin Li                "  void f() {}\n"
7162*67e74705SXin Li                "  int *a;\n"
7163*67e74705SXin Li                "};\n"
7164*67e74705SXin Li                "}\n"
7165*67e74705SXin Li                "}");
7166*67e74705SXin Li }
7167*67e74705SXin Li 
TEST_F(FormatTest,SpecialTokensAtEndOfLine)7168*67e74705SXin Li TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7169*67e74705SXin Li   verifyFormat("while");
7170*67e74705SXin Li   verifyFormat("operator");
7171*67e74705SXin Li }
7172*67e74705SXin Li 
7173*67e74705SXin Li //===----------------------------------------------------------------------===//
7174*67e74705SXin Li // Objective-C tests.
7175*67e74705SXin Li //===----------------------------------------------------------------------===//
7176*67e74705SXin Li 
TEST_F(FormatTest,FormatForObjectiveCMethodDecls)7177*67e74705SXin Li TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7178*67e74705SXin Li   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7179*67e74705SXin Li   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7180*67e74705SXin Li             format("-(NSUInteger)indexOfObject:(id)anObject;"));
7181*67e74705SXin Li   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
7182*67e74705SXin Li   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7183*67e74705SXin Li   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7184*67e74705SXin Li             format("-(NSInteger)Method3:(id)anObject;"));
7185*67e74705SXin Li   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7186*67e74705SXin Li             format("-(NSInteger)Method4:(id)anObject;"));
7187*67e74705SXin Li   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7188*67e74705SXin Li             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7189*67e74705SXin Li   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7190*67e74705SXin Li             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
7191*67e74705SXin Li   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7192*67e74705SXin Li             "forAllCells:(BOOL)flag;",
7193*67e74705SXin Li             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7194*67e74705SXin Li                    "forAllCells:(BOOL)flag;"));
7195*67e74705SXin Li 
7196*67e74705SXin Li   // Very long objectiveC method declaration.
7197*67e74705SXin Li   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7198*67e74705SXin Li                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
7199*67e74705SXin Li   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7200*67e74705SXin Li                "                    inRange:(NSRange)range\n"
7201*67e74705SXin Li                "                   outRange:(NSRange)out_range\n"
7202*67e74705SXin Li                "                  outRange1:(NSRange)out_range1\n"
7203*67e74705SXin Li                "                  outRange2:(NSRange)out_range2\n"
7204*67e74705SXin Li                "                  outRange3:(NSRange)out_range3\n"
7205*67e74705SXin Li                "                  outRange4:(NSRange)out_range4\n"
7206*67e74705SXin Li                "                  outRange5:(NSRange)out_range5\n"
7207*67e74705SXin Li                "                  outRange6:(NSRange)out_range6\n"
7208*67e74705SXin Li                "                  outRange7:(NSRange)out_range7\n"
7209*67e74705SXin Li                "                  outRange8:(NSRange)out_range8\n"
7210*67e74705SXin Li                "                  outRange9:(NSRange)out_range9;");
7211*67e74705SXin Li 
7212*67e74705SXin Li   // When the function name has to be wrapped.
7213*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
7214*67e74705SXin Li   Style.IndentWrappedFunctionNames = false;
7215*67e74705SXin Li   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7216*67e74705SXin Li                "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7217*67e74705SXin Li                "           anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7218*67e74705SXin Li                "}",
7219*67e74705SXin Li                Style);
7220*67e74705SXin Li   Style.IndentWrappedFunctionNames = true;
7221*67e74705SXin Li   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7222*67e74705SXin Li                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7223*67e74705SXin Li                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7224*67e74705SXin Li                "}",
7225*67e74705SXin Li                Style);
7226*67e74705SXin Li 
7227*67e74705SXin Li   verifyFormat("- (int)sum:(vector<int>)numbers;");
7228*67e74705SXin Li   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
7229*67e74705SXin Li   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7230*67e74705SXin Li   // protocol lists (but not for template classes):
7231*67e74705SXin Li   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
7232*67e74705SXin Li 
7233*67e74705SXin Li   verifyFormat("- (int (*)())foo:(int (*)())f;");
7234*67e74705SXin Li   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
7235*67e74705SXin Li 
7236*67e74705SXin Li   // If there's no return type (very rare in practice!), LLVM and Google style
7237*67e74705SXin Li   // agree.
7238*67e74705SXin Li   verifyFormat("- foo;");
7239*67e74705SXin Li   verifyFormat("- foo:(int)f;");
7240*67e74705SXin Li   verifyGoogleFormat("- foo:(int)foo;");
7241*67e74705SXin Li }
7242*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCInterface)7243*67e74705SXin Li TEST_F(FormatTest, FormatObjCInterface) {
7244*67e74705SXin Li   verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
7245*67e74705SXin Li                "@public\n"
7246*67e74705SXin Li                "  int field1;\n"
7247*67e74705SXin Li                "@protected\n"
7248*67e74705SXin Li                "  int field2;\n"
7249*67e74705SXin Li                "@private\n"
7250*67e74705SXin Li                "  int field3;\n"
7251*67e74705SXin Li                "@package\n"
7252*67e74705SXin Li                "  int field4;\n"
7253*67e74705SXin Li                "}\n"
7254*67e74705SXin Li                "+ (id)init;\n"
7255*67e74705SXin Li                "@end");
7256*67e74705SXin Li 
7257*67e74705SXin Li   verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7258*67e74705SXin Li                      " @public\n"
7259*67e74705SXin Li                      "  int field1;\n"
7260*67e74705SXin Li                      " @protected\n"
7261*67e74705SXin Li                      "  int field2;\n"
7262*67e74705SXin Li                      " @private\n"
7263*67e74705SXin Li                      "  int field3;\n"
7264*67e74705SXin Li                      " @package\n"
7265*67e74705SXin Li                      "  int field4;\n"
7266*67e74705SXin Li                      "}\n"
7267*67e74705SXin Li                      "+ (id)init;\n"
7268*67e74705SXin Li                      "@end");
7269*67e74705SXin Li 
7270*67e74705SXin Li   verifyFormat("@interface /* wait for it */ Foo\n"
7271*67e74705SXin Li                "+ (id)init;\n"
7272*67e74705SXin Li                "// Look, a comment!\n"
7273*67e74705SXin Li                "- (int)answerWith:(int)i;\n"
7274*67e74705SXin Li                "@end");
7275*67e74705SXin Li 
7276*67e74705SXin Li   verifyFormat("@interface Foo\n"
7277*67e74705SXin Li                "@end\n"
7278*67e74705SXin Li                "@interface Bar\n"
7279*67e74705SXin Li                "@end");
7280*67e74705SXin Li 
7281*67e74705SXin Li   verifyFormat("@interface Foo : Bar\n"
7282*67e74705SXin Li                "+ (id)init;\n"
7283*67e74705SXin Li                "@end");
7284*67e74705SXin Li 
7285*67e74705SXin Li   verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
7286*67e74705SXin Li                "+ (id)init;\n"
7287*67e74705SXin Li                "@end");
7288*67e74705SXin Li 
7289*67e74705SXin Li   verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
7290*67e74705SXin Li                      "+ (id)init;\n"
7291*67e74705SXin Li                      "@end");
7292*67e74705SXin Li 
7293*67e74705SXin Li   verifyFormat("@interface Foo (HackStuff)\n"
7294*67e74705SXin Li                "+ (id)init;\n"
7295*67e74705SXin Li                "@end");
7296*67e74705SXin Li 
7297*67e74705SXin Li   verifyFormat("@interface Foo ()\n"
7298*67e74705SXin Li                "+ (id)init;\n"
7299*67e74705SXin Li                "@end");
7300*67e74705SXin Li 
7301*67e74705SXin Li   verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
7302*67e74705SXin Li                "+ (id)init;\n"
7303*67e74705SXin Li                "@end");
7304*67e74705SXin Li 
7305*67e74705SXin Li   verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
7306*67e74705SXin Li                      "+ (id)init;\n"
7307*67e74705SXin Li                      "@end");
7308*67e74705SXin Li 
7309*67e74705SXin Li   verifyFormat("@interface Foo {\n"
7310*67e74705SXin Li                "  int _i;\n"
7311*67e74705SXin Li                "}\n"
7312*67e74705SXin Li                "+ (id)init;\n"
7313*67e74705SXin Li                "@end");
7314*67e74705SXin Li 
7315*67e74705SXin Li   verifyFormat("@interface Foo : Bar {\n"
7316*67e74705SXin Li                "  int _i;\n"
7317*67e74705SXin Li                "}\n"
7318*67e74705SXin Li                "+ (id)init;\n"
7319*67e74705SXin Li                "@end");
7320*67e74705SXin Li 
7321*67e74705SXin Li   verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7322*67e74705SXin Li                "  int _i;\n"
7323*67e74705SXin Li                "}\n"
7324*67e74705SXin Li                "+ (id)init;\n"
7325*67e74705SXin Li                "@end");
7326*67e74705SXin Li 
7327*67e74705SXin Li   verifyFormat("@interface Foo (HackStuff) {\n"
7328*67e74705SXin Li                "  int _i;\n"
7329*67e74705SXin Li                "}\n"
7330*67e74705SXin Li                "+ (id)init;\n"
7331*67e74705SXin Li                "@end");
7332*67e74705SXin Li 
7333*67e74705SXin Li   verifyFormat("@interface Foo () {\n"
7334*67e74705SXin Li                "  int _i;\n"
7335*67e74705SXin Li                "}\n"
7336*67e74705SXin Li                "+ (id)init;\n"
7337*67e74705SXin Li                "@end");
7338*67e74705SXin Li 
7339*67e74705SXin Li   verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7340*67e74705SXin Li                "  int _i;\n"
7341*67e74705SXin Li                "}\n"
7342*67e74705SXin Li                "+ (id)init;\n"
7343*67e74705SXin Li                "@end");
7344*67e74705SXin Li 
7345*67e74705SXin Li   FormatStyle OnePerLine = getGoogleStyle();
7346*67e74705SXin Li   OnePerLine.BinPackParameters = false;
7347*67e74705SXin Li   verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
7348*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7349*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7350*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7351*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7352*67e74705SXin Li                "}",
7353*67e74705SXin Li                OnePerLine);
7354*67e74705SXin Li }
7355*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCImplementation)7356*67e74705SXin Li TEST_F(FormatTest, FormatObjCImplementation) {
7357*67e74705SXin Li   verifyFormat("@implementation Foo : NSObject {\n"
7358*67e74705SXin Li                "@public\n"
7359*67e74705SXin Li                "  int field1;\n"
7360*67e74705SXin Li                "@protected\n"
7361*67e74705SXin Li                "  int field2;\n"
7362*67e74705SXin Li                "@private\n"
7363*67e74705SXin Li                "  int field3;\n"
7364*67e74705SXin Li                "@package\n"
7365*67e74705SXin Li                "  int field4;\n"
7366*67e74705SXin Li                "}\n"
7367*67e74705SXin Li                "+ (id)init {\n}\n"
7368*67e74705SXin Li                "@end");
7369*67e74705SXin Li 
7370*67e74705SXin Li   verifyGoogleFormat("@implementation Foo : NSObject {\n"
7371*67e74705SXin Li                      " @public\n"
7372*67e74705SXin Li                      "  int field1;\n"
7373*67e74705SXin Li                      " @protected\n"
7374*67e74705SXin Li                      "  int field2;\n"
7375*67e74705SXin Li                      " @private\n"
7376*67e74705SXin Li                      "  int field3;\n"
7377*67e74705SXin Li                      " @package\n"
7378*67e74705SXin Li                      "  int field4;\n"
7379*67e74705SXin Li                      "}\n"
7380*67e74705SXin Li                      "+ (id)init {\n}\n"
7381*67e74705SXin Li                      "@end");
7382*67e74705SXin Li 
7383*67e74705SXin Li   verifyFormat("@implementation Foo\n"
7384*67e74705SXin Li                "+ (id)init {\n"
7385*67e74705SXin Li                "  if (true)\n"
7386*67e74705SXin Li                "    return nil;\n"
7387*67e74705SXin Li                "}\n"
7388*67e74705SXin Li                "// Look, a comment!\n"
7389*67e74705SXin Li                "- (int)answerWith:(int)i {\n"
7390*67e74705SXin Li                "  return i;\n"
7391*67e74705SXin Li                "}\n"
7392*67e74705SXin Li                "+ (int)answerWith:(int)i {\n"
7393*67e74705SXin Li                "  return i;\n"
7394*67e74705SXin Li                "}\n"
7395*67e74705SXin Li                "@end");
7396*67e74705SXin Li 
7397*67e74705SXin Li   verifyFormat("@implementation Foo\n"
7398*67e74705SXin Li                "@end\n"
7399*67e74705SXin Li                "@implementation Bar\n"
7400*67e74705SXin Li                "@end");
7401*67e74705SXin Li 
7402*67e74705SXin Li   EXPECT_EQ("@implementation Foo : Bar\n"
7403*67e74705SXin Li             "+ (id)init {\n}\n"
7404*67e74705SXin Li             "- (void)foo {\n}\n"
7405*67e74705SXin Li             "@end",
7406*67e74705SXin Li             format("@implementation Foo : Bar\n"
7407*67e74705SXin Li                    "+(id)init{}\n"
7408*67e74705SXin Li                    "-(void)foo{}\n"
7409*67e74705SXin Li                    "@end"));
7410*67e74705SXin Li 
7411*67e74705SXin Li   verifyFormat("@implementation Foo {\n"
7412*67e74705SXin Li                "  int _i;\n"
7413*67e74705SXin Li                "}\n"
7414*67e74705SXin Li                "+ (id)init {\n}\n"
7415*67e74705SXin Li                "@end");
7416*67e74705SXin Li 
7417*67e74705SXin Li   verifyFormat("@implementation Foo : Bar {\n"
7418*67e74705SXin Li                "  int _i;\n"
7419*67e74705SXin Li                "}\n"
7420*67e74705SXin Li                "+ (id)init {\n}\n"
7421*67e74705SXin Li                "@end");
7422*67e74705SXin Li 
7423*67e74705SXin Li   verifyFormat("@implementation Foo (HackStuff)\n"
7424*67e74705SXin Li                "+ (id)init {\n}\n"
7425*67e74705SXin Li                "@end");
7426*67e74705SXin Li   verifyFormat("@implementation ObjcClass\n"
7427*67e74705SXin Li                "- (void)method;\n"
7428*67e74705SXin Li                "{}\n"
7429*67e74705SXin Li                "@end");
7430*67e74705SXin Li }
7431*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCProtocol)7432*67e74705SXin Li TEST_F(FormatTest, FormatObjCProtocol) {
7433*67e74705SXin Li   verifyFormat("@protocol Foo\n"
7434*67e74705SXin Li                "@property(weak) id delegate;\n"
7435*67e74705SXin Li                "- (NSUInteger)numberOfThings;\n"
7436*67e74705SXin Li                "@end");
7437*67e74705SXin Li 
7438*67e74705SXin Li   verifyFormat("@protocol MyProtocol <NSObject>\n"
7439*67e74705SXin Li                "- (NSUInteger)numberOfThings;\n"
7440*67e74705SXin Li                "@end");
7441*67e74705SXin Li 
7442*67e74705SXin Li   verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
7443*67e74705SXin Li                      "- (NSUInteger)numberOfThings;\n"
7444*67e74705SXin Li                      "@end");
7445*67e74705SXin Li 
7446*67e74705SXin Li   verifyFormat("@protocol Foo;\n"
7447*67e74705SXin Li                "@protocol Bar;\n");
7448*67e74705SXin Li 
7449*67e74705SXin Li   verifyFormat("@protocol Foo\n"
7450*67e74705SXin Li                "@end\n"
7451*67e74705SXin Li                "@protocol Bar\n"
7452*67e74705SXin Li                "@end");
7453*67e74705SXin Li 
7454*67e74705SXin Li   verifyFormat("@protocol myProtocol\n"
7455*67e74705SXin Li                "- (void)mandatoryWithInt:(int)i;\n"
7456*67e74705SXin Li                "@optional\n"
7457*67e74705SXin Li                "- (void)optional;\n"
7458*67e74705SXin Li                "@required\n"
7459*67e74705SXin Li                "- (void)required;\n"
7460*67e74705SXin Li                "@optional\n"
7461*67e74705SXin Li                "@property(assign) int madProp;\n"
7462*67e74705SXin Li                "@end\n");
7463*67e74705SXin Li 
7464*67e74705SXin Li   verifyFormat("@property(nonatomic, assign, readonly)\n"
7465*67e74705SXin Li                "    int *looooooooooooooooooooooooooooongNumber;\n"
7466*67e74705SXin Li                "@property(nonatomic, assign, readonly)\n"
7467*67e74705SXin Li                "    NSString *looooooooooooooooooooooooooooongName;");
7468*67e74705SXin Li 
7469*67e74705SXin Li   verifyFormat("@implementation PR18406\n"
7470*67e74705SXin Li                "}\n"
7471*67e74705SXin Li                "@end");
7472*67e74705SXin Li }
7473*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCMethodDeclarations)7474*67e74705SXin Li TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7475*67e74705SXin Li   verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7476*67e74705SXin Li                "                   rect:(NSRect)theRect\n"
7477*67e74705SXin Li                "               interval:(float)theInterval {\n"
7478*67e74705SXin Li                "}");
7479*67e74705SXin Li   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7480*67e74705SXin Li                "      longKeyword:(NSRect)theRect\n"
7481*67e74705SXin Li                "    longerKeyword:(float)theInterval\n"
7482*67e74705SXin Li                "            error:(NSError **)theError {\n"
7483*67e74705SXin Li                "}");
7484*67e74705SXin Li   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7485*67e74705SXin Li                "          longKeyword:(NSRect)theRect\n"
7486*67e74705SXin Li                "    evenLongerKeyword:(float)theInterval\n"
7487*67e74705SXin Li                "                error:(NSError **)theError {\n"
7488*67e74705SXin Li                "}");
7489*67e74705SXin Li   verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7490*67e74705SXin Li                "                         y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7491*67e74705SXin Li                "    NS_DESIGNATED_INITIALIZER;",
7492*67e74705SXin Li                getLLVMStyleWithColumns(60));
7493*67e74705SXin Li 
7494*67e74705SXin Li   // Continuation indent width should win over aligning colons if the function
7495*67e74705SXin Li   // name is long.
7496*67e74705SXin Li   FormatStyle continuationStyle = getGoogleStyle();
7497*67e74705SXin Li   continuationStyle.ColumnLimit = 40;
7498*67e74705SXin Li   continuationStyle.IndentWrappedFunctionNames = true;
7499*67e74705SXin Li   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7500*67e74705SXin Li                "    dontAlignNamef:(NSRect)theRect {\n"
7501*67e74705SXin Li                "}",
7502*67e74705SXin Li                continuationStyle);
7503*67e74705SXin Li 
7504*67e74705SXin Li   // Make sure we don't break aligning for short parameter names.
7505*67e74705SXin Li   verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7506*67e74705SXin Li                "       aShortf:(NSRect)theRect {\n"
7507*67e74705SXin Li                "}",
7508*67e74705SXin Li                continuationStyle);
7509*67e74705SXin Li }
7510*67e74705SXin Li 
TEST_F(FormatTest,FormatObjCMethodExpr)7511*67e74705SXin Li TEST_F(FormatTest, FormatObjCMethodExpr) {
7512*67e74705SXin Li   verifyFormat("[foo bar:baz];");
7513*67e74705SXin Li   verifyFormat("return [foo bar:baz];");
7514*67e74705SXin Li   verifyFormat("return (a)[foo bar:baz];");
7515*67e74705SXin Li   verifyFormat("f([foo bar:baz]);");
7516*67e74705SXin Li   verifyFormat("f(2, [foo bar:baz]);");
7517*67e74705SXin Li   verifyFormat("f(2, a ? b : c);");
7518*67e74705SXin Li   verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7519*67e74705SXin Li 
7520*67e74705SXin Li   // Unary operators.
7521*67e74705SXin Li   verifyFormat("int a = +[foo bar:baz];");
7522*67e74705SXin Li   verifyFormat("int a = -[foo bar:baz];");
7523*67e74705SXin Li   verifyFormat("int a = ![foo bar:baz];");
7524*67e74705SXin Li   verifyFormat("int a = ~[foo bar:baz];");
7525*67e74705SXin Li   verifyFormat("int a = ++[foo bar:baz];");
7526*67e74705SXin Li   verifyFormat("int a = --[foo bar:baz];");
7527*67e74705SXin Li   verifyFormat("int a = sizeof [foo bar:baz];");
7528*67e74705SXin Li   verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
7529*67e74705SXin Li   verifyFormat("int a = &[foo bar:baz];");
7530*67e74705SXin Li   verifyFormat("int a = *[foo bar:baz];");
7531*67e74705SXin Li   // FIXME: Make casts work, without breaking f()[4].
7532*67e74705SXin Li   // verifyFormat("int a = (int)[foo bar:baz];");
7533*67e74705SXin Li   // verifyFormat("return (int)[foo bar:baz];");
7534*67e74705SXin Li   // verifyFormat("(void)[foo bar:baz];");
7535*67e74705SXin Li   verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
7536*67e74705SXin Li 
7537*67e74705SXin Li   // Binary operators.
7538*67e74705SXin Li   verifyFormat("[foo bar:baz], [foo bar:baz];");
7539*67e74705SXin Li   verifyFormat("[foo bar:baz] = [foo bar:baz];");
7540*67e74705SXin Li   verifyFormat("[foo bar:baz] *= [foo bar:baz];");
7541*67e74705SXin Li   verifyFormat("[foo bar:baz] /= [foo bar:baz];");
7542*67e74705SXin Li   verifyFormat("[foo bar:baz] %= [foo bar:baz];");
7543*67e74705SXin Li   verifyFormat("[foo bar:baz] += [foo bar:baz];");
7544*67e74705SXin Li   verifyFormat("[foo bar:baz] -= [foo bar:baz];");
7545*67e74705SXin Li   verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
7546*67e74705SXin Li   verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
7547*67e74705SXin Li   verifyFormat("[foo bar:baz] &= [foo bar:baz];");
7548*67e74705SXin Li   verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
7549*67e74705SXin Li   verifyFormat("[foo bar:baz] |= [foo bar:baz];");
7550*67e74705SXin Li   verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
7551*67e74705SXin Li   verifyFormat("[foo bar:baz] || [foo bar:baz];");
7552*67e74705SXin Li   verifyFormat("[foo bar:baz] && [foo bar:baz];");
7553*67e74705SXin Li   verifyFormat("[foo bar:baz] | [foo bar:baz];");
7554*67e74705SXin Li   verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
7555*67e74705SXin Li   verifyFormat("[foo bar:baz] & [foo bar:baz];");
7556*67e74705SXin Li   verifyFormat("[foo bar:baz] == [foo bar:baz];");
7557*67e74705SXin Li   verifyFormat("[foo bar:baz] != [foo bar:baz];");
7558*67e74705SXin Li   verifyFormat("[foo bar:baz] >= [foo bar:baz];");
7559*67e74705SXin Li   verifyFormat("[foo bar:baz] <= [foo bar:baz];");
7560*67e74705SXin Li   verifyFormat("[foo bar:baz] > [foo bar:baz];");
7561*67e74705SXin Li   verifyFormat("[foo bar:baz] < [foo bar:baz];");
7562*67e74705SXin Li   verifyFormat("[foo bar:baz] >> [foo bar:baz];");
7563*67e74705SXin Li   verifyFormat("[foo bar:baz] << [foo bar:baz];");
7564*67e74705SXin Li   verifyFormat("[foo bar:baz] - [foo bar:baz];");
7565*67e74705SXin Li   verifyFormat("[foo bar:baz] + [foo bar:baz];");
7566*67e74705SXin Li   verifyFormat("[foo bar:baz] * [foo bar:baz];");
7567*67e74705SXin Li   verifyFormat("[foo bar:baz] / [foo bar:baz];");
7568*67e74705SXin Li   verifyFormat("[foo bar:baz] % [foo bar:baz];");
7569*67e74705SXin Li   // Whew!
7570*67e74705SXin Li 
7571*67e74705SXin Li   verifyFormat("return in[42];");
7572*67e74705SXin Li   verifyFormat("for (auto v : in[1]) {\n}");
7573*67e74705SXin Li   verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7574*67e74705SXin Li   verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7575*67e74705SXin Li   verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7576*67e74705SXin Li   verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7577*67e74705SXin Li   verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
7578*67e74705SXin Li   verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7579*67e74705SXin Li                "}");
7580*67e74705SXin Li   verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
7581*67e74705SXin Li   verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7582*67e74705SXin Li   verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
7583*67e74705SXin Li 
7584*67e74705SXin Li   verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7585*67e74705SXin Li   verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7586*67e74705SXin Li   verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7587*67e74705SXin Li   verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7588*67e74705SXin Li   verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
7589*67e74705SXin Li   verifyFormat("[button setAction:@selector(zoomOut:)];");
7590*67e74705SXin Li   verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
7591*67e74705SXin Li 
7592*67e74705SXin Li   verifyFormat("arr[[self indexForFoo:a]];");
7593*67e74705SXin Li   verifyFormat("throw [self errorFor:a];");
7594*67e74705SXin Li   verifyFormat("@throw [self errorFor:a];");
7595*67e74705SXin Li 
7596*67e74705SXin Li   verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7597*67e74705SXin Li   verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7598*67e74705SXin Li   verifyFormat("4 > 4 ? (id)a : (id)baz;");
7599*67e74705SXin Li 
7600*67e74705SXin Li   // This tests that the formatter doesn't break after "backing" but before ":",
7601*67e74705SXin Li   // which would be at 80 columns.
7602*67e74705SXin Li   verifyFormat(
7603*67e74705SXin Li       "void f() {\n"
7604*67e74705SXin Li       "  if ((self = [super initWithContentRect:contentRect\n"
7605*67e74705SXin Li       "                               styleMask:styleMask ?: otherMask\n"
7606*67e74705SXin Li       "                                 backing:NSBackingStoreBuffered\n"
7607*67e74705SXin Li       "                                   defer:YES]))");
7608*67e74705SXin Li 
7609*67e74705SXin Li   verifyFormat(
7610*67e74705SXin Li       "[foo checkThatBreakingAfterColonWorksOk:\n"
7611*67e74705SXin Li       "         [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
7612*67e74705SXin Li 
7613*67e74705SXin Li   verifyFormat("[myObj short:arg1 // Force line break\n"
7614*67e74705SXin Li                "          longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7615*67e74705SXin Li                "    evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
7616*67e74705SXin Li                "                error:arg4];");
7617*67e74705SXin Li   verifyFormat(
7618*67e74705SXin Li       "void f() {\n"
7619*67e74705SXin Li       "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7620*67e74705SXin Li       "      initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7621*67e74705SXin Li       "                                     pos.width(), pos.height())\n"
7622*67e74705SXin Li       "                styleMask:NSBorderlessWindowMask\n"
7623*67e74705SXin Li       "                  backing:NSBackingStoreBuffered\n"
7624*67e74705SXin Li       "                    defer:NO]);\n"
7625*67e74705SXin Li       "}");
7626*67e74705SXin Li   verifyFormat(
7627*67e74705SXin Li       "void f() {\n"
7628*67e74705SXin Li       "  popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7629*67e74705SXin Li       "      iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7630*67e74705SXin Li       "                                 pos.width(), pos.height())\n"
7631*67e74705SXin Li       "                syeMask:NSBorderlessWindowMask\n"
7632*67e74705SXin Li       "                  bking:NSBackingStoreBuffered\n"
7633*67e74705SXin Li       "                    der:NO]);\n"
7634*67e74705SXin Li       "}",
7635*67e74705SXin Li       getLLVMStyleWithColumns(70));
7636*67e74705SXin Li   verifyFormat(
7637*67e74705SXin Li       "void f() {\n"
7638*67e74705SXin Li       "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7639*67e74705SXin Li       "      initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7640*67e74705SXin Li       "                                     pos.width(), pos.height())\n"
7641*67e74705SXin Li       "                styleMask:NSBorderlessWindowMask\n"
7642*67e74705SXin Li       "                  backing:NSBackingStoreBuffered\n"
7643*67e74705SXin Li       "                    defer:NO]);\n"
7644*67e74705SXin Li       "}",
7645*67e74705SXin Li       getChromiumStyle(FormatStyle::LK_Cpp));
7646*67e74705SXin Li   verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7647*67e74705SXin Li                "                             with:contentsNativeView];");
7648*67e74705SXin Li 
7649*67e74705SXin Li   verifyFormat(
7650*67e74705SXin Li       "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7651*67e74705SXin Li       "           owner:nillllll];");
7652*67e74705SXin Li 
7653*67e74705SXin Li   verifyFormat(
7654*67e74705SXin Li       "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
7655*67e74705SXin Li       "        forType:kBookmarkButtonDragType];");
7656*67e74705SXin Li 
7657*67e74705SXin Li   verifyFormat("[defaultCenter addObserver:self\n"
7658*67e74705SXin Li                "                  selector:@selector(willEnterFullscreen)\n"
7659*67e74705SXin Li                "                      name:kWillEnterFullscreenNotification\n"
7660*67e74705SXin Li                "                    object:nil];");
7661*67e74705SXin Li   verifyFormat("[image_rep drawInRect:drawRect\n"
7662*67e74705SXin Li                "             fromRect:NSZeroRect\n"
7663*67e74705SXin Li                "            operation:NSCompositeCopy\n"
7664*67e74705SXin Li                "             fraction:1.0\n"
7665*67e74705SXin Li                "       respectFlipped:NO\n"
7666*67e74705SXin Li                "                hints:nil];");
7667*67e74705SXin Li   verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7668*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7669*67e74705SXin Li   verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7670*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7671*67e74705SXin Li   verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7672*67e74705SXin Li                "    aaaaaaaaaaaaaaaaaaaaaa];");
7673*67e74705SXin Li   verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7674*67e74705SXin Li                "        .aaaaaaaa];", // FIXME: Indentation seems off.
7675*67e74705SXin Li                getLLVMStyleWithColumns(60));
7676*67e74705SXin Li 
7677*67e74705SXin Li   verifyFormat(
7678*67e74705SXin Li       "scoped_nsobject<NSTextField> message(\n"
7679*67e74705SXin Li       "    // The frame will be fixed up when |-setMessageText:| is called.\n"
7680*67e74705SXin Li       "    [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
7681*67e74705SXin Li   verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7682*67e74705SXin Li                "    aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7683*67e74705SXin Li                "         aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7684*67e74705SXin Li                "          aaaa:bbb];");
7685*67e74705SXin Li   verifyFormat("[self param:function( //\n"
7686*67e74705SXin Li                "                parameter)]");
7687*67e74705SXin Li   verifyFormat(
7688*67e74705SXin Li       "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7689*67e74705SXin Li       "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7690*67e74705SXin Li       "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
7691*67e74705SXin Li 
7692*67e74705SXin Li   // FIXME: This violates the column limit.
7693*67e74705SXin Li   verifyFormat(
7694*67e74705SXin Li       "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7695*67e74705SXin Li       "    aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7696*67e74705SXin Li       "                  aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7697*67e74705SXin Li       getLLVMStyleWithColumns(60));
7698*67e74705SXin Li 
7699*67e74705SXin Li   // Variadic parameters.
7700*67e74705SXin Li   verifyFormat(
7701*67e74705SXin Li       "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
7702*67e74705SXin Li   verifyFormat(
7703*67e74705SXin Li       "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7704*67e74705SXin Li       "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7705*67e74705SXin Li       "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
7706*67e74705SXin Li   verifyFormat("[self // break\n"
7707*67e74705SXin Li                "      a:a\n"
7708*67e74705SXin Li                "    aaa:aaa];");
7709*67e74705SXin Li   verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7710*67e74705SXin Li                "          [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
7711*67e74705SXin Li }
7712*67e74705SXin Li 
TEST_F(FormatTest,ObjCAt)7713*67e74705SXin Li TEST_F(FormatTest, ObjCAt) {
7714*67e74705SXin Li   verifyFormat("@autoreleasepool");
7715*67e74705SXin Li   verifyFormat("@catch");
7716*67e74705SXin Li   verifyFormat("@class");
7717*67e74705SXin Li   verifyFormat("@compatibility_alias");
7718*67e74705SXin Li   verifyFormat("@defs");
7719*67e74705SXin Li   verifyFormat("@dynamic");
7720*67e74705SXin Li   verifyFormat("@encode");
7721*67e74705SXin Li   verifyFormat("@end");
7722*67e74705SXin Li   verifyFormat("@finally");
7723*67e74705SXin Li   verifyFormat("@implementation");
7724*67e74705SXin Li   verifyFormat("@import");
7725*67e74705SXin Li   verifyFormat("@interface");
7726*67e74705SXin Li   verifyFormat("@optional");
7727*67e74705SXin Li   verifyFormat("@package");
7728*67e74705SXin Li   verifyFormat("@private");
7729*67e74705SXin Li   verifyFormat("@property");
7730*67e74705SXin Li   verifyFormat("@protected");
7731*67e74705SXin Li   verifyFormat("@protocol");
7732*67e74705SXin Li   verifyFormat("@public");
7733*67e74705SXin Li   verifyFormat("@required");
7734*67e74705SXin Li   verifyFormat("@selector");
7735*67e74705SXin Li   verifyFormat("@synchronized");
7736*67e74705SXin Li   verifyFormat("@synthesize");
7737*67e74705SXin Li   verifyFormat("@throw");
7738*67e74705SXin Li   verifyFormat("@try");
7739*67e74705SXin Li 
7740*67e74705SXin Li   EXPECT_EQ("@interface", format("@ interface"));
7741*67e74705SXin Li 
7742*67e74705SXin Li   // The precise formatting of this doesn't matter, nobody writes code like
7743*67e74705SXin Li   // this.
7744*67e74705SXin Li   verifyFormat("@ /*foo*/ interface");
7745*67e74705SXin Li }
7746*67e74705SXin Li 
TEST_F(FormatTest,ObjCSnippets)7747*67e74705SXin Li TEST_F(FormatTest, ObjCSnippets) {
7748*67e74705SXin Li   verifyFormat("@autoreleasepool {\n"
7749*67e74705SXin Li                "  foo();\n"
7750*67e74705SXin Li                "}");
7751*67e74705SXin Li   verifyFormat("@class Foo, Bar;");
7752*67e74705SXin Li   verifyFormat("@compatibility_alias AliasName ExistingClass;");
7753*67e74705SXin Li   verifyFormat("@dynamic textColor;");
7754*67e74705SXin Li   verifyFormat("char *buf1 = @encode(int *);");
7755*67e74705SXin Li   verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
7756*67e74705SXin Li   verifyFormat("char *buf1 = @encode(int **);");
7757*67e74705SXin Li   verifyFormat("Protocol *proto = @protocol(p1);");
7758*67e74705SXin Li   verifyFormat("SEL s = @selector(foo:);");
7759*67e74705SXin Li   verifyFormat("@synchronized(self) {\n"
7760*67e74705SXin Li                "  f();\n"
7761*67e74705SXin Li                "}");
7762*67e74705SXin Li 
7763*67e74705SXin Li   verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7764*67e74705SXin Li   verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7765*67e74705SXin Li 
7766*67e74705SXin Li   verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
7767*67e74705SXin Li   verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7768*67e74705SXin Li   verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
7769*67e74705SXin Li   verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7770*67e74705SXin Li                getMozillaStyle());
7771*67e74705SXin Li   verifyFormat("@property BOOL editable;", getMozillaStyle());
7772*67e74705SXin Li   verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7773*67e74705SXin Li                getWebKitStyle());
7774*67e74705SXin Li   verifyFormat("@property BOOL editable;", getWebKitStyle());
7775*67e74705SXin Li 
7776*67e74705SXin Li   verifyFormat("@import foo.bar;\n"
7777*67e74705SXin Li                "@import baz;");
7778*67e74705SXin Li }
7779*67e74705SXin Li 
TEST_F(FormatTest,ObjCForIn)7780*67e74705SXin Li TEST_F(FormatTest, ObjCForIn) {
7781*67e74705SXin Li   verifyFormat("- (void)test {\n"
7782*67e74705SXin Li                "  for (NSString *n in arrayOfStrings) {\n"
7783*67e74705SXin Li                "    foo(n);\n"
7784*67e74705SXin Li                "  }\n"
7785*67e74705SXin Li                "}");
7786*67e74705SXin Li   verifyFormat("- (void)test {\n"
7787*67e74705SXin Li                "  for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7788*67e74705SXin Li                "    foo(n);\n"
7789*67e74705SXin Li                "  }\n"
7790*67e74705SXin Li                "}");
7791*67e74705SXin Li }
7792*67e74705SXin Li 
TEST_F(FormatTest,ObjCLiterals)7793*67e74705SXin Li TEST_F(FormatTest, ObjCLiterals) {
7794*67e74705SXin Li   verifyFormat("@\"String\"");
7795*67e74705SXin Li   verifyFormat("@1");
7796*67e74705SXin Li   verifyFormat("@+4.8");
7797*67e74705SXin Li   verifyFormat("@-4");
7798*67e74705SXin Li   verifyFormat("@1LL");
7799*67e74705SXin Li   verifyFormat("@.5");
7800*67e74705SXin Li   verifyFormat("@'c'");
7801*67e74705SXin Li   verifyFormat("@true");
7802*67e74705SXin Li 
7803*67e74705SXin Li   verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7804*67e74705SXin Li   verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7805*67e74705SXin Li   verifyFormat("NSNumber *favoriteColor = @(Green);");
7806*67e74705SXin Li   verifyFormat("NSString *path = @(getenv(\"PATH\"));");
7807*67e74705SXin Li 
7808*67e74705SXin Li   verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
7809*67e74705SXin Li }
7810*67e74705SXin Li 
TEST_F(FormatTest,ObjCDictLiterals)7811*67e74705SXin Li TEST_F(FormatTest, ObjCDictLiterals) {
7812*67e74705SXin Li   verifyFormat("@{");
7813*67e74705SXin Li   verifyFormat("@{}");
7814*67e74705SXin Li   verifyFormat("@{@\"one\" : @1}");
7815*67e74705SXin Li   verifyFormat("return @{@\"one\" : @1;");
7816*67e74705SXin Li   verifyFormat("@{@\"one\" : @1}");
7817*67e74705SXin Li 
7818*67e74705SXin Li   verifyFormat("@{@\"one\" : @{@2 : @1}}");
7819*67e74705SXin Li   verifyFormat("@{\n"
7820*67e74705SXin Li                "  @\"one\" : @{@2 : @1},\n"
7821*67e74705SXin Li                "}");
7822*67e74705SXin Li 
7823*67e74705SXin Li   verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
7824*67e74705SXin Li   verifyIncompleteFormat("[self setDict:@{}");
7825*67e74705SXin Li   verifyIncompleteFormat("[self setDict:@{@1 : @2}");
7826*67e74705SXin Li   verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
7827*67e74705SXin Li   verifyFormat(
7828*67e74705SXin Li       "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
7829*67e74705SXin Li   verifyFormat(
7830*67e74705SXin Li       "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
7831*67e74705SXin Li 
7832*67e74705SXin Li   verifyFormat("NSDictionary *d = @{\n"
7833*67e74705SXin Li                "  @\"nam\" : NSUserNam(),\n"
7834*67e74705SXin Li                "  @\"dte\" : [NSDate date],\n"
7835*67e74705SXin Li                "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
7836*67e74705SXin Li                "};");
7837*67e74705SXin Li   verifyFormat(
7838*67e74705SXin Li       "@{\n"
7839*67e74705SXin Li       "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7840*67e74705SXin Li       "regularFont,\n"
7841*67e74705SXin Li       "};");
7842*67e74705SXin Li   verifyGoogleFormat(
7843*67e74705SXin Li       "@{\n"
7844*67e74705SXin Li       "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7845*67e74705SXin Li       "regularFont,\n"
7846*67e74705SXin Li       "};");
7847*67e74705SXin Li   verifyFormat(
7848*67e74705SXin Li       "@{\n"
7849*67e74705SXin Li       "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7850*67e74705SXin Li       "      reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7851*67e74705SXin Li       "};");
7852*67e74705SXin Li 
7853*67e74705SXin Li   // We should try to be robust in case someone forgets the "@".
7854*67e74705SXin Li   verifyFormat("NSDictionary *d = {\n"
7855*67e74705SXin Li                "  @\"nam\" : NSUserNam(),\n"
7856*67e74705SXin Li                "  @\"dte\" : [NSDate date],\n"
7857*67e74705SXin Li                "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
7858*67e74705SXin Li                "};");
7859*67e74705SXin Li   verifyFormat("NSMutableDictionary *dictionary =\n"
7860*67e74705SXin Li                "    [NSMutableDictionary dictionaryWithDictionary:@{\n"
7861*67e74705SXin Li                "      aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7862*67e74705SXin Li                "      bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7863*67e74705SXin Li                "      cccccccccccccccc : ccccccccccccccc\n"
7864*67e74705SXin Li                "    }];");
7865*67e74705SXin Li 
7866*67e74705SXin Li   // Ensure that casts before the key are kept on the same line as the key.
7867*67e74705SXin Li   verifyFormat(
7868*67e74705SXin Li       "NSDictionary *d = @{\n"
7869*67e74705SXin Li       "  (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7870*67e74705SXin Li       "  (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7871*67e74705SXin Li       "};");
7872*67e74705SXin Li }
7873*67e74705SXin Li 
TEST_F(FormatTest,ObjCArrayLiterals)7874*67e74705SXin Li TEST_F(FormatTest, ObjCArrayLiterals) {
7875*67e74705SXin Li   verifyIncompleteFormat("@[");
7876*67e74705SXin Li   verifyFormat("@[]");
7877*67e74705SXin Li   verifyFormat(
7878*67e74705SXin Li       "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7879*67e74705SXin Li   verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7880*67e74705SXin Li   verifyFormat("NSArray *array = @[ [foo description] ];");
7881*67e74705SXin Li 
7882*67e74705SXin Li   verifyFormat(
7883*67e74705SXin Li       "NSArray *some_variable = @[\n"
7884*67e74705SXin Li       "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7885*67e74705SXin Li       "  @\"aaaaaaaaaaaaaaaaa\",\n"
7886*67e74705SXin Li       "  @\"aaaaaaaaaaaaaaaaa\",\n"
7887*67e74705SXin Li       "  @\"aaaaaaaaaaaaaaaaa\",\n"
7888*67e74705SXin Li       "];");
7889*67e74705SXin Li   verifyFormat(
7890*67e74705SXin Li       "NSArray *some_variable = @[\n"
7891*67e74705SXin Li       "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7892*67e74705SXin Li       "  @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
7893*67e74705SXin Li       "];");
7894*67e74705SXin Li   verifyFormat("NSArray *some_variable = @[\n"
7895*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7896*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7897*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7898*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7899*67e74705SXin Li                "];");
7900*67e74705SXin Li   verifyFormat("NSArray *array = @[\n"
7901*67e74705SXin Li                "  @\"a\",\n"
7902*67e74705SXin Li                "  @\"a\",\n" // Trailing comma -> one per line.
7903*67e74705SXin Li                "];");
7904*67e74705SXin Li 
7905*67e74705SXin Li   // We should try to be robust in case someone forgets the "@".
7906*67e74705SXin Li   verifyFormat("NSArray *some_variable = [\n"
7907*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7908*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7909*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7910*67e74705SXin Li                "  @\"aaaaaaaaaaaaaaaaa\",\n"
7911*67e74705SXin Li                "];");
7912*67e74705SXin Li   verifyFormat(
7913*67e74705SXin Li       "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
7914*67e74705SXin Li       "                                             index:(NSUInteger)index\n"
7915*67e74705SXin Li       "                                nonDigitAttributes:\n"
7916*67e74705SXin Li       "                                    (NSDictionary *)noDigitAttributes;");
7917*67e74705SXin Li   verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
7918*67e74705SXin Li                "  NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
7919*67e74705SXin Li                "]];");
7920*67e74705SXin Li }
7921*67e74705SXin Li 
TEST_F(FormatTest,BreaksStringLiterals)7922*67e74705SXin Li TEST_F(FormatTest, BreaksStringLiterals) {
7923*67e74705SXin Li   EXPECT_EQ("\"some text \"\n"
7924*67e74705SXin Li             "\"other\";",
7925*67e74705SXin Li             format("\"some text other\";", getLLVMStyleWithColumns(12)));
7926*67e74705SXin Li   EXPECT_EQ("\"some text \"\n"
7927*67e74705SXin Li             "\"other\";",
7928*67e74705SXin Li             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
7929*67e74705SXin Li   EXPECT_EQ(
7930*67e74705SXin Li       "#define A  \\\n"
7931*67e74705SXin Li       "  \"some \"  \\\n"
7932*67e74705SXin Li       "  \"text \"  \\\n"
7933*67e74705SXin Li       "  \"other\";",
7934*67e74705SXin Li       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7935*67e74705SXin Li   EXPECT_EQ(
7936*67e74705SXin Li       "#define A  \\\n"
7937*67e74705SXin Li       "  \"so \"    \\\n"
7938*67e74705SXin Li       "  \"text \"  \\\n"
7939*67e74705SXin Li       "  \"other\";",
7940*67e74705SXin Li       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7941*67e74705SXin Li 
7942*67e74705SXin Li   EXPECT_EQ("\"some text\"",
7943*67e74705SXin Li             format("\"some text\"", getLLVMStyleWithColumns(1)));
7944*67e74705SXin Li   EXPECT_EQ("\"some text\"",
7945*67e74705SXin Li             format("\"some text\"", getLLVMStyleWithColumns(11)));
7946*67e74705SXin Li   EXPECT_EQ("\"some \"\n"
7947*67e74705SXin Li             "\"text\"",
7948*67e74705SXin Li             format("\"some text\"", getLLVMStyleWithColumns(10)));
7949*67e74705SXin Li   EXPECT_EQ("\"some \"\n"
7950*67e74705SXin Li             "\"text\"",
7951*67e74705SXin Li             format("\"some text\"", getLLVMStyleWithColumns(7)));
7952*67e74705SXin Li   EXPECT_EQ("\"some\"\n"
7953*67e74705SXin Li             "\" tex\"\n"
7954*67e74705SXin Li             "\"t\"",
7955*67e74705SXin Li             format("\"some text\"", getLLVMStyleWithColumns(6)));
7956*67e74705SXin Li   EXPECT_EQ("\"some\"\n"
7957*67e74705SXin Li             "\" tex\"\n"
7958*67e74705SXin Li             "\" and\"",
7959*67e74705SXin Li             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7960*67e74705SXin Li   EXPECT_EQ("\"some\"\n"
7961*67e74705SXin Li             "\"/tex\"\n"
7962*67e74705SXin Li             "\"/and\"",
7963*67e74705SXin Li             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
7964*67e74705SXin Li 
7965*67e74705SXin Li   EXPECT_EQ("variable =\n"
7966*67e74705SXin Li             "    \"long string \"\n"
7967*67e74705SXin Li             "    \"literal\";",
7968*67e74705SXin Li             format("variable = \"long string literal\";",
7969*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
7970*67e74705SXin Li 
7971*67e74705SXin Li   EXPECT_EQ("variable = f(\n"
7972*67e74705SXin Li             "    \"long string \"\n"
7973*67e74705SXin Li             "    \"literal\",\n"
7974*67e74705SXin Li             "    short,\n"
7975*67e74705SXin Li             "    loooooooooooooooooooong);",
7976*67e74705SXin Li             format("variable = f(\"long string literal\", short, "
7977*67e74705SXin Li                    "loooooooooooooooooooong);",
7978*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
7979*67e74705SXin Li 
7980*67e74705SXin Li   EXPECT_EQ(
7981*67e74705SXin Li       "f(g(\"long string \"\n"
7982*67e74705SXin Li       "    \"literal\"),\n"
7983*67e74705SXin Li       "  b);",
7984*67e74705SXin Li       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
7985*67e74705SXin Li   EXPECT_EQ("f(g(\"long string \"\n"
7986*67e74705SXin Li             "    \"literal\",\n"
7987*67e74705SXin Li             "    a),\n"
7988*67e74705SXin Li             "  b);",
7989*67e74705SXin Li             format("f(g(\"long string literal\", a), b);",
7990*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
7991*67e74705SXin Li   EXPECT_EQ(
7992*67e74705SXin Li       "f(\"one two\".split(\n"
7993*67e74705SXin Li       "    variable));",
7994*67e74705SXin Li       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7995*67e74705SXin Li   EXPECT_EQ("f(\"one two three four five six \"\n"
7996*67e74705SXin Li             "  \"seven\".split(\n"
7997*67e74705SXin Li             "      really_looooong_variable));",
7998*67e74705SXin Li             format("f(\"one two three four five six seven\"."
7999*67e74705SXin Li                    "split(really_looooong_variable));",
8000*67e74705SXin Li                    getLLVMStyleWithColumns(33)));
8001*67e74705SXin Li 
8002*67e74705SXin Li   EXPECT_EQ("f(\"some \"\n"
8003*67e74705SXin Li             "  \"text\",\n"
8004*67e74705SXin Li             "  other);",
8005*67e74705SXin Li             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
8006*67e74705SXin Li 
8007*67e74705SXin Li   // Only break as a last resort.
8008*67e74705SXin Li   verifyFormat(
8009*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaa(\n"
8010*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaa,\n"
8011*67e74705SXin Li       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
8012*67e74705SXin Li 
8013*67e74705SXin Li   EXPECT_EQ("\"splitmea\"\n"
8014*67e74705SXin Li             "\"trandomp\"\n"
8015*67e74705SXin Li             "\"oint\"",
8016*67e74705SXin Li             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
8017*67e74705SXin Li 
8018*67e74705SXin Li   EXPECT_EQ("\"split/\"\n"
8019*67e74705SXin Li             "\"pathat/\"\n"
8020*67e74705SXin Li             "\"slashes\"",
8021*67e74705SXin Li             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8022*67e74705SXin Li 
8023*67e74705SXin Li   EXPECT_EQ("\"split/\"\n"
8024*67e74705SXin Li             "\"pathat/\"\n"
8025*67e74705SXin Li             "\"slashes\"",
8026*67e74705SXin Li             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8027*67e74705SXin Li   EXPECT_EQ("\"split at \"\n"
8028*67e74705SXin Li             "\"spaces/at/\"\n"
8029*67e74705SXin Li             "\"slashes.at.any$\"\n"
8030*67e74705SXin Li             "\"non-alphanumeric%\"\n"
8031*67e74705SXin Li             "\"1111111111characte\"\n"
8032*67e74705SXin Li             "\"rs\"",
8033*67e74705SXin Li             format("\"split at "
8034*67e74705SXin Li                    "spaces/at/"
8035*67e74705SXin Li                    "slashes.at."
8036*67e74705SXin Li                    "any$non-"
8037*67e74705SXin Li                    "alphanumeric%"
8038*67e74705SXin Li                    "1111111111characte"
8039*67e74705SXin Li                    "rs\"",
8040*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
8041*67e74705SXin Li 
8042*67e74705SXin Li   // Verify that splitting the strings understands
8043*67e74705SXin Li   // Style::AlwaysBreakBeforeMultilineStrings.
8044*67e74705SXin Li   EXPECT_EQ(
8045*67e74705SXin Li       "aaaaaaaaaaaa(\n"
8046*67e74705SXin Li       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8047*67e74705SXin Li       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8048*67e74705SXin Li       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8049*67e74705SXin Li              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8050*67e74705SXin Li              "aaaaaaaaaaaaaaaaaaaaaa\");",
8051*67e74705SXin Li              getGoogleStyle()));
8052*67e74705SXin Li   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8053*67e74705SXin Li             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8054*67e74705SXin Li             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8055*67e74705SXin Li                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8056*67e74705SXin Li                    "aaaaaaaaaaaaaaaaaaaaaa\";",
8057*67e74705SXin Li                    getGoogleStyle()));
8058*67e74705SXin Li   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8059*67e74705SXin Li             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8060*67e74705SXin Li             format("llvm::outs() << "
8061*67e74705SXin Li                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8062*67e74705SXin Li                    "aaaaaaaaaaaaaaaaaaa\";"));
8063*67e74705SXin Li   EXPECT_EQ("ffff(\n"
8064*67e74705SXin Li             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8065*67e74705SXin Li             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8066*67e74705SXin Li             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8067*67e74705SXin Li                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8068*67e74705SXin Li                    getGoogleStyle()));
8069*67e74705SXin Li 
8070*67e74705SXin Li   FormatStyle Style = getLLVMStyleWithColumns(12);
8071*67e74705SXin Li   Style.BreakStringLiterals = false;
8072*67e74705SXin Li   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8073*67e74705SXin Li 
8074*67e74705SXin Li   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8075*67e74705SXin Li   AlignLeft.AlignEscapedNewlinesLeft = true;
8076*67e74705SXin Li   EXPECT_EQ("#define A \\\n"
8077*67e74705SXin Li             "  \"some \" \\\n"
8078*67e74705SXin Li             "  \"text \" \\\n"
8079*67e74705SXin Li             "  \"other\";",
8080*67e74705SXin Li             format("#define A \"some text other\";", AlignLeft));
8081*67e74705SXin Li }
8082*67e74705SXin Li 
TEST_F(FormatTest,FullyRemoveEmptyLines)8083*67e74705SXin Li TEST_F(FormatTest, FullyRemoveEmptyLines) {
8084*67e74705SXin Li   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8085*67e74705SXin Li   NoEmptyLines.MaxEmptyLinesToKeep = 0;
8086*67e74705SXin Li   EXPECT_EQ("int i = a(b());",
8087*67e74705SXin Li             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8088*67e74705SXin Li }
8089*67e74705SXin Li 
TEST_F(FormatTest,BreaksStringLiteralsWithTabs)8090*67e74705SXin Li TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8091*67e74705SXin Li   EXPECT_EQ(
8092*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8093*67e74705SXin Li       "(\n"
8094*67e74705SXin Li       "    \"x\t\");",
8095*67e74705SXin Li       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8096*67e74705SXin Li              "aaaaaaa("
8097*67e74705SXin Li              "\"x\t\");"));
8098*67e74705SXin Li }
8099*67e74705SXin Li 
TEST_F(FormatTest,BreaksWideAndNSStringLiterals)8100*67e74705SXin Li TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
8101*67e74705SXin Li   EXPECT_EQ(
8102*67e74705SXin Li       "u8\"utf8 string \"\n"
8103*67e74705SXin Li       "u8\"literal\";",
8104*67e74705SXin Li       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8105*67e74705SXin Li   EXPECT_EQ(
8106*67e74705SXin Li       "u\"utf16 string \"\n"
8107*67e74705SXin Li       "u\"literal\";",
8108*67e74705SXin Li       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8109*67e74705SXin Li   EXPECT_EQ(
8110*67e74705SXin Li       "U\"utf32 string \"\n"
8111*67e74705SXin Li       "U\"literal\";",
8112*67e74705SXin Li       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8113*67e74705SXin Li   EXPECT_EQ("L\"wide string \"\n"
8114*67e74705SXin Li             "L\"literal\";",
8115*67e74705SXin Li             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
8116*67e74705SXin Li   EXPECT_EQ("@\"NSString \"\n"
8117*67e74705SXin Li             "@\"literal\";",
8118*67e74705SXin Li             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
8119*67e74705SXin Li 
8120*67e74705SXin Li   // This input makes clang-format try to split the incomplete unicode escape
8121*67e74705SXin Li   // sequence, which used to lead to a crasher.
8122*67e74705SXin Li   verifyNoCrash(
8123*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8124*67e74705SXin Li       getLLVMStyleWithColumns(60));
8125*67e74705SXin Li }
8126*67e74705SXin Li 
TEST_F(FormatTest,DoesNotBreakRawStringLiterals)8127*67e74705SXin Li TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8128*67e74705SXin Li   FormatStyle Style = getGoogleStyleWithColumns(15);
8129*67e74705SXin Li   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8130*67e74705SXin Li   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8131*67e74705SXin Li   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8132*67e74705SXin Li   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8133*67e74705SXin Li   EXPECT_EQ("u8R\"x(raw literal)x\";",
8134*67e74705SXin Li             format("u8R\"x(raw literal)x\";", Style));
8135*67e74705SXin Li }
8136*67e74705SXin Li 
TEST_F(FormatTest,BreaksStringLiteralsWithin_TMacro)8137*67e74705SXin Li TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8138*67e74705SXin Li   FormatStyle Style = getLLVMStyleWithColumns(20);
8139*67e74705SXin Li   EXPECT_EQ(
8140*67e74705SXin Li       "_T(\"aaaaaaaaaaaaaa\")\n"
8141*67e74705SXin Li       "_T(\"aaaaaaaaaaaaaa\")\n"
8142*67e74705SXin Li       "_T(\"aaaaaaaaaaaa\")",
8143*67e74705SXin Li       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8144*67e74705SXin Li   EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8145*67e74705SXin Li             "     _T(\"aaaaaa\"),\n"
8146*67e74705SXin Li             "  z);",
8147*67e74705SXin Li             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8148*67e74705SXin Li 
8149*67e74705SXin Li   // FIXME: Handle embedded spaces in one iteration.
8150*67e74705SXin Li   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8151*67e74705SXin Li   //            "_T(\"aaaaaaaaaaaaa\")\n"
8152*67e74705SXin Li   //            "_T(\"aaaaaaaaaaaaa\")\n"
8153*67e74705SXin Li   //            "_T(\"a\")",
8154*67e74705SXin Li   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8155*67e74705SXin Li   //                   getLLVMStyleWithColumns(20)));
8156*67e74705SXin Li   EXPECT_EQ(
8157*67e74705SXin Li       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8158*67e74705SXin Li       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
8159*67e74705SXin Li   EXPECT_EQ("f(\n"
8160*67e74705SXin Li             "#if !TEST\n"
8161*67e74705SXin Li             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8162*67e74705SXin Li             "#endif\n"
8163*67e74705SXin Li             "    );",
8164*67e74705SXin Li             format("f(\n"
8165*67e74705SXin Li                    "#if !TEST\n"
8166*67e74705SXin Li                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8167*67e74705SXin Li                    "#endif\n"
8168*67e74705SXin Li                    ");"));
8169*67e74705SXin Li   EXPECT_EQ("f(\n"
8170*67e74705SXin Li             "\n"
8171*67e74705SXin Li             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8172*67e74705SXin Li             format("f(\n"
8173*67e74705SXin Li                    "\n"
8174*67e74705SXin Li                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
8175*67e74705SXin Li }
8176*67e74705SXin Li 
TEST_F(FormatTest,DontSplitStringLiteralsWithEscapedNewlines)8177*67e74705SXin Li TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
8178*67e74705SXin Li   EXPECT_EQ(
8179*67e74705SXin Li       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8180*67e74705SXin Li       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8181*67e74705SXin Li       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8182*67e74705SXin Li       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8183*67e74705SXin Li              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8184*67e74705SXin Li              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8185*67e74705SXin Li }
8186*67e74705SXin Li 
TEST_F(FormatTest,CountsCharactersInMultilineRawStringLiterals)8187*67e74705SXin Li TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8188*67e74705SXin Li   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
8189*67e74705SXin Li             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
8190*67e74705SXin Li   EXPECT_EQ("fffffffffff(g(R\"x(\n"
8191*67e74705SXin Li             "multiline raw string literal xxxxxxxxxxxxxx\n"
8192*67e74705SXin Li             ")x\",\n"
8193*67e74705SXin Li             "              a),\n"
8194*67e74705SXin Li             "            b);",
8195*67e74705SXin Li             format("fffffffffff(g(R\"x(\n"
8196*67e74705SXin Li                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8197*67e74705SXin Li                    ")x\", a), b);",
8198*67e74705SXin Li                    getGoogleStyleWithColumns(20)));
8199*67e74705SXin Li   EXPECT_EQ("fffffffffff(\n"
8200*67e74705SXin Li             "    g(R\"x(qqq\n"
8201*67e74705SXin Li             "multiline raw string literal xxxxxxxxxxxxxx\n"
8202*67e74705SXin Li             ")x\",\n"
8203*67e74705SXin Li             "      a),\n"
8204*67e74705SXin Li             "    b);",
8205*67e74705SXin Li             format("fffffffffff(g(R\"x(qqq\n"
8206*67e74705SXin Li                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8207*67e74705SXin Li                    ")x\", a), b);",
8208*67e74705SXin Li                    getGoogleStyleWithColumns(20)));
8209*67e74705SXin Li 
8210*67e74705SXin Li   EXPECT_EQ("fffffffffff(R\"x(\n"
8211*67e74705SXin Li             "multiline raw string literal xxxxxxxxxxxxxx\n"
8212*67e74705SXin Li             ")x\");",
8213*67e74705SXin Li             format("fffffffffff(R\"x(\n"
8214*67e74705SXin Li                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8215*67e74705SXin Li                    ")x\");",
8216*67e74705SXin Li                    getGoogleStyleWithColumns(20)));
8217*67e74705SXin Li   EXPECT_EQ("fffffffffff(R\"x(\n"
8218*67e74705SXin Li             "multiline raw string literal xxxxxxxxxxxxxx\n"
8219*67e74705SXin Li             ")x\" + bbbbbb);",
8220*67e74705SXin Li             format("fffffffffff(R\"x(\n"
8221*67e74705SXin Li                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8222*67e74705SXin Li                    ")x\" +   bbbbbb);",
8223*67e74705SXin Li                    getGoogleStyleWithColumns(20)));
8224*67e74705SXin Li   EXPECT_EQ("fffffffffff(\n"
8225*67e74705SXin Li             "    R\"x(\n"
8226*67e74705SXin Li             "multiline raw string literal xxxxxxxxxxxxxx\n"
8227*67e74705SXin Li             ")x\" +\n"
8228*67e74705SXin Li             "    bbbbbb);",
8229*67e74705SXin Li             format("fffffffffff(\n"
8230*67e74705SXin Li                    " R\"x(\n"
8231*67e74705SXin Li                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8232*67e74705SXin Li                    ")x\" + bbbbbb);",
8233*67e74705SXin Li                    getGoogleStyleWithColumns(20)));
8234*67e74705SXin Li }
8235*67e74705SXin Li 
TEST_F(FormatTest,SkipsUnknownStringLiterals)8236*67e74705SXin Li TEST_F(FormatTest, SkipsUnknownStringLiterals) {
8237*67e74705SXin Li   verifyFormat("string a = \"unterminated;");
8238*67e74705SXin Li   EXPECT_EQ("function(\"unterminated,\n"
8239*67e74705SXin Li             "         OtherParameter);",
8240*67e74705SXin Li             format("function(  \"unterminated,\n"
8241*67e74705SXin Li                    "    OtherParameter);"));
8242*67e74705SXin Li }
8243*67e74705SXin Li 
TEST_F(FormatTest,DoesNotTryToParseUDLiteralsInPreCpp11Code)8244*67e74705SXin Li TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
8245*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
8246*67e74705SXin Li   Style.Standard = FormatStyle::LS_Cpp03;
8247*67e74705SXin Li   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
8248*67e74705SXin Li             format("#define x(_a) printf(\"foo\"_a);", Style));
8249*67e74705SXin Li }
8250*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsCpp1y)8251*67e74705SXin Li TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
8252*67e74705SXin Li 
TEST_F(FormatTest,BreakStringLiteralsBeforeUnbreakableTokenSequence)8253*67e74705SXin Li TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8254*67e74705SXin Li   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8255*67e74705SXin Li             "             \"ddeeefff\");",
8256*67e74705SXin Li             format("someFunction(\"aaabbbcccdddeeefff\");",
8257*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8258*67e74705SXin Li   EXPECT_EQ("someFunction1234567890(\n"
8259*67e74705SXin Li             "    \"aaabbbcccdddeeefff\");",
8260*67e74705SXin Li             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8261*67e74705SXin Li                    getLLVMStyleWithColumns(26)));
8262*67e74705SXin Li   EXPECT_EQ("someFunction1234567890(\n"
8263*67e74705SXin Li             "    \"aaabbbcccdddeeeff\"\n"
8264*67e74705SXin Li             "    \"f\");",
8265*67e74705SXin Li             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8266*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8267*67e74705SXin Li   EXPECT_EQ("someFunction1234567890(\n"
8268*67e74705SXin Li             "    \"aaabbbcccdddeeeff\"\n"
8269*67e74705SXin Li             "    \"f\");",
8270*67e74705SXin Li             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8271*67e74705SXin Li                    getLLVMStyleWithColumns(24)));
8272*67e74705SXin Li   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8273*67e74705SXin Li             "             \"ddde \"\n"
8274*67e74705SXin Li             "             \"efff\");",
8275*67e74705SXin Li             format("someFunction(\"aaabbbcc ddde efff\");",
8276*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8277*67e74705SXin Li   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8278*67e74705SXin Li             "             \"ddeeefff\");",
8279*67e74705SXin Li             format("someFunction(\"aaabbbccc ddeeefff\");",
8280*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8281*67e74705SXin Li   EXPECT_EQ("someFunction1234567890(\n"
8282*67e74705SXin Li             "    \"aaabb \"\n"
8283*67e74705SXin Li             "    \"cccdddeeefff\");",
8284*67e74705SXin Li             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8285*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8286*67e74705SXin Li   EXPECT_EQ("#define A          \\\n"
8287*67e74705SXin Li             "  string s =       \\\n"
8288*67e74705SXin Li             "      \"123456789\"  \\\n"
8289*67e74705SXin Li             "      \"0\";         \\\n"
8290*67e74705SXin Li             "  int i;",
8291*67e74705SXin Li             format("#define A string s = \"1234567890\"; int i;",
8292*67e74705SXin Li                    getLLVMStyleWithColumns(20)));
8293*67e74705SXin Li   // FIXME: Put additional penalties on breaking at non-whitespace locations.
8294*67e74705SXin Li   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8295*67e74705SXin Li             "             \"dddeeeff\"\n"
8296*67e74705SXin Li             "             \"f\");",
8297*67e74705SXin Li             format("someFunction(\"aaabbbcc dddeeefff\");",
8298*67e74705SXin Li                    getLLVMStyleWithColumns(25)));
8299*67e74705SXin Li }
8300*67e74705SXin Li 
TEST_F(FormatTest,DoNotBreakStringLiteralsInEscapeSequence)8301*67e74705SXin Li TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
8302*67e74705SXin Li   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8303*67e74705SXin Li   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
8304*67e74705SXin Li   EXPECT_EQ("\"test\"\n"
8305*67e74705SXin Li             "\"\\n\"",
8306*67e74705SXin Li             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8307*67e74705SXin Li   EXPECT_EQ("\"tes\\\\\"\n"
8308*67e74705SXin Li             "\"n\"",
8309*67e74705SXin Li             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8310*67e74705SXin Li   EXPECT_EQ("\"\\\\\\\\\"\n"
8311*67e74705SXin Li             "\"\\n\"",
8312*67e74705SXin Li             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
8313*67e74705SXin Li   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
8314*67e74705SXin Li   EXPECT_EQ("\"\\uff01\"\n"
8315*67e74705SXin Li             "\"test\"",
8316*67e74705SXin Li             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8317*67e74705SXin Li   EXPECT_EQ("\"\\Uff01ff02\"",
8318*67e74705SXin Li             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8319*67e74705SXin Li   EXPECT_EQ("\"\\x000000000001\"\n"
8320*67e74705SXin Li             "\"next\"",
8321*67e74705SXin Li             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8322*67e74705SXin Li   EXPECT_EQ("\"\\x000000000001next\"",
8323*67e74705SXin Li             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8324*67e74705SXin Li   EXPECT_EQ("\"\\x000000000001\"",
8325*67e74705SXin Li             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8326*67e74705SXin Li   EXPECT_EQ("\"test\"\n"
8327*67e74705SXin Li             "\"\\000000\"\n"
8328*67e74705SXin Li             "\"000001\"",
8329*67e74705SXin Li             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8330*67e74705SXin Li   EXPECT_EQ("\"test\\000\"\n"
8331*67e74705SXin Li             "\"00000000\"\n"
8332*67e74705SXin Li             "\"1\"",
8333*67e74705SXin Li             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
8334*67e74705SXin Li }
8335*67e74705SXin Li 
TEST_F(FormatTest,DoNotCreateUnreasonableUnwrappedLines)8336*67e74705SXin Li TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8337*67e74705SXin Li   verifyFormat("void f() {\n"
8338*67e74705SXin Li                "  return g() {}\n"
8339*67e74705SXin Li                "  void h() {}");
8340*67e74705SXin Li   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
8341*67e74705SXin Li                "g();\n"
8342*67e74705SXin Li                "}");
8343*67e74705SXin Li }
8344*67e74705SXin Li 
TEST_F(FormatTest,DoNotPrematurelyEndUnwrappedLineForReturnStatements)8345*67e74705SXin Li TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8346*67e74705SXin Li   verifyFormat(
8347*67e74705SXin Li       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
8348*67e74705SXin Li }
8349*67e74705SXin Li 
TEST_F(FormatTest,FormatsClosingBracesInEmptyNestedBlocks)8350*67e74705SXin Li TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8351*67e74705SXin Li   verifyFormat("class X {\n"
8352*67e74705SXin Li                "  void f() {\n"
8353*67e74705SXin Li                "  }\n"
8354*67e74705SXin Li                "};",
8355*67e74705SXin Li                getLLVMStyleWithColumns(12));
8356*67e74705SXin Li }
8357*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableIndentWidth)8358*67e74705SXin Li TEST_F(FormatTest, ConfigurableIndentWidth) {
8359*67e74705SXin Li   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8360*67e74705SXin Li   EightIndent.IndentWidth = 8;
8361*67e74705SXin Li   EightIndent.ContinuationIndentWidth = 8;
8362*67e74705SXin Li   verifyFormat("void f() {\n"
8363*67e74705SXin Li                "        someFunction();\n"
8364*67e74705SXin Li                "        if (true) {\n"
8365*67e74705SXin Li                "                f();\n"
8366*67e74705SXin Li                "        }\n"
8367*67e74705SXin Li                "}",
8368*67e74705SXin Li                EightIndent);
8369*67e74705SXin Li   verifyFormat("class X {\n"
8370*67e74705SXin Li                "        void f() {\n"
8371*67e74705SXin Li                "        }\n"
8372*67e74705SXin Li                "};",
8373*67e74705SXin Li                EightIndent);
8374*67e74705SXin Li   verifyFormat("int x[] = {\n"
8375*67e74705SXin Li                "        call(),\n"
8376*67e74705SXin Li                "        call()};",
8377*67e74705SXin Li                EightIndent);
8378*67e74705SXin Li }
8379*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableFunctionDeclarationIndentAfterType)8380*67e74705SXin Li TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
8381*67e74705SXin Li   verifyFormat("double\n"
8382*67e74705SXin Li                "f();",
8383*67e74705SXin Li                getLLVMStyleWithColumns(8));
8384*67e74705SXin Li }
8385*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableUseOfTab)8386*67e74705SXin Li TEST_F(FormatTest, ConfigurableUseOfTab) {
8387*67e74705SXin Li   FormatStyle Tab = getLLVMStyleWithColumns(42);
8388*67e74705SXin Li   Tab.IndentWidth = 8;
8389*67e74705SXin Li   Tab.UseTab = FormatStyle::UT_Always;
8390*67e74705SXin Li   Tab.AlignEscapedNewlinesLeft = true;
8391*67e74705SXin Li 
8392*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaa && // q\n"
8393*67e74705SXin Li             "    bb)\t\t// w\n"
8394*67e74705SXin Li             "\t;",
8395*67e74705SXin Li             format("if (aaaaaaaa &&// q\n"
8396*67e74705SXin Li                    "bb)// w\n"
8397*67e74705SXin Li                    ";",
8398*67e74705SXin Li                    Tab));
8399*67e74705SXin Li   EXPECT_EQ("if (aaa && bbb) // w\n"
8400*67e74705SXin Li             "\t;",
8401*67e74705SXin Li             format("if(aaa&&bbb)// w\n"
8402*67e74705SXin Li                    ";",
8403*67e74705SXin Li                    Tab));
8404*67e74705SXin Li 
8405*67e74705SXin Li   verifyFormat("class X {\n"
8406*67e74705SXin Li                "\tvoid f() {\n"
8407*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8408*67e74705SXin Li                "\t\t\t     parameter2);\n"
8409*67e74705SXin Li                "\t}\n"
8410*67e74705SXin Li                "};",
8411*67e74705SXin Li                Tab);
8412*67e74705SXin Li   verifyFormat("#define A                        \\\n"
8413*67e74705SXin Li                "\tvoid f() {               \\\n"
8414*67e74705SXin Li                "\t\tsomeFunction(    \\\n"
8415*67e74705SXin Li                "\t\t    parameter1,  \\\n"
8416*67e74705SXin Li                "\t\t    parameter2); \\\n"
8417*67e74705SXin Li                "\t}",
8418*67e74705SXin Li                Tab);
8419*67e74705SXin Li 
8420*67e74705SXin Li   Tab.TabWidth = 4;
8421*67e74705SXin Li   Tab.IndentWidth = 8;
8422*67e74705SXin Li   verifyFormat("class TabWidth4Indent8 {\n"
8423*67e74705SXin Li                "\t\tvoid f() {\n"
8424*67e74705SXin Li                "\t\t\t\tsomeFunction(parameter1,\n"
8425*67e74705SXin Li                "\t\t\t\t\t\t\t parameter2);\n"
8426*67e74705SXin Li                "\t\t}\n"
8427*67e74705SXin Li                "};",
8428*67e74705SXin Li                Tab);
8429*67e74705SXin Li 
8430*67e74705SXin Li   Tab.TabWidth = 4;
8431*67e74705SXin Li   Tab.IndentWidth = 4;
8432*67e74705SXin Li   verifyFormat("class TabWidth4Indent4 {\n"
8433*67e74705SXin Li                "\tvoid f() {\n"
8434*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8435*67e74705SXin Li                "\t\t\t\t\t parameter2);\n"
8436*67e74705SXin Li                "\t}\n"
8437*67e74705SXin Li                "};",
8438*67e74705SXin Li                Tab);
8439*67e74705SXin Li 
8440*67e74705SXin Li   Tab.TabWidth = 8;
8441*67e74705SXin Li   Tab.IndentWidth = 4;
8442*67e74705SXin Li   verifyFormat("class TabWidth8Indent4 {\n"
8443*67e74705SXin Li                "    void f() {\n"
8444*67e74705SXin Li                "\tsomeFunction(parameter1,\n"
8445*67e74705SXin Li                "\t\t     parameter2);\n"
8446*67e74705SXin Li                "    }\n"
8447*67e74705SXin Li                "};",
8448*67e74705SXin Li                Tab);
8449*67e74705SXin Li 
8450*67e74705SXin Li   Tab.TabWidth = 8;
8451*67e74705SXin Li   Tab.IndentWidth = 8;
8452*67e74705SXin Li   EXPECT_EQ("/*\n"
8453*67e74705SXin Li             "\t      a\t\tcomment\n"
8454*67e74705SXin Li             "\t      in multiple lines\n"
8455*67e74705SXin Li             "       */",
8456*67e74705SXin Li             format("   /*\t \t \n"
8457*67e74705SXin Li                    " \t \t a\t\tcomment\t \t\n"
8458*67e74705SXin Li                    " \t \t in multiple lines\t\n"
8459*67e74705SXin Li                    " \t  */",
8460*67e74705SXin Li                    Tab));
8461*67e74705SXin Li 
8462*67e74705SXin Li   Tab.UseTab = FormatStyle::UT_ForIndentation;
8463*67e74705SXin Li   verifyFormat("{\n"
8464*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8465*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8466*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8467*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8468*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8469*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8470*67e74705SXin Li                "};",
8471*67e74705SXin Li                Tab);
8472*67e74705SXin Li   verifyFormat("enum AA {\n"
8473*67e74705SXin Li                "\ta1, // Force multiple lines\n"
8474*67e74705SXin Li                "\ta2,\n"
8475*67e74705SXin Li                "\ta3\n"
8476*67e74705SXin Li                "};",
8477*67e74705SXin Li                Tab);
8478*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaa && // q\n"
8479*67e74705SXin Li             "    bb)         // w\n"
8480*67e74705SXin Li             "\t;",
8481*67e74705SXin Li             format("if (aaaaaaaa &&// q\n"
8482*67e74705SXin Li                    "bb)// w\n"
8483*67e74705SXin Li                    ";",
8484*67e74705SXin Li                    Tab));
8485*67e74705SXin Li   verifyFormat("class X {\n"
8486*67e74705SXin Li                "\tvoid f() {\n"
8487*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8488*67e74705SXin Li                "\t\t             parameter2);\n"
8489*67e74705SXin Li                "\t}\n"
8490*67e74705SXin Li                "};",
8491*67e74705SXin Li                Tab);
8492*67e74705SXin Li   verifyFormat("{\n"
8493*67e74705SXin Li                "\tQ(\n"
8494*67e74705SXin Li                "\t    {\n"
8495*67e74705SXin Li                "\t\t    int a;\n"
8496*67e74705SXin Li                "\t\t    someFunction(aaaaaaaa,\n"
8497*67e74705SXin Li                "\t\t                 bbbbbbb);\n"
8498*67e74705SXin Li                "\t    },\n"
8499*67e74705SXin Li                "\t    p);\n"
8500*67e74705SXin Li                "}",
8501*67e74705SXin Li                Tab);
8502*67e74705SXin Li   EXPECT_EQ("{\n"
8503*67e74705SXin Li             "\t/* aaaa\n"
8504*67e74705SXin Li             "\t   bbbb */\n"
8505*67e74705SXin Li             "}",
8506*67e74705SXin Li             format("{\n"
8507*67e74705SXin Li                    "/* aaaa\n"
8508*67e74705SXin Li                    "   bbbb */\n"
8509*67e74705SXin Li                    "}",
8510*67e74705SXin Li                    Tab));
8511*67e74705SXin Li   EXPECT_EQ("{\n"
8512*67e74705SXin Li             "\t/*\n"
8513*67e74705SXin Li             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8514*67e74705SXin Li             "\t  bbbbbbbbbbbbb\n"
8515*67e74705SXin Li             "\t*/\n"
8516*67e74705SXin Li             "}",
8517*67e74705SXin Li             format("{\n"
8518*67e74705SXin Li                    "/*\n"
8519*67e74705SXin Li                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8520*67e74705SXin Li                    "*/\n"
8521*67e74705SXin Li                    "}",
8522*67e74705SXin Li                    Tab));
8523*67e74705SXin Li   EXPECT_EQ("{\n"
8524*67e74705SXin Li             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8525*67e74705SXin Li             "\t// bbbbbbbbbbbbb\n"
8526*67e74705SXin Li             "}",
8527*67e74705SXin Li             format("{\n"
8528*67e74705SXin Li                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8529*67e74705SXin Li                    "}",
8530*67e74705SXin Li                    Tab));
8531*67e74705SXin Li   EXPECT_EQ("{\n"
8532*67e74705SXin Li             "\t/*\n"
8533*67e74705SXin Li             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8534*67e74705SXin Li             "\t  bbbbbbbbbbbbb\n"
8535*67e74705SXin Li             "\t*/\n"
8536*67e74705SXin Li             "}",
8537*67e74705SXin Li             format("{\n"
8538*67e74705SXin Li                    "\t/*\n"
8539*67e74705SXin Li                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8540*67e74705SXin Li                    "\t*/\n"
8541*67e74705SXin Li                    "}",
8542*67e74705SXin Li                    Tab));
8543*67e74705SXin Li   EXPECT_EQ("{\n"
8544*67e74705SXin Li             "\t/*\n"
8545*67e74705SXin Li             "\n"
8546*67e74705SXin Li             "\t*/\n"
8547*67e74705SXin Li             "}",
8548*67e74705SXin Li             format("{\n"
8549*67e74705SXin Li                    "\t/*\n"
8550*67e74705SXin Li                    "\n"
8551*67e74705SXin Li                    "\t*/\n"
8552*67e74705SXin Li                    "}",
8553*67e74705SXin Li                    Tab));
8554*67e74705SXin Li   EXPECT_EQ("{\n"
8555*67e74705SXin Li             "\t/*\n"
8556*67e74705SXin Li             " asdf\n"
8557*67e74705SXin Li             "\t*/\n"
8558*67e74705SXin Li             "}",
8559*67e74705SXin Li             format("{\n"
8560*67e74705SXin Li                    "\t/*\n"
8561*67e74705SXin Li                    " asdf\n"
8562*67e74705SXin Li                    "\t*/\n"
8563*67e74705SXin Li                    "}",
8564*67e74705SXin Li                    Tab));
8565*67e74705SXin Li 
8566*67e74705SXin Li   Tab.UseTab = FormatStyle::UT_Never;
8567*67e74705SXin Li   EXPECT_EQ("/*\n"
8568*67e74705SXin Li             "              a\t\tcomment\n"
8569*67e74705SXin Li             "              in multiple lines\n"
8570*67e74705SXin Li             "       */",
8571*67e74705SXin Li             format("   /*\t \t \n"
8572*67e74705SXin Li                    " \t \t a\t\tcomment\t \t\n"
8573*67e74705SXin Li                    " \t \t in multiple lines\t\n"
8574*67e74705SXin Li                    " \t  */",
8575*67e74705SXin Li                    Tab));
8576*67e74705SXin Li   EXPECT_EQ("/* some\n"
8577*67e74705SXin Li             "   comment */",
8578*67e74705SXin Li             format(" \t \t /* some\n"
8579*67e74705SXin Li                    " \t \t    comment */",
8580*67e74705SXin Li                    Tab));
8581*67e74705SXin Li   EXPECT_EQ("int a; /* some\n"
8582*67e74705SXin Li             "   comment */",
8583*67e74705SXin Li             format(" \t \t int a; /* some\n"
8584*67e74705SXin Li                    " \t \t    comment */",
8585*67e74705SXin Li                    Tab));
8586*67e74705SXin Li 
8587*67e74705SXin Li   EXPECT_EQ("int a; /* some\n"
8588*67e74705SXin Li             "comment */",
8589*67e74705SXin Li             format(" \t \t int\ta; /* some\n"
8590*67e74705SXin Li                    " \t \t    comment */",
8591*67e74705SXin Li                    Tab));
8592*67e74705SXin Li   EXPECT_EQ("f(\"\t\t\"); /* some\n"
8593*67e74705SXin Li             "    comment */",
8594*67e74705SXin Li             format(" \t \t f(\"\t\t\"); /* some\n"
8595*67e74705SXin Li                    " \t \t    comment */",
8596*67e74705SXin Li                    Tab));
8597*67e74705SXin Li   EXPECT_EQ("{\n"
8598*67e74705SXin Li             "  /*\n"
8599*67e74705SXin Li             "   * Comment\n"
8600*67e74705SXin Li             "   */\n"
8601*67e74705SXin Li             "  int i;\n"
8602*67e74705SXin Li             "}",
8603*67e74705SXin Li             format("{\n"
8604*67e74705SXin Li                    "\t/*\n"
8605*67e74705SXin Li                    "\t * Comment\n"
8606*67e74705SXin Li                    "\t */\n"
8607*67e74705SXin Li                    "\t int i;\n"
8608*67e74705SXin Li                    "}"));
8609*67e74705SXin Li 
8610*67e74705SXin Li   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8611*67e74705SXin Li   Tab.TabWidth = 8;
8612*67e74705SXin Li   Tab.IndentWidth = 8;
8613*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaa && // q\n"
8614*67e74705SXin Li             "    bb)         // w\n"
8615*67e74705SXin Li             "\t;",
8616*67e74705SXin Li             format("if (aaaaaaaa &&// q\n"
8617*67e74705SXin Li                    "bb)// w\n"
8618*67e74705SXin Li                    ";",
8619*67e74705SXin Li                    Tab));
8620*67e74705SXin Li   EXPECT_EQ("if (aaa && bbb) // w\n"
8621*67e74705SXin Li             "\t;",
8622*67e74705SXin Li             format("if(aaa&&bbb)// w\n"
8623*67e74705SXin Li                    ";",
8624*67e74705SXin Li                    Tab));
8625*67e74705SXin Li   verifyFormat("class X {\n"
8626*67e74705SXin Li                "\tvoid f() {\n"
8627*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8628*67e74705SXin Li                "\t\t\t     parameter2);\n"
8629*67e74705SXin Li                "\t}\n"
8630*67e74705SXin Li                "};",
8631*67e74705SXin Li                Tab);
8632*67e74705SXin Li   verifyFormat("#define A                        \\\n"
8633*67e74705SXin Li                "\tvoid f() {               \\\n"
8634*67e74705SXin Li                "\t\tsomeFunction(    \\\n"
8635*67e74705SXin Li                "\t\t    parameter1,  \\\n"
8636*67e74705SXin Li                "\t\t    parameter2); \\\n"
8637*67e74705SXin Li                "\t}",
8638*67e74705SXin Li                Tab);
8639*67e74705SXin Li   Tab.TabWidth = 4;
8640*67e74705SXin Li   Tab.IndentWidth = 8;
8641*67e74705SXin Li   verifyFormat("class TabWidth4Indent8 {\n"
8642*67e74705SXin Li                "\t\tvoid f() {\n"
8643*67e74705SXin Li                "\t\t\t\tsomeFunction(parameter1,\n"
8644*67e74705SXin Li                "\t\t\t\t\t\t\t parameter2);\n"
8645*67e74705SXin Li                "\t\t}\n"
8646*67e74705SXin Li                "};",
8647*67e74705SXin Li                Tab);
8648*67e74705SXin Li   Tab.TabWidth = 4;
8649*67e74705SXin Li   Tab.IndentWidth = 4;
8650*67e74705SXin Li   verifyFormat("class TabWidth4Indent4 {\n"
8651*67e74705SXin Li                "\tvoid f() {\n"
8652*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8653*67e74705SXin Li                "\t\t\t\t\t parameter2);\n"
8654*67e74705SXin Li                "\t}\n"
8655*67e74705SXin Li                "};",
8656*67e74705SXin Li                Tab);
8657*67e74705SXin Li   Tab.TabWidth = 8;
8658*67e74705SXin Li   Tab.IndentWidth = 4;
8659*67e74705SXin Li   verifyFormat("class TabWidth8Indent4 {\n"
8660*67e74705SXin Li                "    void f() {\n"
8661*67e74705SXin Li                "\tsomeFunction(parameter1,\n"
8662*67e74705SXin Li                "\t\t     parameter2);\n"
8663*67e74705SXin Li                "    }\n"
8664*67e74705SXin Li                "};",
8665*67e74705SXin Li                Tab);
8666*67e74705SXin Li   Tab.TabWidth = 8;
8667*67e74705SXin Li   Tab.IndentWidth = 8;
8668*67e74705SXin Li   EXPECT_EQ("/*\n"
8669*67e74705SXin Li             "\t      a\t\tcomment\n"
8670*67e74705SXin Li             "\t      in multiple lines\n"
8671*67e74705SXin Li             "       */",
8672*67e74705SXin Li             format("   /*\t \t \n"
8673*67e74705SXin Li                    " \t \t a\t\tcomment\t \t\n"
8674*67e74705SXin Li                    " \t \t in multiple lines\t\n"
8675*67e74705SXin Li                    " \t  */",
8676*67e74705SXin Li                    Tab));
8677*67e74705SXin Li   verifyFormat("{\n"
8678*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8679*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8680*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8681*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8682*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8683*67e74705SXin Li                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8684*67e74705SXin Li                "};",
8685*67e74705SXin Li                Tab);
8686*67e74705SXin Li   verifyFormat("enum AA {\n"
8687*67e74705SXin Li                "\ta1, // Force multiple lines\n"
8688*67e74705SXin Li                "\ta2,\n"
8689*67e74705SXin Li                "\ta3\n"
8690*67e74705SXin Li                "};",
8691*67e74705SXin Li                Tab);
8692*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaa && // q\n"
8693*67e74705SXin Li             "    bb)         // w\n"
8694*67e74705SXin Li             "\t;",
8695*67e74705SXin Li             format("if (aaaaaaaa &&// q\n"
8696*67e74705SXin Li                    "bb)// w\n"
8697*67e74705SXin Li                    ";",
8698*67e74705SXin Li                    Tab));
8699*67e74705SXin Li   verifyFormat("class X {\n"
8700*67e74705SXin Li                "\tvoid f() {\n"
8701*67e74705SXin Li                "\t\tsomeFunction(parameter1,\n"
8702*67e74705SXin Li                "\t\t\t     parameter2);\n"
8703*67e74705SXin Li                "\t}\n"
8704*67e74705SXin Li                "};",
8705*67e74705SXin Li                Tab);
8706*67e74705SXin Li   verifyFormat("{\n"
8707*67e74705SXin Li                "\tQ(\n"
8708*67e74705SXin Li                "\t    {\n"
8709*67e74705SXin Li                "\t\t    int a;\n"
8710*67e74705SXin Li                "\t\t    someFunction(aaaaaaaa,\n"
8711*67e74705SXin Li                "\t\t\t\t bbbbbbb);\n"
8712*67e74705SXin Li                "\t    },\n"
8713*67e74705SXin Li                "\t    p);\n"
8714*67e74705SXin Li                "}",
8715*67e74705SXin Li                Tab);
8716*67e74705SXin Li   EXPECT_EQ("{\n"
8717*67e74705SXin Li             "\t/* aaaa\n"
8718*67e74705SXin Li             "\t   bbbb */\n"
8719*67e74705SXin Li             "}",
8720*67e74705SXin Li             format("{\n"
8721*67e74705SXin Li                    "/* aaaa\n"
8722*67e74705SXin Li                    "   bbbb */\n"
8723*67e74705SXin Li                    "}",
8724*67e74705SXin Li                    Tab));
8725*67e74705SXin Li   EXPECT_EQ("{\n"
8726*67e74705SXin Li             "\t/*\n"
8727*67e74705SXin Li             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8728*67e74705SXin Li             "\t  bbbbbbbbbbbbb\n"
8729*67e74705SXin Li             "\t*/\n"
8730*67e74705SXin Li             "}",
8731*67e74705SXin Li             format("{\n"
8732*67e74705SXin Li                    "/*\n"
8733*67e74705SXin Li                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8734*67e74705SXin Li                    "*/\n"
8735*67e74705SXin Li                    "}",
8736*67e74705SXin Li                    Tab));
8737*67e74705SXin Li   EXPECT_EQ("{\n"
8738*67e74705SXin Li             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8739*67e74705SXin Li             "\t// bbbbbbbbbbbbb\n"
8740*67e74705SXin Li             "}",
8741*67e74705SXin Li             format("{\n"
8742*67e74705SXin Li                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8743*67e74705SXin Li                    "}",
8744*67e74705SXin Li                    Tab));
8745*67e74705SXin Li   EXPECT_EQ("{\n"
8746*67e74705SXin Li             "\t/*\n"
8747*67e74705SXin Li             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8748*67e74705SXin Li             "\t  bbbbbbbbbbbbb\n"
8749*67e74705SXin Li             "\t*/\n"
8750*67e74705SXin Li             "}",
8751*67e74705SXin Li             format("{\n"
8752*67e74705SXin Li                    "\t/*\n"
8753*67e74705SXin Li                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8754*67e74705SXin Li                    "\t*/\n"
8755*67e74705SXin Li                    "}",
8756*67e74705SXin Li                    Tab));
8757*67e74705SXin Li   EXPECT_EQ("{\n"
8758*67e74705SXin Li             "\t/*\n"
8759*67e74705SXin Li             "\n"
8760*67e74705SXin Li             "\t*/\n"
8761*67e74705SXin Li             "}",
8762*67e74705SXin Li             format("{\n"
8763*67e74705SXin Li                    "\t/*\n"
8764*67e74705SXin Li                    "\n"
8765*67e74705SXin Li                    "\t*/\n"
8766*67e74705SXin Li                    "}",
8767*67e74705SXin Li                    Tab));
8768*67e74705SXin Li   EXPECT_EQ("{\n"
8769*67e74705SXin Li             "\t/*\n"
8770*67e74705SXin Li             " asdf\n"
8771*67e74705SXin Li             "\t*/\n"
8772*67e74705SXin Li             "}",
8773*67e74705SXin Li             format("{\n"
8774*67e74705SXin Li                    "\t/*\n"
8775*67e74705SXin Li                    " asdf\n"
8776*67e74705SXin Li                    "\t*/\n"
8777*67e74705SXin Li                    "}",
8778*67e74705SXin Li                    Tab));
8779*67e74705SXin Li   EXPECT_EQ("/*\n"
8780*67e74705SXin Li             "\t      a\t\tcomment\n"
8781*67e74705SXin Li             "\t      in multiple lines\n"
8782*67e74705SXin Li             "       */",
8783*67e74705SXin Li             format("   /*\t \t \n"
8784*67e74705SXin Li                    " \t \t a\t\tcomment\t \t\n"
8785*67e74705SXin Li                    " \t \t in multiple lines\t\n"
8786*67e74705SXin Li                    " \t  */",
8787*67e74705SXin Li                    Tab));
8788*67e74705SXin Li   EXPECT_EQ("/* some\n"
8789*67e74705SXin Li             "   comment */",
8790*67e74705SXin Li             format(" \t \t /* some\n"
8791*67e74705SXin Li                    " \t \t    comment */",
8792*67e74705SXin Li                    Tab));
8793*67e74705SXin Li   EXPECT_EQ("int a; /* some\n"
8794*67e74705SXin Li             "   comment */",
8795*67e74705SXin Li             format(" \t \t int a; /* some\n"
8796*67e74705SXin Li                    " \t \t    comment */",
8797*67e74705SXin Li                    Tab));
8798*67e74705SXin Li   EXPECT_EQ("int a; /* some\n"
8799*67e74705SXin Li             "comment */",
8800*67e74705SXin Li             format(" \t \t int\ta; /* some\n"
8801*67e74705SXin Li                    " \t \t    comment */",
8802*67e74705SXin Li                    Tab));
8803*67e74705SXin Li   EXPECT_EQ("f(\"\t\t\"); /* some\n"
8804*67e74705SXin Li             "    comment */",
8805*67e74705SXin Li             format(" \t \t f(\"\t\t\"); /* some\n"
8806*67e74705SXin Li                    " \t \t    comment */",
8807*67e74705SXin Li                    Tab));
8808*67e74705SXin Li   EXPECT_EQ("{\n"
8809*67e74705SXin Li             "  /*\n"
8810*67e74705SXin Li             "   * Comment\n"
8811*67e74705SXin Li             "   */\n"
8812*67e74705SXin Li             "  int i;\n"
8813*67e74705SXin Li             "}",
8814*67e74705SXin Li             format("{\n"
8815*67e74705SXin Li                    "\t/*\n"
8816*67e74705SXin Li                    "\t * Comment\n"
8817*67e74705SXin Li                    "\t */\n"
8818*67e74705SXin Li                    "\t int i;\n"
8819*67e74705SXin Li                    "}"));
8820*67e74705SXin Li   Tab.AlignConsecutiveAssignments = true;
8821*67e74705SXin Li   Tab.AlignConsecutiveDeclarations = true;
8822*67e74705SXin Li   Tab.TabWidth = 4;
8823*67e74705SXin Li   Tab.IndentWidth = 4;
8824*67e74705SXin Li   verifyFormat("class Assign {\n"
8825*67e74705SXin Li                "\tvoid f() {\n"
8826*67e74705SXin Li                "\t\tint         x      = 123;\n"
8827*67e74705SXin Li                "\t\tint         random = 4;\n"
8828*67e74705SXin Li                "\t\tstd::string alphabet =\n"
8829*67e74705SXin Li                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8830*67e74705SXin Li                "\t}\n"
8831*67e74705SXin Li                "};",
8832*67e74705SXin Li                Tab);
8833*67e74705SXin Li }
8834*67e74705SXin Li 
TEST_F(FormatTest,CalculatesOriginalColumn)8835*67e74705SXin Li TEST_F(FormatTest, CalculatesOriginalColumn) {
8836*67e74705SXin Li   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8837*67e74705SXin Li             "q\"; /* some\n"
8838*67e74705SXin Li             "       comment */",
8839*67e74705SXin Li             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8840*67e74705SXin Li                    "q\"; /* some\n"
8841*67e74705SXin Li                    "       comment */",
8842*67e74705SXin Li                    getLLVMStyle()));
8843*67e74705SXin Li   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8844*67e74705SXin Li             "/* some\n"
8845*67e74705SXin Li             "   comment */",
8846*67e74705SXin Li             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8847*67e74705SXin Li                    " /* some\n"
8848*67e74705SXin Li                    "    comment */",
8849*67e74705SXin Li                    getLLVMStyle()));
8850*67e74705SXin Li   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8851*67e74705SXin Li             "qqq\n"
8852*67e74705SXin Li             "/* some\n"
8853*67e74705SXin Li             "   comment */",
8854*67e74705SXin Li             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8855*67e74705SXin Li                    "qqq\n"
8856*67e74705SXin Li                    " /* some\n"
8857*67e74705SXin Li                    "    comment */",
8858*67e74705SXin Li                    getLLVMStyle()));
8859*67e74705SXin Li   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8860*67e74705SXin Li             "wwww; /* some\n"
8861*67e74705SXin Li             "         comment */",
8862*67e74705SXin Li             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8863*67e74705SXin Li                    "wwww; /* some\n"
8864*67e74705SXin Li                    "         comment */",
8865*67e74705SXin Li                    getLLVMStyle()));
8866*67e74705SXin Li }
8867*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableSpaceBeforeParens)8868*67e74705SXin Li TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
8869*67e74705SXin Li   FormatStyle NoSpace = getLLVMStyle();
8870*67e74705SXin Li   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
8871*67e74705SXin Li 
8872*67e74705SXin Li   verifyFormat("while(true)\n"
8873*67e74705SXin Li                "  continue;",
8874*67e74705SXin Li                NoSpace);
8875*67e74705SXin Li   verifyFormat("for(;;)\n"
8876*67e74705SXin Li                "  continue;",
8877*67e74705SXin Li                NoSpace);
8878*67e74705SXin Li   verifyFormat("if(true)\n"
8879*67e74705SXin Li                "  f();\n"
8880*67e74705SXin Li                "else if(true)\n"
8881*67e74705SXin Li                "  f();",
8882*67e74705SXin Li                NoSpace);
8883*67e74705SXin Li   verifyFormat("do {\n"
8884*67e74705SXin Li                "  do_something();\n"
8885*67e74705SXin Li                "} while(something());",
8886*67e74705SXin Li                NoSpace);
8887*67e74705SXin Li   verifyFormat("switch(x) {\n"
8888*67e74705SXin Li                "default:\n"
8889*67e74705SXin Li                "  break;\n"
8890*67e74705SXin Li                "}",
8891*67e74705SXin Li                NoSpace);
8892*67e74705SXin Li   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
8893*67e74705SXin Li   verifyFormat("size_t x = sizeof(x);", NoSpace);
8894*67e74705SXin Li   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8895*67e74705SXin Li   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8896*67e74705SXin Li   verifyFormat("alignas(128) char a[128];", NoSpace);
8897*67e74705SXin Li   verifyFormat("size_t x = alignof(MyType);", NoSpace);
8898*67e74705SXin Li   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8899*67e74705SXin Li   verifyFormat("int f() throw(Deprecated);", NoSpace);
8900*67e74705SXin Li   verifyFormat("typedef void (*cb)(int);", NoSpace);
8901*67e74705SXin Li   verifyFormat("T A::operator()();", NoSpace);
8902*67e74705SXin Li   verifyFormat("X A::operator++(T);", NoSpace);
8903*67e74705SXin Li 
8904*67e74705SXin Li   FormatStyle Space = getLLVMStyle();
8905*67e74705SXin Li   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8906*67e74705SXin Li 
8907*67e74705SXin Li   verifyFormat("int f ();", Space);
8908*67e74705SXin Li   verifyFormat("void f (int a, T b) {\n"
8909*67e74705SXin Li                "  while (true)\n"
8910*67e74705SXin Li                "    continue;\n"
8911*67e74705SXin Li                "}",
8912*67e74705SXin Li                Space);
8913*67e74705SXin Li   verifyFormat("if (true)\n"
8914*67e74705SXin Li                "  f ();\n"
8915*67e74705SXin Li                "else if (true)\n"
8916*67e74705SXin Li                "  f ();",
8917*67e74705SXin Li                Space);
8918*67e74705SXin Li   verifyFormat("do {\n"
8919*67e74705SXin Li                "  do_something ();\n"
8920*67e74705SXin Li                "} while (something ());",
8921*67e74705SXin Li                Space);
8922*67e74705SXin Li   verifyFormat("switch (x) {\n"
8923*67e74705SXin Li                "default:\n"
8924*67e74705SXin Li                "  break;\n"
8925*67e74705SXin Li                "}",
8926*67e74705SXin Li                Space);
8927*67e74705SXin Li   verifyFormat("A::A () : a (1) {}", Space);
8928*67e74705SXin Li   verifyFormat("void f () __attribute__ ((asdf));", Space);
8929*67e74705SXin Li   verifyFormat("*(&a + 1);\n"
8930*67e74705SXin Li                "&((&a)[1]);\n"
8931*67e74705SXin Li                "a[(b + c) * d];\n"
8932*67e74705SXin Li                "(((a + 1) * 2) + 3) * 4;",
8933*67e74705SXin Li                Space);
8934*67e74705SXin Li   verifyFormat("#define A(x) x", Space);
8935*67e74705SXin Li   verifyFormat("#define A (x) x", Space);
8936*67e74705SXin Li   verifyFormat("#if defined(x)\n"
8937*67e74705SXin Li                "#endif",
8938*67e74705SXin Li                Space);
8939*67e74705SXin Li   verifyFormat("auto i = std::make_unique<int> (5);", Space);
8940*67e74705SXin Li   verifyFormat("size_t x = sizeof (x);", Space);
8941*67e74705SXin Li   verifyFormat("auto f (int x) -> decltype (x);", Space);
8942*67e74705SXin Li   verifyFormat("int f (T x) noexcept (x.create ());", Space);
8943*67e74705SXin Li   verifyFormat("alignas (128) char a[128];", Space);
8944*67e74705SXin Li   verifyFormat("size_t x = alignof (MyType);", Space);
8945*67e74705SXin Li   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8946*67e74705SXin Li   verifyFormat("int f () throw (Deprecated);", Space);
8947*67e74705SXin Li   verifyFormat("typedef void (*cb) (int);", Space);
8948*67e74705SXin Li   verifyFormat("T A::operator() ();", Space);
8949*67e74705SXin Li   verifyFormat("X A::operator++ (T);", Space);
8950*67e74705SXin Li }
8951*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableSpacesInParentheses)8952*67e74705SXin Li TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8953*67e74705SXin Li   FormatStyle Spaces = getLLVMStyle();
8954*67e74705SXin Li 
8955*67e74705SXin Li   Spaces.SpacesInParentheses = true;
8956*67e74705SXin Li   verifyFormat("call( x, y, z );", Spaces);
8957*67e74705SXin Li   verifyFormat("call();", Spaces);
8958*67e74705SXin Li   verifyFormat("std::function<void( int, int )> callback;", Spaces);
8959*67e74705SXin Li   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8960*67e74705SXin Li                Spaces);
8961*67e74705SXin Li   verifyFormat("while ( (bool)1 )\n"
8962*67e74705SXin Li                "  continue;",
8963*67e74705SXin Li                Spaces);
8964*67e74705SXin Li   verifyFormat("for ( ;; )\n"
8965*67e74705SXin Li                "  continue;",
8966*67e74705SXin Li                Spaces);
8967*67e74705SXin Li   verifyFormat("if ( true )\n"
8968*67e74705SXin Li                "  f();\n"
8969*67e74705SXin Li                "else if ( true )\n"
8970*67e74705SXin Li                "  f();",
8971*67e74705SXin Li                Spaces);
8972*67e74705SXin Li   verifyFormat("do {\n"
8973*67e74705SXin Li                "  do_something( (int)i );\n"
8974*67e74705SXin Li                "} while ( something() );",
8975*67e74705SXin Li                Spaces);
8976*67e74705SXin Li   verifyFormat("switch ( x ) {\n"
8977*67e74705SXin Li                "default:\n"
8978*67e74705SXin Li                "  break;\n"
8979*67e74705SXin Li                "}",
8980*67e74705SXin Li                Spaces);
8981*67e74705SXin Li 
8982*67e74705SXin Li   Spaces.SpacesInParentheses = false;
8983*67e74705SXin Li   Spaces.SpacesInCStyleCastParentheses = true;
8984*67e74705SXin Li   verifyFormat("Type *A = ( Type * )P;", Spaces);
8985*67e74705SXin Li   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8986*67e74705SXin Li   verifyFormat("x = ( int32 )y;", Spaces);
8987*67e74705SXin Li   verifyFormat("int a = ( int )(2.0f);", Spaces);
8988*67e74705SXin Li   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8989*67e74705SXin Li   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8990*67e74705SXin Li   verifyFormat("#define x (( int )-1)", Spaces);
8991*67e74705SXin Li 
8992*67e74705SXin Li   // Run the first set of tests again with:
8993*67e74705SXin Li   Spaces.SpacesInParentheses = false;
8994*67e74705SXin Li   Spaces.SpaceInEmptyParentheses = true;
8995*67e74705SXin Li   Spaces.SpacesInCStyleCastParentheses = true;
8996*67e74705SXin Li   verifyFormat("call(x, y, z);", Spaces);
8997*67e74705SXin Li   verifyFormat("call( );", Spaces);
8998*67e74705SXin Li   verifyFormat("std::function<void(int, int)> callback;", Spaces);
8999*67e74705SXin Li   verifyFormat("while (( bool )1)\n"
9000*67e74705SXin Li                "  continue;",
9001*67e74705SXin Li                Spaces);
9002*67e74705SXin Li   verifyFormat("for (;;)\n"
9003*67e74705SXin Li                "  continue;",
9004*67e74705SXin Li                Spaces);
9005*67e74705SXin Li   verifyFormat("if (true)\n"
9006*67e74705SXin Li                "  f( );\n"
9007*67e74705SXin Li                "else if (true)\n"
9008*67e74705SXin Li                "  f( );",
9009*67e74705SXin Li                Spaces);
9010*67e74705SXin Li   verifyFormat("do {\n"
9011*67e74705SXin Li                "  do_something(( int )i);\n"
9012*67e74705SXin Li                "} while (something( ));",
9013*67e74705SXin Li                Spaces);
9014*67e74705SXin Li   verifyFormat("switch (x) {\n"
9015*67e74705SXin Li                "default:\n"
9016*67e74705SXin Li                "  break;\n"
9017*67e74705SXin Li                "}",
9018*67e74705SXin Li                Spaces);
9019*67e74705SXin Li 
9020*67e74705SXin Li   // Run the first set of tests again with:
9021*67e74705SXin Li   Spaces.SpaceAfterCStyleCast = true;
9022*67e74705SXin Li   verifyFormat("call(x, y, z);", Spaces);
9023*67e74705SXin Li   verifyFormat("call( );", Spaces);
9024*67e74705SXin Li   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9025*67e74705SXin Li   verifyFormat("while (( bool ) 1)\n"
9026*67e74705SXin Li                "  continue;",
9027*67e74705SXin Li                Spaces);
9028*67e74705SXin Li   verifyFormat("for (;;)\n"
9029*67e74705SXin Li                "  continue;",
9030*67e74705SXin Li                Spaces);
9031*67e74705SXin Li   verifyFormat("if (true)\n"
9032*67e74705SXin Li                "  f( );\n"
9033*67e74705SXin Li                "else if (true)\n"
9034*67e74705SXin Li                "  f( );",
9035*67e74705SXin Li                Spaces);
9036*67e74705SXin Li   verifyFormat("do {\n"
9037*67e74705SXin Li                "  do_something(( int ) i);\n"
9038*67e74705SXin Li                "} while (something( ));",
9039*67e74705SXin Li                Spaces);
9040*67e74705SXin Li   verifyFormat("switch (x) {\n"
9041*67e74705SXin Li                "default:\n"
9042*67e74705SXin Li                "  break;\n"
9043*67e74705SXin Li                "}",
9044*67e74705SXin Li                Spaces);
9045*67e74705SXin Li 
9046*67e74705SXin Li   // Run subset of tests again with:
9047*67e74705SXin Li   Spaces.SpacesInCStyleCastParentheses = false;
9048*67e74705SXin Li   Spaces.SpaceAfterCStyleCast = true;
9049*67e74705SXin Li   verifyFormat("while ((bool) 1)\n"
9050*67e74705SXin Li                "  continue;",
9051*67e74705SXin Li                Spaces);
9052*67e74705SXin Li   verifyFormat("do {\n"
9053*67e74705SXin Li                "  do_something((int) i);\n"
9054*67e74705SXin Li                "} while (something( ));",
9055*67e74705SXin Li                Spaces);
9056*67e74705SXin Li }
9057*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableSpacesInSquareBrackets)9058*67e74705SXin Li TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9059*67e74705SXin Li   verifyFormat("int a[5];");
9060*67e74705SXin Li   verifyFormat("a[3] += 42;");
9061*67e74705SXin Li 
9062*67e74705SXin Li   FormatStyle Spaces = getLLVMStyle();
9063*67e74705SXin Li   Spaces.SpacesInSquareBrackets = true;
9064*67e74705SXin Li   // Lambdas unchanged.
9065*67e74705SXin Li   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9066*67e74705SXin Li   verifyFormat("return [i, args...] {};", Spaces);
9067*67e74705SXin Li 
9068*67e74705SXin Li   // Not lambdas.
9069*67e74705SXin Li   verifyFormat("int a[ 5 ];", Spaces);
9070*67e74705SXin Li   verifyFormat("a[ 3 ] += 42;", Spaces);
9071*67e74705SXin Li   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9072*67e74705SXin Li   verifyFormat("double &operator[](int i) { return 0; }\n"
9073*67e74705SXin Li                "int i;",
9074*67e74705SXin Li                Spaces);
9075*67e74705SXin Li   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9076*67e74705SXin Li   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9077*67e74705SXin Li   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9078*67e74705SXin Li }
9079*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableSpaceBeforeAssignmentOperators)9080*67e74705SXin Li TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9081*67e74705SXin Li   verifyFormat("int a = 5;");
9082*67e74705SXin Li   verifyFormat("a += 42;");
9083*67e74705SXin Li   verifyFormat("a or_eq 8;");
9084*67e74705SXin Li 
9085*67e74705SXin Li   FormatStyle Spaces = getLLVMStyle();
9086*67e74705SXin Li   Spaces.SpaceBeforeAssignmentOperators = false;
9087*67e74705SXin Li   verifyFormat("int a= 5;", Spaces);
9088*67e74705SXin Li   verifyFormat("a+= 42;", Spaces);
9089*67e74705SXin Li   verifyFormat("a or_eq 8;", Spaces);
9090*67e74705SXin Li }
9091*67e74705SXin Li 
TEST_F(FormatTest,AlignConsecutiveAssignments)9092*67e74705SXin Li TEST_F(FormatTest, AlignConsecutiveAssignments) {
9093*67e74705SXin Li   FormatStyle Alignment = getLLVMStyle();
9094*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = false;
9095*67e74705SXin Li   verifyFormat("int a = 5;\n"
9096*67e74705SXin Li                "int oneTwoThree = 123;",
9097*67e74705SXin Li                Alignment);
9098*67e74705SXin Li   verifyFormat("int a = 5;\n"
9099*67e74705SXin Li                "int oneTwoThree = 123;",
9100*67e74705SXin Li                Alignment);
9101*67e74705SXin Li 
9102*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = true;
9103*67e74705SXin Li   verifyFormat("int a           = 5;\n"
9104*67e74705SXin Li                "int oneTwoThree = 123;",
9105*67e74705SXin Li                Alignment);
9106*67e74705SXin Li   verifyFormat("int a           = method();\n"
9107*67e74705SXin Li                "int oneTwoThree = 133;",
9108*67e74705SXin Li                Alignment);
9109*67e74705SXin Li   verifyFormat("a &= 5;\n"
9110*67e74705SXin Li                "bcd *= 5;\n"
9111*67e74705SXin Li                "ghtyf += 5;\n"
9112*67e74705SXin Li                "dvfvdb -= 5;\n"
9113*67e74705SXin Li                "a /= 5;\n"
9114*67e74705SXin Li                "vdsvsv %= 5;\n"
9115*67e74705SXin Li                "sfdbddfbdfbb ^= 5;\n"
9116*67e74705SXin Li                "dvsdsv |= 5;\n"
9117*67e74705SXin Li                "int dsvvdvsdvvv = 123;",
9118*67e74705SXin Li                Alignment);
9119*67e74705SXin Li   verifyFormat("int i = 1, j = 10;\n"
9120*67e74705SXin Li                "something = 2000;",
9121*67e74705SXin Li                Alignment);
9122*67e74705SXin Li   verifyFormat("something = 2000;\n"
9123*67e74705SXin Li                "int i = 1, j = 10;\n",
9124*67e74705SXin Li                Alignment);
9125*67e74705SXin Li   verifyFormat("something = 2000;\n"
9126*67e74705SXin Li                "another   = 911;\n"
9127*67e74705SXin Li                "int i = 1, j = 10;\n"
9128*67e74705SXin Li                "oneMore = 1;\n"
9129*67e74705SXin Li                "i       = 2;",
9130*67e74705SXin Li                Alignment);
9131*67e74705SXin Li   verifyFormat("int a   = 5;\n"
9132*67e74705SXin Li                "int one = 1;\n"
9133*67e74705SXin Li                "method();\n"
9134*67e74705SXin Li                "int oneTwoThree = 123;\n"
9135*67e74705SXin Li                "int oneTwo      = 12;",
9136*67e74705SXin Li                Alignment);
9137*67e74705SXin Li   verifyFormat("int oneTwoThree = 123;\n"
9138*67e74705SXin Li                "int oneTwo      = 12;\n"
9139*67e74705SXin Li                "method();\n",
9140*67e74705SXin Li                Alignment);
9141*67e74705SXin Li   verifyFormat("int oneTwoThree = 123; // comment\n"
9142*67e74705SXin Li                "int oneTwo      = 12;  // comment",
9143*67e74705SXin Li                Alignment);
9144*67e74705SXin Li   EXPECT_EQ("int a = 5;\n"
9145*67e74705SXin Li             "\n"
9146*67e74705SXin Li             "int oneTwoThree = 123;",
9147*67e74705SXin Li             format("int a       = 5;\n"
9148*67e74705SXin Li                    "\n"
9149*67e74705SXin Li                    "int oneTwoThree= 123;",
9150*67e74705SXin Li                    Alignment));
9151*67e74705SXin Li   EXPECT_EQ("int a   = 5;\n"
9152*67e74705SXin Li             "int one = 1;\n"
9153*67e74705SXin Li             "\n"
9154*67e74705SXin Li             "int oneTwoThree = 123;",
9155*67e74705SXin Li             format("int a = 5;\n"
9156*67e74705SXin Li                    "int one = 1;\n"
9157*67e74705SXin Li                    "\n"
9158*67e74705SXin Li                    "int oneTwoThree = 123;",
9159*67e74705SXin Li                    Alignment));
9160*67e74705SXin Li   EXPECT_EQ("int a   = 5;\n"
9161*67e74705SXin Li             "int one = 1;\n"
9162*67e74705SXin Li             "\n"
9163*67e74705SXin Li             "int oneTwoThree = 123;\n"
9164*67e74705SXin Li             "int oneTwo      = 12;",
9165*67e74705SXin Li             format("int a = 5;\n"
9166*67e74705SXin Li                    "int one = 1;\n"
9167*67e74705SXin Li                    "\n"
9168*67e74705SXin Li                    "int oneTwoThree = 123;\n"
9169*67e74705SXin Li                    "int oneTwo = 12;",
9170*67e74705SXin Li                    Alignment));
9171*67e74705SXin Li   Alignment.AlignEscapedNewlinesLeft = true;
9172*67e74705SXin Li   verifyFormat("#define A               \\\n"
9173*67e74705SXin Li                "  int aaaa       = 12;  \\\n"
9174*67e74705SXin Li                "  int b          = 23;  \\\n"
9175*67e74705SXin Li                "  int ccc        = 234; \\\n"
9176*67e74705SXin Li                "  int dddddddddd = 2345;",
9177*67e74705SXin Li                Alignment);
9178*67e74705SXin Li   Alignment.AlignEscapedNewlinesLeft = false;
9179*67e74705SXin Li   verifyFormat("#define A                                                      "
9180*67e74705SXin Li                "                \\\n"
9181*67e74705SXin Li                "  int aaaa       = 12;                                         "
9182*67e74705SXin Li                "                \\\n"
9183*67e74705SXin Li                "  int b          = 23;                                         "
9184*67e74705SXin Li                "                \\\n"
9185*67e74705SXin Li                "  int ccc        = 234;                                        "
9186*67e74705SXin Li                "                \\\n"
9187*67e74705SXin Li                "  int dddddddddd = 2345;",
9188*67e74705SXin Li                Alignment);
9189*67e74705SXin Li   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9190*67e74705SXin Li                "k = 4, int l = 5,\n"
9191*67e74705SXin Li                "                  int m = 6) {\n"
9192*67e74705SXin Li                "  int j      = 10;\n"
9193*67e74705SXin Li                "  otherThing = 1;\n"
9194*67e74705SXin Li                "}",
9195*67e74705SXin Li                Alignment);
9196*67e74705SXin Li   verifyFormat("void SomeFunction(int parameter = 0) {\n"
9197*67e74705SXin Li                "  int i   = 1;\n"
9198*67e74705SXin Li                "  int j   = 2;\n"
9199*67e74705SXin Li                "  int big = 10000;\n"
9200*67e74705SXin Li                "}",
9201*67e74705SXin Li                Alignment);
9202*67e74705SXin Li   verifyFormat("class C {\n"
9203*67e74705SXin Li                "public:\n"
9204*67e74705SXin Li                "  int i            = 1;\n"
9205*67e74705SXin Li                "  virtual void f() = 0;\n"
9206*67e74705SXin Li                "};",
9207*67e74705SXin Li                Alignment);
9208*67e74705SXin Li   verifyFormat("int i = 1;\n"
9209*67e74705SXin Li                "if (SomeType t = getSomething()) {\n"
9210*67e74705SXin Li                "}\n"
9211*67e74705SXin Li                "int j   = 2;\n"
9212*67e74705SXin Li                "int big = 10000;",
9213*67e74705SXin Li                Alignment);
9214*67e74705SXin Li   verifyFormat("int j = 7;\n"
9215*67e74705SXin Li                "for (int k = 0; k < N; ++k) {\n"
9216*67e74705SXin Li                "}\n"
9217*67e74705SXin Li                "int j   = 2;\n"
9218*67e74705SXin Li                "int big = 10000;\n"
9219*67e74705SXin Li                "}",
9220*67e74705SXin Li                Alignment);
9221*67e74705SXin Li   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9222*67e74705SXin Li   verifyFormat("int i = 1;\n"
9223*67e74705SXin Li                "LooooooooooongType loooooooooooooooooooooongVariable\n"
9224*67e74705SXin Li                "    = someLooooooooooooooooongFunction();\n"
9225*67e74705SXin Li                "int j = 2;",
9226*67e74705SXin Li                Alignment);
9227*67e74705SXin Li   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9228*67e74705SXin Li   verifyFormat("int i = 1;\n"
9229*67e74705SXin Li                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9230*67e74705SXin Li                "    someLooooooooooooooooongFunction();\n"
9231*67e74705SXin Li                "int j = 2;",
9232*67e74705SXin Li                Alignment);
9233*67e74705SXin Li 
9234*67e74705SXin Li   verifyFormat("auto lambda = []() {\n"
9235*67e74705SXin Li                "  auto i = 0;\n"
9236*67e74705SXin Li                "  return 0;\n"
9237*67e74705SXin Li                "};\n"
9238*67e74705SXin Li                "int i  = 0;\n"
9239*67e74705SXin Li                "auto v = type{\n"
9240*67e74705SXin Li                "    i = 1,   //\n"
9241*67e74705SXin Li                "    (i = 2), //\n"
9242*67e74705SXin Li                "    i = 3    //\n"
9243*67e74705SXin Li                "};",
9244*67e74705SXin Li                Alignment);
9245*67e74705SXin Li 
9246*67e74705SXin Li   // FIXME: Should align all three assignments
9247*67e74705SXin Li   verifyFormat(
9248*67e74705SXin Li       "int i      = 1;\n"
9249*67e74705SXin Li       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9250*67e74705SXin Li       "                          loooooooooooooooooooooongParameterB);\n"
9251*67e74705SXin Li       "int j = 2;",
9252*67e74705SXin Li       Alignment);
9253*67e74705SXin Li 
9254*67e74705SXin Li   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9255*67e74705SXin Li                "          typename B   = very_long_type_name_1,\n"
9256*67e74705SXin Li                "          typename T_2 = very_long_type_name_2>\n"
9257*67e74705SXin Li                "auto foo() {}\n",
9258*67e74705SXin Li                Alignment);
9259*67e74705SXin Li   verifyFormat("int a, b = 1;\n"
9260*67e74705SXin Li                "int c  = 2;\n"
9261*67e74705SXin Li                "int dd = 3;\n",
9262*67e74705SXin Li                Alignment);
9263*67e74705SXin Li   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
9264*67e74705SXin Li                "float b[1][] = {{3.f}};\n",
9265*67e74705SXin Li                Alignment);
9266*67e74705SXin Li }
9267*67e74705SXin Li 
TEST_F(FormatTest,AlignConsecutiveDeclarations)9268*67e74705SXin Li TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9269*67e74705SXin Li   FormatStyle Alignment = getLLVMStyle();
9270*67e74705SXin Li   Alignment.AlignConsecutiveDeclarations = false;
9271*67e74705SXin Li   verifyFormat("float const a = 5;\n"
9272*67e74705SXin Li                "int oneTwoThree = 123;",
9273*67e74705SXin Li                Alignment);
9274*67e74705SXin Li   verifyFormat("int a = 5;\n"
9275*67e74705SXin Li                "float const oneTwoThree = 123;",
9276*67e74705SXin Li                Alignment);
9277*67e74705SXin Li 
9278*67e74705SXin Li   Alignment.AlignConsecutiveDeclarations = true;
9279*67e74705SXin Li   verifyFormat("float const a = 5;\n"
9280*67e74705SXin Li                "int         oneTwoThree = 123;",
9281*67e74705SXin Li                Alignment);
9282*67e74705SXin Li   verifyFormat("int         a = method();\n"
9283*67e74705SXin Li                "float const oneTwoThree = 133;",
9284*67e74705SXin Li                Alignment);
9285*67e74705SXin Li   verifyFormat("int i = 1, j = 10;\n"
9286*67e74705SXin Li                "something = 2000;",
9287*67e74705SXin Li                Alignment);
9288*67e74705SXin Li   verifyFormat("something = 2000;\n"
9289*67e74705SXin Li                "int i = 1, j = 10;\n",
9290*67e74705SXin Li                Alignment);
9291*67e74705SXin Li   verifyFormat("float      something = 2000;\n"
9292*67e74705SXin Li                "double     another = 911;\n"
9293*67e74705SXin Li                "int        i = 1, j = 10;\n"
9294*67e74705SXin Li                "const int *oneMore = 1;\n"
9295*67e74705SXin Li                "unsigned   i = 2;",
9296*67e74705SXin Li                Alignment);
9297*67e74705SXin Li   verifyFormat("float a = 5;\n"
9298*67e74705SXin Li                "int   one = 1;\n"
9299*67e74705SXin Li                "method();\n"
9300*67e74705SXin Li                "const double       oneTwoThree = 123;\n"
9301*67e74705SXin Li                "const unsigned int oneTwo = 12;",
9302*67e74705SXin Li                Alignment);
9303*67e74705SXin Li   verifyFormat("int      oneTwoThree{0}; // comment\n"
9304*67e74705SXin Li                "unsigned oneTwo;         // comment",
9305*67e74705SXin Li                Alignment);
9306*67e74705SXin Li   EXPECT_EQ("float const a = 5;\n"
9307*67e74705SXin Li             "\n"
9308*67e74705SXin Li             "int oneTwoThree = 123;",
9309*67e74705SXin Li             format("float const   a = 5;\n"
9310*67e74705SXin Li                    "\n"
9311*67e74705SXin Li                    "int           oneTwoThree= 123;",
9312*67e74705SXin Li                    Alignment));
9313*67e74705SXin Li   EXPECT_EQ("float a = 5;\n"
9314*67e74705SXin Li             "int   one = 1;\n"
9315*67e74705SXin Li             "\n"
9316*67e74705SXin Li             "unsigned oneTwoThree = 123;",
9317*67e74705SXin Li             format("float    a = 5;\n"
9318*67e74705SXin Li                    "int      one = 1;\n"
9319*67e74705SXin Li                    "\n"
9320*67e74705SXin Li                    "unsigned oneTwoThree = 123;",
9321*67e74705SXin Li                    Alignment));
9322*67e74705SXin Li   EXPECT_EQ("float a = 5;\n"
9323*67e74705SXin Li             "int   one = 1;\n"
9324*67e74705SXin Li             "\n"
9325*67e74705SXin Li             "unsigned oneTwoThree = 123;\n"
9326*67e74705SXin Li             "int      oneTwo = 12;",
9327*67e74705SXin Li             format("float    a = 5;\n"
9328*67e74705SXin Li                    "int one = 1;\n"
9329*67e74705SXin Li                    "\n"
9330*67e74705SXin Li                    "unsigned oneTwoThree = 123;\n"
9331*67e74705SXin Li                    "int oneTwo = 12;",
9332*67e74705SXin Li                    Alignment));
9333*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = true;
9334*67e74705SXin Li   verifyFormat("float      something = 2000;\n"
9335*67e74705SXin Li                "double     another   = 911;\n"
9336*67e74705SXin Li                "int        i = 1, j = 10;\n"
9337*67e74705SXin Li                "const int *oneMore = 1;\n"
9338*67e74705SXin Li                "unsigned   i       = 2;",
9339*67e74705SXin Li                Alignment);
9340*67e74705SXin Li   verifyFormat("int      oneTwoThree = {0}; // comment\n"
9341*67e74705SXin Li                "unsigned oneTwo      = 0;   // comment",
9342*67e74705SXin Li                Alignment);
9343*67e74705SXin Li   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9344*67e74705SXin Li             "  int const i   = 1;\n"
9345*67e74705SXin Li             "  int *     j   = 2;\n"
9346*67e74705SXin Li             "  int       big = 10000;\n"
9347*67e74705SXin Li             "\n"
9348*67e74705SXin Li             "  unsigned oneTwoThree = 123;\n"
9349*67e74705SXin Li             "  int      oneTwo      = 12;\n"
9350*67e74705SXin Li             "  method();\n"
9351*67e74705SXin Li             "  float k  = 2;\n"
9352*67e74705SXin Li             "  int   ll = 10000;\n"
9353*67e74705SXin Li             "}",
9354*67e74705SXin Li             format("void SomeFunction(int parameter= 0) {\n"
9355*67e74705SXin Li                    " int const  i= 1;\n"
9356*67e74705SXin Li                    "  int *j=2;\n"
9357*67e74705SXin Li                    " int big  =  10000;\n"
9358*67e74705SXin Li                    "\n"
9359*67e74705SXin Li                    "unsigned oneTwoThree  =123;\n"
9360*67e74705SXin Li                    "int oneTwo = 12;\n"
9361*67e74705SXin Li                    "  method();\n"
9362*67e74705SXin Li                    "float k= 2;\n"
9363*67e74705SXin Li                    "int ll=10000;\n"
9364*67e74705SXin Li                    "}",
9365*67e74705SXin Li                    Alignment));
9366*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = false;
9367*67e74705SXin Li   Alignment.AlignEscapedNewlinesLeft = true;
9368*67e74705SXin Li   verifyFormat("#define A              \\\n"
9369*67e74705SXin Li                "  int       aaaa = 12; \\\n"
9370*67e74705SXin Li                "  float     b = 23;    \\\n"
9371*67e74705SXin Li                "  const int ccc = 234; \\\n"
9372*67e74705SXin Li                "  unsigned  dddddddddd = 2345;",
9373*67e74705SXin Li                Alignment);
9374*67e74705SXin Li   Alignment.AlignEscapedNewlinesLeft = false;
9375*67e74705SXin Li   Alignment.ColumnLimit = 30;
9376*67e74705SXin Li   verifyFormat("#define A                    \\\n"
9377*67e74705SXin Li                "  int       aaaa = 12;       \\\n"
9378*67e74705SXin Li                "  float     b = 23;          \\\n"
9379*67e74705SXin Li                "  const int ccc = 234;       \\\n"
9380*67e74705SXin Li                "  int       dddddddddd = 2345;",
9381*67e74705SXin Li                Alignment);
9382*67e74705SXin Li   Alignment.ColumnLimit = 80;
9383*67e74705SXin Li   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9384*67e74705SXin Li                "k = 4, int l = 5,\n"
9385*67e74705SXin Li                "                  int m = 6) {\n"
9386*67e74705SXin Li                "  const int j = 10;\n"
9387*67e74705SXin Li                "  otherThing = 1;\n"
9388*67e74705SXin Li                "}",
9389*67e74705SXin Li                Alignment);
9390*67e74705SXin Li   verifyFormat("void SomeFunction(int parameter = 0) {\n"
9391*67e74705SXin Li                "  int const i = 1;\n"
9392*67e74705SXin Li                "  int *     j = 2;\n"
9393*67e74705SXin Li                "  int       big = 10000;\n"
9394*67e74705SXin Li                "}",
9395*67e74705SXin Li                Alignment);
9396*67e74705SXin Li   verifyFormat("class C {\n"
9397*67e74705SXin Li                "public:\n"
9398*67e74705SXin Li                "  int          i = 1;\n"
9399*67e74705SXin Li                "  virtual void f() = 0;\n"
9400*67e74705SXin Li                "};",
9401*67e74705SXin Li                Alignment);
9402*67e74705SXin Li   verifyFormat("float i = 1;\n"
9403*67e74705SXin Li                "if (SomeType t = getSomething()) {\n"
9404*67e74705SXin Li                "}\n"
9405*67e74705SXin Li                "const unsigned j = 2;\n"
9406*67e74705SXin Li                "int            big = 10000;",
9407*67e74705SXin Li                Alignment);
9408*67e74705SXin Li   verifyFormat("float j = 7;\n"
9409*67e74705SXin Li                "for (int k = 0; k < N; ++k) {\n"
9410*67e74705SXin Li                "}\n"
9411*67e74705SXin Li                "unsigned j = 2;\n"
9412*67e74705SXin Li                "int      big = 10000;\n"
9413*67e74705SXin Li                "}",
9414*67e74705SXin Li                Alignment);
9415*67e74705SXin Li   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9416*67e74705SXin Li   verifyFormat("float              i = 1;\n"
9417*67e74705SXin Li                "LooooooooooongType loooooooooooooooooooooongVariable\n"
9418*67e74705SXin Li                "    = someLooooooooooooooooongFunction();\n"
9419*67e74705SXin Li                "int j = 2;",
9420*67e74705SXin Li                Alignment);
9421*67e74705SXin Li   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9422*67e74705SXin Li   verifyFormat("int                i = 1;\n"
9423*67e74705SXin Li                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9424*67e74705SXin Li                "    someLooooooooooooooooongFunction();\n"
9425*67e74705SXin Li                "int j = 2;",
9426*67e74705SXin Li                Alignment);
9427*67e74705SXin Li 
9428*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = true;
9429*67e74705SXin Li   verifyFormat("auto lambda = []() {\n"
9430*67e74705SXin Li                "  auto  ii = 0;\n"
9431*67e74705SXin Li                "  float j  = 0;\n"
9432*67e74705SXin Li                "  return 0;\n"
9433*67e74705SXin Li                "};\n"
9434*67e74705SXin Li                "int   i  = 0;\n"
9435*67e74705SXin Li                "float i2 = 0;\n"
9436*67e74705SXin Li                "auto  v  = type{\n"
9437*67e74705SXin Li                "    i = 1,   //\n"
9438*67e74705SXin Li                "    (i = 2), //\n"
9439*67e74705SXin Li                "    i = 3    //\n"
9440*67e74705SXin Li                "};",
9441*67e74705SXin Li                Alignment);
9442*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = false;
9443*67e74705SXin Li 
9444*67e74705SXin Li   // FIXME: Should align all three declarations
9445*67e74705SXin Li   verifyFormat(
9446*67e74705SXin Li       "int      i = 1;\n"
9447*67e74705SXin Li       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9448*67e74705SXin Li       "                          loooooooooooooooooooooongParameterB);\n"
9449*67e74705SXin Li       "int j = 2;",
9450*67e74705SXin Li       Alignment);
9451*67e74705SXin Li 
9452*67e74705SXin Li   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9453*67e74705SXin Li   // We expect declarations and assignments to align, as long as it doesn't
9454*67e74705SXin Li   // exceed the column limit, starting a new alignemnt sequence whenever it
9455*67e74705SXin Li   // happens.
9456*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = true;
9457*67e74705SXin Li   Alignment.ColumnLimit = 30;
9458*67e74705SXin Li   verifyFormat("float    ii              = 1;\n"
9459*67e74705SXin Li                "unsigned j               = 2;\n"
9460*67e74705SXin Li                "int someVerylongVariable = 1;\n"
9461*67e74705SXin Li                "AnotherLongType  ll = 123456;\n"
9462*67e74705SXin Li                "VeryVeryLongType k  = 2;\n"
9463*67e74705SXin Li                "int              myvar = 1;",
9464*67e74705SXin Li                Alignment);
9465*67e74705SXin Li   Alignment.ColumnLimit = 80;
9466*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = false;
9467*67e74705SXin Li 
9468*67e74705SXin Li   verifyFormat(
9469*67e74705SXin Li       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9470*67e74705SXin Li       "          typename LongType, typename B>\n"
9471*67e74705SXin Li       "auto foo() {}\n",
9472*67e74705SXin Li       Alignment);
9473*67e74705SXin Li   verifyFormat("float a, b = 1;\n"
9474*67e74705SXin Li                "int   c = 2;\n"
9475*67e74705SXin Li                "int   dd = 3;\n",
9476*67e74705SXin Li                Alignment);
9477*67e74705SXin Li   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
9478*67e74705SXin Li                "float b[1][] = {{3.f}};\n",
9479*67e74705SXin Li                Alignment);
9480*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = true;
9481*67e74705SXin Li   verifyFormat("float a, b = 1;\n"
9482*67e74705SXin Li                "int   c  = 2;\n"
9483*67e74705SXin Li                "int   dd = 3;\n",
9484*67e74705SXin Li                Alignment);
9485*67e74705SXin Li   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
9486*67e74705SXin Li                "float b[1][] = {{3.f}};\n",
9487*67e74705SXin Li                Alignment);
9488*67e74705SXin Li   Alignment.AlignConsecutiveAssignments = false;
9489*67e74705SXin Li 
9490*67e74705SXin Li   Alignment.ColumnLimit = 30;
9491*67e74705SXin Li   Alignment.BinPackParameters = false;
9492*67e74705SXin Li   verifyFormat("void foo(float     a,\n"
9493*67e74705SXin Li                "         float     b,\n"
9494*67e74705SXin Li                "         int       c,\n"
9495*67e74705SXin Li                "         uint32_t *d) {\n"
9496*67e74705SXin Li                "  int *  e = 0;\n"
9497*67e74705SXin Li                "  float  f = 0;\n"
9498*67e74705SXin Li                "  double g = 0;\n"
9499*67e74705SXin Li                "}\n"
9500*67e74705SXin Li                "void bar(ino_t     a,\n"
9501*67e74705SXin Li                "         int       b,\n"
9502*67e74705SXin Li                "         uint32_t *c,\n"
9503*67e74705SXin Li                "         bool      d) {}\n",
9504*67e74705SXin Li                Alignment);
9505*67e74705SXin Li   Alignment.BinPackParameters = true;
9506*67e74705SXin Li   Alignment.ColumnLimit = 80;
9507*67e74705SXin Li }
9508*67e74705SXin Li 
TEST_F(FormatTest,LinuxBraceBreaking)9509*67e74705SXin Li TEST_F(FormatTest, LinuxBraceBreaking) {
9510*67e74705SXin Li   FormatStyle LinuxBraceStyle = getLLVMStyle();
9511*67e74705SXin Li   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
9512*67e74705SXin Li   verifyFormat("namespace a\n"
9513*67e74705SXin Li                "{\n"
9514*67e74705SXin Li                "class A\n"
9515*67e74705SXin Li                "{\n"
9516*67e74705SXin Li                "  void f()\n"
9517*67e74705SXin Li                "  {\n"
9518*67e74705SXin Li                "    if (true) {\n"
9519*67e74705SXin Li                "      a();\n"
9520*67e74705SXin Li                "      b();\n"
9521*67e74705SXin Li                "    } else {\n"
9522*67e74705SXin Li                "      a();\n"
9523*67e74705SXin Li                "    }\n"
9524*67e74705SXin Li                "  }\n"
9525*67e74705SXin Li                "  void g() { return; }\n"
9526*67e74705SXin Li                "};\n"
9527*67e74705SXin Li                "struct B {\n"
9528*67e74705SXin Li                "  int x;\n"
9529*67e74705SXin Li                "};\n"
9530*67e74705SXin Li                "}\n",
9531*67e74705SXin Li                LinuxBraceStyle);
9532*67e74705SXin Li   verifyFormat("enum X {\n"
9533*67e74705SXin Li                "  Y = 0,\n"
9534*67e74705SXin Li                "}\n",
9535*67e74705SXin Li                LinuxBraceStyle);
9536*67e74705SXin Li   verifyFormat("struct S {\n"
9537*67e74705SXin Li                "  int Type;\n"
9538*67e74705SXin Li                "  union {\n"
9539*67e74705SXin Li                "    int x;\n"
9540*67e74705SXin Li                "    double y;\n"
9541*67e74705SXin Li                "  } Value;\n"
9542*67e74705SXin Li                "  class C\n"
9543*67e74705SXin Li                "  {\n"
9544*67e74705SXin Li                "    MyFavoriteType Value;\n"
9545*67e74705SXin Li                "  } Class;\n"
9546*67e74705SXin Li                "}\n",
9547*67e74705SXin Li                LinuxBraceStyle);
9548*67e74705SXin Li }
9549*67e74705SXin Li 
TEST_F(FormatTest,MozillaBraceBreaking)9550*67e74705SXin Li TEST_F(FormatTest, MozillaBraceBreaking) {
9551*67e74705SXin Li   FormatStyle MozillaBraceStyle = getLLVMStyle();
9552*67e74705SXin Li   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9553*67e74705SXin Li   verifyFormat("namespace a {\n"
9554*67e74705SXin Li                "class A\n"
9555*67e74705SXin Li                "{\n"
9556*67e74705SXin Li                "  void f()\n"
9557*67e74705SXin Li                "  {\n"
9558*67e74705SXin Li                "    if (true) {\n"
9559*67e74705SXin Li                "      a();\n"
9560*67e74705SXin Li                "      b();\n"
9561*67e74705SXin Li                "    }\n"
9562*67e74705SXin Li                "  }\n"
9563*67e74705SXin Li                "  void g() { return; }\n"
9564*67e74705SXin Li                "};\n"
9565*67e74705SXin Li                "enum E\n"
9566*67e74705SXin Li                "{\n"
9567*67e74705SXin Li                "  A,\n"
9568*67e74705SXin Li                "  // foo\n"
9569*67e74705SXin Li                "  B,\n"
9570*67e74705SXin Li                "  C\n"
9571*67e74705SXin Li                "};\n"
9572*67e74705SXin Li                "struct B\n"
9573*67e74705SXin Li                "{\n"
9574*67e74705SXin Li                "  int x;\n"
9575*67e74705SXin Li                "};\n"
9576*67e74705SXin Li                "}\n",
9577*67e74705SXin Li                MozillaBraceStyle);
9578*67e74705SXin Li   verifyFormat("struct S\n"
9579*67e74705SXin Li                "{\n"
9580*67e74705SXin Li                "  int Type;\n"
9581*67e74705SXin Li                "  union\n"
9582*67e74705SXin Li                "  {\n"
9583*67e74705SXin Li                "    int x;\n"
9584*67e74705SXin Li                "    double y;\n"
9585*67e74705SXin Li                "  } Value;\n"
9586*67e74705SXin Li                "  class C\n"
9587*67e74705SXin Li                "  {\n"
9588*67e74705SXin Li                "    MyFavoriteType Value;\n"
9589*67e74705SXin Li                "  } Class;\n"
9590*67e74705SXin Li                "}\n",
9591*67e74705SXin Li                MozillaBraceStyle);
9592*67e74705SXin Li }
9593*67e74705SXin Li 
TEST_F(FormatTest,StroustrupBraceBreaking)9594*67e74705SXin Li TEST_F(FormatTest, StroustrupBraceBreaking) {
9595*67e74705SXin Li   FormatStyle StroustrupBraceStyle = getLLVMStyle();
9596*67e74705SXin Li   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9597*67e74705SXin Li   verifyFormat("namespace a {\n"
9598*67e74705SXin Li                "class A {\n"
9599*67e74705SXin Li                "  void f()\n"
9600*67e74705SXin Li                "  {\n"
9601*67e74705SXin Li                "    if (true) {\n"
9602*67e74705SXin Li                "      a();\n"
9603*67e74705SXin Li                "      b();\n"
9604*67e74705SXin Li                "    }\n"
9605*67e74705SXin Li                "  }\n"
9606*67e74705SXin Li                "  void g() { return; }\n"
9607*67e74705SXin Li                "};\n"
9608*67e74705SXin Li                "struct B {\n"
9609*67e74705SXin Li                "  int x;\n"
9610*67e74705SXin Li                "};\n"
9611*67e74705SXin Li                "}\n",
9612*67e74705SXin Li                StroustrupBraceStyle);
9613*67e74705SXin Li 
9614*67e74705SXin Li   verifyFormat("void foo()\n"
9615*67e74705SXin Li                "{\n"
9616*67e74705SXin Li                "  if (a) {\n"
9617*67e74705SXin Li                "    a();\n"
9618*67e74705SXin Li                "  }\n"
9619*67e74705SXin Li                "  else {\n"
9620*67e74705SXin Li                "    b();\n"
9621*67e74705SXin Li                "  }\n"
9622*67e74705SXin Li                "}\n",
9623*67e74705SXin Li                StroustrupBraceStyle);
9624*67e74705SXin Li 
9625*67e74705SXin Li   verifyFormat("#ifdef _DEBUG\n"
9626*67e74705SXin Li                "int foo(int i = 0)\n"
9627*67e74705SXin Li                "#else\n"
9628*67e74705SXin Li                "int foo(int i = 5)\n"
9629*67e74705SXin Li                "#endif\n"
9630*67e74705SXin Li                "{\n"
9631*67e74705SXin Li                "  return i;\n"
9632*67e74705SXin Li                "}",
9633*67e74705SXin Li                StroustrupBraceStyle);
9634*67e74705SXin Li 
9635*67e74705SXin Li   verifyFormat("void foo() {}\n"
9636*67e74705SXin Li                "void bar()\n"
9637*67e74705SXin Li                "#ifdef _DEBUG\n"
9638*67e74705SXin Li                "{\n"
9639*67e74705SXin Li                "  foo();\n"
9640*67e74705SXin Li                "}\n"
9641*67e74705SXin Li                "#else\n"
9642*67e74705SXin Li                "{\n"
9643*67e74705SXin Li                "}\n"
9644*67e74705SXin Li                "#endif",
9645*67e74705SXin Li                StroustrupBraceStyle);
9646*67e74705SXin Li 
9647*67e74705SXin Li   verifyFormat("void foobar() { int i = 5; }\n"
9648*67e74705SXin Li                "#ifdef _DEBUG\n"
9649*67e74705SXin Li                "void bar() {}\n"
9650*67e74705SXin Li                "#else\n"
9651*67e74705SXin Li                "void bar() { foobar(); }\n"
9652*67e74705SXin Li                "#endif",
9653*67e74705SXin Li                StroustrupBraceStyle);
9654*67e74705SXin Li }
9655*67e74705SXin Li 
TEST_F(FormatTest,AllmanBraceBreaking)9656*67e74705SXin Li TEST_F(FormatTest, AllmanBraceBreaking) {
9657*67e74705SXin Li   FormatStyle AllmanBraceStyle = getLLVMStyle();
9658*67e74705SXin Li   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
9659*67e74705SXin Li   verifyFormat("namespace a\n"
9660*67e74705SXin Li                "{\n"
9661*67e74705SXin Li                "class A\n"
9662*67e74705SXin Li                "{\n"
9663*67e74705SXin Li                "  void f()\n"
9664*67e74705SXin Li                "  {\n"
9665*67e74705SXin Li                "    if (true)\n"
9666*67e74705SXin Li                "    {\n"
9667*67e74705SXin Li                "      a();\n"
9668*67e74705SXin Li                "      b();\n"
9669*67e74705SXin Li                "    }\n"
9670*67e74705SXin Li                "  }\n"
9671*67e74705SXin Li                "  void g() { return; }\n"
9672*67e74705SXin Li                "};\n"
9673*67e74705SXin Li                "struct B\n"
9674*67e74705SXin Li                "{\n"
9675*67e74705SXin Li                "  int x;\n"
9676*67e74705SXin Li                "};\n"
9677*67e74705SXin Li                "}",
9678*67e74705SXin Li                AllmanBraceStyle);
9679*67e74705SXin Li 
9680*67e74705SXin Li   verifyFormat("void f()\n"
9681*67e74705SXin Li                "{\n"
9682*67e74705SXin Li                "  if (true)\n"
9683*67e74705SXin Li                "  {\n"
9684*67e74705SXin Li                "    a();\n"
9685*67e74705SXin Li                "  }\n"
9686*67e74705SXin Li                "  else if (false)\n"
9687*67e74705SXin Li                "  {\n"
9688*67e74705SXin Li                "    b();\n"
9689*67e74705SXin Li                "  }\n"
9690*67e74705SXin Li                "  else\n"
9691*67e74705SXin Li                "  {\n"
9692*67e74705SXin Li                "    c();\n"
9693*67e74705SXin Li                "  }\n"
9694*67e74705SXin Li                "}\n",
9695*67e74705SXin Li                AllmanBraceStyle);
9696*67e74705SXin Li 
9697*67e74705SXin Li   verifyFormat("void f()\n"
9698*67e74705SXin Li                "{\n"
9699*67e74705SXin Li                "  for (int i = 0; i < 10; ++i)\n"
9700*67e74705SXin Li                "  {\n"
9701*67e74705SXin Li                "    a();\n"
9702*67e74705SXin Li                "  }\n"
9703*67e74705SXin Li                "  while (false)\n"
9704*67e74705SXin Li                "  {\n"
9705*67e74705SXin Li                "    b();\n"
9706*67e74705SXin Li                "  }\n"
9707*67e74705SXin Li                "  do\n"
9708*67e74705SXin Li                "  {\n"
9709*67e74705SXin Li                "    c();\n"
9710*67e74705SXin Li                "  } while (false)\n"
9711*67e74705SXin Li                "}\n",
9712*67e74705SXin Li                AllmanBraceStyle);
9713*67e74705SXin Li 
9714*67e74705SXin Li   verifyFormat("void f(int a)\n"
9715*67e74705SXin Li                "{\n"
9716*67e74705SXin Li                "  switch (a)\n"
9717*67e74705SXin Li                "  {\n"
9718*67e74705SXin Li                "  case 0:\n"
9719*67e74705SXin Li                "    break;\n"
9720*67e74705SXin Li                "  case 1:\n"
9721*67e74705SXin Li                "  {\n"
9722*67e74705SXin Li                "    break;\n"
9723*67e74705SXin Li                "  }\n"
9724*67e74705SXin Li                "  case 2:\n"
9725*67e74705SXin Li                "  {\n"
9726*67e74705SXin Li                "  }\n"
9727*67e74705SXin Li                "  break;\n"
9728*67e74705SXin Li                "  default:\n"
9729*67e74705SXin Li                "    break;\n"
9730*67e74705SXin Li                "  }\n"
9731*67e74705SXin Li                "}\n",
9732*67e74705SXin Li                AllmanBraceStyle);
9733*67e74705SXin Li 
9734*67e74705SXin Li   verifyFormat("enum X\n"
9735*67e74705SXin Li                "{\n"
9736*67e74705SXin Li                "  Y = 0,\n"
9737*67e74705SXin Li                "}\n",
9738*67e74705SXin Li                AllmanBraceStyle);
9739*67e74705SXin Li   verifyFormat("enum X\n"
9740*67e74705SXin Li                "{\n"
9741*67e74705SXin Li                "  Y = 0\n"
9742*67e74705SXin Li                "}\n",
9743*67e74705SXin Li                AllmanBraceStyle);
9744*67e74705SXin Li 
9745*67e74705SXin Li   verifyFormat("@interface BSApplicationController ()\n"
9746*67e74705SXin Li                "{\n"
9747*67e74705SXin Li                "@private\n"
9748*67e74705SXin Li                "  id _extraIvar;\n"
9749*67e74705SXin Li                "}\n"
9750*67e74705SXin Li                "@end\n",
9751*67e74705SXin Li                AllmanBraceStyle);
9752*67e74705SXin Li 
9753*67e74705SXin Li   verifyFormat("#ifdef _DEBUG\n"
9754*67e74705SXin Li                "int foo(int i = 0)\n"
9755*67e74705SXin Li                "#else\n"
9756*67e74705SXin Li                "int foo(int i = 5)\n"
9757*67e74705SXin Li                "#endif\n"
9758*67e74705SXin Li                "{\n"
9759*67e74705SXin Li                "  return i;\n"
9760*67e74705SXin Li                "}",
9761*67e74705SXin Li                AllmanBraceStyle);
9762*67e74705SXin Li 
9763*67e74705SXin Li   verifyFormat("void foo() {}\n"
9764*67e74705SXin Li                "void bar()\n"
9765*67e74705SXin Li                "#ifdef _DEBUG\n"
9766*67e74705SXin Li                "{\n"
9767*67e74705SXin Li                "  foo();\n"
9768*67e74705SXin Li                "}\n"
9769*67e74705SXin Li                "#else\n"
9770*67e74705SXin Li                "{\n"
9771*67e74705SXin Li                "}\n"
9772*67e74705SXin Li                "#endif",
9773*67e74705SXin Li                AllmanBraceStyle);
9774*67e74705SXin Li 
9775*67e74705SXin Li   verifyFormat("void foobar() { int i = 5; }\n"
9776*67e74705SXin Li                "#ifdef _DEBUG\n"
9777*67e74705SXin Li                "void bar() {}\n"
9778*67e74705SXin Li                "#else\n"
9779*67e74705SXin Li                "void bar() { foobar(); }\n"
9780*67e74705SXin Li                "#endif",
9781*67e74705SXin Li                AllmanBraceStyle);
9782*67e74705SXin Li 
9783*67e74705SXin Li   // This shouldn't affect ObjC blocks..
9784*67e74705SXin Li   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
9785*67e74705SXin Li                "  // ...\n"
9786*67e74705SXin Li                "  int i;\n"
9787*67e74705SXin Li                "}];",
9788*67e74705SXin Li                AllmanBraceStyle);
9789*67e74705SXin Li   verifyFormat("void (^block)(void) = ^{\n"
9790*67e74705SXin Li                "  // ...\n"
9791*67e74705SXin Li                "  int i;\n"
9792*67e74705SXin Li                "};",
9793*67e74705SXin Li                AllmanBraceStyle);
9794*67e74705SXin Li   // .. or dict literals.
9795*67e74705SXin Li   verifyFormat("void f()\n"
9796*67e74705SXin Li                "{\n"
9797*67e74705SXin Li                "  [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9798*67e74705SXin Li                "}",
9799*67e74705SXin Li                AllmanBraceStyle);
9800*67e74705SXin Li   verifyFormat("int f()\n"
9801*67e74705SXin Li                "{ // comment\n"
9802*67e74705SXin Li                "  return 42;\n"
9803*67e74705SXin Li                "}",
9804*67e74705SXin Li                AllmanBraceStyle);
9805*67e74705SXin Li 
9806*67e74705SXin Li   AllmanBraceStyle.ColumnLimit = 19;
9807*67e74705SXin Li   verifyFormat("void f() { int i; }", AllmanBraceStyle);
9808*67e74705SXin Li   AllmanBraceStyle.ColumnLimit = 18;
9809*67e74705SXin Li   verifyFormat("void f()\n"
9810*67e74705SXin Li                "{\n"
9811*67e74705SXin Li                "  int i;\n"
9812*67e74705SXin Li                "}",
9813*67e74705SXin Li                AllmanBraceStyle);
9814*67e74705SXin Li   AllmanBraceStyle.ColumnLimit = 80;
9815*67e74705SXin Li 
9816*67e74705SXin Li   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
9817*67e74705SXin Li   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9818*67e74705SXin Li   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9819*67e74705SXin Li   verifyFormat("void f(bool b)\n"
9820*67e74705SXin Li                "{\n"
9821*67e74705SXin Li                "  if (b)\n"
9822*67e74705SXin Li                "  {\n"
9823*67e74705SXin Li                "    return;\n"
9824*67e74705SXin Li                "  }\n"
9825*67e74705SXin Li                "}\n",
9826*67e74705SXin Li                BreakBeforeBraceShortIfs);
9827*67e74705SXin Li   verifyFormat("void f(bool b)\n"
9828*67e74705SXin Li                "{\n"
9829*67e74705SXin Li                "  if (b) return;\n"
9830*67e74705SXin Li                "}\n",
9831*67e74705SXin Li                BreakBeforeBraceShortIfs);
9832*67e74705SXin Li   verifyFormat("void f(bool b)\n"
9833*67e74705SXin Li                "{\n"
9834*67e74705SXin Li                "  while (b)\n"
9835*67e74705SXin Li                "  {\n"
9836*67e74705SXin Li                "    return;\n"
9837*67e74705SXin Li                "  }\n"
9838*67e74705SXin Li                "}\n",
9839*67e74705SXin Li                BreakBeforeBraceShortIfs);
9840*67e74705SXin Li }
9841*67e74705SXin Li 
TEST_F(FormatTest,GNUBraceBreaking)9842*67e74705SXin Li TEST_F(FormatTest, GNUBraceBreaking) {
9843*67e74705SXin Li   FormatStyle GNUBraceStyle = getLLVMStyle();
9844*67e74705SXin Li   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9845*67e74705SXin Li   verifyFormat("namespace a\n"
9846*67e74705SXin Li                "{\n"
9847*67e74705SXin Li                "class A\n"
9848*67e74705SXin Li                "{\n"
9849*67e74705SXin Li                "  void f()\n"
9850*67e74705SXin Li                "  {\n"
9851*67e74705SXin Li                "    int a;\n"
9852*67e74705SXin Li                "    {\n"
9853*67e74705SXin Li                "      int b;\n"
9854*67e74705SXin Li                "    }\n"
9855*67e74705SXin Li                "    if (true)\n"
9856*67e74705SXin Li                "      {\n"
9857*67e74705SXin Li                "        a();\n"
9858*67e74705SXin Li                "        b();\n"
9859*67e74705SXin Li                "      }\n"
9860*67e74705SXin Li                "  }\n"
9861*67e74705SXin Li                "  void g() { return; }\n"
9862*67e74705SXin Li                "}\n"
9863*67e74705SXin Li                "}",
9864*67e74705SXin Li                GNUBraceStyle);
9865*67e74705SXin Li 
9866*67e74705SXin Li   verifyFormat("void f()\n"
9867*67e74705SXin Li                "{\n"
9868*67e74705SXin Li                "  if (true)\n"
9869*67e74705SXin Li                "    {\n"
9870*67e74705SXin Li                "      a();\n"
9871*67e74705SXin Li                "    }\n"
9872*67e74705SXin Li                "  else if (false)\n"
9873*67e74705SXin Li                "    {\n"
9874*67e74705SXin Li                "      b();\n"
9875*67e74705SXin Li                "    }\n"
9876*67e74705SXin Li                "  else\n"
9877*67e74705SXin Li                "    {\n"
9878*67e74705SXin Li                "      c();\n"
9879*67e74705SXin Li                "    }\n"
9880*67e74705SXin Li                "}\n",
9881*67e74705SXin Li                GNUBraceStyle);
9882*67e74705SXin Li 
9883*67e74705SXin Li   verifyFormat("void f()\n"
9884*67e74705SXin Li                "{\n"
9885*67e74705SXin Li                "  for (int i = 0; i < 10; ++i)\n"
9886*67e74705SXin Li                "    {\n"
9887*67e74705SXin Li                "      a();\n"
9888*67e74705SXin Li                "    }\n"
9889*67e74705SXin Li                "  while (false)\n"
9890*67e74705SXin Li                "    {\n"
9891*67e74705SXin Li                "      b();\n"
9892*67e74705SXin Li                "    }\n"
9893*67e74705SXin Li                "  do\n"
9894*67e74705SXin Li                "    {\n"
9895*67e74705SXin Li                "      c();\n"
9896*67e74705SXin Li                "    }\n"
9897*67e74705SXin Li                "  while (false);\n"
9898*67e74705SXin Li                "}\n",
9899*67e74705SXin Li                GNUBraceStyle);
9900*67e74705SXin Li 
9901*67e74705SXin Li   verifyFormat("void f(int a)\n"
9902*67e74705SXin Li                "{\n"
9903*67e74705SXin Li                "  switch (a)\n"
9904*67e74705SXin Li                "    {\n"
9905*67e74705SXin Li                "    case 0:\n"
9906*67e74705SXin Li                "      break;\n"
9907*67e74705SXin Li                "    case 1:\n"
9908*67e74705SXin Li                "      {\n"
9909*67e74705SXin Li                "        break;\n"
9910*67e74705SXin Li                "      }\n"
9911*67e74705SXin Li                "    case 2:\n"
9912*67e74705SXin Li                "      {\n"
9913*67e74705SXin Li                "      }\n"
9914*67e74705SXin Li                "      break;\n"
9915*67e74705SXin Li                "    default:\n"
9916*67e74705SXin Li                "      break;\n"
9917*67e74705SXin Li                "    }\n"
9918*67e74705SXin Li                "}\n",
9919*67e74705SXin Li                GNUBraceStyle);
9920*67e74705SXin Li 
9921*67e74705SXin Li   verifyFormat("enum X\n"
9922*67e74705SXin Li                "{\n"
9923*67e74705SXin Li                "  Y = 0,\n"
9924*67e74705SXin Li                "}\n",
9925*67e74705SXin Li                GNUBraceStyle);
9926*67e74705SXin Li 
9927*67e74705SXin Li   verifyFormat("@interface BSApplicationController ()\n"
9928*67e74705SXin Li                "{\n"
9929*67e74705SXin Li                "@private\n"
9930*67e74705SXin Li                "  id _extraIvar;\n"
9931*67e74705SXin Li                "}\n"
9932*67e74705SXin Li                "@end\n",
9933*67e74705SXin Li                GNUBraceStyle);
9934*67e74705SXin Li 
9935*67e74705SXin Li   verifyFormat("#ifdef _DEBUG\n"
9936*67e74705SXin Li                "int foo(int i = 0)\n"
9937*67e74705SXin Li                "#else\n"
9938*67e74705SXin Li                "int foo(int i = 5)\n"
9939*67e74705SXin Li                "#endif\n"
9940*67e74705SXin Li                "{\n"
9941*67e74705SXin Li                "  return i;\n"
9942*67e74705SXin Li                "}",
9943*67e74705SXin Li                GNUBraceStyle);
9944*67e74705SXin Li 
9945*67e74705SXin Li   verifyFormat("void foo() {}\n"
9946*67e74705SXin Li                "void bar()\n"
9947*67e74705SXin Li                "#ifdef _DEBUG\n"
9948*67e74705SXin Li                "{\n"
9949*67e74705SXin Li                "  foo();\n"
9950*67e74705SXin Li                "}\n"
9951*67e74705SXin Li                "#else\n"
9952*67e74705SXin Li                "{\n"
9953*67e74705SXin Li                "}\n"
9954*67e74705SXin Li                "#endif",
9955*67e74705SXin Li                GNUBraceStyle);
9956*67e74705SXin Li 
9957*67e74705SXin Li   verifyFormat("void foobar() { int i = 5; }\n"
9958*67e74705SXin Li                "#ifdef _DEBUG\n"
9959*67e74705SXin Li                "void bar() {}\n"
9960*67e74705SXin Li                "#else\n"
9961*67e74705SXin Li                "void bar() { foobar(); }\n"
9962*67e74705SXin Li                "#endif",
9963*67e74705SXin Li                GNUBraceStyle);
9964*67e74705SXin Li }
9965*67e74705SXin Li 
TEST_F(FormatTest,WebKitBraceBreaking)9966*67e74705SXin Li TEST_F(FormatTest, WebKitBraceBreaking) {
9967*67e74705SXin Li   FormatStyle WebKitBraceStyle = getLLVMStyle();
9968*67e74705SXin Li   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9969*67e74705SXin Li   verifyFormat("namespace a {\n"
9970*67e74705SXin Li                "class A {\n"
9971*67e74705SXin Li                "  void f()\n"
9972*67e74705SXin Li                "  {\n"
9973*67e74705SXin Li                "    if (true) {\n"
9974*67e74705SXin Li                "      a();\n"
9975*67e74705SXin Li                "      b();\n"
9976*67e74705SXin Li                "    }\n"
9977*67e74705SXin Li                "  }\n"
9978*67e74705SXin Li                "  void g() { return; }\n"
9979*67e74705SXin Li                "};\n"
9980*67e74705SXin Li                "enum E {\n"
9981*67e74705SXin Li                "  A,\n"
9982*67e74705SXin Li                "  // foo\n"
9983*67e74705SXin Li                "  B,\n"
9984*67e74705SXin Li                "  C\n"
9985*67e74705SXin Li                "};\n"
9986*67e74705SXin Li                "struct B {\n"
9987*67e74705SXin Li                "  int x;\n"
9988*67e74705SXin Li                "};\n"
9989*67e74705SXin Li                "}\n",
9990*67e74705SXin Li                WebKitBraceStyle);
9991*67e74705SXin Li   verifyFormat("struct S {\n"
9992*67e74705SXin Li                "  int Type;\n"
9993*67e74705SXin Li                "  union {\n"
9994*67e74705SXin Li                "    int x;\n"
9995*67e74705SXin Li                "    double y;\n"
9996*67e74705SXin Li                "  } Value;\n"
9997*67e74705SXin Li                "  class C {\n"
9998*67e74705SXin Li                "    MyFavoriteType Value;\n"
9999*67e74705SXin Li                "  } Class;\n"
10000*67e74705SXin Li                "};\n",
10001*67e74705SXin Li                WebKitBraceStyle);
10002*67e74705SXin Li }
10003*67e74705SXin Li 
TEST_F(FormatTest,CatchExceptionReferenceBinding)10004*67e74705SXin Li TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10005*67e74705SXin Li   verifyFormat("void f() {\n"
10006*67e74705SXin Li                "  try {\n"
10007*67e74705SXin Li                "  } catch (const Exception &e) {\n"
10008*67e74705SXin Li                "  }\n"
10009*67e74705SXin Li                "}\n",
10010*67e74705SXin Li                getLLVMStyle());
10011*67e74705SXin Li }
10012*67e74705SXin Li 
TEST_F(FormatTest,UnderstandsPragmas)10013*67e74705SXin Li TEST_F(FormatTest, UnderstandsPragmas) {
10014*67e74705SXin Li   verifyFormat("#pragma omp reduction(| : var)");
10015*67e74705SXin Li   verifyFormat("#pragma omp reduction(+ : var)");
10016*67e74705SXin Li 
10017*67e74705SXin Li   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10018*67e74705SXin Li             "(including parentheses).",
10019*67e74705SXin Li             format("#pragma    mark   Any non-hyphenated or hyphenated string "
10020*67e74705SXin Li                    "(including parentheses)."));
10021*67e74705SXin Li }
10022*67e74705SXin Li 
TEST_F(FormatTest,UnderstandPragmaOption)10023*67e74705SXin Li TEST_F(FormatTest, UnderstandPragmaOption) {
10024*67e74705SXin Li   verifyFormat("#pragma option -C -A");
10025*67e74705SXin Li 
10026*67e74705SXin Li   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
10027*67e74705SXin Li }
10028*67e74705SXin Li 
10029*67e74705SXin Li #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
10030*67e74705SXin Li   for (size_t i = 1; i < Styles.size(); ++i)                                   \
10031*67e74705SXin Li   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10032*67e74705SXin Li                                   << " differs from Style #0"
10033*67e74705SXin Li 
TEST_F(FormatTest,GetsPredefinedStyleByName)10034*67e74705SXin Li TEST_F(FormatTest, GetsPredefinedStyleByName) {
10035*67e74705SXin Li   SmallVector<FormatStyle, 3> Styles;
10036*67e74705SXin Li   Styles.resize(3);
10037*67e74705SXin Li 
10038*67e74705SXin Li   Styles[0] = getLLVMStyle();
10039*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10040*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10041*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10042*67e74705SXin Li 
10043*67e74705SXin Li   Styles[0] = getGoogleStyle();
10044*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10045*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10046*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10047*67e74705SXin Li 
10048*67e74705SXin Li   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
10049*67e74705SXin Li   EXPECT_TRUE(
10050*67e74705SXin Li       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10051*67e74705SXin Li   EXPECT_TRUE(
10052*67e74705SXin Li       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10053*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10054*67e74705SXin Li 
10055*67e74705SXin Li   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
10056*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10057*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10058*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10059*67e74705SXin Li 
10060*67e74705SXin Li   Styles[0] = getMozillaStyle();
10061*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10062*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10063*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10064*67e74705SXin Li 
10065*67e74705SXin Li   Styles[0] = getWebKitStyle();
10066*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10067*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10068*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10069*67e74705SXin Li 
10070*67e74705SXin Li   Styles[0] = getGNUStyle();
10071*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10072*67e74705SXin Li   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10073*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10074*67e74705SXin Li 
10075*67e74705SXin Li   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10076*67e74705SXin Li }
10077*67e74705SXin Li 
TEST_F(FormatTest,GetsCorrectBasedOnStyle)10078*67e74705SXin Li TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10079*67e74705SXin Li   SmallVector<FormatStyle, 8> Styles;
10080*67e74705SXin Li   Styles.resize(2);
10081*67e74705SXin Li 
10082*67e74705SXin Li   Styles[0] = getGoogleStyle();
10083*67e74705SXin Li   Styles[1] = getLLVMStyle();
10084*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10085*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10086*67e74705SXin Li 
10087*67e74705SXin Li   Styles.resize(5);
10088*67e74705SXin Li   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
10089*67e74705SXin Li   Styles[1] = getLLVMStyle();
10090*67e74705SXin Li   Styles[1].Language = FormatStyle::LK_JavaScript;
10091*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10092*67e74705SXin Li 
10093*67e74705SXin Li   Styles[2] = getLLVMStyle();
10094*67e74705SXin Li   Styles[2].Language = FormatStyle::LK_JavaScript;
10095*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10096*67e74705SXin Li                                   "BasedOnStyle: Google",
10097*67e74705SXin Li                                   &Styles[2])
10098*67e74705SXin Li                    .value());
10099*67e74705SXin Li 
10100*67e74705SXin Li   Styles[3] = getLLVMStyle();
10101*67e74705SXin Li   Styles[3].Language = FormatStyle::LK_JavaScript;
10102*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10103*67e74705SXin Li                                   "Language: JavaScript",
10104*67e74705SXin Li                                   &Styles[3])
10105*67e74705SXin Li                    .value());
10106*67e74705SXin Li 
10107*67e74705SXin Li   Styles[4] = getLLVMStyle();
10108*67e74705SXin Li   Styles[4].Language = FormatStyle::LK_JavaScript;
10109*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("---\n"
10110*67e74705SXin Li                                   "BasedOnStyle: LLVM\n"
10111*67e74705SXin Li                                   "IndentWidth: 123\n"
10112*67e74705SXin Li                                   "---\n"
10113*67e74705SXin Li                                   "BasedOnStyle: Google\n"
10114*67e74705SXin Li                                   "Language: JavaScript",
10115*67e74705SXin Li                                   &Styles[4])
10116*67e74705SXin Li                    .value());
10117*67e74705SXin Li   EXPECT_ALL_STYLES_EQUAL(Styles);
10118*67e74705SXin Li }
10119*67e74705SXin Li 
10120*67e74705SXin Li #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
10121*67e74705SXin Li   Style.FIELD = false;                                                         \
10122*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
10123*67e74705SXin Li   EXPECT_TRUE(Style.FIELD);                                                    \
10124*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
10125*67e74705SXin Li   EXPECT_FALSE(Style.FIELD);
10126*67e74705SXin Li 
10127*67e74705SXin Li #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10128*67e74705SXin Li 
10129*67e74705SXin Li #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
10130*67e74705SXin Li   Style.STRUCT.FIELD = false;                                                  \
10131*67e74705SXin Li   EXPECT_EQ(0,                                                                 \
10132*67e74705SXin Li             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
10133*67e74705SXin Li                 .value());                                                     \
10134*67e74705SXin Li   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
10135*67e74705SXin Li   EXPECT_EQ(0,                                                                 \
10136*67e74705SXin Li             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
10137*67e74705SXin Li                 .value());                                                     \
10138*67e74705SXin Li   EXPECT_FALSE(Style.STRUCT.FIELD);
10139*67e74705SXin Li 
10140*67e74705SXin Li #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
10141*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10142*67e74705SXin Li 
10143*67e74705SXin Li #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
10144*67e74705SXin Li   EXPECT_NE(VALUE, Style.FIELD);                                               \
10145*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
10146*67e74705SXin Li   EXPECT_EQ(VALUE, Style.FIELD)
10147*67e74705SXin Li 
TEST_F(FormatTest,ParsesConfigurationBools)10148*67e74705SXin Li TEST_F(FormatTest, ParsesConfigurationBools) {
10149*67e74705SXin Li   FormatStyle Style = {};
10150*67e74705SXin Li   Style.Language = FormatStyle::LK_Cpp;
10151*67e74705SXin Li   CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
10152*67e74705SXin Li   CHECK_PARSE_BOOL(AlignOperands);
10153*67e74705SXin Li   CHECK_PARSE_BOOL(AlignTrailingComments);
10154*67e74705SXin Li   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
10155*67e74705SXin Li   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
10156*67e74705SXin Li   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
10157*67e74705SXin Li   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
10158*67e74705SXin Li   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
10159*67e74705SXin Li   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
10160*67e74705SXin Li   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
10161*67e74705SXin Li   CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
10162*67e74705SXin Li   CHECK_PARSE_BOOL(BinPackArguments);
10163*67e74705SXin Li   CHECK_PARSE_BOOL(BinPackParameters);
10164*67e74705SXin Li   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
10165*67e74705SXin Li   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
10166*67e74705SXin Li   CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
10167*67e74705SXin Li   CHECK_PARSE_BOOL(BreakStringLiterals);
10168*67e74705SXin Li   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
10169*67e74705SXin Li   CHECK_PARSE_BOOL(DerivePointerAlignment);
10170*67e74705SXin Li   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
10171*67e74705SXin Li   CHECK_PARSE_BOOL(DisableFormat);
10172*67e74705SXin Li   CHECK_PARSE_BOOL(IndentCaseLabels);
10173*67e74705SXin Li   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
10174*67e74705SXin Li   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
10175*67e74705SXin Li   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
10176*67e74705SXin Li   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
10177*67e74705SXin Li   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
10178*67e74705SXin Li   CHECK_PARSE_BOOL(ReflowComments);
10179*67e74705SXin Li   CHECK_PARSE_BOOL(SortIncludes);
10180*67e74705SXin Li   CHECK_PARSE_BOOL(SpacesInParentheses);
10181*67e74705SXin Li   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
10182*67e74705SXin Li   CHECK_PARSE_BOOL(SpacesInAngles);
10183*67e74705SXin Li   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
10184*67e74705SXin Li   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
10185*67e74705SXin Li   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
10186*67e74705SXin Li   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
10187*67e74705SXin Li   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
10188*67e74705SXin Li 
10189*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10190*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10191*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10192*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10193*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10194*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10195*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10196*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10197*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10198*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10199*67e74705SXin Li   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
10200*67e74705SXin Li }
10201*67e74705SXin Li 
10202*67e74705SXin Li #undef CHECK_PARSE_BOOL
10203*67e74705SXin Li 
TEST_F(FormatTest,ParsesConfiguration)10204*67e74705SXin Li TEST_F(FormatTest, ParsesConfiguration) {
10205*67e74705SXin Li   FormatStyle Style = {};
10206*67e74705SXin Li   Style.Language = FormatStyle::LK_Cpp;
10207*67e74705SXin Li   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
10208*67e74705SXin Li   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10209*67e74705SXin Li               ConstructorInitializerIndentWidth, 1234u);
10210*67e74705SXin Li   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
10211*67e74705SXin Li   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10212*67e74705SXin Li   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
10213*67e74705SXin Li   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10214*67e74705SXin Li               PenaltyBreakBeforeFirstCallParameter, 1234u);
10215*67e74705SXin Li   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10216*67e74705SXin Li   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10217*67e74705SXin Li               PenaltyReturnTypeOnItsOwnLine, 1234u);
10218*67e74705SXin Li   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10219*67e74705SXin Li               SpacesBeforeTrailingComments, 1234u);
10220*67e74705SXin Li   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
10221*67e74705SXin Li   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
10222*67e74705SXin Li   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
10223*67e74705SXin Li 
10224*67e74705SXin Li   Style.PointerAlignment = FormatStyle::PAS_Middle;
10225*67e74705SXin Li   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10226*67e74705SXin Li               FormatStyle::PAS_Left);
10227*67e74705SXin Li   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10228*67e74705SXin Li               FormatStyle::PAS_Right);
10229*67e74705SXin Li   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10230*67e74705SXin Li               FormatStyle::PAS_Middle);
10231*67e74705SXin Li   // For backward compatibility:
10232*67e74705SXin Li   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10233*67e74705SXin Li               FormatStyle::PAS_Left);
10234*67e74705SXin Li   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10235*67e74705SXin Li               FormatStyle::PAS_Right);
10236*67e74705SXin Li   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10237*67e74705SXin Li               FormatStyle::PAS_Middle);
10238*67e74705SXin Li 
10239*67e74705SXin Li   Style.Standard = FormatStyle::LS_Auto;
10240*67e74705SXin Li   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10241*67e74705SXin Li   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
10242*67e74705SXin Li   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10243*67e74705SXin Li   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10244*67e74705SXin Li   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10245*67e74705SXin Li 
10246*67e74705SXin Li   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10247*67e74705SXin Li   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10248*67e74705SXin Li               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
10249*67e74705SXin Li   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10250*67e74705SXin Li               FormatStyle::BOS_None);
10251*67e74705SXin Li   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10252*67e74705SXin Li               FormatStyle::BOS_All);
10253*67e74705SXin Li   // For backward compatibility:
10254*67e74705SXin Li   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10255*67e74705SXin Li               FormatStyle::BOS_None);
10256*67e74705SXin Li   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10257*67e74705SXin Li               FormatStyle::BOS_All);
10258*67e74705SXin Li 
10259*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10260*67e74705SXin Li   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10261*67e74705SXin Li               FormatStyle::BAS_Align);
10262*67e74705SXin Li   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10263*67e74705SXin Li               FormatStyle::BAS_DontAlign);
10264*67e74705SXin Li   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10265*67e74705SXin Li               FormatStyle::BAS_AlwaysBreak);
10266*67e74705SXin Li   // For backward compatibility:
10267*67e74705SXin Li   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10268*67e74705SXin Li               FormatStyle::BAS_DontAlign);
10269*67e74705SXin Li   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10270*67e74705SXin Li               FormatStyle::BAS_Align);
10271*67e74705SXin Li 
10272*67e74705SXin Li   Style.UseTab = FormatStyle::UT_ForIndentation;
10273*67e74705SXin Li   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10274*67e74705SXin Li   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10275*67e74705SXin Li   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
10276*67e74705SXin Li   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10277*67e74705SXin Li               FormatStyle::UT_ForContinuationAndIndentation);
10278*67e74705SXin Li   // For backward compatibility:
10279*67e74705SXin Li   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10280*67e74705SXin Li   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
10281*67e74705SXin Li 
10282*67e74705SXin Li   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
10283*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10284*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10285*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10286*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
10287*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10288*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
10289*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10290*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
10291*67e74705SXin Li   // For backward compatibility:
10292*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10293*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10294*67e74705SXin Li   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10295*67e74705SXin Li               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
10296*67e74705SXin Li 
10297*67e74705SXin Li   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10298*67e74705SXin Li   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10299*67e74705SXin Li               FormatStyle::SBPO_Never);
10300*67e74705SXin Li   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10301*67e74705SXin Li               FormatStyle::SBPO_Always);
10302*67e74705SXin Li   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10303*67e74705SXin Li               FormatStyle::SBPO_ControlStatements);
10304*67e74705SXin Li   // For backward compatibility:
10305*67e74705SXin Li   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10306*67e74705SXin Li               FormatStyle::SBPO_Never);
10307*67e74705SXin Li   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10308*67e74705SXin Li               FormatStyle::SBPO_ControlStatements);
10309*67e74705SXin Li 
10310*67e74705SXin Li   Style.ColumnLimit = 123;
10311*67e74705SXin Li   FormatStyle BaseStyle = getLLVMStyle();
10312*67e74705SXin Li   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10313*67e74705SXin Li   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10314*67e74705SXin Li 
10315*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10316*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10317*67e74705SXin Li               FormatStyle::BS_Attach);
10318*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10319*67e74705SXin Li               FormatStyle::BS_Linux);
10320*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10321*67e74705SXin Li               FormatStyle::BS_Mozilla);
10322*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10323*67e74705SXin Li               FormatStyle::BS_Stroustrup);
10324*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10325*67e74705SXin Li               FormatStyle::BS_Allman);
10326*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
10327*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10328*67e74705SXin Li               FormatStyle::BS_WebKit);
10329*67e74705SXin Li   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10330*67e74705SXin Li               FormatStyle::BS_Custom);
10331*67e74705SXin Li 
10332*67e74705SXin Li   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10333*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10334*67e74705SXin Li               FormatStyle::RTBS_None);
10335*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10336*67e74705SXin Li               FormatStyle::RTBS_All);
10337*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
10338*67e74705SXin Li               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
10339*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10340*67e74705SXin Li               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10341*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10342*67e74705SXin Li               AlwaysBreakAfterReturnType,
10343*67e74705SXin Li               FormatStyle::RTBS_TopLevelDefinitions);
10344*67e74705SXin Li 
10345*67e74705SXin Li   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10346*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10347*67e74705SXin Li               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10348*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10349*67e74705SXin Li               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10350*67e74705SXin Li   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10351*67e74705SXin Li               AlwaysBreakAfterDefinitionReturnType,
10352*67e74705SXin Li               FormatStyle::DRTBS_TopLevel);
10353*67e74705SXin Li 
10354*67e74705SXin Li   Style.NamespaceIndentation = FormatStyle::NI_All;
10355*67e74705SXin Li   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10356*67e74705SXin Li               FormatStyle::NI_None);
10357*67e74705SXin Li   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10358*67e74705SXin Li               FormatStyle::NI_Inner);
10359*67e74705SXin Li   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10360*67e74705SXin Li               FormatStyle::NI_All);
10361*67e74705SXin Li 
10362*67e74705SXin Li   // FIXME: This is required because parsing a configuration simply overwrites
10363*67e74705SXin Li   // the first N elements of the list instead of resetting it.
10364*67e74705SXin Li   Style.ForEachMacros.clear();
10365*67e74705SXin Li   std::vector<std::string> BoostForeach;
10366*67e74705SXin Li   BoostForeach.push_back("BOOST_FOREACH");
10367*67e74705SXin Li   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
10368*67e74705SXin Li   std::vector<std::string> BoostAndQForeach;
10369*67e74705SXin Li   BoostAndQForeach.push_back("BOOST_FOREACH");
10370*67e74705SXin Li   BoostAndQForeach.push_back("Q_FOREACH");
10371*67e74705SXin Li   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10372*67e74705SXin Li               BoostAndQForeach);
10373*67e74705SXin Li 
10374*67e74705SXin Li   Style.IncludeCategories.clear();
10375*67e74705SXin Li   std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10376*67e74705SXin Li                                                                   {".*", 1}};
10377*67e74705SXin Li   CHECK_PARSE("IncludeCategories:\n"
10378*67e74705SXin Li               "  - Regex: abc/.*\n"
10379*67e74705SXin Li               "    Priority: 2\n"
10380*67e74705SXin Li               "  - Regex: .*\n"
10381*67e74705SXin Li               "    Priority: 1",
10382*67e74705SXin Li               IncludeCategories, ExpectedCategories);
10383*67e74705SXin Li   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
10384*67e74705SXin Li }
10385*67e74705SXin Li 
TEST_F(FormatTest,ParsesConfigurationWithLanguages)10386*67e74705SXin Li TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10387*67e74705SXin Li   FormatStyle Style = {};
10388*67e74705SXin Li   Style.Language = FormatStyle::LK_Cpp;
10389*67e74705SXin Li   CHECK_PARSE("Language: Cpp\n"
10390*67e74705SXin Li               "IndentWidth: 12",
10391*67e74705SXin Li               IndentWidth, 12u);
10392*67e74705SXin Li   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10393*67e74705SXin Li                                "IndentWidth: 34",
10394*67e74705SXin Li                                &Style),
10395*67e74705SXin Li             ParseError::Unsuitable);
10396*67e74705SXin Li   EXPECT_EQ(12u, Style.IndentWidth);
10397*67e74705SXin Li   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10398*67e74705SXin Li   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10399*67e74705SXin Li 
10400*67e74705SXin Li   Style.Language = FormatStyle::LK_JavaScript;
10401*67e74705SXin Li   CHECK_PARSE("Language: JavaScript\n"
10402*67e74705SXin Li               "IndentWidth: 12",
10403*67e74705SXin Li               IndentWidth, 12u);
10404*67e74705SXin Li   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
10405*67e74705SXin Li   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10406*67e74705SXin Li                                "IndentWidth: 34",
10407*67e74705SXin Li                                &Style),
10408*67e74705SXin Li             ParseError::Unsuitable);
10409*67e74705SXin Li   EXPECT_EQ(23u, Style.IndentWidth);
10410*67e74705SXin Li   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10411*67e74705SXin Li   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10412*67e74705SXin Li 
10413*67e74705SXin Li   CHECK_PARSE("BasedOnStyle: LLVM\n"
10414*67e74705SXin Li               "IndentWidth: 67",
10415*67e74705SXin Li               IndentWidth, 67u);
10416*67e74705SXin Li 
10417*67e74705SXin Li   CHECK_PARSE("---\n"
10418*67e74705SXin Li               "Language: JavaScript\n"
10419*67e74705SXin Li               "IndentWidth: 12\n"
10420*67e74705SXin Li               "---\n"
10421*67e74705SXin Li               "Language: Cpp\n"
10422*67e74705SXin Li               "IndentWidth: 34\n"
10423*67e74705SXin Li               "...\n",
10424*67e74705SXin Li               IndentWidth, 12u);
10425*67e74705SXin Li 
10426*67e74705SXin Li   Style.Language = FormatStyle::LK_Cpp;
10427*67e74705SXin Li   CHECK_PARSE("---\n"
10428*67e74705SXin Li               "Language: JavaScript\n"
10429*67e74705SXin Li               "IndentWidth: 12\n"
10430*67e74705SXin Li               "---\n"
10431*67e74705SXin Li               "Language: Cpp\n"
10432*67e74705SXin Li               "IndentWidth: 34\n"
10433*67e74705SXin Li               "...\n",
10434*67e74705SXin Li               IndentWidth, 34u);
10435*67e74705SXin Li   CHECK_PARSE("---\n"
10436*67e74705SXin Li               "IndentWidth: 78\n"
10437*67e74705SXin Li               "---\n"
10438*67e74705SXin Li               "Language: JavaScript\n"
10439*67e74705SXin Li               "IndentWidth: 56\n"
10440*67e74705SXin Li               "...\n",
10441*67e74705SXin Li               IndentWidth, 78u);
10442*67e74705SXin Li 
10443*67e74705SXin Li   Style.ColumnLimit = 123;
10444*67e74705SXin Li   Style.IndentWidth = 234;
10445*67e74705SXin Li   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10446*67e74705SXin Li   Style.TabWidth = 345;
10447*67e74705SXin Li   EXPECT_FALSE(parseConfiguration("---\n"
10448*67e74705SXin Li                                   "IndentWidth: 456\n"
10449*67e74705SXin Li                                   "BreakBeforeBraces: Allman\n"
10450*67e74705SXin Li                                   "---\n"
10451*67e74705SXin Li                                   "Language: JavaScript\n"
10452*67e74705SXin Li                                   "IndentWidth: 111\n"
10453*67e74705SXin Li                                   "TabWidth: 111\n"
10454*67e74705SXin Li                                   "---\n"
10455*67e74705SXin Li                                   "Language: Cpp\n"
10456*67e74705SXin Li                                   "BreakBeforeBraces: Stroustrup\n"
10457*67e74705SXin Li                                   "TabWidth: 789\n"
10458*67e74705SXin Li                                   "...\n",
10459*67e74705SXin Li                                   &Style));
10460*67e74705SXin Li   EXPECT_EQ(123u, Style.ColumnLimit);
10461*67e74705SXin Li   EXPECT_EQ(456u, Style.IndentWidth);
10462*67e74705SXin Li   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10463*67e74705SXin Li   EXPECT_EQ(789u, Style.TabWidth);
10464*67e74705SXin Li 
10465*67e74705SXin Li   EXPECT_EQ(parseConfiguration("---\n"
10466*67e74705SXin Li                                "Language: JavaScript\n"
10467*67e74705SXin Li                                "IndentWidth: 56\n"
10468*67e74705SXin Li                                "---\n"
10469*67e74705SXin Li                                "IndentWidth: 78\n"
10470*67e74705SXin Li                                "...\n",
10471*67e74705SXin Li                                &Style),
10472*67e74705SXin Li             ParseError::Error);
10473*67e74705SXin Li   EXPECT_EQ(parseConfiguration("---\n"
10474*67e74705SXin Li                                "Language: JavaScript\n"
10475*67e74705SXin Li                                "IndentWidth: 56\n"
10476*67e74705SXin Li                                "---\n"
10477*67e74705SXin Li                                "Language: JavaScript\n"
10478*67e74705SXin Li                                "IndentWidth: 78\n"
10479*67e74705SXin Li                                "...\n",
10480*67e74705SXin Li                                &Style),
10481*67e74705SXin Li             ParseError::Error);
10482*67e74705SXin Li 
10483*67e74705SXin Li   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10484*67e74705SXin Li }
10485*67e74705SXin Li 
10486*67e74705SXin Li #undef CHECK_PARSE
10487*67e74705SXin Li 
TEST_F(FormatTest,UsesLanguageForBasedOnStyle)10488*67e74705SXin Li TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10489*67e74705SXin Li   FormatStyle Style = {};
10490*67e74705SXin Li   Style.Language = FormatStyle::LK_JavaScript;
10491*67e74705SXin Li   Style.BreakBeforeTernaryOperators = true;
10492*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
10493*67e74705SXin Li   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
10494*67e74705SXin Li 
10495*67e74705SXin Li   Style.BreakBeforeTernaryOperators = true;
10496*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration("---\n"
10497*67e74705SXin Li                                   "BasedOnStyle: Google\n"
10498*67e74705SXin Li                                   "---\n"
10499*67e74705SXin Li                                   "Language: JavaScript\n"
10500*67e74705SXin Li                                   "IndentWidth: 76\n"
10501*67e74705SXin Li                                   "...\n",
10502*67e74705SXin Li                                   &Style)
10503*67e74705SXin Li                    .value());
10504*67e74705SXin Li   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
10505*67e74705SXin Li   EXPECT_EQ(76u, Style.IndentWidth);
10506*67e74705SXin Li   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10507*67e74705SXin Li }
10508*67e74705SXin Li 
TEST_F(FormatTest,ConfigurationRoundTripTest)10509*67e74705SXin Li TEST_F(FormatTest, ConfigurationRoundTripTest) {
10510*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
10511*67e74705SXin Li   std::string YAML = configurationAsText(Style);
10512*67e74705SXin Li   FormatStyle ParsedStyle = {};
10513*67e74705SXin Li   ParsedStyle.Language = FormatStyle::LK_Cpp;
10514*67e74705SXin Li   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10515*67e74705SXin Li   EXPECT_EQ(Style, ParsedStyle);
10516*67e74705SXin Li }
10517*67e74705SXin Li 
TEST_F(FormatTest,WorksFor8bitEncodings)10518*67e74705SXin Li TEST_F(FormatTest, WorksFor8bitEncodings) {
10519*67e74705SXin Li   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10520*67e74705SXin Li             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10521*67e74705SXin Li             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10522*67e74705SXin Li             "\"\xef\xee\xf0\xf3...\"",
10523*67e74705SXin Li             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10524*67e74705SXin Li                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10525*67e74705SXin Li                    "\xef\xee\xf0\xf3...\"",
10526*67e74705SXin Li                    getLLVMStyleWithColumns(12)));
10527*67e74705SXin Li }
10528*67e74705SXin Li 
TEST_F(FormatTest,HandlesUTF8BOM)10529*67e74705SXin Li TEST_F(FormatTest, HandlesUTF8BOM) {
10530*67e74705SXin Li   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10531*67e74705SXin Li   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10532*67e74705SXin Li             format("\xef\xbb\xbf#include <iostream>"));
10533*67e74705SXin Li   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10534*67e74705SXin Li             format("\xef\xbb\xbf\n#include <iostream>"));
10535*67e74705SXin Li }
10536*67e74705SXin Li 
10537*67e74705SXin Li // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10538*67e74705SXin Li #if !defined(_MSC_VER)
10539*67e74705SXin Li 
TEST_F(FormatTest,CountsUTF8CharactersProperly)10540*67e74705SXin Li TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10541*67e74705SXin Li   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10542*67e74705SXin Li                getLLVMStyleWithColumns(35));
10543*67e74705SXin Li   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
10544*67e74705SXin Li                getLLVMStyleWithColumns(31));
10545*67e74705SXin Li   verifyFormat("// Однажды в студёную зимнюю пору...",
10546*67e74705SXin Li                getLLVMStyleWithColumns(36));
10547*67e74705SXin Li   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
10548*67e74705SXin Li   verifyFormat("/* Однажды в студёную зимнюю пору... */",
10549*67e74705SXin Li                getLLVMStyleWithColumns(39));
10550*67e74705SXin Li   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
10551*67e74705SXin Li                getLLVMStyleWithColumns(35));
10552*67e74705SXin Li }
10553*67e74705SXin Li 
TEST_F(FormatTest,SplitsUTF8Strings)10554*67e74705SXin Li TEST_F(FormatTest, SplitsUTF8Strings) {
10555*67e74705SXin Li   // Non-printable characters' width is currently considered to be the length in
10556*67e74705SXin Li   // bytes in UTF8. The characters can be displayed in very different manner
10557*67e74705SXin Li   // (zero-width, single width with a substitution glyph, expanded to their code
10558*67e74705SXin Li   // (e.g. "<8d>"), so there's no single correct way to handle them.
10559*67e74705SXin Li   EXPECT_EQ("\"aaaaÄ\"\n"
10560*67e74705SXin Li             "\"\xc2\x8d\";",
10561*67e74705SXin Li             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
10562*67e74705SXin Li   EXPECT_EQ("\"aaaaaaaÄ\"\n"
10563*67e74705SXin Li             "\"\xc2\x8d\";",
10564*67e74705SXin Li             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
10565*67e74705SXin Li   EXPECT_EQ("\"Однажды, в \"\n"
10566*67e74705SXin Li             "\"студёную \"\n"
10567*67e74705SXin Li             "\"зимнюю \"\n"
10568*67e74705SXin Li             "\"пору,\"",
10569*67e74705SXin Li             format("\"Однажды, в студёную зимнюю пору,\"",
10570*67e74705SXin Li                    getLLVMStyleWithColumns(13)));
10571*67e74705SXin Li   EXPECT_EQ(
10572*67e74705SXin Li       "\"一 二 三 \"\n"
10573*67e74705SXin Li       "\"四 五六 \"\n"
10574*67e74705SXin Li       "\"七 八 九 \"\n"
10575*67e74705SXin Li       "\"十\"",
10576*67e74705SXin Li       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
10577*67e74705SXin Li   EXPECT_EQ("\"一\t二 \"\n"
10578*67e74705SXin Li             "\"\t三 \"\n"
10579*67e74705SXin Li             "\"四 五\t六 \"\n"
10580*67e74705SXin Li             "\"\t七 \"\n"
10581*67e74705SXin Li             "\"八九十\tqq\"",
10582*67e74705SXin Li             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10583*67e74705SXin Li                    getLLVMStyleWithColumns(11)));
10584*67e74705SXin Li 
10585*67e74705SXin Li   // UTF8 character in an escape sequence.
10586*67e74705SXin Li   EXPECT_EQ("\"aaaaaa\"\n"
10587*67e74705SXin Li             "\"\\\xC2\x8D\"",
10588*67e74705SXin Li             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
10589*67e74705SXin Li }
10590*67e74705SXin Li 
TEST_F(FormatTest,HandlesDoubleWidthCharsInMultiLineStrings)10591*67e74705SXin Li TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10592*67e74705SXin Li   EXPECT_EQ("const char *sssss =\n"
10593*67e74705SXin Li             "    \"一二三四五六七八\\\n"
10594*67e74705SXin Li             " 九 十\";",
10595*67e74705SXin Li             format("const char *sssss = \"一二三四五六七八\\\n"
10596*67e74705SXin Li                    " 九 十\";",
10597*67e74705SXin Li                    getLLVMStyleWithColumns(30)));
10598*67e74705SXin Li }
10599*67e74705SXin Li 
TEST_F(FormatTest,SplitsUTF8LineComments)10600*67e74705SXin Li TEST_F(FormatTest, SplitsUTF8LineComments) {
10601*67e74705SXin Li   EXPECT_EQ("// aaaaÄ\xc2\x8d",
10602*67e74705SXin Li             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
10603*67e74705SXin Li   EXPECT_EQ("// Я из лесу\n"
10604*67e74705SXin Li             "// вышел; был\n"
10605*67e74705SXin Li             "// сильный\n"
10606*67e74705SXin Li             "// мороз.",
10607*67e74705SXin Li             format("// Я из лесу вышел; был сильный мороз.",
10608*67e74705SXin Li                    getLLVMStyleWithColumns(13)));
10609*67e74705SXin Li   EXPECT_EQ("// 一二三\n"
10610*67e74705SXin Li             "// 四五六七\n"
10611*67e74705SXin Li             "// 八  九\n"
10612*67e74705SXin Li             "// 十",
10613*67e74705SXin Li             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
10614*67e74705SXin Li }
10615*67e74705SXin Li 
TEST_F(FormatTest,SplitsUTF8BlockComments)10616*67e74705SXin Li TEST_F(FormatTest, SplitsUTF8BlockComments) {
10617*67e74705SXin Li   EXPECT_EQ("/* Гляжу,\n"
10618*67e74705SXin Li             " * поднимается\n"
10619*67e74705SXin Li             " * медленно в\n"
10620*67e74705SXin Li             " * гору\n"
10621*67e74705SXin Li             " * Лошадка,\n"
10622*67e74705SXin Li             " * везущая\n"
10623*67e74705SXin Li             " * хворосту\n"
10624*67e74705SXin Li             " * воз. */",
10625*67e74705SXin Li             format("/* Гляжу, поднимается медленно в гору\n"
10626*67e74705SXin Li                    " * Лошадка, везущая хворосту воз. */",
10627*67e74705SXin Li                    getLLVMStyleWithColumns(13)));
10628*67e74705SXin Li   EXPECT_EQ(
10629*67e74705SXin Li       "/* 一二三\n"
10630*67e74705SXin Li       " * 四五六七\n"
10631*67e74705SXin Li       " * 八  九\n"
10632*67e74705SXin Li       " * 十  */",
10633*67e74705SXin Li       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
10634*67e74705SXin Li   EXPECT_EQ("/* �������� ��������\n"
10635*67e74705SXin Li             " * ��������\n"
10636*67e74705SXin Li             " * ������-�� */",
10637*67e74705SXin Li             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
10638*67e74705SXin Li }
10639*67e74705SXin Li 
10640*67e74705SXin Li #endif // _MSC_VER
10641*67e74705SXin Li 
TEST_F(FormatTest,ConstructorInitializerIndentWidth)10642*67e74705SXin Li TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10643*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
10644*67e74705SXin Li 
10645*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 4;
10646*67e74705SXin Li   verifyFormat(
10647*67e74705SXin Li       "SomeClass::Constructor()\n"
10648*67e74705SXin Li       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10649*67e74705SXin Li       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10650*67e74705SXin Li       Style);
10651*67e74705SXin Li 
10652*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 2;
10653*67e74705SXin Li   verifyFormat(
10654*67e74705SXin Li       "SomeClass::Constructor()\n"
10655*67e74705SXin Li       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10656*67e74705SXin Li       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10657*67e74705SXin Li       Style);
10658*67e74705SXin Li 
10659*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 0;
10660*67e74705SXin Li   verifyFormat(
10661*67e74705SXin Li       "SomeClass::Constructor()\n"
10662*67e74705SXin Li       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10663*67e74705SXin Li       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10664*67e74705SXin Li       Style);
10665*67e74705SXin Li   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10666*67e74705SXin Li   verifyFormat(
10667*67e74705SXin Li       "SomeLongTemplateVariableName<\n"
10668*67e74705SXin Li       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10669*67e74705SXin Li       Style);
10670*67e74705SXin Li   verifyFormat(
10671*67e74705SXin Li       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10672*67e74705SXin Li       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10673*67e74705SXin Li       Style);
10674*67e74705SXin Li }
10675*67e74705SXin Li 
TEST_F(FormatTest,BreakConstructorInitializersBeforeComma)10676*67e74705SXin Li TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10677*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
10678*67e74705SXin Li   Style.BreakConstructorInitializersBeforeComma = true;
10679*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 4;
10680*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10681*67e74705SXin Li                "    : a(a)\n"
10682*67e74705SXin Li                "    , b(b)\n"
10683*67e74705SXin Li                "    , c(c) {}",
10684*67e74705SXin Li                Style);
10685*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10686*67e74705SXin Li                "    : a(a) {}",
10687*67e74705SXin Li                Style);
10688*67e74705SXin Li 
10689*67e74705SXin Li   Style.ColumnLimit = 0;
10690*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10691*67e74705SXin Li                "    : a(a) {}",
10692*67e74705SXin Li                Style);
10693*67e74705SXin Li   verifyFormat("SomeClass::Constructor() noexcept\n"
10694*67e74705SXin Li                "    : a(a) {}",
10695*67e74705SXin Li                Style);
10696*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10697*67e74705SXin Li                "    : a(a)\n"
10698*67e74705SXin Li                "    , b(b)\n"
10699*67e74705SXin Li                "    , c(c) {}",
10700*67e74705SXin Li                Style);
10701*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10702*67e74705SXin Li                "    : a(a) {\n"
10703*67e74705SXin Li                "  foo();\n"
10704*67e74705SXin Li                "  bar();\n"
10705*67e74705SXin Li                "}",
10706*67e74705SXin Li                Style);
10707*67e74705SXin Li 
10708*67e74705SXin Li   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
10709*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10710*67e74705SXin Li                "    : a(a)\n"
10711*67e74705SXin Li                "    , b(b)\n"
10712*67e74705SXin Li                "    , c(c) {\n}",
10713*67e74705SXin Li                Style);
10714*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10715*67e74705SXin Li                "    : a(a) {\n}",
10716*67e74705SXin Li                Style);
10717*67e74705SXin Li 
10718*67e74705SXin Li   Style.ColumnLimit = 80;
10719*67e74705SXin Li   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
10720*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 2;
10721*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10722*67e74705SXin Li                "  : a(a)\n"
10723*67e74705SXin Li                "  , b(b)\n"
10724*67e74705SXin Li                "  , c(c) {}",
10725*67e74705SXin Li                Style);
10726*67e74705SXin Li 
10727*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 0;
10728*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10729*67e74705SXin Li                ": a(a)\n"
10730*67e74705SXin Li                ", b(b)\n"
10731*67e74705SXin Li                ", c(c) {}",
10732*67e74705SXin Li                Style);
10733*67e74705SXin Li 
10734*67e74705SXin Li   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10735*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 4;
10736*67e74705SXin Li   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10737*67e74705SXin Li   verifyFormat(
10738*67e74705SXin Li       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10739*67e74705SXin Li       Style);
10740*67e74705SXin Li   verifyFormat(
10741*67e74705SXin Li       "SomeClass::Constructor()\n"
10742*67e74705SXin Li       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10743*67e74705SXin Li       Style);
10744*67e74705SXin Li   Style.ConstructorInitializerIndentWidth = 4;
10745*67e74705SXin Li   Style.ColumnLimit = 60;
10746*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10747*67e74705SXin Li                "    : aaaaaaaa(aaaaaaaa)\n"
10748*67e74705SXin Li                "    , aaaaaaaa(aaaaaaaa)\n"
10749*67e74705SXin Li                "    , aaaaaaaa(aaaaaaaa) {}",
10750*67e74705SXin Li                Style);
10751*67e74705SXin Li }
10752*67e74705SXin Li 
TEST_F(FormatTest,Destructors)10753*67e74705SXin Li TEST_F(FormatTest, Destructors) {
10754*67e74705SXin Li   verifyFormat("void F(int &i) { i.~int(); }");
10755*67e74705SXin Li   verifyFormat("void F(int &i) { i->~int(); }");
10756*67e74705SXin Li }
10757*67e74705SXin Li 
TEST_F(FormatTest,FormatsWithWebKitStyle)10758*67e74705SXin Li TEST_F(FormatTest, FormatsWithWebKitStyle) {
10759*67e74705SXin Li   FormatStyle Style = getWebKitStyle();
10760*67e74705SXin Li 
10761*67e74705SXin Li   // Don't indent in outer namespaces.
10762*67e74705SXin Li   verifyFormat("namespace outer {\n"
10763*67e74705SXin Li                "int i;\n"
10764*67e74705SXin Li                "namespace inner {\n"
10765*67e74705SXin Li                "    int i;\n"
10766*67e74705SXin Li                "} // namespace inner\n"
10767*67e74705SXin Li                "} // namespace outer\n"
10768*67e74705SXin Li                "namespace other_outer {\n"
10769*67e74705SXin Li                "int i;\n"
10770*67e74705SXin Li                "}",
10771*67e74705SXin Li                Style);
10772*67e74705SXin Li 
10773*67e74705SXin Li   // Don't indent case labels.
10774*67e74705SXin Li   verifyFormat("switch (variable) {\n"
10775*67e74705SXin Li                "case 1:\n"
10776*67e74705SXin Li                "case 2:\n"
10777*67e74705SXin Li                "    doSomething();\n"
10778*67e74705SXin Li                "    break;\n"
10779*67e74705SXin Li                "default:\n"
10780*67e74705SXin Li                "    ++variable;\n"
10781*67e74705SXin Li                "}",
10782*67e74705SXin Li                Style);
10783*67e74705SXin Li 
10784*67e74705SXin Li   // Wrap before binary operators.
10785*67e74705SXin Li   EXPECT_EQ("void f()\n"
10786*67e74705SXin Li             "{\n"
10787*67e74705SXin Li             "    if (aaaaaaaaaaaaaaaa\n"
10788*67e74705SXin Li             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10789*67e74705SXin Li             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10790*67e74705SXin Li             "        return;\n"
10791*67e74705SXin Li             "}",
10792*67e74705SXin Li             format("void f() {\n"
10793*67e74705SXin Li                    "if (aaaaaaaaaaaaaaaa\n"
10794*67e74705SXin Li                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10795*67e74705SXin Li                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10796*67e74705SXin Li                    "return;\n"
10797*67e74705SXin Li                    "}",
10798*67e74705SXin Li                    Style));
10799*67e74705SXin Li 
10800*67e74705SXin Li   // Allow functions on a single line.
10801*67e74705SXin Li   verifyFormat("void f() { return; }", Style);
10802*67e74705SXin Li 
10803*67e74705SXin Li   // Constructor initializers are formatted one per line with the "," on the
10804*67e74705SXin Li   // new line.
10805*67e74705SXin Li   verifyFormat("Constructor()\n"
10806*67e74705SXin Li                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10807*67e74705SXin Li                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
10808*67e74705SXin Li                "          aaaaaaaaaaaaaa)\n"
10809*67e74705SXin Li                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10810*67e74705SXin Li                "{\n"
10811*67e74705SXin Li                "}",
10812*67e74705SXin Li                Style);
10813*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10814*67e74705SXin Li                "    : a(a)\n"
10815*67e74705SXin Li                "{\n"
10816*67e74705SXin Li                "}",
10817*67e74705SXin Li                Style);
10818*67e74705SXin Li   EXPECT_EQ("SomeClass::Constructor()\n"
10819*67e74705SXin Li             "    : a(a)\n"
10820*67e74705SXin Li             "{\n"
10821*67e74705SXin Li             "}",
10822*67e74705SXin Li             format("SomeClass::Constructor():a(a){}", Style));
10823*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10824*67e74705SXin Li                "    : a(a)\n"
10825*67e74705SXin Li                "    , b(b)\n"
10826*67e74705SXin Li                "    , c(c)\n"
10827*67e74705SXin Li                "{\n"
10828*67e74705SXin Li                "}",
10829*67e74705SXin Li                Style);
10830*67e74705SXin Li   verifyFormat("SomeClass::Constructor()\n"
10831*67e74705SXin Li                "    : a(a)\n"
10832*67e74705SXin Li                "{\n"
10833*67e74705SXin Li                "    foo();\n"
10834*67e74705SXin Li                "    bar();\n"
10835*67e74705SXin Li                "}",
10836*67e74705SXin Li                Style);
10837*67e74705SXin Li 
10838*67e74705SXin Li   // Access specifiers should be aligned left.
10839*67e74705SXin Li   verifyFormat("class C {\n"
10840*67e74705SXin Li                "public:\n"
10841*67e74705SXin Li                "    int i;\n"
10842*67e74705SXin Li                "};",
10843*67e74705SXin Li                Style);
10844*67e74705SXin Li 
10845*67e74705SXin Li   // Do not align comments.
10846*67e74705SXin Li   verifyFormat("int a; // Do not\n"
10847*67e74705SXin Li                "double b; // align comments.",
10848*67e74705SXin Li                Style);
10849*67e74705SXin Li 
10850*67e74705SXin Li   // Do not align operands.
10851*67e74705SXin Li   EXPECT_EQ("ASSERT(aaaa\n"
10852*67e74705SXin Li             "    || bbbb);",
10853*67e74705SXin Li             format("ASSERT ( aaaa\n||bbbb);", Style));
10854*67e74705SXin Li 
10855*67e74705SXin Li   // Accept input's line breaks.
10856*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10857*67e74705SXin Li             "    || bbbbbbbbbbbbbbb) {\n"
10858*67e74705SXin Li             "    i++;\n"
10859*67e74705SXin Li             "}",
10860*67e74705SXin Li             format("if (aaaaaaaaaaaaaaa\n"
10861*67e74705SXin Li                    "|| bbbbbbbbbbbbbbb) { i++; }",
10862*67e74705SXin Li                    Style));
10863*67e74705SXin Li   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10864*67e74705SXin Li             "    i++;\n"
10865*67e74705SXin Li             "}",
10866*67e74705SXin Li             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
10867*67e74705SXin Li 
10868*67e74705SXin Li   // Don't automatically break all macro definitions (llvm.org/PR17842).
10869*67e74705SXin Li   verifyFormat("#define aNumber 10", Style);
10870*67e74705SXin Li   // However, generally keep the line breaks that the user authored.
10871*67e74705SXin Li   EXPECT_EQ("#define aNumber \\\n"
10872*67e74705SXin Li             "    10",
10873*67e74705SXin Li             format("#define aNumber \\\n"
10874*67e74705SXin Li                    " 10",
10875*67e74705SXin Li                    Style));
10876*67e74705SXin Li 
10877*67e74705SXin Li   // Keep empty and one-element array literals on a single line.
10878*67e74705SXin Li   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10879*67e74705SXin Li             "                                  copyItems:YES];",
10880*67e74705SXin Li             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10881*67e74705SXin Li                    "copyItems:YES];",
10882*67e74705SXin Li                    Style));
10883*67e74705SXin Li   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10884*67e74705SXin Li             "                                  copyItems:YES];",
10885*67e74705SXin Li             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10886*67e74705SXin Li                    "             copyItems:YES];",
10887*67e74705SXin Li                    Style));
10888*67e74705SXin Li   // FIXME: This does not seem right, there should be more indentation before
10889*67e74705SXin Li   // the array literal's entries. Nested blocks have the same problem.
10890*67e74705SXin Li   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10891*67e74705SXin Li             "    @\"a\",\n"
10892*67e74705SXin Li             "    @\"a\"\n"
10893*67e74705SXin Li             "]\n"
10894*67e74705SXin Li             "                                  copyItems:YES];",
10895*67e74705SXin Li             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10896*67e74705SXin Li                    "     @\"a\",\n"
10897*67e74705SXin Li                    "     @\"a\"\n"
10898*67e74705SXin Li                    "     ]\n"
10899*67e74705SXin Li                    "       copyItems:YES];",
10900*67e74705SXin Li                    Style));
10901*67e74705SXin Li   EXPECT_EQ(
10902*67e74705SXin Li       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10903*67e74705SXin Li       "                                  copyItems:YES];",
10904*67e74705SXin Li       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10905*67e74705SXin Li              "   copyItems:YES];",
10906*67e74705SXin Li              Style));
10907*67e74705SXin Li 
10908*67e74705SXin Li   verifyFormat("[self.a b:c c:d];", Style);
10909*67e74705SXin Li   EXPECT_EQ("[self.a b:c\n"
10910*67e74705SXin Li             "        c:d];",
10911*67e74705SXin Li             format("[self.a b:c\n"
10912*67e74705SXin Li                    "c:d];",
10913*67e74705SXin Li                    Style));
10914*67e74705SXin Li }
10915*67e74705SXin Li 
TEST_F(FormatTest,FormatsLambdas)10916*67e74705SXin Li TEST_F(FormatTest, FormatsLambdas) {
10917*67e74705SXin Li   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10918*67e74705SXin Li   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10919*67e74705SXin Li   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10920*67e74705SXin Li   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10921*67e74705SXin Li   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
10922*67e74705SXin Li   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
10923*67e74705SXin Li   verifyFormat("void f() {\n"
10924*67e74705SXin Li                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10925*67e74705SXin Li                "}\n");
10926*67e74705SXin Li   verifyFormat("void f() {\n"
10927*67e74705SXin Li                "  other(x.begin(), //\n"
10928*67e74705SXin Li                "        x.end(),   //\n"
10929*67e74705SXin Li                "        [&](int, int) { return 1; });\n"
10930*67e74705SXin Li                "}\n");
10931*67e74705SXin Li   verifyFormat("SomeFunction([]() { // A cool function...\n"
10932*67e74705SXin Li                "  return 43;\n"
10933*67e74705SXin Li                "});");
10934*67e74705SXin Li   EXPECT_EQ("SomeFunction([]() {\n"
10935*67e74705SXin Li             "#define A a\n"
10936*67e74705SXin Li             "  return 43;\n"
10937*67e74705SXin Li             "});",
10938*67e74705SXin Li             format("SomeFunction([](){\n"
10939*67e74705SXin Li                    "#define A a\n"
10940*67e74705SXin Li                    "return 43;\n"
10941*67e74705SXin Li                    "});"));
10942*67e74705SXin Li   verifyFormat("void f() {\n"
10943*67e74705SXin Li                "  SomeFunction([](decltype(x), A *a) {});\n"
10944*67e74705SXin Li                "}");
10945*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10946*67e74705SXin Li                "    [](const aaaaaaaaaa &a) { return a; });");
10947*67e74705SXin Li   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10948*67e74705SXin Li                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
10949*67e74705SXin Li                "});");
10950*67e74705SXin Li   verifyFormat("Constructor()\n"
10951*67e74705SXin Li                "    : Field([] { // comment\n"
10952*67e74705SXin Li                "        int i;\n"
10953*67e74705SXin Li                "      }) {}");
10954*67e74705SXin Li   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10955*67e74705SXin Li                "  return some_parameter.size();\n"
10956*67e74705SXin Li                "};");
10957*67e74705SXin Li   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10958*67e74705SXin Li                "    [](const string &s) { return s; };");
10959*67e74705SXin Li   verifyFormat("int i = aaaaaa ? 1 //\n"
10960*67e74705SXin Li                "               : [] {\n"
10961*67e74705SXin Li                "                   return 2; //\n"
10962*67e74705SXin Li                "                 }();");
10963*67e74705SXin Li   verifyFormat("llvm::errs() << \"number of twos is \"\n"
10964*67e74705SXin Li                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
10965*67e74705SXin Li                "                  return x == 2; // force break\n"
10966*67e74705SXin Li                "                });");
10967*67e74705SXin Li   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10968*67e74705SXin Li                "    int iiiiiiiiiiii) {\n"
10969*67e74705SXin Li                "  return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10970*67e74705SXin Li                "});",
10971*67e74705SXin Li                getLLVMStyleWithColumns(60));
10972*67e74705SXin Li   verifyFormat("SomeFunction({[&] {\n"
10973*67e74705SXin Li                "                // comment\n"
10974*67e74705SXin Li                "              },\n"
10975*67e74705SXin Li                "              [&] {\n"
10976*67e74705SXin Li                "                // comment\n"
10977*67e74705SXin Li                "              }});");
10978*67e74705SXin Li   verifyFormat("SomeFunction({[&] {\n"
10979*67e74705SXin Li                "  // comment\n"
10980*67e74705SXin Li                "}});");
10981*67e74705SXin Li   verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10982*67e74705SXin Li                "                             [&]() { return true; },\n"
10983*67e74705SXin Li                "                         aaaaa aaaaaaaaa);");
10984*67e74705SXin Li 
10985*67e74705SXin Li   // Lambdas with return types.
10986*67e74705SXin Li   verifyFormat("int c = []() -> int { return 2; }();\n");
10987*67e74705SXin Li   verifyFormat("int c = []() -> int * { return 2; }();\n");
10988*67e74705SXin Li   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10989*67e74705SXin Li   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
10990*67e74705SXin Li   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
10991*67e74705SXin Li   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
10992*67e74705SXin Li   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10993*67e74705SXin Li   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
10994*67e74705SXin Li   verifyFormat("[a, a]() -> a<1> {};");
10995*67e74705SXin Li   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10996*67e74705SXin Li                "                   int j) -> int {\n"
10997*67e74705SXin Li                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
10998*67e74705SXin Li                "};");
10999*67e74705SXin Li   verifyFormat(
11000*67e74705SXin Li       "aaaaaaaaaaaaaaaaaaaaaa(\n"
11001*67e74705SXin Li       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11002*67e74705SXin Li       "      return aaaaaaaaaaaaaaaaa;\n"
11003*67e74705SXin Li       "    });",
11004*67e74705SXin Li       getLLVMStyleWithColumns(70));
11005*67e74705SXin Li   verifyFormat("[]() //\n"
11006*67e74705SXin Li                "    -> int {\n"
11007*67e74705SXin Li                "  return 1; //\n"
11008*67e74705SXin Li                "};");
11009*67e74705SXin Li 
11010*67e74705SXin Li   // Multiple lambdas in the same parentheses change indentation rules.
11011*67e74705SXin Li   verifyFormat("SomeFunction(\n"
11012*67e74705SXin Li                "    []() {\n"
11013*67e74705SXin Li                "      int i = 42;\n"
11014*67e74705SXin Li                "      return i;\n"
11015*67e74705SXin Li                "    },\n"
11016*67e74705SXin Li                "    []() {\n"
11017*67e74705SXin Li                "      int j = 43;\n"
11018*67e74705SXin Li                "      return j;\n"
11019*67e74705SXin Li                "    });");
11020*67e74705SXin Li 
11021*67e74705SXin Li   // More complex introducers.
11022*67e74705SXin Li   verifyFormat("return [i, args...] {};");
11023*67e74705SXin Li 
11024*67e74705SXin Li   // Not lambdas.
11025*67e74705SXin Li   verifyFormat("constexpr char hello[]{\"hello\"};");
11026*67e74705SXin Li   verifyFormat("double &operator[](int i) { return 0; }\n"
11027*67e74705SXin Li                "int i;");
11028*67e74705SXin Li   verifyFormat("std::unique_ptr<int[]> foo() {}");
11029*67e74705SXin Li   verifyFormat("int i = a[a][a]->f();");
11030*67e74705SXin Li   verifyFormat("int i = (*b)[a]->f();");
11031*67e74705SXin Li 
11032*67e74705SXin Li   // Other corner cases.
11033*67e74705SXin Li   verifyFormat("void f() {\n"
11034*67e74705SXin Li                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11035*67e74705SXin Li                "      );\n"
11036*67e74705SXin Li                "}");
11037*67e74705SXin Li 
11038*67e74705SXin Li   // Lambdas created through weird macros.
11039*67e74705SXin Li   verifyFormat("void f() {\n"
11040*67e74705SXin Li                "  MACRO((const AA &a) { return 1; });\n"
11041*67e74705SXin Li                "  MACRO((AA &a) { return 1; });\n"
11042*67e74705SXin Li                "}");
11043*67e74705SXin Li 
11044*67e74705SXin Li   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11045*67e74705SXin Li                "      doo_dah();\n"
11046*67e74705SXin Li                "      doo_dah();\n"
11047*67e74705SXin Li                "    })) {\n"
11048*67e74705SXin Li                "}");
11049*67e74705SXin Li   verifyFormat("auto lambda = []() {\n"
11050*67e74705SXin Li                "  int a = 2\n"
11051*67e74705SXin Li                "#if A\n"
11052*67e74705SXin Li                "          + 2\n"
11053*67e74705SXin Li                "#endif\n"
11054*67e74705SXin Li                "      ;\n"
11055*67e74705SXin Li                "};");
11056*67e74705SXin Li }
11057*67e74705SXin Li 
TEST_F(FormatTest,FormatsBlocks)11058*67e74705SXin Li TEST_F(FormatTest, FormatsBlocks) {
11059*67e74705SXin Li   FormatStyle ShortBlocks = getLLVMStyle();
11060*67e74705SXin Li   ShortBlocks.AllowShortBlocksOnASingleLine = true;
11061*67e74705SXin Li   verifyFormat("int (^Block)(int, int);", ShortBlocks);
11062*67e74705SXin Li   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11063*67e74705SXin Li   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11064*67e74705SXin Li   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11065*67e74705SXin Li   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11066*67e74705SXin Li   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
11067*67e74705SXin Li 
11068*67e74705SXin Li   verifyFormat("foo(^{ bar(); });", ShortBlocks);
11069*67e74705SXin Li   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11070*67e74705SXin Li   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
11071*67e74705SXin Li 
11072*67e74705SXin Li   verifyFormat("[operation setCompletionBlock:^{\n"
11073*67e74705SXin Li                "  [self onOperationDone];\n"
11074*67e74705SXin Li                "}];");
11075*67e74705SXin Li   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
11076*67e74705SXin Li                "  [self onOperationDone];\n"
11077*67e74705SXin Li                "}]};");
11078*67e74705SXin Li   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
11079*67e74705SXin Li                "  f();\n"
11080*67e74705SXin Li                "}];");
11081*67e74705SXin Li   verifyFormat("int a = [operation block:^int(int *i) {\n"
11082*67e74705SXin Li                "  return 1;\n"
11083*67e74705SXin Li                "}];");
11084*67e74705SXin Li   verifyFormat("[myObject doSomethingWith:arg1\n"
11085*67e74705SXin Li                "                      aaa:^int(int *a) {\n"
11086*67e74705SXin Li                "                        return 1;\n"
11087*67e74705SXin Li                "                      }\n"
11088*67e74705SXin Li                "                      bbb:f(a * bbbbbbbb)];");
11089*67e74705SXin Li 
11090*67e74705SXin Li   verifyFormat("[operation setCompletionBlock:^{\n"
11091*67e74705SXin Li                "  [self.delegate newDataAvailable];\n"
11092*67e74705SXin Li                "}];",
11093*67e74705SXin Li                getLLVMStyleWithColumns(60));
11094*67e74705SXin Li   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
11095*67e74705SXin Li                "  NSString *path = [self sessionFilePath];\n"
11096*67e74705SXin Li                "  if (path) {\n"
11097*67e74705SXin Li                "    // ...\n"
11098*67e74705SXin Li                "  }\n"
11099*67e74705SXin Li                "});");
11100*67e74705SXin Li   verifyFormat("[[SessionService sharedService]\n"
11101*67e74705SXin Li                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11102*67e74705SXin Li                "      if (window) {\n"
11103*67e74705SXin Li                "        [self windowDidLoad:window];\n"
11104*67e74705SXin Li                "      } else {\n"
11105*67e74705SXin Li                "        [self errorLoadingWindow];\n"
11106*67e74705SXin Li                "      }\n"
11107*67e74705SXin Li                "    }];");
11108*67e74705SXin Li   verifyFormat("void (^largeBlock)(void) = ^{\n"
11109*67e74705SXin Li                "  // ...\n"
11110*67e74705SXin Li                "};\n",
11111*67e74705SXin Li                getLLVMStyleWithColumns(40));
11112*67e74705SXin Li   verifyFormat("[[SessionService sharedService]\n"
11113*67e74705SXin Li                "    loadWindowWithCompletionBlock: //\n"
11114*67e74705SXin Li                "        ^(SessionWindow *window) {\n"
11115*67e74705SXin Li                "          if (window) {\n"
11116*67e74705SXin Li                "            [self windowDidLoad:window];\n"
11117*67e74705SXin Li                "          } else {\n"
11118*67e74705SXin Li                "            [self errorLoadingWindow];\n"
11119*67e74705SXin Li                "          }\n"
11120*67e74705SXin Li                "        }];",
11121*67e74705SXin Li                getLLVMStyleWithColumns(60));
11122*67e74705SXin Li   verifyFormat("[myObject doSomethingWith:arg1\n"
11123*67e74705SXin Li                "    firstBlock:^(Foo *a) {\n"
11124*67e74705SXin Li                "      // ...\n"
11125*67e74705SXin Li                "      int i;\n"
11126*67e74705SXin Li                "    }\n"
11127*67e74705SXin Li                "    secondBlock:^(Bar *b) {\n"
11128*67e74705SXin Li                "      // ...\n"
11129*67e74705SXin Li                "      int i;\n"
11130*67e74705SXin Li                "    }\n"
11131*67e74705SXin Li                "    thirdBlock:^Foo(Bar *b) {\n"
11132*67e74705SXin Li                "      // ...\n"
11133*67e74705SXin Li                "      int i;\n"
11134*67e74705SXin Li                "    }];");
11135*67e74705SXin Li   verifyFormat("[myObject doSomethingWith:arg1\n"
11136*67e74705SXin Li                "               firstBlock:-1\n"
11137*67e74705SXin Li                "              secondBlock:^(Bar *b) {\n"
11138*67e74705SXin Li                "                // ...\n"
11139*67e74705SXin Li                "                int i;\n"
11140*67e74705SXin Li                "              }];");
11141*67e74705SXin Li 
11142*67e74705SXin Li   verifyFormat("f(^{\n"
11143*67e74705SXin Li                "  @autoreleasepool {\n"
11144*67e74705SXin Li                "    if (a) {\n"
11145*67e74705SXin Li                "      g();\n"
11146*67e74705SXin Li                "    }\n"
11147*67e74705SXin Li                "  }\n"
11148*67e74705SXin Li                "});");
11149*67e74705SXin Li   verifyFormat("Block b = ^int *(A *a, B *b) {}");
11150*67e74705SXin Li 
11151*67e74705SXin Li   FormatStyle FourIndent = getLLVMStyle();
11152*67e74705SXin Li   FourIndent.ObjCBlockIndentWidth = 4;
11153*67e74705SXin Li   verifyFormat("[operation setCompletionBlock:^{\n"
11154*67e74705SXin Li                "    [self onOperationDone];\n"
11155*67e74705SXin Li                "}];",
11156*67e74705SXin Li                FourIndent);
11157*67e74705SXin Li }
11158*67e74705SXin Li 
TEST_F(FormatTest,FormatsBlocksWithZeroColumnWidth)11159*67e74705SXin Li TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11160*67e74705SXin Li   FormatStyle ZeroColumn = getLLVMStyle();
11161*67e74705SXin Li   ZeroColumn.ColumnLimit = 0;
11162*67e74705SXin Li 
11163*67e74705SXin Li   verifyFormat("[[SessionService sharedService] "
11164*67e74705SXin Li                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11165*67e74705SXin Li                "  if (window) {\n"
11166*67e74705SXin Li                "    [self windowDidLoad:window];\n"
11167*67e74705SXin Li                "  } else {\n"
11168*67e74705SXin Li                "    [self errorLoadingWindow];\n"
11169*67e74705SXin Li                "  }\n"
11170*67e74705SXin Li                "}];",
11171*67e74705SXin Li                ZeroColumn);
11172*67e74705SXin Li   EXPECT_EQ("[[SessionService sharedService]\n"
11173*67e74705SXin Li             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11174*67e74705SXin Li             "      if (window) {\n"
11175*67e74705SXin Li             "        [self windowDidLoad:window];\n"
11176*67e74705SXin Li             "      } else {\n"
11177*67e74705SXin Li             "        [self errorLoadingWindow];\n"
11178*67e74705SXin Li             "      }\n"
11179*67e74705SXin Li             "    }];",
11180*67e74705SXin Li             format("[[SessionService sharedService]\n"
11181*67e74705SXin Li                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11182*67e74705SXin Li                    "                if (window) {\n"
11183*67e74705SXin Li                    "    [self windowDidLoad:window];\n"
11184*67e74705SXin Li                    "  } else {\n"
11185*67e74705SXin Li                    "    [self errorLoadingWindow];\n"
11186*67e74705SXin Li                    "  }\n"
11187*67e74705SXin Li                    "}];",
11188*67e74705SXin Li                    ZeroColumn));
11189*67e74705SXin Li   verifyFormat("[myObject doSomethingWith:arg1\n"
11190*67e74705SXin Li                "    firstBlock:^(Foo *a) {\n"
11191*67e74705SXin Li                "      // ...\n"
11192*67e74705SXin Li                "      int i;\n"
11193*67e74705SXin Li                "    }\n"
11194*67e74705SXin Li                "    secondBlock:^(Bar *b) {\n"
11195*67e74705SXin Li                "      // ...\n"
11196*67e74705SXin Li                "      int i;\n"
11197*67e74705SXin Li                "    }\n"
11198*67e74705SXin Li                "    thirdBlock:^Foo(Bar *b) {\n"
11199*67e74705SXin Li                "      // ...\n"
11200*67e74705SXin Li                "      int i;\n"
11201*67e74705SXin Li                "    }];",
11202*67e74705SXin Li                ZeroColumn);
11203*67e74705SXin Li   verifyFormat("f(^{\n"
11204*67e74705SXin Li                "  @autoreleasepool {\n"
11205*67e74705SXin Li                "    if (a) {\n"
11206*67e74705SXin Li                "      g();\n"
11207*67e74705SXin Li                "    }\n"
11208*67e74705SXin Li                "  }\n"
11209*67e74705SXin Li                "});",
11210*67e74705SXin Li                ZeroColumn);
11211*67e74705SXin Li   verifyFormat("void (^largeBlock)(void) = ^{\n"
11212*67e74705SXin Li                "  // ...\n"
11213*67e74705SXin Li                "};",
11214*67e74705SXin Li                ZeroColumn);
11215*67e74705SXin Li 
11216*67e74705SXin Li   ZeroColumn.AllowShortBlocksOnASingleLine = true;
11217*67e74705SXin Li   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
11218*67e74705SXin Li             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
11219*67e74705SXin Li   ZeroColumn.AllowShortBlocksOnASingleLine = false;
11220*67e74705SXin Li   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11221*67e74705SXin Li             "  int i;\n"
11222*67e74705SXin Li             "};",
11223*67e74705SXin Li             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
11224*67e74705SXin Li }
11225*67e74705SXin Li 
TEST_F(FormatTest,SupportsCRLF)11226*67e74705SXin Li TEST_F(FormatTest, SupportsCRLF) {
11227*67e74705SXin Li   EXPECT_EQ("int a;\r\n"
11228*67e74705SXin Li             "int b;\r\n"
11229*67e74705SXin Li             "int c;\r\n",
11230*67e74705SXin Li             format("int a;\r\n"
11231*67e74705SXin Li                    "  int b;\r\n"
11232*67e74705SXin Li                    "    int c;\r\n",
11233*67e74705SXin Li                    getLLVMStyle()));
11234*67e74705SXin Li   EXPECT_EQ("int a;\r\n"
11235*67e74705SXin Li             "int b;\r\n"
11236*67e74705SXin Li             "int c;\r\n",
11237*67e74705SXin Li             format("int a;\r\n"
11238*67e74705SXin Li                    "  int b;\n"
11239*67e74705SXin Li                    "    int c;\r\n",
11240*67e74705SXin Li                    getLLVMStyle()));
11241*67e74705SXin Li   EXPECT_EQ("int a;\n"
11242*67e74705SXin Li             "int b;\n"
11243*67e74705SXin Li             "int c;\n",
11244*67e74705SXin Li             format("int a;\r\n"
11245*67e74705SXin Li                    "  int b;\n"
11246*67e74705SXin Li                    "    int c;\n",
11247*67e74705SXin Li                    getLLVMStyle()));
11248*67e74705SXin Li   EXPECT_EQ("\"aaaaaaa \"\r\n"
11249*67e74705SXin Li             "\"bbbbbbb\";\r\n",
11250*67e74705SXin Li             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11251*67e74705SXin Li   EXPECT_EQ("#define A \\\r\n"
11252*67e74705SXin Li             "  b;      \\\r\n"
11253*67e74705SXin Li             "  c;      \\\r\n"
11254*67e74705SXin Li             "  d;\r\n",
11255*67e74705SXin Li             format("#define A \\\r\n"
11256*67e74705SXin Li                    "  b; \\\r\n"
11257*67e74705SXin Li                    "  c; d; \r\n",
11258*67e74705SXin Li                    getGoogleStyle()));
11259*67e74705SXin Li 
11260*67e74705SXin Li   EXPECT_EQ("/*\r\n"
11261*67e74705SXin Li             "multi line block comments\r\n"
11262*67e74705SXin Li             "should not introduce\r\n"
11263*67e74705SXin Li             "an extra carriage return\r\n"
11264*67e74705SXin Li             "*/\r\n",
11265*67e74705SXin Li             format("/*\r\n"
11266*67e74705SXin Li                    "multi line block comments\r\n"
11267*67e74705SXin Li                    "should not introduce\r\n"
11268*67e74705SXin Li                    "an extra carriage return\r\n"
11269*67e74705SXin Li                    "*/\r\n"));
11270*67e74705SXin Li }
11271*67e74705SXin Li 
TEST_F(FormatTest,MunchSemicolonAfterBlocks)11272*67e74705SXin Li TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11273*67e74705SXin Li   verifyFormat("MY_CLASS(C) {\n"
11274*67e74705SXin Li                "  int i;\n"
11275*67e74705SXin Li                "  int j;\n"
11276*67e74705SXin Li                "};");
11277*67e74705SXin Li }
11278*67e74705SXin Li 
TEST_F(FormatTest,ConfigurableContinuationIndentWidth)11279*67e74705SXin Li TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11280*67e74705SXin Li   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11281*67e74705SXin Li   TwoIndent.ContinuationIndentWidth = 2;
11282*67e74705SXin Li 
11283*67e74705SXin Li   EXPECT_EQ("int i =\n"
11284*67e74705SXin Li             "  longFunction(\n"
11285*67e74705SXin Li             "    arg);",
11286*67e74705SXin Li             format("int i = longFunction(arg);", TwoIndent));
11287*67e74705SXin Li 
11288*67e74705SXin Li   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11289*67e74705SXin Li   SixIndent.ContinuationIndentWidth = 6;
11290*67e74705SXin Li 
11291*67e74705SXin Li   EXPECT_EQ("int i =\n"
11292*67e74705SXin Li             "      longFunction(\n"
11293*67e74705SXin Li             "            arg);",
11294*67e74705SXin Li             format("int i = longFunction(arg);", SixIndent));
11295*67e74705SXin Li }
11296*67e74705SXin Li 
TEST_F(FormatTest,SpacesInAngles)11297*67e74705SXin Li TEST_F(FormatTest, SpacesInAngles) {
11298*67e74705SXin Li   FormatStyle Spaces = getLLVMStyle();
11299*67e74705SXin Li   Spaces.SpacesInAngles = true;
11300*67e74705SXin Li 
11301*67e74705SXin Li   verifyFormat("static_cast< int >(arg);", Spaces);
11302*67e74705SXin Li   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11303*67e74705SXin Li   verifyFormat("f< int, float >();", Spaces);
11304*67e74705SXin Li   verifyFormat("template <> g() {}", Spaces);
11305*67e74705SXin Li   verifyFormat("template < std::vector< int > > f() {}", Spaces);
11306*67e74705SXin Li   verifyFormat("std::function< void(int, int) > fct;", Spaces);
11307*67e74705SXin Li   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11308*67e74705SXin Li                Spaces);
11309*67e74705SXin Li 
11310*67e74705SXin Li   Spaces.Standard = FormatStyle::LS_Cpp03;
11311*67e74705SXin Li   Spaces.SpacesInAngles = true;
11312*67e74705SXin Li   verifyFormat("A< A< int > >();", Spaces);
11313*67e74705SXin Li 
11314*67e74705SXin Li   Spaces.SpacesInAngles = false;
11315*67e74705SXin Li   verifyFormat("A<A<int> >();", Spaces);
11316*67e74705SXin Li 
11317*67e74705SXin Li   Spaces.Standard = FormatStyle::LS_Cpp11;
11318*67e74705SXin Li   Spaces.SpacesInAngles = true;
11319*67e74705SXin Li   verifyFormat("A< A< int > >();", Spaces);
11320*67e74705SXin Li 
11321*67e74705SXin Li   Spaces.SpacesInAngles = false;
11322*67e74705SXin Li   verifyFormat("A<A<int>>();", Spaces);
11323*67e74705SXin Li }
11324*67e74705SXin Li 
TEST_F(FormatTest,TripleAngleBrackets)11325*67e74705SXin Li TEST_F(FormatTest, TripleAngleBrackets) {
11326*67e74705SXin Li   verifyFormat("f<<<1, 1>>>();");
11327*67e74705SXin Li   verifyFormat("f<<<1, 1, 1, s>>>();");
11328*67e74705SXin Li   verifyFormat("f<<<a, b, c, d>>>();");
11329*67e74705SXin Li   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
11330*67e74705SXin Li   verifyFormat("f<param><<<1, 1>>>();");
11331*67e74705SXin Li   verifyFormat("f<1><<<1, 1>>>();");
11332*67e74705SXin Li   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
11333*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11334*67e74705SXin Li                "aaaaaaaaaaa<<<\n    1, 1>>>();");
11335*67e74705SXin Li }
11336*67e74705SXin Li 
TEST_F(FormatTest,MergeLessLessAtEnd)11337*67e74705SXin Li TEST_F(FormatTest, MergeLessLessAtEnd) {
11338*67e74705SXin Li   verifyFormat("<<");
11339*67e74705SXin Li   EXPECT_EQ("< < <", format("\\\n<<<"));
11340*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11341*67e74705SXin Li                "aaallvm::outs() <<");
11342*67e74705SXin Li   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11343*67e74705SXin Li                "aaaallvm::outs()\n    <<");
11344*67e74705SXin Li }
11345*67e74705SXin Li 
TEST_F(FormatTest,HandleUnbalancedImplicitBracesAcrossPPBranches)11346*67e74705SXin Li TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11347*67e74705SXin Li   std::string code = "#if A\n"
11348*67e74705SXin Li                      "#if B\n"
11349*67e74705SXin Li                      "a.\n"
11350*67e74705SXin Li                      "#endif\n"
11351*67e74705SXin Li                      "    a = 1;\n"
11352*67e74705SXin Li                      "#else\n"
11353*67e74705SXin Li                      "#endif\n"
11354*67e74705SXin Li                      "#if C\n"
11355*67e74705SXin Li                      "#else\n"
11356*67e74705SXin Li                      "#endif\n";
11357*67e74705SXin Li   EXPECT_EQ(code, format(code));
11358*67e74705SXin Li }
11359*67e74705SXin Li 
TEST_F(FormatTest,HandleConflictMarkers)11360*67e74705SXin Li TEST_F(FormatTest, HandleConflictMarkers) {
11361*67e74705SXin Li   // Git/SVN conflict markers.
11362*67e74705SXin Li   EXPECT_EQ("int a;\n"
11363*67e74705SXin Li             "void f() {\n"
11364*67e74705SXin Li             "  callme(some(parameter1,\n"
11365*67e74705SXin Li             "<<<<<<< text by the vcs\n"
11366*67e74705SXin Li             "              parameter2),\n"
11367*67e74705SXin Li             "||||||| text by the vcs\n"
11368*67e74705SXin Li             "              parameter2),\n"
11369*67e74705SXin Li             "         parameter3,\n"
11370*67e74705SXin Li             "======= text by the vcs\n"
11371*67e74705SXin Li             "              parameter2, parameter3),\n"
11372*67e74705SXin Li             ">>>>>>> text by the vcs\n"
11373*67e74705SXin Li             "         otherparameter);\n",
11374*67e74705SXin Li             format("int a;\n"
11375*67e74705SXin Li                    "void f() {\n"
11376*67e74705SXin Li                    "  callme(some(parameter1,\n"
11377*67e74705SXin Li                    "<<<<<<< text by the vcs\n"
11378*67e74705SXin Li                    "  parameter2),\n"
11379*67e74705SXin Li                    "||||||| text by the vcs\n"
11380*67e74705SXin Li                    "  parameter2),\n"
11381*67e74705SXin Li                    "  parameter3,\n"
11382*67e74705SXin Li                    "======= text by the vcs\n"
11383*67e74705SXin Li                    "  parameter2,\n"
11384*67e74705SXin Li                    "  parameter3),\n"
11385*67e74705SXin Li                    ">>>>>>> text by the vcs\n"
11386*67e74705SXin Li                    "  otherparameter);\n"));
11387*67e74705SXin Li 
11388*67e74705SXin Li   // Perforce markers.
11389*67e74705SXin Li   EXPECT_EQ("void f() {\n"
11390*67e74705SXin Li             "  function(\n"
11391*67e74705SXin Li             ">>>> text by the vcs\n"
11392*67e74705SXin Li             "      parameter,\n"
11393*67e74705SXin Li             "==== text by the vcs\n"
11394*67e74705SXin Li             "      parameter,\n"
11395*67e74705SXin Li             "==== text by the vcs\n"
11396*67e74705SXin Li             "      parameter,\n"
11397*67e74705SXin Li             "<<<< text by the vcs\n"
11398*67e74705SXin Li             "      parameter);\n",
11399*67e74705SXin Li             format("void f() {\n"
11400*67e74705SXin Li                    "  function(\n"
11401*67e74705SXin Li                    ">>>> text by the vcs\n"
11402*67e74705SXin Li                    "  parameter,\n"
11403*67e74705SXin Li                    "==== text by the vcs\n"
11404*67e74705SXin Li                    "  parameter,\n"
11405*67e74705SXin Li                    "==== text by the vcs\n"
11406*67e74705SXin Li                    "  parameter,\n"
11407*67e74705SXin Li                    "<<<< text by the vcs\n"
11408*67e74705SXin Li                    "  parameter);\n"));
11409*67e74705SXin Li 
11410*67e74705SXin Li   EXPECT_EQ("<<<<<<<\n"
11411*67e74705SXin Li             "|||||||\n"
11412*67e74705SXin Li             "=======\n"
11413*67e74705SXin Li             ">>>>>>>",
11414*67e74705SXin Li             format("<<<<<<<\n"
11415*67e74705SXin Li                    "|||||||\n"
11416*67e74705SXin Li                    "=======\n"
11417*67e74705SXin Li                    ">>>>>>>"));
11418*67e74705SXin Li 
11419*67e74705SXin Li   EXPECT_EQ("<<<<<<<\n"
11420*67e74705SXin Li             "|||||||\n"
11421*67e74705SXin Li             "int i;\n"
11422*67e74705SXin Li             "=======\n"
11423*67e74705SXin Li             ">>>>>>>",
11424*67e74705SXin Li             format("<<<<<<<\n"
11425*67e74705SXin Li                    "|||||||\n"
11426*67e74705SXin Li                    "int i;\n"
11427*67e74705SXin Li                    "=======\n"
11428*67e74705SXin Li                    ">>>>>>>"));
11429*67e74705SXin Li 
11430*67e74705SXin Li   // FIXME: Handle parsing of macros around conflict markers correctly:
11431*67e74705SXin Li   EXPECT_EQ("#define Macro \\\n"
11432*67e74705SXin Li             "<<<<<<<\n"
11433*67e74705SXin Li             "Something \\\n"
11434*67e74705SXin Li             "|||||||\n"
11435*67e74705SXin Li             "Else \\\n"
11436*67e74705SXin Li             "=======\n"
11437*67e74705SXin Li             "Other \\\n"
11438*67e74705SXin Li             ">>>>>>>\n"
11439*67e74705SXin Li             "    End int i;\n",
11440*67e74705SXin Li             format("#define Macro \\\n"
11441*67e74705SXin Li                    "<<<<<<<\n"
11442*67e74705SXin Li                    "  Something \\\n"
11443*67e74705SXin Li                    "|||||||\n"
11444*67e74705SXin Li                    "  Else \\\n"
11445*67e74705SXin Li                    "=======\n"
11446*67e74705SXin Li                    "  Other \\\n"
11447*67e74705SXin Li                    ">>>>>>>\n"
11448*67e74705SXin Li                    "  End\n"
11449*67e74705SXin Li                    "int i;\n"));
11450*67e74705SXin Li }
11451*67e74705SXin Li 
TEST_F(FormatTest,DisableRegions)11452*67e74705SXin Li TEST_F(FormatTest, DisableRegions) {
11453*67e74705SXin Li   EXPECT_EQ("int i;\n"
11454*67e74705SXin Li             "// clang-format off\n"
11455*67e74705SXin Li             "  int j;\n"
11456*67e74705SXin Li             "// clang-format on\n"
11457*67e74705SXin Li             "int k;",
11458*67e74705SXin Li             format(" int  i;\n"
11459*67e74705SXin Li                    "   // clang-format off\n"
11460*67e74705SXin Li                    "  int j;\n"
11461*67e74705SXin Li                    " // clang-format on\n"
11462*67e74705SXin Li                    "   int   k;"));
11463*67e74705SXin Li   EXPECT_EQ("int i;\n"
11464*67e74705SXin Li             "/* clang-format off */\n"
11465*67e74705SXin Li             "  int j;\n"
11466*67e74705SXin Li             "/* clang-format on */\n"
11467*67e74705SXin Li             "int k;",
11468*67e74705SXin Li             format(" int  i;\n"
11469*67e74705SXin Li                    "   /* clang-format off */\n"
11470*67e74705SXin Li                    "  int j;\n"
11471*67e74705SXin Li                    " /* clang-format on */\n"
11472*67e74705SXin Li                    "   int   k;"));
11473*67e74705SXin Li }
11474*67e74705SXin Li 
TEST_F(FormatTest,DoNotCrashOnInvalidInput)11475*67e74705SXin Li TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11476*67e74705SXin Li   format("? ) =");
11477*67e74705SXin Li   verifyNoCrash("#define a\\\n /**/}");
11478*67e74705SXin Li }
11479*67e74705SXin Li 
TEST_F(FormatTest,FormatsTableGenCode)11480*67e74705SXin Li TEST_F(FormatTest, FormatsTableGenCode) {
11481*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
11482*67e74705SXin Li   Style.Language = FormatStyle::LK_TableGen;
11483*67e74705SXin Li   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11484*67e74705SXin Li }
11485*67e74705SXin Li 
11486*67e74705SXin Li // Since this test case uses UNIX-style file path. We disable it for MS
11487*67e74705SXin Li // compiler.
11488*67e74705SXin Li #if !defined(_MSC_VER) && !defined(__MINGW32__)
11489*67e74705SXin Li 
TEST(FormatStyle,GetStyleOfFile)11490*67e74705SXin Li TEST(FormatStyle, GetStyleOfFile) {
11491*67e74705SXin Li   vfs::InMemoryFileSystem FS;
11492*67e74705SXin Li   // Test 1: format file in the same directory.
11493*67e74705SXin Li   ASSERT_TRUE(
11494*67e74705SXin Li       FS.addFile("/a/.clang-format", 0,
11495*67e74705SXin Li                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11496*67e74705SXin Li   ASSERT_TRUE(
11497*67e74705SXin Li       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11498*67e74705SXin Li   auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11499*67e74705SXin Li   ASSERT_EQ(Style1, getLLVMStyle());
11500*67e74705SXin Li 
11501*67e74705SXin Li   // Test 2: fallback to default.
11502*67e74705SXin Li   ASSERT_TRUE(
11503*67e74705SXin Li       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11504*67e74705SXin Li   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11505*67e74705SXin Li   ASSERT_EQ(Style2, getMozillaStyle());
11506*67e74705SXin Li 
11507*67e74705SXin Li   // Test 3: format file in parent directory.
11508*67e74705SXin Li   ASSERT_TRUE(
11509*67e74705SXin Li       FS.addFile("/c/.clang-format", 0,
11510*67e74705SXin Li                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11511*67e74705SXin Li   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11512*67e74705SXin Li                          llvm::MemoryBuffer::getMemBuffer("int i;")));
11513*67e74705SXin Li   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11514*67e74705SXin Li   ASSERT_EQ(Style3, getGoogleStyle());
11515*67e74705SXin Li }
11516*67e74705SXin Li 
11517*67e74705SXin Li #endif // _MSC_VER
11518*67e74705SXin Li 
11519*67e74705SXin Li class ReplacementTest : public ::testing::Test {
11520*67e74705SXin Li protected:
createReplacement(SourceLocation Start,unsigned Length,llvm::StringRef ReplacementText)11521*67e74705SXin Li   tooling::Replacement createReplacement(SourceLocation Start, unsigned Length,
11522*67e74705SXin Li                                          llvm::StringRef ReplacementText) {
11523*67e74705SXin Li     return tooling::Replacement(Context.Sources, Start, Length,
11524*67e74705SXin Li                                 ReplacementText);
11525*67e74705SXin Li   }
11526*67e74705SXin Li 
11527*67e74705SXin Li   RewriterTestContext Context;
11528*67e74705SXin Li };
11529*67e74705SXin Li 
TEST_F(ReplacementTest,FormatCodeAfterReplacements)11530*67e74705SXin Li TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11531*67e74705SXin Li   // Column limit is 20.
11532*67e74705SXin Li   std::string Code = "Type *a =\n"
11533*67e74705SXin Li                      "    new Type();\n"
11534*67e74705SXin Li                      "g(iiiii, 0, jjjjj,\n"
11535*67e74705SXin Li                      "  0, kkkkk, 0, mm);\n"
11536*67e74705SXin Li                      "int  bad     = format   ;";
11537*67e74705SXin Li   std::string Expected = "auto a = new Type();\n"
11538*67e74705SXin Li                          "g(iiiii, nullptr,\n"
11539*67e74705SXin Li                          "  jjjjj, nullptr,\n"
11540*67e74705SXin Li                          "  kkkkk, nullptr,\n"
11541*67e74705SXin Li                          "  mm);\n"
11542*67e74705SXin Li                          "int  bad     = format   ;";
11543*67e74705SXin Li   FileID ID = Context.createInMemoryFile("format.cpp", Code);
11544*67e74705SXin Li   tooling::Replacements Replaces;
11545*67e74705SXin Li   Replaces.insert(tooling::Replacement(
11546*67e74705SXin Li       Context.Sources, Context.getLocation(ID, 1, 1), 6, "auto "));
11547*67e74705SXin Li   Replaces.insert(tooling::Replacement(
11548*67e74705SXin Li       Context.Sources, Context.getLocation(ID, 3, 10), 1, "nullptr"));
11549*67e74705SXin Li   Replaces.insert(tooling::Replacement(
11550*67e74705SXin Li       Context.Sources, Context.getLocation(ID, 4, 3), 1, "nullptr"));
11551*67e74705SXin Li   Replaces.insert(tooling::Replacement(
11552*67e74705SXin Li       Context.Sources, Context.getLocation(ID, 4, 13), 1, "nullptr"));
11553*67e74705SXin Li 
11554*67e74705SXin Li   format::FormatStyle Style = format::getLLVMStyle();
11555*67e74705SXin Li   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
11556*67e74705SXin Li   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11557*67e74705SXin Li   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11558*67e74705SXin Li       << llvm::toString(FormattedReplaces.takeError()) << "\n";
11559*67e74705SXin Li   auto Result = applyAllReplacements(Code, *FormattedReplaces);
11560*67e74705SXin Li   EXPECT_TRUE(static_cast<bool>(Result));
11561*67e74705SXin Li   EXPECT_EQ(Expected, *Result);
11562*67e74705SXin Li }
11563*67e74705SXin Li 
TEST_F(ReplacementTest,SortIncludesAfterReplacement)11564*67e74705SXin Li TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11565*67e74705SXin Li   std::string Code = "#include \"a.h\"\n"
11566*67e74705SXin Li                      "#include \"c.h\"\n"
11567*67e74705SXin Li                      "\n"
11568*67e74705SXin Li                      "int main() {\n"
11569*67e74705SXin Li                      "  return 0;\n"
11570*67e74705SXin Li                      "}";
11571*67e74705SXin Li   std::string Expected = "#include \"a.h\"\n"
11572*67e74705SXin Li                          "#include \"b.h\"\n"
11573*67e74705SXin Li                          "#include \"c.h\"\n"
11574*67e74705SXin Li                          "\n"
11575*67e74705SXin Li                          "int main() {\n"
11576*67e74705SXin Li                          "  return 0;\n"
11577*67e74705SXin Li                          "}";
11578*67e74705SXin Li   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
11579*67e74705SXin Li   tooling::Replacements Replaces;
11580*67e74705SXin Li   Replaces.insert(tooling::Replacement(
11581*67e74705SXin Li       Context.Sources, Context.getLocation(ID, 1, 1), 0, "#include \"b.h\"\n"));
11582*67e74705SXin Li 
11583*67e74705SXin Li   format::FormatStyle Style = format::getLLVMStyle();
11584*67e74705SXin Li   Style.SortIncludes = true;
11585*67e74705SXin Li   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11586*67e74705SXin Li   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11587*67e74705SXin Li       << llvm::toString(FormattedReplaces.takeError()) << "\n";
11588*67e74705SXin Li   auto Result = applyAllReplacements(Code, *FormattedReplaces);
11589*67e74705SXin Li   EXPECT_TRUE(static_cast<bool>(Result));
11590*67e74705SXin Li   EXPECT_EQ(Expected, *Result);
11591*67e74705SXin Li }
11592*67e74705SXin Li 
11593*67e74705SXin Li } // end namespace
11594*67e74705SXin Li } // end namespace format
11595*67e74705SXin Li } // end namespace clang
11596