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 ¶meter) {}");
4010*67e74705SXin Li verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4011*67e74705SXin Li "string OldFunction(const string ¶meter) {}");
4012*67e74705SXin Li verifyFormat("template <typename T>\n"
4013*67e74705SXin Li "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4014*67e74705SXin Li "string OldFunction(const string ¶meter) {}");
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 (¶meter)[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(¶m1, ¶m2)(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