blob: cec25440a5557c4dc6472cddc1d143d5386d8012 [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000033 enum StatusCheck {
34 SC_ExpectComplete,
35 SC_ExpectIncomplete,
36 SC_DoNotCheck
Manuel Klimekec5c3db2015-05-07 12:26:30 +000037 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000041 StatusCheck CheckComplete = SC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000045 FormattingAttemptStatus Status;
Manuel Klimekec5c3db2015-05-07 12:26:30 +000046 tooling::Replacements Replaces =
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000047 reformat(Style, Code, Ranges, "<stdin>", &Status);
48 if (CheckComplete != SC_DoNotCheck) {
49 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
50 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
51 << Code << "\n\n";
Manuel Klimekec5c3db2015-05-07 12:26:30 +000052 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000053 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000054 auto Result = applyAllReplacements(Code, Replaces);
55 EXPECT_TRUE(static_cast<bool>(Result));
56 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
57 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000058 }
59
Manuel Klimekb69e3c62013-01-02 18:33:23 +000060 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
61 FormatStyle Style = getLLVMStyle();
62 Style.ColumnLimit = ColumnLimit;
63 return Style;
64 }
65
Daniel Jasper1b750ed2013-01-14 16:24:39 +000066 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
67 FormatStyle Style = getGoogleStyle();
68 Style.ColumnLimit = ColumnLimit;
69 return Style;
70 }
71
Manuel Klimekb69e3c62013-01-02 18:33:23 +000072 void verifyFormat(llvm::StringRef Code,
73 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000074 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Nico Weberd96ae862017-02-24 19:10:12 +000075 if (Style.Language == FormatStyle::LK_Cpp) {
76 // Objective-C++ is a superset of C++, so everything checked for C++
77 // needs to be checked for Objective-C++ as well.
78 FormatStyle ObjCStyle = Style;
79 ObjCStyle.Language = FormatStyle::LK_ObjC;
80 EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
81 }
Daniel Jasperf7935112012-12-03 18:12:45 +000082 }
83
Manuel Klimekec5c3db2015-05-07 12:26:30 +000084 void verifyIncompleteFormat(llvm::StringRef Code,
85 const FormatStyle &Style = getLLVMStyle()) {
86 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000087 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000088 }
89
Daniel Jasperf7935112012-12-03 18:12:45 +000090 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000091 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000092 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000093
94 void verifyIndependentOfContext(llvm::StringRef text) {
95 verifyFormat(text);
96 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
97 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000098
Daniel Jasper675b4f82015-01-19 10:51:23 +000099 /// \brief Verify that clang-format does not crash on the given input.
100 void verifyNoCrash(llvm::StringRef Code,
101 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000102 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000103 }
104
Daniel Jasper7b038a22013-01-30 09:46:12 +0000105 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000106};
107
Manuel Klimek52b15152013-01-09 15:25:02 +0000108TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000109 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
110 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
111 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
112 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
113 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000114}
115
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000116//===----------------------------------------------------------------------===//
117// Basic function tests.
118//===----------------------------------------------------------------------===//
119
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000120TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000121 EXPECT_EQ(";", format(";"));
122}
123
124TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
125 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000126 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000127 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
128 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
129}
130
131TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
132 EXPECT_EQ("int i;", format("int\ni;"));
133}
134
135TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000136 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000137}
138
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000139TEST_F(FormatTest, FormatsNestedCall) {
140 verifyFormat("Method(f1, f2(f3));");
141 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000142 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000143}
144
Daniel Jasper14556742013-02-07 21:08:36 +0000145TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000146 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000147 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000148 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000149 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000150 verifyFormat("ALWAYS_INLINE ::std::string getName();");
151 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000152}
153
Daniel Jasper7b038a22013-01-30 09:46:12 +0000154TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
155 EXPECT_EQ("if (a) {\n"
156 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000157 "}",
158 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000159 EXPECT_EQ(4, ReplacementCount);
160 EXPECT_EQ("if (a) {\n"
161 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000162 "}",
163 format("if (a) {\n"
164 " f();\n"
165 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000166 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000167 EXPECT_EQ("/*\r\n"
168 "\r\n"
169 "*/\r\n",
170 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000171 "\r\n"
172 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000173 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000174}
175
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000176TEST_F(FormatTest, RemovesEmptyLines) {
177 EXPECT_EQ("class C {\n"
178 " int i;\n"
179 "};",
180 format("class C {\n"
181 " int i;\n"
182 "\n"
183 "};"));
184
Nico Weber34272652014-11-13 16:25:37 +0000185 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000186 EXPECT_EQ("namespace N {\n"
187 "\n"
188 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000189 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000190 format("namespace N {\n"
191 "\n"
192 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000193 "}",
194 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000195 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
196 "\n"
197 "int i;\n"
198 "}",
199 format("extern /**/ \"C\" /**/ {\n"
200 "\n"
201 "int i;\n"
202 "}",
203 getGoogleStyle()));
204
205 // ...but do keep inlining and removing empty lines for non-block extern "C"
206 // functions.
207 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
208 EXPECT_EQ("extern \"C\" int f() {\n"
209 " int i = 42;\n"
210 " return i;\n"
211 "}",
212 format("extern \"C\" int f() {\n"
213 "\n"
214 " int i = 42;\n"
215 " return i;\n"
216 "}",
217 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000218
Daniel Jasper11164bd2014-03-21 12:58:53 +0000219 // Remove empty lines at the beginning and end of blocks.
220 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000221 "\n"
222 " if (a) {\n"
223 "\n"
224 " f();\n"
225 " }\n"
226 "}",
227 format("void f() {\n"
228 "\n"
229 " if (a) {\n"
230 "\n"
231 " f();\n"
232 "\n"
233 " }\n"
234 "\n"
235 "}",
236 getLLVMStyle()));
237 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000238 " if (a) {\n"
239 " f();\n"
240 " }\n"
241 "}",
242 format("void f() {\n"
243 "\n"
244 " if (a) {\n"
245 "\n"
246 " f();\n"
247 "\n"
248 " }\n"
249 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000250 "}",
251 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000252
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000253 // Don't remove empty lines in more complex control statements.
254 EXPECT_EQ("void f() {\n"
255 " if (a) {\n"
256 " f();\n"
257 "\n"
258 " } else if (b) {\n"
259 " f();\n"
260 " }\n"
261 "}",
262 format("void f() {\n"
263 " if (a) {\n"
264 " f();\n"
265 "\n"
266 " } else if (b) {\n"
267 " f();\n"
268 "\n"
269 " }\n"
270 "\n"
271 "}"));
272
273 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000274 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
275 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000276 EXPECT_EQ("namespace {\n"
277 "int i;\n"
278 "}",
279 format("namespace {\n"
280 "int i;\n"
281 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000282 "}", LLVMWithNoNamespaceFix));
283 EXPECT_EQ("namespace {\n"
284 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000285 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000286 format("namespace {\n"
287 "int i;\n"
288 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000289 "}"));
290 EXPECT_EQ("namespace {\n"
291 "int i;\n"
292 "\n"
293 "} // namespace",
294 format("namespace {\n"
295 "int i;\n"
296 "\n"
297 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000298
299 FormatStyle Style = getLLVMStyle();
300 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
301 Style.MaxEmptyLinesToKeep = 2;
302 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
303 Style.BraceWrapping.AfterClass = true;
304 Style.BraceWrapping.AfterFunction = true;
305 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
306
307 EXPECT_EQ("class Foo\n"
308 "{\n"
309 " Foo() {}\n"
310 "\n"
311 " void funk() {}\n"
312 "};",
313 format("class Foo\n"
314 "{\n"
315 " Foo()\n"
316 " {\n"
317 " }\n"
318 "\n"
319 " void funk() {}\n"
320 "};",
321 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000322}
323
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000324TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000325 verifyFormat("x = (a) and (b);");
326 verifyFormat("x = (a) or (b);");
327 verifyFormat("x = (a) bitand (b);");
328 verifyFormat("x = (a) bitor (b);");
329 verifyFormat("x = (a) not_eq (b);");
330 verifyFormat("x = (a) and_eq (b);");
331 verifyFormat("x = (a) or_eq (b);");
332 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000333}
334
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000335//===----------------------------------------------------------------------===//
336// Tests for control statements.
337//===----------------------------------------------------------------------===//
338
Daniel Jaspercdd06622013-05-14 10:31:09 +0000339TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000340 verifyFormat("if (true)\n f();\ng();");
341 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000342 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000343
Daniel Jasper3a685df2013-05-16 12:12:21 +0000344 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000345 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000346 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
347 verifyFormat("if (a)\n"
348 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000349 " f();",
350 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000351 verifyFormat("{\n"
352 " if (a)\n"
353 " label:\n"
354 " f();\n"
355 "}",
356 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000357 verifyFormat("#define A \\\n"
358 " if (a) \\\n"
359 " label: \\\n"
360 " f()",
361 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000362 verifyFormat("if (a)\n"
363 " ;",
364 AllowsMergedIf);
365 verifyFormat("if (a)\n"
366 " if (b) return;",
367 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000368
Daniel Jasper3a685df2013-05-16 12:12:21 +0000369 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000370 " f();\n",
371 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000372 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000373 " f();",
374 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000376 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000377 "}",
378 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000379 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000380 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000381 "}",
382 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000383
384 AllowsMergedIf.ColumnLimit = 14;
385 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000386 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000387 " return;",
388 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000389
390 AllowsMergedIf.ColumnLimit = 13;
391 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000392}
393
Daniel Jasper3a685df2013-05-16 12:12:21 +0000394TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
395 FormatStyle AllowsMergedLoops = getLLVMStyle();
396 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
397 verifyFormat("while (true) continue;", AllowsMergedLoops);
398 verifyFormat("for (;;) continue;", AllowsMergedLoops);
399 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
400 verifyFormat("while (true)\n"
401 " ;",
402 AllowsMergedLoops);
403 verifyFormat("for (;;)\n"
404 " ;",
405 AllowsMergedLoops);
406 verifyFormat("for (;;)\n"
407 " for (;;) continue;",
408 AllowsMergedLoops);
409 verifyFormat("for (;;) // Can't merge this\n"
410 " continue;",
411 AllowsMergedLoops);
412 verifyFormat("for (;;) /* still don't merge */\n"
413 " continue;",
414 AllowsMergedLoops);
415}
416
Daniel Jasper17605d32014-05-14 09:33:35 +0000417TEST_F(FormatTest, FormatShortBracedStatements) {
418 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
419 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
420
421 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
422 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
423
424 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
425 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
426 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
427 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
428 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
429 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
430 verifyFormat("if (true) { //\n"
431 " f();\n"
432 "}",
433 AllowSimpleBracedStatements);
434 verifyFormat("if (true) {\n"
435 " f();\n"
436 " f();\n"
437 "}",
438 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000439 verifyFormat("if (true) {\n"
440 " f();\n"
441 "} else {\n"
442 " f();\n"
443 "}",
444 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000445
Daniel Jasperbd630732014-05-22 13:25:26 +0000446 verifyFormat("template <int> struct A2 {\n"
447 " struct B {};\n"
448 "};",
449 AllowSimpleBracedStatements);
450
Daniel Jasper17605d32014-05-14 09:33:35 +0000451 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
452 verifyFormat("if (true) {\n"
453 " f();\n"
454 "}",
455 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000456 verifyFormat("if (true) {\n"
457 " f();\n"
458 "} else {\n"
459 " f();\n"
460 "}",
461 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000462
463 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
464 verifyFormat("while (true) {\n"
465 " f();\n"
466 "}",
467 AllowSimpleBracedStatements);
468 verifyFormat("for (;;) {\n"
469 " f();\n"
470 "}",
471 AllowSimpleBracedStatements);
472}
473
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000474TEST_F(FormatTest, ParseIfElse) {
475 verifyFormat("if (true)\n"
476 " if (true)\n"
477 " if (true)\n"
478 " f();\n"
479 " else\n"
480 " g();\n"
481 " else\n"
482 " h();\n"
483 "else\n"
484 " i();");
485 verifyFormat("if (true)\n"
486 " if (true)\n"
487 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000488 " if (true)\n"
489 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000490 " } else {\n"
491 " g();\n"
492 " }\n"
493 " else\n"
494 " h();\n"
495 "else {\n"
496 " i();\n"
497 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000498 verifyFormat("void f() {\n"
499 " if (a) {\n"
500 " } else {\n"
501 " }\n"
502 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000503}
504
505TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000506 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000507 verifyFormat("if (a)\n"
508 " f();\n"
509 "else if (b)\n"
510 " g();\n"
511 "else\n"
512 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000513 verifyFormat("if (a) {\n"
514 " f();\n"
515 "}\n"
516 "// or else ..\n"
517 "else {\n"
518 " g()\n"
519 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000520
521 verifyFormat("if (a) {\n"
522 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
524 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000525 verifyFormat("if (a) {\n"
526 "} else if (\n"
527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
528 "}",
529 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000530}
531
Daniel Jasperf7935112012-12-03 18:12:45 +0000532TEST_F(FormatTest, FormatsForLoop) {
533 verifyFormat(
534 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000535 " ++VeryVeryLongLoopVariable)\n"
536 " ;");
537 verifyFormat("for (;;)\n"
538 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000539 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000540 verifyFormat("for (;;) {\n"
541 " f();\n"
542 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000543 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000544
545 verifyFormat(
546 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
547 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000548 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000549
550 verifyFormat(
551 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000552 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000553 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
554 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000555 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000556 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
557 " I = FD->getDeclsInPrototypeScope().begin(),\n"
558 " E = FD->getDeclsInPrototypeScope().end();\n"
559 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000560 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
561 " I = Container.begin(),\n"
562 " E = Container.end();\n"
563 " I != E; ++I) {\n}",
564 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000565
Daniel Jasper48c62f92013-01-28 17:30:17 +0000566 verifyFormat(
567 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000571 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000572 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
573 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
574 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000575 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
576 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
577 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000578 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
579 " aaaaaaaaaa);\n"
580 " iter; ++iter) {\n"
581 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000582 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
584 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
585 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000586
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000587 FormatStyle NoBinPacking = getLLVMStyle();
588 NoBinPacking.BinPackParameters = false;
589 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
590 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
591 " aaaaaaaaaaaaaaaa,\n"
592 " aaaaaaaaaaaaaaaa,\n"
593 " aaaaaaaaaaaaaaaa);\n"
594 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
595 "}",
596 NoBinPacking);
597 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000598 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
599 " E = UnwrappedLines.end();\n"
600 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000601 " ++I) {\n}",
602 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000603}
604
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000605TEST_F(FormatTest, RangeBasedForLoops) {
606 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
608 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
609 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000610 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000612 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
613 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000614}
615
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616TEST_F(FormatTest, ForEachLoops) {
617 verifyFormat("void f() {\n"
618 " foreach (Item *item, itemlist) {}\n"
619 " Q_FOREACH (Item *item, itemlist) {}\n"
620 " BOOST_FOREACH (Item *item, itemlist) {}\n"
621 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
622 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000623
624 // As function-like macros.
625 verifyFormat("#define foreach(x, y)\n"
626 "#define Q_FOREACH(x, y)\n"
627 "#define BOOST_FOREACH(x, y)\n"
628 "#define UNKNOWN_FOREACH(x, y)\n");
629
630 // Not as function-like macros.
631 verifyFormat("#define foreach (x, y)\n"
632 "#define Q_FOREACH (x, y)\n"
633 "#define BOOST_FOREACH (x, y)\n"
634 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000635}
636
Daniel Jasperf7935112012-12-03 18:12:45 +0000637TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000638 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000639 verifyFormat("while (true)\n"
640 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000641 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000642 verifyFormat("while () {\n"
643 " f();\n"
644 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000645}
646
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000647TEST_F(FormatTest, FormatsDoWhile) {
648 verifyFormat("do {\n"
649 " do_something();\n"
650 "} while (something());");
651 verifyFormat("do\n"
652 " do_something();\n"
653 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000654}
655
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000656TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000657 verifyFormat("switch (x) {\n"
658 "case 1:\n"
659 " f();\n"
660 " break;\n"
661 "case kFoo:\n"
662 "case ns::kBar:\n"
663 "case kBaz:\n"
664 " break;\n"
665 "default:\n"
666 " g();\n"
667 " break;\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " break;\n"
673 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000674 "case 2: {\n"
675 " break;\n"
676 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000677 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000678 verifyFormat("switch (x) {\n"
679 "case 1: {\n"
680 " f();\n"
681 " {\n"
682 " g();\n"
683 " h();\n"
684 " }\n"
685 " break;\n"
686 "}\n"
687 "}");
688 verifyFormat("switch (x) {\n"
689 "case 1: {\n"
690 " f();\n"
691 " if (foo) {\n"
692 " g();\n"
693 " h();\n"
694 " }\n"
695 " break;\n"
696 "}\n"
697 "}");
698 verifyFormat("switch (x) {\n"
699 "case 1: {\n"
700 " f();\n"
701 " g();\n"
702 "} break;\n"
703 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000704 verifyFormat("switch (test)\n"
705 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000706 verifyFormat("switch (x) {\n"
707 "default: {\n"
708 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000709 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000710 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000711 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000712 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000713 "// if 1, do f()\n"
714 "case 1:\n"
715 " f();\n"
716 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:\n"
719 " // Do amazing stuff\n"
720 " {\n"
721 " f();\n"
722 " g();\n"
723 " }\n"
724 " break;\n"
725 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000726 verifyFormat("#define A \\\n"
727 " switch (x) { \\\n"
728 " case a: \\\n"
729 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000730 " }",
731 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000732 verifyFormat("#define OPERATION_CASE(name) \\\n"
733 " case OP_name: \\\n"
734 " return operations::Operation##name\n",
735 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000736 verifyFormat("switch (x) {\n"
737 "case 1:;\n"
738 "default:;\n"
739 " int i;\n"
740 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000741
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000742 verifyGoogleFormat("switch (x) {\n"
743 " case 1:\n"
744 " f();\n"
745 " break;\n"
746 " case kFoo:\n"
747 " case ns::kBar:\n"
748 " case kBaz:\n"
749 " break;\n"
750 " default:\n"
751 " g();\n"
752 " break;\n"
753 "}");
754 verifyGoogleFormat("switch (x) {\n"
755 " case 1: {\n"
756 " f();\n"
757 " break;\n"
758 " }\n"
759 "}");
760 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000761 " ;");
762
763 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
764 " case OP_name: \\\n"
765 " return operations::Operation##name\n");
766 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
767 " // Get the correction operation class.\n"
768 " switch (OpCode) {\n"
769 " CASE(Add);\n"
770 " CASE(Subtract);\n"
771 " default:\n"
772 " return operations::Unknown;\n"
773 " }\n"
774 "#undef OPERATION_CASE\n"
775 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000776 verifyFormat("DEBUG({\n"
777 " switch (x) {\n"
778 " case A:\n"
779 " f();\n"
780 " break;\n"
781 " // On B:\n"
782 " case B:\n"
783 " g();\n"
784 " break;\n"
785 " }\n"
786 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000787 verifyFormat("switch (a) {\n"
788 "case (b):\n"
789 " return;\n"
790 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000791
792 verifyFormat("switch (a) {\n"
793 "case some_namespace::\n"
794 " some_constant:\n"
795 " return;\n"
796 "}",
797 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000798}
799
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000800TEST_F(FormatTest, CaseRanges) {
801 verifyFormat("switch (x) {\n"
802 "case 'A' ... 'Z':\n"
803 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000804 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000805 " break;\n"
806 "}");
807}
808
Daniel Jasperb87899b2014-09-10 13:11:45 +0000809TEST_F(FormatTest, ShortCaseLabels) {
810 FormatStyle Style = getLLVMStyle();
811 Style.AllowShortCaseLabelsOnASingleLine = true;
812 verifyFormat("switch (a) {\n"
813 "case 1: x = 1; break;\n"
814 "case 2: return;\n"
815 "case 3:\n"
816 "case 4:\n"
817 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000818 "case 6: // comment\n"
819 " return;\n"
820 "case 7:\n"
821 " // comment\n"
822 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000823 "case 8:\n"
824 " x = 8; // comment\n"
825 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000826 "default: y = 1; break;\n"
827 "}",
828 Style);
829 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000830 "#if FOO\n"
831 "case 0: return 0;\n"
832 "#endif\n"
833 "}",
834 Style);
835 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000836 "case 1: {\n"
837 "}\n"
838 "case 2: {\n"
839 " return;\n"
840 "}\n"
841 "case 3: {\n"
842 " x = 1;\n"
843 " return;\n"
844 "}\n"
845 "case 4:\n"
846 " if (x)\n"
847 " return;\n"
848 "}",
849 Style);
850 Style.ColumnLimit = 21;
851 verifyFormat("switch (a) {\n"
852 "case 1: x = 1; break;\n"
853 "case 2: return;\n"
854 "case 3:\n"
855 "case 4:\n"
856 "case 5: return;\n"
857 "default:\n"
858 " y = 1;\n"
859 " break;\n"
860 "}",
861 Style);
862}
863
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000864TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000865 verifyFormat("void f() {\n"
866 " some_code();\n"
867 "test_label:\n"
868 " some_other_code();\n"
869 " {\n"
870 " some_more_code();\n"
871 " another_label:\n"
872 " some_more_code();\n"
873 " }\n"
874 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000875 verifyFormat("{\n"
876 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000877 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000878 " some_other_code();\n"
879 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000880 verifyFormat("{\n"
881 " some_code();\n"
882 "test_label:;\n"
883 " int i = 0;\n"
884 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000885}
886
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000887//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000888// Tests for classes, namespaces, etc.
889//===----------------------------------------------------------------------===//
890
891TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000892 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000893}
894
895TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
896 verifyFormat("class A {\n"
897 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000898 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000899 "protected:\n"
900 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000901 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000902 "};");
903 verifyGoogleFormat("class A {\n"
904 " public:\n"
905 " protected:\n"
906 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000907 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000908 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000909 verifyFormat("class A {\n"
910 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000911 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000912 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000913 " void f2() {}\n"
914 "protected slots:\n"
915 " void f3() {}\n"
916 "protected Q_SLOTS:\n"
917 " void f4() {}\n"
918 "private slots:\n"
919 " void f5() {}\n"
920 "private Q_SLOTS:\n"
921 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000922 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000923 " void g1();\n"
924 "Q_SIGNALS:\n"
925 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000926 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000927
928 // Don't interpret 'signals' the wrong way.
929 verifyFormat("signals.set();");
930 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000931 verifyFormat("{\n"
932 " signals.set(); // This needs indentation.\n"
933 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000934 verifyFormat("void f() {\n"
935 "label:\n"
936 " signals.baz();\n"
937 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000938}
939
Alexander Kornienkofd433362013-03-27 17:08:02 +0000940TEST_F(FormatTest, SeparatesLogicalBlocks) {
941 EXPECT_EQ("class A {\n"
942 "public:\n"
943 " void f();\n"
944 "\n"
945 "private:\n"
946 " void g() {}\n"
947 " // test\n"
948 "protected:\n"
949 " int h;\n"
950 "};",
951 format("class A {\n"
952 "public:\n"
953 "void f();\n"
954 "private:\n"
955 "void g() {}\n"
956 "// test\n"
957 "protected:\n"
958 "int h;\n"
959 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +0000960 EXPECT_EQ("class A {\n"
961 "protected:\n"
962 "public:\n"
963 " void f();\n"
964 "};",
965 format("class A {\n"
966 "protected:\n"
967 "\n"
968 "public:\n"
969 "\n"
970 " void f();\n"
971 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +0000972
973 // Even ensure proper spacing inside macros.
974 EXPECT_EQ("#define B \\\n"
975 " class A { \\\n"
976 " protected: \\\n"
977 " public: \\\n"
978 " void f(); \\\n"
979 " };",
980 format("#define B \\\n"
981 " class A { \\\n"
982 " protected: \\\n"
983 " \\\n"
984 " public: \\\n"
985 " \\\n"
986 " void f(); \\\n"
987 " };",
988 getGoogleStyle()));
989 // But don't remove empty lines after macros ending in access specifiers.
990 EXPECT_EQ("#define A private:\n"
991 "\n"
992 "int i;",
993 format("#define A private:\n"
994 "\n"
995 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +0000996}
997
Daniel Jasper83193602013-04-05 17:22:09 +0000998TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000999 verifyFormat("class A : public B {};");
1000 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001001
1002 verifyFormat(
1003 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001004 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001005 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1006 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001007 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001008 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001009 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001010 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1011 " public C,\n"
1012 " public D,\n"
1013 " public E,\n"
1014 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001015 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001016
1017 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001018 " ReallyReallyLongClassName {\n"
1019 " int i;\n"
1020 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001021 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001022 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1023 " aaaaaaaaaaaaaaaa> {};");
1024 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1025 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1026 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001027 verifyFormat("template <class R, class C>\n"
1028 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1029 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001030 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001031}
1032
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001033TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1034 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1035 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1036
1037 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1038 verifyFormat("class MyClass\n"
1039 " : public X\n"
1040 " , public Y {};",
1041 StyleWithInheritanceBreak);
1042}
1043
Manuel Klimek28cacc72013-01-07 18:10:23 +00001044TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001045 verifyFormat("class A {\n} a, b;");
1046 verifyFormat("struct A {\n} a, b;");
1047 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001048}
1049
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001050TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001051 verifyFormat("enum {\n"
1052 " Zero,\n"
1053 " One = 1,\n"
1054 " Two = One + 1,\n"
1055 " Three = (One + Two),\n"
1056 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1057 " Five = (One, Two, Three, Four, 5)\n"
1058 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001059 verifyGoogleFormat("enum {\n"
1060 " Zero,\n"
1061 " One = 1,\n"
1062 " Two = One + 1,\n"
1063 " Three = (One + Two),\n"
1064 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1065 " Five = (One, Two, Three, Four, 5)\n"
1066 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001067 verifyFormat("enum Enum {};");
1068 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001069 verifyFormat("enum X E {} d;");
1070 verifyFormat("enum __attribute__((...)) E {} d;");
1071 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001072 verifyFormat("enum {\n"
1073 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001074 "};",
1075 getLLVMStyleWithColumns(30));
1076
1077 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001078 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001079
1080 EXPECT_EQ("enum KeepEmptyLines {\n"
1081 " ONE,\n"
1082 "\n"
1083 " TWO,\n"
1084 "\n"
1085 " THREE\n"
1086 "}",
1087 format("enum KeepEmptyLines {\n"
1088 " ONE,\n"
1089 "\n"
1090 " TWO,\n"
1091 "\n"
1092 "\n"
1093 " THREE\n"
1094 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001095 verifyFormat("enum E { // comment\n"
1096 " ONE,\n"
1097 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001098 "};\n"
1099 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001100 // Not enums.
1101 verifyFormat("enum X f() {\n"
1102 " a();\n"
1103 " return 42;\n"
1104 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001105 verifyFormat("enum X Type::f() {\n"
1106 " a();\n"
1107 " return 42;\n"
1108 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001109 verifyFormat("enum ::X f() {\n"
1110 " a();\n"
1111 " return 42;\n"
1112 "}");
1113 verifyFormat("enum ns::X f() {\n"
1114 " a();\n"
1115 " return 42;\n"
1116 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001117}
1118
Daniel Jasperb7150872013-08-30 10:10:19 +00001119TEST_F(FormatTest, FormatsEnumsWithErrors) {
1120 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001121 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001122 " Two = 1;\n"
1123 "};");
1124 verifyFormat("namespace n {\n"
1125 "enum Type {\n"
1126 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001127 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001128 " int i;\n"
1129 "}\n"
1130 "void g() {}");
1131}
1132
Daniel Jasper2b41a822013-08-20 12:42:50 +00001133TEST_F(FormatTest, FormatsEnumStruct) {
1134 verifyFormat("enum struct {\n"
1135 " Zero,\n"
1136 " One = 1,\n"
1137 " Two = One + 1,\n"
1138 " Three = (One + Two),\n"
1139 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1140 " Five = (One, Two, Three, Four, 5)\n"
1141 "};");
1142 verifyFormat("enum struct Enum {};");
1143 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001144 verifyFormat("enum struct X E {} d;");
1145 verifyFormat("enum struct __attribute__((...)) E {} d;");
1146 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001147 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1148}
1149
1150TEST_F(FormatTest, FormatsEnumClass) {
1151 verifyFormat("enum class {\n"
1152 " Zero,\n"
1153 " One = 1,\n"
1154 " Two = One + 1,\n"
1155 " Three = (One + Two),\n"
1156 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1157 " Five = (One, Two, Three, Four, 5)\n"
1158 "};");
1159 verifyFormat("enum class Enum {};");
1160 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001161 verifyFormat("enum class X E {} d;");
1162 verifyFormat("enum class __attribute__((...)) E {} d;");
1163 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001164 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1165}
1166
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001167TEST_F(FormatTest, FormatsEnumTypes) {
1168 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001169 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001170 " B\n"
1171 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001172 verifyFormat("enum X : int { A, B };");
1173 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001174}
1175
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001176TEST_F(FormatTest, FormatsNSEnums) {
1177 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1178 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1179 " // Information about someDecentlyLongValue.\n"
1180 " someDecentlyLongValue,\n"
1181 " // Information about anotherDecentlyLongValue.\n"
1182 " anotherDecentlyLongValue,\n"
1183 " // Information about aThirdDecentlyLongValue.\n"
1184 " aThirdDecentlyLongValue\n"
1185 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001186 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1187 " a = 1,\n"
1188 " b = 2,\n"
1189 " c = 3,\n"
1190 "};");
1191 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1192 " a = 1,\n"
1193 " b = 2,\n"
1194 " c = 3,\n"
1195 "};");
1196 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1197 " a = 1,\n"
1198 " b = 2,\n"
1199 " c = 3,\n"
1200 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001201}
1202
Nico Weber7769a902013-01-14 05:49:49 +00001203TEST_F(FormatTest, FormatsBitfields) {
1204 verifyFormat("struct Bitfields {\n"
1205 " unsigned sClass : 8;\n"
1206 " unsigned ValueKind : 2;\n"
1207 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001208 verifyFormat("struct A {\n"
1209 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1210 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1211 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001212 verifyFormat("struct MyStruct {\n"
1213 " uchar data;\n"
1214 " uchar : 8;\n"
1215 " uchar : 8;\n"
1216 " uchar other;\n"
1217 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001218}
1219
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001220TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001221 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1222 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1223
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001224 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001225 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001226 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001227 "}",
1228 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001229 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001230 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001231 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001232 "}",
1233 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001234 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001235 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001236 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001237 "}",
1238 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001239 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001240 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001241 "void f() { f(); }",
1242 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001243
1244 // This code is more common than we thought; if we
1245 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001246 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001247 verifyFormat("namespace {};",
1248 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001249 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001250 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001251 "};",
1252 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001253
1254 verifyFormat("namespace {\n"
1255 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001256 "} // namespace",
1257 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001258 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1259 "#define HEADER_GUARD\n"
1260 "namespace my_namespace {\n"
1261 "int i;\n"
1262 "} // my_namespace\n"
1263 "#endif // HEADER_GUARD",
1264 format("#ifndef HEADER_GUARD\n"
1265 " #define HEADER_GUARD\n"
1266 " namespace my_namespace {\n"
1267 "int i;\n"
1268 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001269 "#endif // HEADER_GUARD",
1270 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001271
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001272 EXPECT_EQ("namespace A::B {\n"
1273 "class C {};\n"
1274 "}",
1275 format("namespace A::B {\n"
1276 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001277 "}",
1278 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001279
Daniel Jasper65ee3472013-07-31 23:16:02 +00001280 FormatStyle Style = getLLVMStyle();
1281 Style.NamespaceIndentation = FormatStyle::NI_All;
1282 EXPECT_EQ("namespace out {\n"
1283 " int i;\n"
1284 " namespace in {\n"
1285 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001286 " } // namespace in\n"
1287 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001288 format("namespace out {\n"
1289 "int i;\n"
1290 "namespace in {\n"
1291 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001292 "} // namespace in\n"
1293 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001294 Style));
1295
1296 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1297 EXPECT_EQ("namespace out {\n"
1298 "int i;\n"
1299 "namespace in {\n"
1300 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001301 "} // namespace in\n"
1302 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001303 format("namespace out {\n"
1304 "int i;\n"
1305 "namespace in {\n"
1306 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001307 "} // namespace in\n"
1308 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001309 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001310}
1311
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001312TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001313
Daniel Jasper40aacf42013-03-14 13:45:21 +00001314TEST_F(FormatTest, FormatsInlineASM) {
1315 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001316 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001317 verifyFormat(
1318 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1319 " \"cpuid\\n\\t\"\n"
1320 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001321 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001322 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001323 EXPECT_EQ(
1324 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001325 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001326 " mov edx,[that] // vtable in edx\n"
1327 " mov eax,methodIndex\n"
1328 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001329 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001330 "}",
1331 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1332 " __asm {\n"
1333 " mov edx,[that] // vtable in edx\n"
1334 " mov eax,methodIndex\n"
1335 " call [edx][eax*4] // stdcall\n"
1336 " }\n"
1337 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001338 EXPECT_EQ("_asm {\n"
1339 " xor eax, eax;\n"
1340 " cpuid;\n"
1341 "}",
1342 format("_asm {\n"
1343 " xor eax, eax;\n"
1344 " cpuid;\n"
1345 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001346 verifyFormat("void function() {\n"
1347 " // comment\n"
1348 " asm(\"\");\n"
1349 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001350 EXPECT_EQ("__asm {\n"
1351 "}\n"
1352 "int i;",
1353 format("__asm {\n"
1354 "}\n"
1355 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001356}
1357
Nico Weberd5650bd2013-01-07 16:36:17 +00001358TEST_F(FormatTest, FormatTryCatch) {
1359 verifyFormat("try {\n"
1360 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001361 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001362 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001363 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001364 " exit(42);\n"
1365 "}");
1366
1367 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001368 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001369 " return 5;\n"
1370 "}");
1371 verifyFormat("class A {\n"
1372 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001373 " A() try : a(0) {\n"
1374 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001375 " throw;\n"
1376 " }\n"
1377 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001378
1379 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001380 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001381}
1382
Nico Weberfac23712015-02-04 15:26:27 +00001383TEST_F(FormatTest, FormatSEHTryCatch) {
1384 verifyFormat("__try {\n"
1385 " int a = b * c;\n"
1386 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1387 " // Do nothing.\n"
1388 "}");
1389
1390 verifyFormat("__try {\n"
1391 " int a = b * c;\n"
1392 "} __finally {\n"
1393 " // Do nothing.\n"
1394 "}");
1395
1396 verifyFormat("DEBUG({\n"
1397 " __try {\n"
1398 " } __finally {\n"
1399 " }\n"
1400 "});\n");
1401}
1402
Daniel Jasper04a71a42014-05-08 11:58:24 +00001403TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1404 verifyFormat("try {\n"
1405 " f();\n"
1406 "} catch {\n"
1407 " g();\n"
1408 "}");
1409 verifyFormat("try {\n"
1410 " f();\n"
1411 "} catch (A a) MACRO(x) {\n"
1412 " g();\n"
1413 "} catch (B b) MACRO(x) {\n"
1414 " g();\n"
1415 "}");
1416}
1417
1418TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1419 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001420 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1421 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001422 Style.BreakBeforeBraces = BraceStyle;
1423 verifyFormat("try {\n"
1424 " // something\n"
1425 "} catch (...) {\n"
1426 " // something\n"
1427 "}",
1428 Style);
1429 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001430 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1431 verifyFormat("try {\n"
1432 " // something\n"
1433 "}\n"
1434 "catch (...) {\n"
1435 " // something\n"
1436 "}",
1437 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001438 verifyFormat("__try {\n"
1439 " // something\n"
1440 "}\n"
1441 "__finally {\n"
1442 " // something\n"
1443 "}",
1444 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001445 verifyFormat("@try {\n"
1446 " // something\n"
1447 "}\n"
1448 "@finally {\n"
1449 " // something\n"
1450 "}",
1451 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001452 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1453 verifyFormat("try\n"
1454 "{\n"
1455 " // something\n"
1456 "}\n"
1457 "catch (...)\n"
1458 "{\n"
1459 " // something\n"
1460 "}",
1461 Style);
1462 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1463 verifyFormat("try\n"
1464 " {\n"
1465 " // something\n"
1466 " }\n"
1467 "catch (...)\n"
1468 " {\n"
1469 " // something\n"
1470 " }",
1471 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001472 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1473 Style.BraceWrapping.BeforeCatch = true;
1474 verifyFormat("try {\n"
1475 " // something\n"
1476 "}\n"
1477 "catch (...) {\n"
1478 " // something\n"
1479 "}",
1480 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001481}
1482
Daniel Jaspere25509f2012-12-17 11:29:41 +00001483TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001484 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001485
Daniel Jaspera44991332015-04-29 13:06:49 +00001486 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1487 " 100000000, "
1488 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001489
Daniel Jasper473c62c2013-05-17 09:35:01 +00001490 // Here, everything other than the "}" would fit on a line.
1491 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001492 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001493 EXPECT_EQ("S s = {a,\n"
1494 "\n"
1495 " b};",
1496 format("S s = {\n"
1497 " a,\n"
1498 "\n"
1499 " b\n"
1500 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001501
1502 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1503 // line. However, the formatting looks a bit off and this probably doesn't
1504 // happen often in practice.
1505 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001506 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001507 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001508}
1509
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001510TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001511 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1512 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1513 " .bbbbbbbbbb = 2,\n"
1514 " .cccccccccc = 3,\n"
1515 " .dddddddddd = 4,\n"
1516 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001517 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001518 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1519 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1520 " .ccccccccccccccccccccccccccc = 3,\n"
1521 " .ddddddddddddddddddddddddddd = 4,\n"
1522 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001523
1524 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1525}
1526
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001527TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001528 verifyFormat("static A x = {{{}}};\n");
1529 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1530 " {init1, init2, init3, init4}}};",
1531 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001532
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001533 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001534 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1535 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1536 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1537 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001538 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001539 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1540 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1541 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001542 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1543 " {rect.fRight - rect.fLeft, rect.fBottom - "
1544 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001545
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001546 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001547 "SomeArrayOfSomeType a = {\n"
1548 " {{1, 2, 3},\n"
1549 " {1, 2, 3},\n"
1550 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1551 " 333333333333333333333333333333},\n"
1552 " {1, 2, 3},\n"
1553 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001554 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001555 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001556 " {{1, 2, 3}},\n"
1557 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001558 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1559 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001560 " {{1, 2, 3}},\n"
1561 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001562
Daniel Jaspera44991332015-04-29 13:06:49 +00001563 verifyFormat("struct {\n"
1564 " unsigned bit;\n"
1565 " const char *const name;\n"
1566 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1567 " {kOsWin, \"Windows\"},\n"
1568 " {kOsLinux, \"Linux\"},\n"
1569 " {kOsCrOS, \"Chrome OS\"}};");
1570 verifyFormat("struct {\n"
1571 " unsigned bit;\n"
1572 " const char *const name;\n"
1573 "} kBitsToOs[] = {\n"
1574 " {kOsMac, \"Mac\"},\n"
1575 " {kOsWin, \"Windows\"},\n"
1576 " {kOsLinux, \"Linux\"},\n"
1577 " {kOsCrOS, \"Chrome OS\"},\n"
1578 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001579}
1580
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001581TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1582 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1583 " \\\n"
1584 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1585}
1586
Daniel Jasperda16db32013-01-07 10:48:50 +00001587TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001588 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1589 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001590
1591 // Do break defaulted and deleted functions.
1592 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1593 " default;",
1594 getLLVMStyleWithColumns(40));
1595 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1596 " delete;",
1597 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001598}
1599
1600TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1601 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1602 getLLVMStyleWithColumns(40));
1603 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1604 getLLVMStyleWithColumns(40));
1605 EXPECT_EQ("#define Q \\\n"
1606 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1607 " \"aaaaaaaa.cpp\"",
1608 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1609 getLLVMStyleWithColumns(40)));
1610}
1611
1612TEST_F(FormatTest, UnderstandsLinePPDirective) {
1613 EXPECT_EQ("# 123 \"A string literal\"",
1614 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001615}
1616
Manuel Klimek591b5802013-01-31 15:58:48 +00001617TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001618 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001619 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001620}
1621
1622TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1623 EXPECT_EQ("#line 42 \"test\"\n",
1624 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001625 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1626 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001627}
1628
1629TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1630 EXPECT_EQ("#line 42 \"test\"",
1631 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001632 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001633}
1634
Daniel Jasper877615c2013-10-11 19:45:02 +00001635TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1636 verifyFormat("#define A \\x20");
1637 verifyFormat("#define A \\ x20");
1638 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1639 verifyFormat("#define A ''");
1640 verifyFormat("#define A ''qqq");
1641 verifyFormat("#define A `qqq");
1642 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001643 EXPECT_EQ("const char *c = STRINGIFY(\n"
1644 "\\na : b);",
1645 format("const char * c = STRINGIFY(\n"
1646 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001647
1648 verifyFormat("a\r\\");
1649 verifyFormat("a\v\\");
1650 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001651}
1652
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001653TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001654 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1655 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001656 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001657 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001658 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001659
1660 verifyFormat("#define A A\n#define A A");
1661 verifyFormat("#define A(X) A\n#define A A");
1662
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001663 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1664 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001665}
1666
1667TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001668 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001669 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001670 "#define A( \\\n"
1671 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001672 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001673 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001674 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001675 " #include \"a.h\"\n"
1676 "#define A(A,\\\n"
1677 " B)\n"
1678 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001679 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001680 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001681}
1682
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001683TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001684
1685TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1686 EXPECT_EQ("#define A \\\n"
1687 " c; \\\n"
1688 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001689 "f;",
1690 format("#define A c; e;\n"
1691 "f;",
1692 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001693}
1694
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001695TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001696
Manuel Klimek1abf7892013-01-04 23:34:14 +00001697TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001698 EXPECT_EQ("int x,\n"
1699 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001700 " y;",
1701 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001702}
1703
Manuel Klimek09e07972013-01-05 21:34:55 +00001704TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001705 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001706 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001707 verifyFormat("#define A \\\n"
1708 " { \\\n"
1709 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001710 " }",
1711 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001712
1713 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001714 " void function##X()",
1715 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001716
1717 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001718 " void a##b##c()",
1719 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001720
Daniel Jasper39825ea2013-01-14 15:40:57 +00001721 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001722}
1723
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001724TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001725 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1726 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001727}
1728
Manuel Klimek0c137952013-02-11 12:33:24 +00001729TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1730 EXPECT_EQ("#define A b;", format("#define A \\\n"
1731 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001732 " b;",
1733 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001734 EXPECT_EQ("#define A \\\n"
1735 " \\\n"
1736 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001737 " b;",
1738 format("#define A \\\n"
1739 " \\\n"
1740 " a; \\\n"
1741 " b;",
1742 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001743 EXPECT_EQ("#define A \\\n"
1744 " a; \\\n"
1745 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001746 " b;",
1747 format("#define A \\\n"
1748 " a; \\\n"
1749 " \\\n"
1750 " b;",
1751 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001752}
1753
Daniel Jasper00475962013-02-19 17:14:38 +00001754TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001755 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001756 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001757 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001758 " case 2\n",
1759 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001760 verifyFormat("#define MACRO(a) \\\n"
1761 " if (a) \\\n"
1762 " f(); \\\n"
1763 " else \\\n"
1764 " g()",
1765 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001766 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001767 verifyIncompleteFormat("#define STR(x) #x\n"
1768 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001769 verifyFormat("#pragma omp threadprivate( \\\n"
1770 " y)), // expected-warning",
1771 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001772 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001773 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001774 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001775 "#define b \\\n"
1776 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001777 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001778 "a",
1779 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001780 verifyFormat("#define A \\\n"
1781 " { \\\n"
1782 " {\n"
1783 "#define B \\\n"
1784 " } \\\n"
1785 " }",
1786 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001787 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001788 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001789 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001790 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001791}
1792
Daniel Jasper40e19212013-05-29 13:16:10 +00001793TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1794 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1795 EXPECT_EQ("class A : public QObject {\n"
1796 " Q_OBJECT\n"
1797 "\n"
1798 " A() {}\n"
1799 "};",
1800 format("class A : public QObject {\n"
1801 " Q_OBJECT\n"
1802 "\n"
1803 " A() {\n}\n"
1804 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001805 EXPECT_EQ("MACRO\n"
1806 "/*static*/ int i;",
1807 format("MACRO\n"
1808 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001809 EXPECT_EQ("SOME_MACRO\n"
1810 "namespace {\n"
1811 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001812 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00001813 format("SOME_MACRO\n"
1814 " namespace {\n"
1815 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001816 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001817 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001818 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1819 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001820 // Only if everything is upper case.
1821 EXPECT_EQ("class A : public QObject {\n"
1822 " Q_Object A() {}\n"
1823 "};",
1824 format("class A : public QObject {\n"
1825 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001826 " A() {\n}\n"
1827 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001828
1829 // Only if the next line can actually start an unwrapped line.
1830 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1831 format("SOME_WEIRD_LOG_MACRO\n"
1832 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001833
1834 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001835 "(n, buffers))\n",
1836 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001837}
1838
Alexander Kornienkode644272013-04-08 22:16:06 +00001839TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1840 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1841 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1842 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001843 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001844 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1845 "int *createScopDetectionPass() { return 0; }",
1846 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1847 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1848 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1849 " class X {};\n"
1850 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1851 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001852 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1853 // braces, so that inner block is indented one level more.
1854 EXPECT_EQ("int q() {\n"
1855 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1856 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1857 " IPC_END_MESSAGE_MAP()\n"
1858 "}",
1859 format("int q() {\n"
1860 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1861 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1862 " IPC_END_MESSAGE_MAP()\n"
1863 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001864
Daniel Jasper352dae12014-01-03 11:50:46 +00001865 // Same inside macros.
1866 EXPECT_EQ("#define LIST(L) \\\n"
1867 " L(A) \\\n"
1868 " L(B) \\\n"
1869 " L(C)",
1870 format("#define LIST(L) \\\n"
1871 " L(A) \\\n"
1872 " L(B) \\\n"
1873 " L(C)",
1874 getGoogleStyle()));
1875
Daniel Jasper545c6522013-09-17 09:26:07 +00001876 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001877 EXPECT_EQ("int q() {\n"
1878 " f(x);\n"
1879 " f(x) {}\n"
1880 " f(x)->g();\n"
1881 " f(x)->*g();\n"
1882 " f(x).g();\n"
1883 " f(x) = x;\n"
1884 " f(x) += x;\n"
1885 " f(x) -= x;\n"
1886 " f(x) *= x;\n"
1887 " f(x) /= x;\n"
1888 " f(x) %= x;\n"
1889 " f(x) &= x;\n"
1890 " f(x) |= x;\n"
1891 " f(x) ^= x;\n"
1892 " f(x) >>= x;\n"
1893 " f(x) <<= x;\n"
1894 " f(x)[y].z();\n"
1895 " LOG(INFO) << x;\n"
1896 " ifstream(x) >> x;\n"
1897 "}\n",
1898 format("int q() {\n"
1899 " f(x)\n;\n"
1900 " f(x)\n {}\n"
1901 " f(x)\n->g();\n"
1902 " f(x)\n->*g();\n"
1903 " f(x)\n.g();\n"
1904 " f(x)\n = x;\n"
1905 " f(x)\n += x;\n"
1906 " f(x)\n -= x;\n"
1907 " f(x)\n *= x;\n"
1908 " f(x)\n /= x;\n"
1909 " f(x)\n %= x;\n"
1910 " f(x)\n &= x;\n"
1911 " f(x)\n |= x;\n"
1912 " f(x)\n ^= x;\n"
1913 " f(x)\n >>= x;\n"
1914 " f(x)\n <<= x;\n"
1915 " f(x)\n[y].z();\n"
1916 " LOG(INFO)\n << x;\n"
1917 " ifstream(x)\n >> x;\n"
1918 "}\n"));
1919 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001920 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001921 " if (1) {\n"
1922 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001923 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001924 " while (1) {\n"
1925 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001926 " F(x)\n"
1927 " G(x);\n"
1928 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001929 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001930 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001931 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001932 " }\n"
1933 "}\n",
1934 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001935 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001936 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001937 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001938 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001939 "F(x)\n"
1940 "G(x);\n"
1941 "F(x)\n"
1942 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001943 "}\n"));
1944 EXPECT_EQ("class A {\n"
1945 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001946 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001947 " A(X x)\n" // FIXME: function-level try blocks are broken.
1948 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001949 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001950 " }\n"
1951 "};",
1952 format("class A {\n"
1953 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001954 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001955 " A(X x)\n"
1956 " try : t(0) {} catch (...) {}\n"
1957 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001958 EXPECT_EQ("class SomeClass {\n"
1959 "public:\n"
1960 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1961 "};",
1962 format("class SomeClass {\n"
1963 "public:\n"
1964 " SomeClass()\n"
1965 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1966 "};"));
1967 EXPECT_EQ("class SomeClass {\n"
1968 "public:\n"
1969 " SomeClass()\n"
1970 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1971 "};",
1972 format("class SomeClass {\n"
1973 "public:\n"
1974 " SomeClass()\n"
1975 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1976 "};",
1977 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001978
1979 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001980}
1981
Manuel Klimek4fe43002013-05-22 12:51:29 +00001982TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1983 verifyFormat("#define A \\\n"
1984 " f({ \\\n"
1985 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001986 " });",
1987 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001988}
1989
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001990TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1991 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1992}
1993
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001994TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001995 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001996}
1997
Manuel Klimek1058d982013-01-06 20:07:31 +00001998TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1999 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2000 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2001 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2002 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2003}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002004
Daniel Jaspere2408e32015-05-06 11:16:43 +00002005TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002006 EXPECT_EQ(
2007 "#define A \\\n int i; \\\n int j;",
2008 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002009 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002010 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002011 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002012 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002013}
2014
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002015TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2016 verifyFormat("#define A \\\n"
2017 " int v( \\\n"
2018 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002019 " int i;",
2020 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002021}
2022
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002023TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002024 EXPECT_EQ(
2025 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2026 " \\\n"
2027 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2028 "\n"
2029 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2030 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2031 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2032 "\\\n"
2033 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2034 " \n"
2035 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2036 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002037}
2038
Manuel Klimek52b15152013-01-09 15:25:02 +00002039TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2040 EXPECT_EQ("int\n"
2041 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002042 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002043 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002044 verifyFormat("functionCallTo(\n"
2045 " someOtherFunction(\n"
2046 " withSomeParameters, whichInSequence,\n"
2047 " areLongerThanALine(andAnotherCall,\n"
2048 "#define A B\n"
2049 " withMoreParamters,\n"
2050 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002051 " andMoreParameters),\n"
2052 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002053 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002054 verifyFormat("Foo::Foo()\n"
2055 "#ifdef BAR\n"
2056 " : baz(0)\n"
2057 "#endif\n"
2058 "{\n"
2059 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002060 verifyFormat("void f() {\n"
2061 " if (true)\n"
2062 "#ifdef A\n"
2063 " f(42);\n"
2064 " x();\n"
2065 "#else\n"
2066 " g();\n"
2067 " x();\n"
2068 "#endif\n"
2069 "}");
2070 verifyFormat("void f(param1, param2,\n"
2071 " param3,\n"
2072 "#ifdef A\n"
2073 " param4(param5,\n"
2074 "#ifdef A1\n"
2075 " param6,\n"
2076 "#ifdef A2\n"
2077 " param7),\n"
2078 "#else\n"
2079 " param8),\n"
2080 " param9,\n"
2081 "#endif\n"
2082 " param10,\n"
2083 "#endif\n"
2084 " param11)\n"
2085 "#else\n"
2086 " param12)\n"
2087 "#endif\n"
2088 "{\n"
2089 " x();\n"
2090 "}",
2091 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002092 verifyFormat("#if 1\n"
2093 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002094 verifyFormat("#if 1\n"
2095 "#endif\n"
2096 "#if 1\n"
2097 "#else\n"
2098 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002099 verifyFormat("DEBUG({\n"
2100 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2102 "});\n"
2103 "#if a\n"
2104 "#else\n"
2105 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002106
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002107 verifyIncompleteFormat("void f(\n"
2108 "#if A\n"
2109 " );\n"
2110 "#else\n"
2111 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002112}
2113
Manuel Klimek14bd9172014-01-29 08:49:02 +00002114TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2115 verifyFormat("#endif\n"
2116 "#if B");
2117}
2118
Manuel Klimek88033d72013-10-21 08:11:15 +00002119TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2120 FormatStyle SingleLine = getLLVMStyle();
2121 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002122 verifyFormat("#if 0\n"
2123 "#elif 1\n"
2124 "#endif\n"
2125 "void foo() {\n"
2126 " if (test) foo2();\n"
2127 "}",
2128 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002129}
2130
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002131TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002132 verifyFormat("functionCall({ int i; });");
2133 verifyFormat("functionCall({\n"
2134 " int i;\n"
2135 " int j;\n"
2136 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002137 verifyFormat("functionCall(\n"
2138 " {\n"
2139 " int i;\n"
2140 " int j;\n"
2141 " },\n"
2142 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002143 verifyFormat("functionA(functionB({\n"
2144 " int i;\n"
2145 " int j;\n"
2146 " }),\n"
2147 " aaaa, bbbb, cccc);");
2148 verifyFormat("functionCall(\n"
2149 " {\n"
2150 " int i;\n"
2151 " int j;\n"
2152 " },\n"
2153 " aaaa, bbbb, // comment\n"
2154 " cccc);");
2155 verifyFormat("functionA(functionB({\n"
2156 " int i;\n"
2157 " int j;\n"
2158 " }),\n"
2159 " aaaa, bbbb, // comment\n"
2160 " cccc);");
2161 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2162 verifyFormat("functionCall(aaaa, bbbb, {\n"
2163 " int i;\n"
2164 " int j;\n"
2165 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002166 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002167 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002168 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002169 " int i; // break\n"
2170 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2172 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002173 verifyFormat("DEBUG({\n"
2174 " if (a)\n"
2175 " f();\n"
2176 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002177}
2178
2179TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002180 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002181 "int i;",
2182 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002183}
2184
2185TEST_F(FormatTest, LayoutNestedBlocks) {
2186 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2187 " struct s {\n"
2188 " int i;\n"
2189 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002190 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002191 " for (int i = 0; i < 10; ++i)\n"
2192 " return;\n"
2193 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002194 verifyFormat("call(parameter, {\n"
2195 " something();\n"
2196 " // Comment using all columns.\n"
2197 " somethingelse();\n"
2198 "});",
2199 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002200 verifyFormat("DEBUG( //\n"
2201 " { f(); }, a);");
2202 verifyFormat("DEBUG( //\n"
2203 " {\n"
2204 " f(); //\n"
2205 " },\n"
2206 " a);");
2207
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002208 EXPECT_EQ("call(parameter, {\n"
2209 " something();\n"
2210 " // Comment too\n"
2211 " // looooooooooong.\n"
2212 " somethingElse();\n"
2213 "});",
2214 format("call(parameter, {\n"
2215 " something();\n"
2216 " // Comment too looooooooooong.\n"
2217 " somethingElse();\n"
2218 "});",
2219 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002220 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002221 EXPECT_EQ("DEBUG({ // comment\n"
2222 " int i;\n"
2223 "});",
2224 format("DEBUG({ // comment\n"
2225 "int i;\n"
2226 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002227 EXPECT_EQ("DEBUG({\n"
2228 " int i;\n"
2229 "\n"
2230 " // comment\n"
2231 " int j;\n"
2232 "});",
2233 format("DEBUG({\n"
2234 " int i;\n"
2235 "\n"
2236 " // comment\n"
2237 " int j;\n"
2238 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002239
2240 verifyFormat("DEBUG({\n"
2241 " if (a)\n"
2242 " return;\n"
2243 "});");
2244 verifyGoogleFormat("DEBUG({\n"
2245 " if (a) return;\n"
2246 "});");
2247 FormatStyle Style = getGoogleStyle();
2248 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002249 verifyFormat("Debug(aaaaa,\n"
2250 " {\n"
2251 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2252 " },\n"
2253 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002254 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002255
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002256 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2257
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002258 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002259}
2260
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002261TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2262 EXPECT_EQ("#define MACRO() \\\n"
2263 " Debug(aaa, /* force line break */ \\\n"
2264 " { \\\n"
2265 " int i; \\\n"
2266 " int j; \\\n"
2267 " })",
2268 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2269 " { int i; int j; })",
2270 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002271
2272 EXPECT_EQ("#define A \\\n"
2273 " [] { \\\n"
2274 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2275 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2276 " }",
2277 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2278 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2279 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002280}
2281
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002282TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2283 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002284 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002285 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002286}
2287
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002288TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2289 FormatStyle Style = getLLVMStyle();
2290 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2291 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2292 verifyFormat("FOO_BEGIN\n"
2293 " FOO_ENTRY\n"
2294 "FOO_END", Style);
2295 verifyFormat("FOO_BEGIN\n"
2296 " NESTED_FOO_BEGIN\n"
2297 " NESTED_FOO_ENTRY\n"
2298 " NESTED_FOO_END\n"
2299 "FOO_END", Style);
2300 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2301 " int x;\n"
2302 " x = 1;\n"
2303 "FOO_END(Baz)", Style);
2304}
2305
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002306//===----------------------------------------------------------------------===//
2307// Line break tests.
2308//===----------------------------------------------------------------------===//
2309
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002310TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002311 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002312 "void f() {\n"
2313 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2314 " parameter, parameter, parameter)),\n"
2315 " SecondLongCall(parameter));\n"
2316 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002317 verifyFormat(
2318 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2319 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2321 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2322 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002323 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2324 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2325 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2326 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002327 verifyFormat(
2328 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2329 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2331 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002332 verifyFormat("int a = bbbb && ccc &&\n"
2333 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002334 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002335 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002336}
2337
Daniel Jasperd69fc772013-05-08 14:12:04 +00002338TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2339 verifyFormat(
2340 "bool aaaaaaa =\n"
2341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2342 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002343 verifyFormat(
2344 "bool aaaaaaa =\n"
2345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2346 " bbbbbbbb();");
2347
Daniel Jasperd69fc772013-05-08 14:12:04 +00002348 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2350 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002351 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2353 " ccccccccc == ddddddddddd;");
2354 verifyFormat(
2355 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2357 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002358
2359 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2360 " aaaaaa) &&\n"
2361 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002362 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2363 " aaaaaa) >>\n"
2364 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002365 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002366 " SourceMgr.getSpellingColumnNumber(\n"
2367 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2368 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002369
Daniel Jasper68d888c2013-06-03 08:42:05 +00002370 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2371 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2372 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002373 verifyFormat("b = a &&\n"
2374 " // Comment\n"
2375 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002376
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002377 // If the LHS of a comparison is not a binary expression itself, the
2378 // additional linebreak confuses many people.
2379 verifyFormat(
2380 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2382 "}");
2383 verifyFormat(
2384 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2386 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002387 verifyFormat(
2388 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2390 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002391 // Even explicit parentheses stress the precedence enough to make the
2392 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002393 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2395 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002396 // This cases is borderline, but with the indentation it is still readable.
2397 verifyFormat(
2398 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2399 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2401 "}",
2402 getLLVMStyleWithColumns(75));
2403
2404 // If the LHS is a binary expression, we should still use the additional break
2405 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002406 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2408 " 5) {\n"
2409 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002410
Daniel Jasper571f1af2013-05-14 20:39:56 +00002411 FormatStyle OnePerLine = getLLVMStyle();
2412 OnePerLine.BinPackParameters = false;
2413 verifyFormat(
2414 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2417 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002418
2419 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2420 " .aaa(aaaaaaaaaaaaa) *\n"
2421 " aaaaaaa +\n"
2422 " aaaaaaa;",
2423 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002424}
2425
Daniel Jasper6bee6822013-04-08 20:33:42 +00002426TEST_F(FormatTest, ExpressionIndentation) {
2427 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2431 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2432 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2435 " ccccccccccccccccccccccccccccccccccccccccc;");
2436 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2439 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2440 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2442 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2443 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2444 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2447 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002448 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002449 "} else if (aaaaa && bbbbb > // break\n"
2450 " ccccc) {\n"
2451 "}");
2452 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002453 "} else if (aaaaa &&\n"
2454 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002455 " ccccc &&\n"
2456 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002457 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002458
2459 // Presence of a trailing comment used to change indentation of b.
2460 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2461 " b;\n"
2462 "return aaaaaaaaaaaaaaaaaaa +\n"
2463 " b; //",
2464 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002465}
2466
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002467TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2468 // Not sure what the best system is here. Like this, the LHS can be found
2469 // immediately above an operator (everything with the same or a higher
2470 // indent). The RHS is aligned right of the operator and so compasses
2471 // everything until something with the same indent as the operator is found.
2472 // FIXME: Is this a good system?
2473 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002474 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002475 verifyFormat(
2476 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002477 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2478 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2479 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2480 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2481 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002482 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002483 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2484 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002485 Style);
2486 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002487 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2488 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002489 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2490 Style);
2491 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002492 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2493 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002494 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2495 Style);
2496 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2497 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002498 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2499 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002500 Style);
2501 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002502 "} else if (aaaaa\n"
2503 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002504 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002505 "}",
2506 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002507 verifyFormat("return (a)\n"
2508 " // comment\n"
2509 " + b;",
2510 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002511 verifyFormat(
2512 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2513 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2514 " + cc;",
2515 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002516
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002517 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2518 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2519 Style);
2520
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002521 // Forced by comments.
2522 verifyFormat(
2523 "unsigned ContentSize =\n"
2524 " sizeof(int16_t) // DWARF ARange version number\n"
2525 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2526 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2527 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002528
2529 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2530 " == boost::fusion::at_c<1>(iiii).second;",
2531 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002532
2533 Style.ColumnLimit = 60;
2534 verifyFormat("zzzzzzzzzz\n"
2535 " = bbbbbbbbbbbbbbbbb\n"
2536 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2537 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002538}
2539
Daniel Jasperb1270392017-02-01 23:27:37 +00002540TEST_F(FormatTest, EnforcedOperatorWraps) {
2541 // Here we'd like to wrap after the || operators, but a comment is forcing an
2542 // earlier wrap.
2543 verifyFormat("bool x = aaaaa //\n"
2544 " || bbbbb\n"
2545 " //\n"
2546 " || cccc;");
2547}
2548
Daniel Jasper3219e432014-12-02 13:24:51 +00002549TEST_F(FormatTest, NoOperandAlignment) {
2550 FormatStyle Style = getLLVMStyle();
2551 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002552 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2554 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2555 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002556 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002557 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2558 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2559 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2560 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2561 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2562 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2563 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2564 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2565 " > ccccccccccccccccccccccccccccccccccccccccc;",
2566 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002567
2568 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2569 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2570 " + cc;",
2571 Style);
2572 verifyFormat("int a = aa\n"
2573 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002574 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002575 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002576
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002577 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002578 verifyFormat("return (a > b\n"
2579 " // comment1\n"
2580 " // comment2\n"
2581 " || c);",
2582 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002583}
2584
Daniel Jasperac043c92014-09-15 11:11:00 +00002585TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2586 FormatStyle Style = getLLVMStyle();
2587 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2588 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002590 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2591 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002592}
2593
Daniel Jasper988e7e42017-05-08 15:07:52 +00002594TEST_F(FormatTest, AllowBinPackingInsideArguments) {
2595 FormatStyle Style = getLLVMStyle();
2596 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2597 Style.BinPackArguments = false;
2598 Style.ColumnLimit = 40;
2599 verifyFormat("void test() {\n"
2600 " someFunction(\n"
2601 " this + argument + is + quite\n"
2602 " + long + so + it + gets + wrapped\n"
2603 " + but + remains + bin - packed);\n"
2604 "}",
2605 Style);
2606 verifyFormat("void test() {\n"
2607 " someFunction(arg1,\n"
2608 " this + argument + is\n"
2609 " + quite + long + so\n"
2610 " + it + gets + wrapped\n"
2611 " + but + remains + bin\n"
2612 " - packed,\n"
2613 " arg3);\n"
2614 "}",
2615 Style);
2616 verifyFormat("void test() {\n"
2617 " someFunction(\n"
2618 " arg1,\n"
2619 " this + argument + has\n"
2620 " + anotherFunc(nested,\n"
2621 " calls + whose\n"
2622 " + arguments\n"
2623 " + are + also\n"
2624 " + wrapped,\n"
2625 " in + addition)\n"
2626 " + to + being + bin - packed,\n"
2627 " arg3);\n"
2628 "}",
2629 Style);
2630
2631 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
2632 verifyFormat("void test() {\n"
2633 " someFunction(\n"
2634 " arg1,\n"
2635 " this + argument + has +\n"
2636 " anotherFunc(nested,\n"
2637 " calls + whose +\n"
2638 " arguments +\n"
2639 " are + also +\n"
2640 " wrapped,\n"
2641 " in + addition) +\n"
2642 " to + being + bin - packed,\n"
2643 " arg3);\n"
2644 "}",
2645 Style);
2646}
2647
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002648TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002649 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002650 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2651 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002652 verifyFormat("Constructor()\n"
2653 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002654 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002655 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002656 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002657 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002658
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002659 verifyFormat("template <typename T>\n"
2660 "Constructor() : Initializer(FitsOnTheLine) {}",
2661 getLLVMStyleWithColumns(45));
2662
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002663 verifyFormat(
2664 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002665 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002666
2667 verifyFormat(
2668 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002669 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002670 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002671 verifyFormat(
2672 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002673 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002674 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002675 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2676 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2677 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002678
2679 verifyFormat("Constructor()\n"
2680 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2681 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2682 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002683 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002684
Daniel Jasper65585ed2013-01-28 13:31:35 +00002685 verifyFormat("Constructor()\n"
2686 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002688
Daniel Jasper62e68172013-02-25 15:59:54 +00002689 verifyFormat("Constructor(int Parameter = 0)\n"
2690 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2691 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002692 verifyFormat("Constructor()\n"
2693 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2694 "}",
2695 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002696 verifyFormat("Constructor()\n"
2697 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2698 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002699
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002700 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002701 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002702 verifyFormat("Constructor()\n"
2703 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2704 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2705 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002706
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002707 FormatStyle OnePerLine = getLLVMStyle();
2708 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002709 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002710 verifyFormat("SomeClass::Constructor()\n"
2711 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2712 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002713 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002714 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002715 verifyFormat("SomeClass::Constructor()\n"
2716 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2717 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002718 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002719 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002720 verifyFormat("MyClass::MyClass(int var)\n"
2721 " : some_var_(var), // 4 space indent\n"
2722 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002723 "}",
2724 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002725 verifyFormat("Constructor()\n"
2726 " : aaaaa(aaaaaa),\n"
2727 " aaaaa(aaaaaa),\n"
2728 " aaaaa(aaaaaa),\n"
2729 " aaaaa(aaaaaa),\n"
2730 " aaaaa(aaaaaa) {}",
2731 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002732 verifyFormat("Constructor()\n"
2733 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2734 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2735 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002736 OnePerLine.BinPackParameters = false;
2737 verifyFormat(
2738 "Constructor()\n"
2739 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2740 " aaaaaaaaaaa().aaa(),\n"
2741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2742 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002743 OnePerLine.ColumnLimit = 60;
2744 verifyFormat("Constructor()\n"
2745 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2746 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2747 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002748
2749 EXPECT_EQ("Constructor()\n"
2750 " : // Comment forcing unwanted break.\n"
2751 " aaaa(aaaa) {}",
2752 format("Constructor() :\n"
2753 " // Comment forcing unwanted break.\n"
2754 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002755}
2756
2757TEST_F(FormatTest, MemoizationTests) {
2758 // This breaks if the memoization lookup does not take \c Indent and
2759 // \c LastSpace into account.
2760 verifyFormat(
2761 "extern CFRunLoopTimerRef\n"
2762 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2763 " CFTimeInterval interval, CFOptionFlags flags,\n"
2764 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002765 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002766
2767 // Deep nesting somewhat works around our memoization.
2768 verifyFormat(
2769 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2770 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2771 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2772 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2773 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2774 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002775 verifyFormat(
2776 "aaaaa(\n"
2777 " aaaaa,\n"
2778 " aaaaa(\n"
2779 " aaaaa,\n"
2780 " aaaaa(\n"
2781 " aaaaa,\n"
2782 " aaaaa(\n"
2783 " aaaaa,\n"
2784 " aaaaa(\n"
2785 " aaaaa,\n"
2786 " aaaaa(\n"
2787 " aaaaa,\n"
2788 " aaaaa(\n"
2789 " aaaaa,\n"
2790 " aaaaa(\n"
2791 " aaaaa,\n"
2792 " aaaaa(\n"
2793 " aaaaa,\n"
2794 " aaaaa(\n"
2795 " aaaaa,\n"
2796 " aaaaa(\n"
2797 " aaaaa,\n"
2798 " aaaaa(\n"
2799 " aaaaa,\n"
2800 " aaaaa))))))))))));",
2801 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002802 verifyFormat(
2803 "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"
2804 " a),\n"
2805 " a),\n"
2806 " a),\n"
2807 " a),\n"
2808 " a),\n"
2809 " a),\n"
2810 " a),\n"
2811 " a),\n"
2812 " a),\n"
2813 " a),\n"
2814 " a),\n"
2815 " a),\n"
2816 " a),\n"
2817 " a),\n"
2818 " a),\n"
2819 " a),\n"
2820 " a)",
2821 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002822
2823 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002824 FormatStyle OnePerLine = getLLVMStyle();
2825 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002826 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002827 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002828 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002829 for (unsigned i = 0, e = 80; i != e; ++i) {
2830 input += " a,\n";
2831 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002832 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002833 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002834}
2835
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002836TEST_F(FormatTest, BreaksAsHighAsPossible) {
2837 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002838 "void f() {\n"
2839 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2840 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2841 " f();\n"
2842 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002843 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002844 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002845}
2846
Daniel Jasper6728fc12013-04-11 14:29:13 +00002847TEST_F(FormatTest, BreaksFunctionDeclarations) {
2848 // Principially, we break function declarations in a certain order:
2849 // 1) break amongst arguments.
2850 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2851 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002852 verifyFormat("template <class TemplateIt>\n"
2853 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2854 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002855
2856 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002857 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002858 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002859 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002860 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002861
2862 // 3) break after (.
2863 verifyFormat(
2864 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002865 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2866 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002867
2868 // 4) break before after nested name specifiers.
2869 verifyFormat(
2870 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002871 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2872 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002873 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002874
2875 // However, there are exceptions, if a sufficient amount of lines can be
2876 // saved.
2877 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2878 // more adjusting.
2879 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2880 " Cccccccccccccc cccccccccc,\n"
2881 " Cccccccccccccc cccccccccc,\n"
2882 " Cccccccccccccc cccccccccc,\n"
2883 " Cccccccccccccc cccccccccc);");
2884 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002885 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002886 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2887 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2888 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002889 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002890 verifyFormat(
2891 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2892 " Cccccccccccccc cccccccccc,\n"
2893 " Cccccccccccccc cccccccccc,\n"
2894 " Cccccccccccccc cccccccccc,\n"
2895 " Cccccccccccccc cccccccccc,\n"
2896 " Cccccccccccccc cccccccccc,\n"
2897 " Cccccccccccccc cccccccccc);");
2898 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2899 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2900 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2901 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2902 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002903
2904 // Break after multi-line parameters.
2905 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2908 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002909 verifyFormat("void SomeLoooooooooooongFunction(\n"
2910 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2911 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2912 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002913
2914 // Treat overloaded operators like other functions.
2915 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2916 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002917 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2918 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002919 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2920 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2921 verifyGoogleFormat(
2922 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2923 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002924 verifyGoogleFormat(
2925 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2926 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002927 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2928 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2929 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2930 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002931 verifyGoogleFormat(
2932 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2933 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2934 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002935 verifyGoogleFormat(
2936 "template <typename T>\n"
2937 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2938 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2939 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002940
2941 FormatStyle Style = getLLVMStyle();
2942 Style.PointerAlignment = FormatStyle::PAS_Left;
2943 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2944 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2945 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002946 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2948 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002949}
2950
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002951TEST_F(FormatTest, TrailingReturnType) {
2952 verifyFormat("auto foo() -> int;\n");
2953 verifyFormat("struct S {\n"
2954 " auto bar() const -> int;\n"
2955 "};");
2956 verifyFormat("template <size_t Order, typename T>\n"
2957 "auto load_img(const std::string &filename)\n"
2958 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002959 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2960 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002961 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002962 verifyFormat("template <typename T>\n"
2963 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2964 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002965
2966 // Not trailing return types.
2967 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002968}
2969
Daniel Jasper5be31f72013-05-21 09:16:31 +00002970TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002971 // Avoid breaking before trailing 'const' or other trailing annotations, if
2972 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002973 FormatStyle Style = getGoogleStyle();
2974 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002975 verifyFormat("void someLongFunction(\n"
2976 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002977 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002978 verifyFormat("LoooooongReturnType\n"
2979 "someLoooooooongFunction() const {}",
2980 getLLVMStyleWithColumns(47));
2981 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2982 " const {}",
2983 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002984 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2985 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2986 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2987 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2988 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2989 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002990 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2991 " aaaaaaaaaaa aaaaa) const override;");
2992 verifyGoogleFormat(
2993 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2994 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002995
Daniel Jasper5550de62014-02-17 07:57:46 +00002996 // Even if the first parameter has to be wrapped.
2997 verifyFormat("void someLongFunction(\n"
2998 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002999 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003000 verifyFormat("void someLongFunction(\n"
3001 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003002 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003003 verifyFormat("void someLongFunction(\n"
3004 " int someLongParameter) override {}",
3005 Style);
3006 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003007 " int someLongParameter) OVERRIDE {}",
3008 Style);
3009 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003010 " int someLongParameter) final {}",
3011 Style);
3012 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003013 " int someLongParameter) FINAL {}",
3014 Style);
3015 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003016 " int parameter) const override {}",
3017 Style);
3018
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003019 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3020 verifyFormat("void someLongFunction(\n"
3021 " int someLongParameter) const\n"
3022 "{\n"
3023 "}",
3024 Style);
3025
Daniel Jasper5550de62014-02-17 07:57:46 +00003026 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003027 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3028 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3029 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003030
3031 // Breaking before function-like trailing annotations is fine to keep them
3032 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003033 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3034 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3035 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3036 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3037 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3038 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003039 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3040 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003041 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003042
3043 verifyFormat(
3044 "void aaaaaaaaaaaaaaaaaa()\n"
3045 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3046 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3047 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3048 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003049 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003050 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003051 " GUARDED_BY(aaaaaaaaaaaa);");
3052 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003053 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003054 " GUARDED_BY(aaaaaaaaaaaa);");
3055 verifyGoogleFormat(
3056 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3057 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003058 verifyGoogleFormat(
3059 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3060 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003061}
3062
Daniel Jasperf090f032015-05-18 09:47:22 +00003063TEST_F(FormatTest, FunctionAnnotations) {
3064 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003065 "int OldFunction(const string &parameter) {}");
3066 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003067 "string OldFunction(const string &parameter) {}");
3068 verifyFormat("template <typename T>\n"
3069 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3070 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003071
3072 // Not function annotations.
3073 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3074 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003075 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3076 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003077 verifyFormat("MACRO(abc).function() // wrap\n"
3078 " << abc;");
3079 verifyFormat("MACRO(abc)->function() // wrap\n"
3080 " << abc;");
3081 verifyFormat("MACRO(abc)::function() // wrap\n"
3082 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003083}
3084
Daniel Jasperf7935112012-12-03 18:12:45 +00003085TEST_F(FormatTest, BreaksDesireably) {
3086 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3087 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003088 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003089 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3091 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003092
3093 verifyFormat(
3094 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003096
3097 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3098 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003100
3101 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003102 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3103 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003105 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003107
3108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3109 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3110
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003111 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003112 "void f() {\n"
3113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3115 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003116 verifyFormat(
3117 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3119 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003120 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3122 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003123 "aaaaaa(aaa,\n"
3124 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3126 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003127 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003130
Daniel Jasper739b85f2015-06-29 10:42:59 +00003131 // Indent consistently independent of call expression and unary operator.
3132 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3133 " dddddddddddddddddddddddddddddd));");
3134 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3135 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003136 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003137 " dddddddddddddddddddddddddddddd));");
3138
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003139 // This test case breaks on an incorrect memoization, i.e. an optimization not
3140 // taking into account the StopAt value.
3141 verifyFormat(
3142 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003143 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3144 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3145 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003146
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003147 verifyFormat("{\n {\n {\n"
3148 " Annotation.SpaceRequiredBefore =\n"
3149 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3150 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3151 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003152
3153 // Break on an outer level if there was a break on an inner level.
3154 EXPECT_EQ("f(g(h(a, // comment\n"
3155 " b, c),\n"
3156 " d, e),\n"
3157 " x, y);",
3158 format("f(g(h(a, // comment\n"
3159 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003160
3161 // Prefer breaking similar line breaks.
3162 verifyFormat(
3163 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3164 " NSTrackingMouseEnteredAndExited |\n"
3165 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003166}
3167
Daniel Jasper18210d72014-10-09 09:52:05 +00003168TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3169 FormatStyle NoBinPacking = getGoogleStyle();
3170 NoBinPacking.BinPackParameters = false;
3171 NoBinPacking.BinPackArguments = true;
3172 verifyFormat("void f() {\n"
3173 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3175 "}",
3176 NoBinPacking);
3177 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3178 " int aaaaaaaaaaaaaaaaaaaa,\n"
3179 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3180 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003181
Daniel Jasper00693b082016-01-09 15:56:47 +00003182 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3183 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3184 " vector<int> bbbbbbbbbbbbbbb);",
3185 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003186 // FIXME: This behavior difference is probably not wanted. However, currently
3187 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3188 // template arguments from BreakBeforeParameter being set because of the
3189 // one-per-line formatting.
3190 verifyFormat(
3191 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3192 " aaaaaaaaaa> aaaaaaaaaa);",
3193 NoBinPacking);
3194 verifyFormat(
3195 "void fffffffffff(\n"
3196 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3197 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003198}
3199
Daniel Jasper9278eb92013-01-16 14:59:02 +00003200TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003201 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003202 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003203 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003204 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3205 " aaaaaaaaaaaaaaaaaaaa,\n"
3206 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3207 NoBinPacking);
3208 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3209 " aaaaaaaaaaaaa,\n"
3210 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3211 NoBinPacking);
3212 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003213 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3214 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3216 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3218 NoBinPacking);
3219 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3220 " .aaaaaaaaaaaaaaaaaa();",
3221 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003222 verifyFormat("void f() {\n"
3223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3224 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3225 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003226 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003227
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003228 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003229 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3230 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003231 " aaaaaaaaaaaa);",
3232 NoBinPacking);
3233 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003234 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3235 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003236 " test);",
3237 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003238
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003239 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3240 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003241 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3242 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003243 NoBinPacking);
3244 verifyFormat("a(\"a\"\n"
3245 " \"a\",\n"
3246 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003247
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003248 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003249 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003250 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003252 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003253 verifyFormat(
3254 "void f() {\n"
3255 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3256 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003257 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003258 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003259 verifyFormat(
3260 "template <class SomeType, class SomeOtherType>\n"
3261 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3262 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003263}
3264
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003265TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3266 FormatStyle Style = getLLVMStyleWithColumns(15);
3267 Style.ExperimentalAutoDetectBinPacking = true;
3268 EXPECT_EQ("aaa(aaaa,\n"
3269 " aaaa,\n"
3270 " aaaa);\n"
3271 "aaa(aaaa,\n"
3272 " aaaa,\n"
3273 " aaaa);",
3274 format("aaa(aaaa,\n" // one-per-line
3275 " aaaa,\n"
3276 " aaaa );\n"
3277 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3278 Style));
3279 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3280 " aaaa);\n"
3281 "aaa(aaaa, aaaa,\n"
3282 " aaaa);",
3283 format("aaa(aaaa, aaaa,\n" // bin-packed
3284 " aaaa );\n"
3285 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3286 Style));
3287}
3288
Daniel Jasper04468962013-01-18 10:56:38 +00003289TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003290 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3291 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3292 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3293 " .StartsWith(\".init\", ORDER_INIT)\n"
3294 " .StartsWith(\".fini\", ORDER_FINI)\n"
3295 " .StartsWith(\".hash\", ORDER_HASH)\n"
3296 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003297
Daniel Jaspereb50c672013-02-15 20:33:06 +00003298 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003299 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003300 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003301 "aaaaaaa->aaaaaaa\n"
3302 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003304 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003305 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003306 "aaaaaaa->aaaaaaa\n"
3307 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3308 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3309 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003310 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003311 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003312 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003313 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3314 " aaaaaa->aaaaaaaaaaaa()\n"
3315 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003317 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003318 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003319 "void f() {\n"
3320 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003321 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003322 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003323 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003324 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003325 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003326 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003327 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003328 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003329 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003330 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003331 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003332
3333 verifyFormat(
3334 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3335 verifyFormat("aaaaaaaaaaaaaaa()\n"
3336 " .aaaaaaaaaaaaaaa()\n"
3337 " .aaaaaaaaaaaaaaa()\n"
3338 " .aaaaaaaaaaaaaaa()\n"
3339 " .aaaaaaaaaaaaaaa();");
3340 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3341 " .aaaaaaaaaaaaaaa()\n"
3342 " .aaaaaaaaaaaaaaa()\n"
3343 " .aaaaaaaaaaaaaaa();");
3344 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3345 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3346 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003347 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3348 " ->aaaaaaaaaaaaaae(0)\n"
3349 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003350
Daniel Jasper775954b2015-04-24 10:08:09 +00003351 // Don't linewrap after very short segments.
3352 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3353 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3354 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3355 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3356 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3357 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3358 verifyFormat("aaa()\n"
3359 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3360 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3361 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3362
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003363 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3364 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3365 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3366 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3367 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003369
Daniel Jaspera41aa532014-09-19 08:01:25 +00003370 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003371 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3372 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003373
3374 // Prefer not to create "hanging" indents.
3375 verifyFormat(
3376 "return !soooooooooooooome_map\n"
3377 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3378 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003379 verifyFormat(
3380 "return aaaaaaaaaaaaaaaa\n"
3381 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3382 " .aaaa(aaaaaaaaaaaaaa);");
3383 // No hanging indent here.
3384 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3386 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003388 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3389 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3390 getLLVMStyleWithColumns(60));
3391 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3392 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3393 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3394 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003395 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3397 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003398}
3399
Daniel Jasperde5c2072012-12-24 00:13:23 +00003400TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3401 verifyFormat(
3402 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003403 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003404 verifyFormat(
3405 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3406 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3407
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003408 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003409 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003410 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3411 " ccccccccccccccccccccccccc) {\n}");
3412
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003413 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003414 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003415 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3416 " ccccccccccccccccccccccccc) {\n}");
3417
Daniel Jasperde5c2072012-12-24 00:13:23 +00003418 verifyFormat(
3419 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003420 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003421 verifyFormat(
3422 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3423 " ccccccccccccccccccccccccc) {\n}");
3424
Daniel Jasper400adc62013-02-08 15:28:42 +00003425 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3426 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3427 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3428 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003429 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3430 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3431 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3432 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3433
Daniel Jasper400adc62013-02-08 15:28:42 +00003434 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3435 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3436 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003437 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3438 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3439 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003440}
3441
Daniel Jasper43b65482013-01-23 12:27:43 +00003442TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003443 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003444 "unsigned Cost =\n"
3445 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3446 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003447 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003448 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3449 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003450
3451 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003452 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3453 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003454 verifyFormat("unsigned OriginalStartColumn =\n"
3455 " SourceMgr.getSpellingColumnNumber(\n"
3456 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3457 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003458}
3459
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003460TEST_F(FormatTest, AlignsAfterAssignments) {
3461 verifyFormat(
3462 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003463 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003464 verifyFormat(
3465 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003466 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003467 verifyFormat(
3468 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003469 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003470 verifyFormat(
3471 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003472 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003473 verifyFormat(
3474 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3476 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003477}
3478
3479TEST_F(FormatTest, AlignsAfterReturn) {
3480 verifyFormat(
3481 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3482 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3483 verifyFormat(
3484 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3485 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003486 verifyFormat(
3487 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003488 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003489 verifyFormat(
3490 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003491 " aaaaaaaaaaaaaaaaaaaaaa());");
3492 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3494 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003497 verifyFormat("return\n"
3498 " // true if code is one of a or b.\n"
3499 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003500}
3501
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003502TEST_F(FormatTest, AlignsAfterOpenBracket) {
3503 verifyFormat(
3504 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3505 " aaaaaaaaa aaaaaaa) {}");
3506 verifyFormat(
3507 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3508 " aaaaaaaaaaa aaaaaaaaa);");
3509 verifyFormat(
3510 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3511 " aaaaaaaaaaaaaaaaaaaaa));");
3512 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003513 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003514 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3515 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3516 Style);
3517 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3518 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3519 Style);
3520 verifyFormat("SomeLongVariableName->someFunction(\n"
3521 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3522 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003523 verifyFormat(
3524 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3525 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3526 Style);
3527 verifyFormat(
3528 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3529 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3530 Style);
3531 verifyFormat(
3532 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3533 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3534 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003535
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003536 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3537 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3538 " b));",
3539 Style);
3540
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003541 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3542 Style.BinPackArguments = false;
3543 Style.BinPackParameters = false;
3544 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3545 " aaaaaaaaaaa aaaaaaaa,\n"
3546 " aaaaaaaaa aaaaaaa,\n"
3547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3548 Style);
3549 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3550 " aaaaaaaaaaa aaaaaaaaa,\n"
3551 " aaaaaaaaaaa aaaaaaaaa,\n"
3552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3553 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003554 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3555 " aaaaaaaaaaaaaaa,\n"
3556 " aaaaaaaaaaaaaaaaaaaaa,\n"
3557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003558 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003559 verifyFormat(
3560 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3561 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3562 Style);
3563 verifyFormat(
3564 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3565 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3566 Style);
3567 verifyFormat(
3568 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3569 " aaaaaaaaaaaaaaaaaaaaa(\n"
3570 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3571 " aaaaaaaaaaaaaaaa);",
3572 Style);
3573 verifyFormat(
3574 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3575 " aaaaaaaaaaaaaaaaaaaaa(\n"
3576 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3577 " aaaaaaaaaaaaaaaa);",
3578 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003579}
3580
Daniel Jasper3219e432014-12-02 13:24:51 +00003581TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3582 FormatStyle Style = getLLVMStyleWithColumns(40);
3583 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3584 " bbbbbbbbbbbbbbbbbbbbbb);",
3585 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003586 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003587 Style.AlignOperands = false;
3588 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3589 " bbbbbbbbbbbbbbbbbbbbbb);",
3590 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003591 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003592 Style.AlignOperands = true;
3593 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3594 " bbbbbbbbbbbbbbbbbbbbbb);",
3595 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003596 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003597 Style.AlignOperands = false;
3598 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3599 " bbbbbbbbbbbbbbbbbbbbbb);",
3600 Style);
3601}
3602
Daniel Jasper399d24b2013-01-09 07:06:56 +00003603TEST_F(FormatTest, BreaksConditionalExpressions) {
3604 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003605 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3606 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3607 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3608 verifyFormat(
3609 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003610 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3611 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003612 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003613 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3614 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3615 verifyFormat(
3616 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003617 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3618 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003619 verifyFormat(
3620 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3621 " : aaaaaaaaaaaaa);");
3622 verifyFormat(
3623 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003624 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003625 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3626 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003627 verifyFormat(
3628 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3629 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3630 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003631 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3632 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3633 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3634 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3636 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3638 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3640 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3642 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003643 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3645 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3647 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003648 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3649 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3650 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003651 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3653 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3654 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003655 verifyFormat(
3656 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3657 " ? aaaaaaaaaaaaaaa\n"
3658 " : aaaaaaaaaaaaaaa;");
3659 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003660 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003661 " ? b\n"
3662 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003663 verifyFormat("return aaaa == bbbb\n"
3664 " // comment\n"
3665 " ? aaaa\n"
3666 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003667 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003668 " format(TheLine.First,\n"
3669 " IndentForLevel[TheLine.Level] >= 0\n"
3670 " ? IndentForLevel[TheLine.Level]\n"
3671 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003672 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003673 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003674 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3675 " ? aaaaaaaaaaaaaaa\n"
3676 " : bbbbbbbbbbbbbbb //\n"
3677 " ? ccccccccccccccc\n"
3678 " : ddddddddddddddd;");
3679 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3680 " ? aaaaaaaaaaaaaaa\n"
3681 " : (bbbbbbbbbbbbbbb //\n"
3682 " ? ccccccccccccccc\n"
3683 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003684 verifyFormat(
3685 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3686 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3687 " aaaaaaaaaaaaaaaaaaaaa +\n"
3688 " aaaaaaaaaaaaaaaaaaaaa\n"
3689 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003690 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003691 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3692 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3693 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003694
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003695 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003696 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003697 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003698 "void f() {\n"
3699 " g(aaa,\n"
3700 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3702 " ? aaaaaaaaaaaaaaa\n"
3703 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003704 "}",
3705 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003706 verifyFormat(
3707 "void f() {\n"
3708 " g(aaa,\n"
3709 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3711 " ?: aaaaaaaaaaaaaaa);\n"
3712 "}",
3713 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003714
3715 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3716 " // comment.\n"
3717 " ccccccccccccccccccccccccccccccccccccccc\n"
3718 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3719 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003720
3721 // Assignments in conditional expressions. Apparently not uncommon :-(.
3722 verifyFormat("return a != b\n"
3723 " // comment\n"
3724 " ? a = b\n"
3725 " : a = b;");
3726 verifyFormat("return a != b\n"
3727 " // comment\n"
3728 " ? a = a != b\n"
3729 " // comment\n"
3730 " ? a = b\n"
3731 " : a\n"
3732 " : a;\n");
3733 verifyFormat("return a != b\n"
3734 " // comment\n"
3735 " ? a\n"
3736 " : a = a != b\n"
3737 " // comment\n"
3738 " ? a = b\n"
3739 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003740}
3741
Daniel Jasper165b29e2013-11-08 00:57:11 +00003742TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3743 FormatStyle Style = getLLVMStyle();
3744 Style.BreakBeforeTernaryOperators = false;
3745 Style.ColumnLimit = 70;
3746 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003747 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3750 Style);
3751 verifyFormat(
3752 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003753 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003755 Style);
3756 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003757 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3759 Style);
3760 verifyFormat(
3761 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003762 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003764 Style);
3765 verifyFormat(
3766 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3767 " aaaaaaaaaaaaa);",
3768 Style);
3769 verifyFormat(
3770 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3771 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3773 " aaaaaaaaaaaaa);",
3774 Style);
3775 verifyFormat(
3776 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3777 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3778 " aaaaaaaaaaaaa);",
3779 Style);
3780 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3783 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3785 Style);
3786 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3790 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3792 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3793 Style);
3794 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3798 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3799 Style);
3800 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3801 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3802 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3803 Style);
3804 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003805 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3808 Style);
3809 verifyFormat(
3810 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3811 " aaaaaaaaaaaaaaa :\n"
3812 " aaaaaaaaaaaaaaa;",
3813 Style);
3814 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3815 " aaaaaaaaa ?\n"
3816 " b :\n"
3817 " c);",
3818 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003819 verifyFormat("unsigned Indent =\n"
3820 " format(TheLine.First,\n"
3821 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3822 " IndentForLevel[TheLine.Level] :\n"
3823 " TheLine * 2,\n"
3824 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3825 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003826 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3827 " aaaaaaaaaaaaaaa :\n"
3828 " bbbbbbbbbbbbbbb ? //\n"
3829 " ccccccccccccccc :\n"
3830 " ddddddddddddddd;",
3831 Style);
3832 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3833 " aaaaaaaaaaaaaaa :\n"
3834 " (bbbbbbbbbbbbbbb ? //\n"
3835 " ccccccccccccccc :\n"
3836 " ddddddddddddddd);",
3837 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003838 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3839 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3840 " ccccccccccccccccccccccccccc;",
3841 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003842 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3843 " aaaaa :\n"
3844 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3845 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003846}
3847
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003848TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3849 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3850 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3851 verifyFormat("bool a = true, b = false;");
3852
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003853 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003855 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003856 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003857 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003858 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003859 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003860 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003861 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3862 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3863 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3864 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3865 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3866 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003867
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003868 FormatStyle Style = getGoogleStyle();
3869 Style.PointerAlignment = FormatStyle::PAS_Left;
3870 Style.DerivePointerAlignment = false;
3871 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3872 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3873 " *b = bbbbbbbbbbbbbbbbbbb;",
3874 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003875 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3876 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3877 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003878 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003879 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003880}
3881
Nico Weber4a5030c2013-01-12 01:28:06 +00003882TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3883 verifyFormat("arr[foo ? bar : baz];");
3884 verifyFormat("f()[foo ? bar : baz];");
3885 verifyFormat("(a + b)[foo ? bar : baz];");
3886 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3887}
3888
Daniel Jasperf7935112012-12-03 18:12:45 +00003889TEST_F(FormatTest, AlignsStringLiterals) {
3890 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3891 " \"short literal\");");
3892 verifyFormat(
3893 "looooooooooooooooooooooooongFunction(\n"
3894 " \"short literal\"\n"
3895 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003896 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3897 " \" string literals\",\n"
3898 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003899 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3900 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003901 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003902 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003903 getLLVMStyleWithColumns(28)));
3904 EXPECT_EQ(
3905 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3906 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3907 " \"aaaaaaaaaaaaaaaa\";",
3908 format("aaaaaa ="
3909 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3910 "aaaaaaaaaaaaaaaaaaaaa\" "
3911 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003912 verifyFormat("a = a + \"a\"\n"
3913 " \"a\"\n"
3914 " \"a\";");
3915 verifyFormat("f(\"a\", \"b\"\n"
3916 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003917
3918 verifyFormat(
3919 "#define LL_FORMAT \"ll\"\n"
3920 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3921 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003922
3923 verifyFormat("#define A(X) \\\n"
3924 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3925 " \"ccccc\"",
3926 getLLVMStyleWithColumns(23));
3927 verifyFormat("#define A \"def\"\n"
3928 "f(\"abc\" A \"ghi\"\n"
3929 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003930
3931 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003932 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003933 verifyFormat("#define A(X) \\\n"
3934 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3935 " L\"ccccc\"",
3936 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003937
3938 verifyFormat("f(@\"a\"\n"
3939 " @\"b\");");
3940 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003941 " @\"b\"\n"
3942 " @\"c\";");
3943 verifyFormat("NSString s = @\"a\"\n"
3944 " \"b\"\n"
3945 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003946}
3947
Zachary Turner448592e2015-12-18 22:20:15 +00003948TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003949 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003950 // No declarations or definitions should be moved to own line.
3951 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3952 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003953 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003954 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003955 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003956 "int f() { return 1; }\n"
3957 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003958 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003959
3960 // All declarations and definitions should have the return type moved to its
3961 // own
3962 // line.
3963 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3964 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003965 " int\n"
3966 " f() {\n"
3967 " return 1;\n"
3968 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003969 " int\n"
3970 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003971 "};\n"
3972 "int\n"
3973 "f() {\n"
3974 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003975 "}\n"
3976 "int\n"
3977 "g();\n",
3978 Style);
3979
3980 // Top-level definitions, and no kinds of declarations should have the
3981 // return type moved to its own line.
3982 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3983 verifyFormat("class B {\n"
3984 " int f() { return 1; }\n"
3985 " int g();\n"
3986 "};\n"
3987 "int\n"
3988 "f() {\n"
3989 " return 1;\n"
3990 "}\n"
3991 "int g();\n",
3992 Style);
3993
3994 // Top-level definitions and declarations should have the return type moved
3995 // to its own line.
3996 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3997 verifyFormat("class C {\n"
3998 " int f() { return 1; }\n"
3999 " int g();\n"
4000 "};\n"
4001 "int\n"
4002 "f() {\n"
4003 " return 1;\n"
4004 "}\n"
4005 "int\n"
4006 "g();\n",
4007 Style);
4008
4009 // All definitions should have the return type moved to its own line, but no
4010 // kinds of declarations.
4011 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4012 verifyFormat("class D {\n"
4013 " int\n"
4014 " f() {\n"
4015 " return 1;\n"
4016 " }\n"
4017 " int g();\n"
4018 "};\n"
4019 "int\n"
4020 "f() {\n"
4021 " return 1;\n"
4022 "}\n"
4023 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004024 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004025 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004026 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004027 " return \"\";\n"
4028 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004029 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004030 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004031 verifyFormat("template <class T>\n"
4032 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004033 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004034 " return NULL;\n"
4035 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004036 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004037 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004038 verifyFormat("class C {\n"
4039 " int\n"
4040 " operator+() {\n"
4041 " return 1;\n"
4042 " }\n"
4043 " int\n"
4044 " operator()() {\n"
4045 " return 1;\n"
4046 " }\n"
4047 "};\n",
4048 Style);
4049 verifyFormat("void\n"
4050 "A::operator()() {}\n"
4051 "void\n"
4052 "A::operator>>() {}\n"
4053 "void\n"
4054 "A::operator+() {}\n",
4055 Style);
4056 verifyFormat("void *operator new(std::size_t s);", // No break here.
4057 Style);
4058 verifyFormat("void *\n"
4059 "operator new(std::size_t s) {}",
4060 Style);
4061 verifyFormat("void *\n"
4062 "operator delete[](void *ptr) {}",
4063 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004064 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004065 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004066 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004067 "{\n"
4068 " return \"\";\n"
4069 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004070 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004071 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004072 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004073 "T *\n" // Problem here: no line break
4074 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004075 "{\n"
4076 " return NULL;\n"
4077 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004078 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004079 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004080}
4081
Alexander Kornienko58611712013-07-04 12:02:44 +00004082TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4083 FormatStyle NoBreak = getLLVMStyle();
4084 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4085 FormatStyle Break = getLLVMStyle();
4086 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004087 verifyFormat("aaaa = \"bbbb\"\n"
4088 " \"cccc\";",
4089 NoBreak);
4090 verifyFormat("aaaa =\n"
4091 " \"bbbb\"\n"
4092 " \"cccc\";",
4093 Break);
4094 verifyFormat("aaaa(\"bbbb\"\n"
4095 " \"cccc\");",
4096 NoBreak);
4097 verifyFormat("aaaa(\n"
4098 " \"bbbb\"\n"
4099 " \"cccc\");",
4100 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004101 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4102 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004103 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004104 verifyFormat("aaaa(qqq,\n"
4105 " \"bbbb\"\n"
4106 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004107 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004108 verifyFormat("aaaa(qqq,\n"
4109 " L\"bbbb\"\n"
4110 " L\"cccc\");",
4111 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004112 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4113 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004114 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004115 verifyFormat("string s = someFunction(\n"
4116 " \"abc\"\n"
4117 " \"abc\");",
4118 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004119
Daniel Jasper3251fff2014-06-10 06:27:23 +00004120 // As we break before unary operators, breaking right after them is bad.
4121 verifyFormat("string foo = abc ? \"x\"\n"
4122 " \"blah blah blah blah blah blah\"\n"
4123 " : \"y\";",
4124 Break);
4125
Daniel Jasperc834c702013-07-17 15:38:19 +00004126 // Don't break if there is no column gain.
4127 verifyFormat("f(\"aaaa\"\n"
4128 " \"bbbb\");",
4129 Break);
4130
4131 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004132 EXPECT_EQ("x = \"a\\\n"
4133 "b\\\n"
4134 "c\";",
4135 format("x = \"a\\\n"
4136 "b\\\n"
4137 "c\";",
4138 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004139 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004140 " \"a\\\n"
4141 "b\\\n"
4142 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004143 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004144 "b\\\n"
4145 "c\";",
4146 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004147
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004148 EXPECT_EQ("NSString *const kString =\n"
4149 " @\"aaaa\"\n"
4150 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004151 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004152 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004153 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004154
4155 Break.ColumnLimit = 0;
4156 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004157}
4158
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004159TEST_F(FormatTest, AlignsPipes) {
4160 verifyFormat(
4161 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4162 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4163 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4164 verifyFormat(
4165 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4166 " << aaaaaaaaaaaaaaaaaaaa;");
4167 verifyFormat(
4168 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4169 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4170 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004171 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4172 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4173 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004174 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4175 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4176 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4177 verifyFormat(
4178 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4179 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4180 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004181 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4184 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004185 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4186 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004187 verifyFormat(
4188 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4189 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004190 verifyFormat(
4191 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4192 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004193
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004194 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4195 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004196 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4197 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4198 " aaaaaaaaaaaaaaaaaaaaa)\n"
4199 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004200 verifyFormat("LOG_IF(aaa == //\n"
4201 " bbb)\n"
4202 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004203
Daniel Jasper467ddb12013-08-12 12:58:05 +00004204 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004205 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4206 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004207 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4208 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4209 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004210 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4211 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004212 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4213 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4215 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4216 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4218 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004219
Daniel Jasperc238c872013-04-02 14:33:13 +00004220 verifyFormat(
4221 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4222 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004223
4224 // Incomplete string literal.
4225 EXPECT_EQ("llvm::errs() << \"\n"
4226 " << a;",
4227 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004228
4229 verifyFormat("void f() {\n"
4230 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4231 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4232 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004233
4234 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004235 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4236 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4237 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004238
4239 // Handle '\n'.
4240 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4241 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4242 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4243 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4244 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4245 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4246 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004247}
4248
Daniel Jasper7209bb92016-12-13 11:16:42 +00004249TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4250 verifyFormat("return out << \"somepacket = {\\n\"\n"
4251 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4252 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4253 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4254 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4255 " << \"}\";");
4256
4257 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4258 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4259 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4260 verifyFormat(
4261 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4262 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4263 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4264 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4265 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4266 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4267 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4268 verifyFormat(
4269 "void f() {\n"
4270 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4271 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4272 "}");
4273
4274 // Breaking before the first "<<" is generally not desirable.
4275 verifyFormat(
4276 "llvm::errs()\n"
4277 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4278 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4279 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4280 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4281 getLLVMStyleWithColumns(70));
4282 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4283 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4284 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4285 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4286 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4287 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4288 getLLVMStyleWithColumns(70));
4289
4290 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4291 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4292 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4293 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4294 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4295 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004296 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4297 " (aaaa + aaaa);",
4298 getLLVMStyleWithColumns(40));
4299 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4300 " (aaaaaaa + aaaaa));",
4301 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004302 verifyFormat(
4303 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4304 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4305 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004306}
4307
Daniel Jasperf7935112012-12-03 18:12:45 +00004308TEST_F(FormatTest, UnderstandsEquals) {
4309 verifyFormat(
4310 "aaaaaaaaaaaaaaaaa =\n"
4311 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4312 verifyFormat(
4313 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004315 verifyFormat(
4316 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004317 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004318 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4320 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004321
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004322 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4323 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004324}
4325
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004326TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004327 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4328 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004329
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004330 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4331 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004332
4333 verifyFormat(
4334 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4335 " Parameter2);");
4336
4337 verifyFormat(
4338 "ShortObject->shortFunction(\n"
4339 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4340 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4341
4342 verifyFormat("loooooooooooooongFunction(\n"
4343 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4344
4345 verifyFormat(
4346 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4347 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4348
Daniel Jasper687af3b2013-02-14 14:26:07 +00004349 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4350 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004351 verifyFormat("void f() {\n"
4352 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4353 " .Times(2)\n"
4354 " .WillRepeatedly(Return(SomeValue));\n"
4355 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004356 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4357 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004358 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4360 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004361 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004362 verifyFormat("void f() {\n"
4363 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4364 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4365 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004366 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4368 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4369 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4370 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004371 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4372 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4373 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4374 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4375 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004376
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004377 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004378 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004379 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004380 verifyFormat(
4381 "aaaaaaaaaaa->aaaaaaaaa(\n"
4382 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4383 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004384
4385 verifyFormat(
4386 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004388 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4389 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4390 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4391 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004392
Daniel Jasper9b334242013-03-15 14:57:30 +00004393 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4395 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004396
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004397 FormatStyle NoBinPacking = getLLVMStyle();
4398 NoBinPacking.BinPackParameters = false;
4399 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4400 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4401 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4402 " aaaaaaaaaaaaaaaaaaa,\n"
4403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4404 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004405
4406 // If there is a subsequent call, change to hanging indentation.
4407 verifyFormat(
4408 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4409 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4410 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4411 verifyFormat(
4412 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4413 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004414 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4416 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4417 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4419 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004420}
4421
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004422TEST_F(FormatTest, WrapsTemplateDeclarations) {
4423 verifyFormat("template <typename T>\n"
4424 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004425 verifyFormat("template <typename T>\n"
4426 "// T should be one of {A, B}.\n"
4427 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004428 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004429 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004430 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004431 verifyFormat("template <typename T>\n"
4432 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4433 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004434 verifyFormat(
4435 "template <typename T>\n"
4436 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4437 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004438 verifyFormat(
4439 "template <typename T>\n"
4440 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4441 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4442 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004443 verifyFormat("template <typename T>\n"
4444 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004445 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004446 verifyFormat(
4447 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4448 " typename T4 = char>\n"
4449 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004450 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4451 " template <typename> class cccccccccccccccccccccc,\n"
4452 " typename ddddddddddddd>\n"
4453 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004454 verifyFormat(
4455 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004457
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004458 verifyFormat("void f() {\n"
4459 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4460 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4461 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004462
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004463 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004464 verifyFormat("template <typename T> void f();");
4465 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004466 verifyFormat(
4467 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4470 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4473 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4474 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004475 EXPECT_EQ("static_cast<A< //\n"
4476 " B> *>(\n"
4477 "\n"
4478 " );",
4479 format("static_cast<A<//\n"
4480 " B>*>(\n"
4481 "\n"
4482 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004483 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4484 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004485
4486 FormatStyle AlwaysBreak = getLLVMStyle();
4487 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4488 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4489 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4490 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4491 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4492 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4493 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4494 verifyFormat("template <template <typename> class Fooooooo,\n"
4495 " template <typename> class Baaaaaaar>\n"
4496 "struct C {};",
4497 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004498 verifyFormat("template <typename T> // T can be A, B or C.\n"
4499 "struct C {};",
4500 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004501 verifyFormat("template <enum E> class A {\n"
4502 "public:\n"
4503 " E *f();\n"
4504 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004505}
4506
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004507TEST_F(FormatTest, WrapsTemplateParameters) {
4508 FormatStyle Style = getLLVMStyle();
4509 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4510 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4511 verifyFormat(
4512 "template <typename... a> struct q {};\n"
4513 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4514 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4515 " y;",
4516 Style);
4517 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4518 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4519 verifyFormat(
4520 "template <typename... a> struct r {};\n"
4521 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4522 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4523 " y;",
4524 Style);
4525 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4526 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4527 verifyFormat(
4528 "template <typename... a> struct s {};\n"
4529 "extern s<\n"
4530 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4531 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4532 " y;",
4533 Style);
4534 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4535 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4536 verifyFormat(
4537 "template <typename... a> struct t {};\n"
4538 "extern t<\n"
4539 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4540 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4541 " y;",
4542 Style);
4543}
4544
Daniel Jasper45797022013-01-25 10:57:27 +00004545TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4546 verifyFormat(
4547 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4549 verifyFormat(
4550 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4553
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004554 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004555 verifyFormat(
4556 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004559
Daniel Jasper45797022013-01-25 10:57:27 +00004560 verifyFormat(
4561 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004562 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004563
4564 // Breaking at nested name specifiers is generally not desirable.
4565 verifyFormat(
4566 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004568
4569 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004570 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004573 " aaaaaaaaaaaaaaaaaaaaa);",
4574 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004575
4576 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4578 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004579}
4580
Daniel Jasperf7935112012-12-03 18:12:45 +00004581TEST_F(FormatTest, UnderstandsTemplateParameters) {
4582 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004583 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004584 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4585 verifyFormat("bool x = a < 1 || 2 > a;");
4586 verifyFormat("bool x = 5 < f<int>();");
4587 verifyFormat("bool x = f<int>() > 5;");
4588 verifyFormat("bool x = 5 < a<int>::x;");
4589 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4590 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4591
4592 verifyGoogleFormat("A<A<int>> a;");
4593 verifyGoogleFormat("A<A<A<int>>> a;");
4594 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004595 verifyGoogleFormat("A<A<int> > a;");
4596 verifyGoogleFormat("A<A<A<int> > > a;");
4597 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004598 verifyGoogleFormat("A<::A<int>> a;");
4599 verifyGoogleFormat("A<::A> a;");
4600 verifyGoogleFormat("A< ::A> a;");
4601 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004602 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4603 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004604 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4605 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004606 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4607 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004608
Nico Weber7533b4d2014-09-24 17:17:32 +00004609 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4610
Daniel Jasperf7935112012-12-03 18:12:45 +00004611 verifyFormat("test >> a >> b;");
4612 verifyFormat("test << a >> b;");
4613
4614 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004615 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004616 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004617 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4618 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004619 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004620 verifyFormat("f(a.operator()<A>());");
4621 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622 " .template operator()<A>());",
4623 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004624
4625 // Not template parameters.
4626 verifyFormat("return a < b && c > d;");
4627 verifyFormat("void f() {\n"
4628 " while (a < b && c > d) {\n"
4629 " }\n"
4630 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004631 verifyFormat("template <typename... Types>\n"
4632 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004633
4634 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4636 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004637 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004638 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004639 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004640}
4641
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004642TEST_F(FormatTest, BitshiftOperatorWidth) {
4643 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4644 " bar */",
4645 format("int a=1<<2; /* foo\n"
4646 " bar */"));
4647
4648 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4649 " bar */",
4650 format("int b =256>>1 ; /* foo\n"
4651 " bar */"));
4652}
4653
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004654TEST_F(FormatTest, UnderstandsBinaryOperators) {
4655 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004656 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004657}
4658
4659TEST_F(FormatTest, UnderstandsPointersToMembers) {
4660 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004661 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004662 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004663 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004664 verifyFormat("void f() {\n"
4665 " (a->*f)();\n"
4666 " a->*x;\n"
4667 " (a.*f)();\n"
4668 " ((*a).*f)();\n"
4669 " a.*x;\n"
4670 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004671 verifyFormat("void f() {\n"
4672 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4673 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4674 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004675 verifyFormat(
4676 "(aaaaaaaaaa->*bbbbbbb)(\n"
4677 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004678 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004679 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004680 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004681}
4682
Daniel Jasper8dd40472012-12-21 09:41:31 +00004683TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004684 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004685 verifyFormat("f(-1, -2, -3);");
4686 verifyFormat("a[-1] = 5;");
4687 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004688 verifyFormat("if (i == -1) {\n}");
4689 verifyFormat("if (i != -1) {\n}");
4690 verifyFormat("if (i > -1) {\n}");
4691 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004692 verifyFormat("++(a->f());");
4693 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004694 verifyFormat("(a->f())++;");
4695 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004696 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004697
4698 verifyFormat("a-- > b;");
4699 verifyFormat("b ? -a : c;");
4700 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004701 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004702 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004703 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004704
4705 verifyFormat("return -1;");
4706 verifyFormat("switch (a) {\n"
4707 "case -1:\n"
4708 " break;\n"
4709 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004710 verifyFormat("#define X -1");
4711 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004712
Chandler Carruthf8b72662014-03-02 12:37:31 +00004713 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4714 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004715
4716 verifyFormat("int a = /* confusing comment */ -1;");
4717 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4718 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004719}
4720
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004721TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004722 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004723 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004724 "}");
4725 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004726 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004727 verifyFormat("*aaa = aaaaaaa( // break\n"
4728 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004729}
4730
Daniel Jasper8863ada2013-08-26 08:10:17 +00004731TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004732 verifyFormat("bool operator<();");
4733 verifyFormat("bool operator>();");
4734 verifyFormat("bool operator=();");
4735 verifyFormat("bool operator==();");
4736 verifyFormat("bool operator!=();");
4737 verifyFormat("int operator+();");
4738 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004739 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004740 verifyFormat("bool operator();");
4741 verifyFormat("bool operator()();");
4742 verifyFormat("bool operator[]();");
4743 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004744 verifyFormat("operator int();");
4745 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004746 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004747 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004748 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004749 verifyFormat("void *operator new(std::size_t size);");
4750 verifyFormat("void *operator new[](std::size_t size);");
4751 verifyFormat("void operator delete(void *ptr);");
4752 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004753 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4754 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004755 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004756 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004757
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004758 verifyFormat(
4759 "ostream &operator<<(ostream &OutputStream,\n"
4760 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004761 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4762 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4763 " return left.group < right.group;\n"
4764 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004765 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004766 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004767
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004768 verifyGoogleFormat("operator void*();");
4769 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004770 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004771
4772 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004773 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4774 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004775}
4776
Daniel Jasper1c220482015-02-25 10:30:06 +00004777TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004778 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4779 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4780 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4781 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4782 verifyFormat("Deleted &operator=(const Deleted &) &;");
4783 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4784 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4785 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4786 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4787 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4788 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004789 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004790 verifyFormat("template <typename T>\n"
4791 "void F(T) && = delete;",
4792 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004793
Daniel Jasperaf642c62015-08-25 13:40:51 +00004794 FormatStyle AlignLeft = getLLVMStyle();
4795 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004796 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004797 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4798 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4799 AlignLeft);
4800 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4801 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004802 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4803 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4804 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4805 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004806 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004807
4808 FormatStyle Spaces = getLLVMStyle();
4809 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004810 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4811 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4812 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4813 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004814
4815 Spaces.SpacesInCStyleCastParentheses = false;
4816 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004817 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4818 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4819 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4820 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004821}
4822
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004823TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004824 verifyFormat("void f() {\n"
4825 " A *a = new A;\n"
4826 " A *a = new (placement) A;\n"
4827 " delete a;\n"
4828 " delete (A *)a;\n"
4829 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004830 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4831 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004832 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4833 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4834 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004835 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004836}
4837
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004838TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004839 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004840 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004841 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004842 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004843 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004844 verifyIndependentOfContext("int a = b * 10;");
4845 verifyIndependentOfContext("int a = 10 * b;");
4846 verifyIndependentOfContext("int a = b * c;");
4847 verifyIndependentOfContext("int a += b * c;");
4848 verifyIndependentOfContext("int a -= b * c;");
4849 verifyIndependentOfContext("int a *= b * c;");
4850 verifyIndependentOfContext("int a /= b * c;");
4851 verifyIndependentOfContext("int a = *b;");
4852 verifyIndependentOfContext("int a = *b * c;");
4853 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004854 verifyIndependentOfContext("int a = b * (10);");
4855 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004856 verifyIndependentOfContext("return 10 * b;");
4857 verifyIndependentOfContext("return *b * *c;");
4858 verifyIndependentOfContext("return a & ~b;");
4859 verifyIndependentOfContext("f(b ? *c : *d);");
4860 verifyIndependentOfContext("int a = b ? *c : *d;");
4861 verifyIndependentOfContext("*b = a;");
4862 verifyIndependentOfContext("a * ~b;");
4863 verifyIndependentOfContext("a * !b;");
4864 verifyIndependentOfContext("a * +b;");
4865 verifyIndependentOfContext("a * -b;");
4866 verifyIndependentOfContext("a * ++b;");
4867 verifyIndependentOfContext("a * --b;");
4868 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004869 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004870 verifyIndependentOfContext("f() * b;");
4871 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004872 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004873 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004874 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004875 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004876 verifyIndependentOfContext("return sizeof(int **);");
4877 verifyIndependentOfContext("return sizeof(int ******);");
4878 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004879 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004880 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004881 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004882 verifyGoogleFormat("return sizeof(int**);");
4883 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4884 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004885 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004886 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004887 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004888 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004889 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004890 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004891 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004892 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004893 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004894 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004895 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004896 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004897 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004898 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004899 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004900 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004901 verifyFormat("void f(const MyOverride &override);");
4902 verifyFormat("void f(const MyFinal &final);");
4903 verifyIndependentOfContext("bool a = f() && override.f();");
4904 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004905
Daniel Jasper5b49f472013-01-23 12:10:53 +00004906 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004907
Daniel Jasper5b49f472013-01-23 12:10:53 +00004908 verifyIndependentOfContext("A<int *> a;");
4909 verifyIndependentOfContext("A<int **> a;");
4910 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004911 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004912 verifyIndependentOfContext(
4913 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004914 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004915 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004916 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004917 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004918 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004919
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004920 verifyFormat(
4921 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4922 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4923
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004924 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004925 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004926 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004927 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004928 verifyGoogleFormat("A<int*> a;");
4929 verifyGoogleFormat("A<int**> a;");
4930 verifyGoogleFormat("A<int*, int*> a;");
4931 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004932 verifyGoogleFormat("f(b ? *c : *d);");
4933 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004934 verifyGoogleFormat("Type* t = **x;");
4935 verifyGoogleFormat("Type* t = *++*x;");
4936 verifyGoogleFormat("*++*x;");
4937 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4938 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004939 verifyGoogleFormat(
4940 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004941 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004942 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4943 verifyGoogleFormat("template <typename T>\n"
4944 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004945
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004946 FormatStyle Left = getLLVMStyle();
4947 Left.PointerAlignment = FormatStyle::PAS_Left;
4948 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004949 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004950 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004951
Daniel Jasper5b49f472013-01-23 12:10:53 +00004952 verifyIndependentOfContext("a = *(x + y);");
4953 verifyIndependentOfContext("a = &(x + y);");
4954 verifyIndependentOfContext("*(x + y).call();");
4955 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004956 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004957
Daniel Jasper5b49f472013-01-23 12:10:53 +00004958 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004959 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004960 "int *MyValues = {\n"
4961 " *A, // Operator detection might be confused by the '{'\n"
4962 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004963 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004964
Daniel Jasper5b49f472013-01-23 12:10:53 +00004965 verifyIndependentOfContext("if (int *a = &b)");
4966 verifyIndependentOfContext("if (int &a = *b)");
4967 verifyIndependentOfContext("if (a & b[i])");
4968 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4969 verifyIndependentOfContext("if (*b[i])");
4970 verifyIndependentOfContext("if (int *a = (&b))");
4971 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004972 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004973 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004974 verifyFormat("void f() {\n"
4975 " for (const int &v : Values) {\n"
4976 " }\n"
4977 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004978 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4979 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004980 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004981
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004982 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004983 verifyFormat("#define MACRO \\\n"
4984 " int *i = a * b; \\\n"
4985 " void f(a *b);",
4986 getLLVMStyleWithColumns(19));
4987
Daniel Jasper97b89482013-03-13 07:49:51 +00004988 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004989 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004990 verifyIndependentOfContext("T **t = new T *;");
4991 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004992 verifyGoogleFormat("A = new SomeType*[Length]();");
4993 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004994 verifyGoogleFormat("T** t = new T*;");
4995 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004996
Daniel Jasper990ff972013-05-07 14:17:18 +00004997 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004998 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004999 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005000 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5001 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005002 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005003 "typename t::if<x && y>::type f() {}");
5004 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005005 verifyFormat("vector<int *> v;");
5006 verifyFormat("vector<int *const> v;");
5007 verifyFormat("vector<int *const **const *> v;");
5008 verifyFormat("vector<int *volatile> v;");
5009 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005010 verifyFormat("foo<b && false>();");
5011 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005012 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005013 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005014 "template <class T, class = typename std::enable_if<\n"
5015 " std::is_integral<T>::value &&\n"
5016 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5017 "void F();",
5018 getLLVMStyleWithColumns(70));
5019 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005020 "template <class T,\n"
5021 " class = typename std::enable_if<\n"
5022 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005023 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5024 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005025 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005026 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005027 verifyFormat(
5028 "template <class T,\n"
5029 " class = typename ::std::enable_if<\n"
5030 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5031 "void F();",
5032 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005033
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005034 verifyIndependentOfContext("MACRO(int *i);");
5035 verifyIndependentOfContext("MACRO(auto *a);");
5036 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005037 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005038 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005039 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005040 // FIXME: Is there a way to make this work?
5041 // verifyIndependentOfContext("MACRO(A *a);");
5042
Daniel Jasper32ccb032014-06-23 07:36:18 +00005043 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005044 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005045
Daniel Jasper866468a2014-04-14 13:15:29 +00005046 EXPECT_EQ("#define OP(x) \\\n"
5047 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5048 " return s << a.DebugString(); \\\n"
5049 " }",
5050 format("#define OP(x) \\\n"
5051 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5052 " return s << a.DebugString(); \\\n"
5053 " }",
5054 getLLVMStyleWithColumns(50)));
5055
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005056 // FIXME: We cannot handle this case yet; we might be able to figure out that
5057 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005058 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005059
5060 FormatStyle PointerMiddle = getLLVMStyle();
5061 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5062 verifyFormat("delete *x;", PointerMiddle);
5063 verifyFormat("int * x;", PointerMiddle);
5064 verifyFormat("template <int * y> f() {}", PointerMiddle);
5065 verifyFormat("int * f(int * a) {}", PointerMiddle);
5066 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5067 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5068 verifyFormat("A<int *> a;", PointerMiddle);
5069 verifyFormat("A<int **> a;", PointerMiddle);
5070 verifyFormat("A<int *, int *> a;", PointerMiddle);
5071 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005072 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5073 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005074 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005075
5076 // Member function reference qualifiers aren't binary operators.
5077 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005078 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005079 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005080 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005081 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005082 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005083}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005084
Daniel Jasperee6d6502013-07-17 20:25:02 +00005085TEST_F(FormatTest, UnderstandsAttributes) {
5086 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005087 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5088 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005089 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005090 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005091 verifyFormat("__attribute__((nodebug)) void\n"
5092 "foo() {}\n",
5093 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005094}
5095
Daniel Jasper10cd5812013-05-06 06:35:44 +00005096TEST_F(FormatTest, UnderstandsEllipsis) {
5097 verifyFormat("int printf(const char *fmt, ...);");
5098 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005099 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5100
5101 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005102 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005103 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005104}
5105
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005106TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005107 EXPECT_EQ("int *a;\n"
5108 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005109 "int *a;",
5110 format("int *a;\n"
5111 "int* a;\n"
5112 "int *a;",
5113 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005114 EXPECT_EQ("int* a;\n"
5115 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005116 "int* a;",
5117 format("int* a;\n"
5118 "int* a;\n"
5119 "int *a;",
5120 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005121 EXPECT_EQ("int *a;\n"
5122 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005123 "int *a;",
5124 format("int *a;\n"
5125 "int * a;\n"
5126 "int * a;",
5127 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005128 EXPECT_EQ("auto x = [] {\n"
5129 " int *a;\n"
5130 " int *a;\n"
5131 " int *a;\n"
5132 "};",
5133 format("auto x=[]{int *a;\n"
5134 "int * a;\n"
5135 "int * a;};",
5136 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005137}
5138
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005139TEST_F(FormatTest, UnderstandsRvalueReferences) {
5140 verifyFormat("int f(int &&a) {}");
5141 verifyFormat("int f(int a, char &&b) {}");
5142 verifyFormat("void f() { int &&a = b; }");
5143 verifyGoogleFormat("int f(int a, char&& b) {}");
5144 verifyGoogleFormat("void f() { int&& a = b; }");
5145
Daniel Jasper1eff9082013-05-27 16:36:33 +00005146 verifyIndependentOfContext("A<int &&> a;");
5147 verifyIndependentOfContext("A<int &&, int &&> a;");
5148 verifyGoogleFormat("A<int&&> a;");
5149 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005150
5151 // Not rvalue references:
5152 verifyFormat("template <bool B, bool C> class A {\n"
5153 " static_assert(B && C, \"Something is wrong\");\n"
5154 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005155 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5156 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005157 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005158}
5159
Manuel Klimekc1237a82013-01-23 14:08:21 +00005160TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5161 verifyFormat("void f() {\n"
5162 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005163 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005164 "}",
5165 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005166}
5167
Daniel Jasperef906a92013-01-13 08:01:36 +00005168TEST_F(FormatTest, FormatsCasts) {
5169 verifyFormat("Type *A = static_cast<Type *>(P);");
5170 verifyFormat("Type *A = (Type *)P;");
5171 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5172 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005173 verifyFormat("int a = (int)2.0f;");
5174 verifyFormat("x[(int32)y];");
5175 verifyFormat("x = (int32)y;");
5176 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5177 verifyFormat("int a = (int)*b;");
5178 verifyFormat("int a = (int)2.0f;");
5179 verifyFormat("int a = (int)~0;");
5180 verifyFormat("int a = (int)++a;");
5181 verifyFormat("int a = (int)sizeof(int);");
5182 verifyFormat("int a = (int)+2;");
5183 verifyFormat("my_int a = (my_int)2.0f;");
5184 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005185 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005186 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005187 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005188 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005189 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005190
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005191 verifyFormat("void f() { my_int a = (my_int)*b; }");
5192 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5193 verifyFormat("my_int a = (my_int)~0;");
5194 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005195 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005196 verifyFormat("my_int a = (my_int)1;");
5197 verifyFormat("my_int a = (my_int *)1;");
5198 verifyFormat("my_int a = (const my_int)-1;");
5199 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005200 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005201 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005202 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005203 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005204
5205 // FIXME: single value wrapped with paren will be treated as cast.
5206 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005207
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005208 verifyFormat("{ (void)F; }");
5209
Daniel Jasper998cabc2013-07-18 14:46:07 +00005210 // Don't break after a cast's
5211 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5212 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5213 " bbbbbbbbbbbbbbbbbbbbbb);");
5214
Daniel Jasperef906a92013-01-13 08:01:36 +00005215 // These are not casts.
5216 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005217 verifyFormat("f(foo)->b;");
5218 verifyFormat("f(foo).b;");
5219 verifyFormat("f(foo)(b);");
5220 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005221 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005222 verifyFormat("(*funptr)(foo)[4];");
5223 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005224 verifyFormat("void f(int *);");
5225 verifyFormat("void f(int *) = 0;");
5226 verifyFormat("void f(SmallVector<int>) {}");
5227 verifyFormat("void f(SmallVector<int>);");
5228 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005229 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005230 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005231 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005232 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5233 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005234 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005235
Daniel Jasperba0bda92013-02-23 08:07:18 +00005236 // These are not casts, but at some point were confused with casts.
5237 verifyFormat("virtual void foo(int *) override;");
5238 verifyFormat("virtual void foo(char &) const;");
5239 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005240 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005241 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005242 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005243 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005244
5245 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5246 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005247 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005248 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005249 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5250 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5251 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005252}
5253
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005254TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005255 verifyFormat("A<bool()> a;");
5256 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005257 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005258 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005259 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005260 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005261 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005262 verifyFormat("template <class CallbackClass>\n"
5263 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005264
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005265 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5266 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005267 verifyGoogleFormat(
5268 "template <class CallbackClass>\n"
5269 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005270
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005271 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005272 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005273 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005274 verifyFormat("some_var = function(*some_pointer_var)[0];");
5275 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005276 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005277 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005278 verifyFormat("std::function<\n"
5279 " LooooooooooongTemplatedType<\n"
5280 " SomeType>*(\n"
5281 " LooooooooooooooooongType type)>\n"
5282 " function;",
5283 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005284}
5285
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005286TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5287 verifyFormat("A (*foo_)[6];");
5288 verifyFormat("vector<int> (*foo_)[6];");
5289}
5290
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005291TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5292 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5293 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5294 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5295 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005296 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5297 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005298
5299 // Different ways of ()-initializiation.
5300 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5301 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5302 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5303 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5304 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5305 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005306 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5307 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005308
5309 // Lambdas should not confuse the variable declaration heuristic.
5310 verifyFormat("LooooooooooooooooongType\n"
5311 " variable(nullptr, [](A *a) {});",
5312 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005313}
5314
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005315TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005316 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005317 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005318 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005320 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005321 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005322 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5323 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005324 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5325 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005326 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5327 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005328 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5329 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005330 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5331 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005332 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5333 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5334 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5335 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005336 FormatStyle Indented = getLLVMStyle();
5337 Indented.IndentWrappedFunctionNames = true;
5338 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5339 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5340 Indented);
5341 verifyFormat(
5342 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5343 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5344 Indented);
5345 verifyFormat(
5346 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5347 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5348 Indented);
5349 verifyFormat(
5350 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5351 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5352 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005353
5354 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005355 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5356 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5357 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005358
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005359 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005360 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005361 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005362 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5363 " SourceLocation L, IdentifierIn *II,\n"
5364 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005365 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005366 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005367 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005368 " const SomeType<string, SomeOtherTemplateParameter>\n"
5369 " &ReallyReallyLongParameterName,\n"
5370 " const SomeType<string, SomeOtherTemplateParameter>\n"
5371 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005372 verifyFormat("template <typename A>\n"
5373 "SomeLoooooooooooooooooooooongType<\n"
5374 " typename some_namespace::SomeOtherType<A>::Type>\n"
5375 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005376
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005377 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005378 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5379 " aaaaaaaaaaaaaaaaaaaaaaa;");
5380 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005381 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5382 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005383 verifyGoogleFormat(
5384 "some_namespace::LongReturnType\n"
5385 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005386 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005387
5388 verifyGoogleFormat("template <typename T>\n"
5389 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005390 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005391 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5392 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005393
5394 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005395 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5396 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005397 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5398 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5399 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5400 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5401 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005404
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005405 verifyFormat("template <typename T> // Templates on own line.\n"
5406 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005407 "MyFunction(int a);",
5408 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005409}
5410
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005411TEST_F(FormatTest, FormatsArrays) {
5412 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5413 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5415 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005416 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5417 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005418 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5419 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5420 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5421 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5422 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5423 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5424 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5425 verifyFormat(
5426 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5427 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5428 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005429 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5430 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005431
5432 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005434 verifyFormat(
5435 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5436 " .aaaaaaa[0]\n"
5437 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005438 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005439
5440 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005441
5442 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5443 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005444}
5445
Daniel Jaspere9de2602012-12-06 09:56:08 +00005446TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5447 verifyFormat("(a)->b();");
5448 verifyFormat("--a;");
5449}
5450
Daniel Jasper8b529712012-12-04 13:02:32 +00005451TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005452 verifyFormat("#include <string>\n"
5453 "#include <a/b/c.h>\n"
5454 "#include \"a/b/string\"\n"
5455 "#include \"string.h\"\n"
5456 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005457 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005458 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005459 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005460 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005461 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005462 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5463 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005464 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5465 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005466
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005467 verifyFormat("#import <string>");
5468 verifyFormat("#import <a/b/c.h>");
5469 verifyFormat("#import \"a/b/string\"");
5470 verifyFormat("#import \"string.h\"");
5471 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005472 verifyFormat("#if __has_include(<strstream>)\n"
5473 "#include <strstream>\n"
5474 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005475
Daniel Jasper343643b2014-08-13 08:29:18 +00005476 verifyFormat("#define MY_IMPORT <a/b>");
5477
Nico Weber21088802017-02-10 19:36:52 +00005478 verifyFormat("#if __has_include(<a/b>)");
5479 verifyFormat("#if __has_include_next(<a/b>)");
5480 verifyFormat("#define F __has_include(<a/b>)");
5481 verifyFormat("#define F __has_include_next(<a/b>)");
5482
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005483 // Protocol buffer definition or missing "#".
5484 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5485 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005486
5487 FormatStyle Style = getLLVMStyle();
5488 Style.AlwaysBreakBeforeMultilineStrings = true;
5489 Style.ColumnLimit = 0;
5490 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005491
5492 // But 'import' might also be a regular C++ namespace.
5493 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005495}
5496
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005497//===----------------------------------------------------------------------===//
5498// Error recovery tests.
5499//===----------------------------------------------------------------------===//
5500
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005501TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005502 FormatStyle NoBinPacking = getLLVMStyle();
5503 NoBinPacking.BinPackParameters = false;
5504 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5505 " double *min_x,\n"
5506 " double *max_x,\n"
5507 " double *min_y,\n"
5508 " double *max_y,\n"
5509 " double *min_z,\n"
5510 " double *max_z, ) {}",
5511 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005512}
5513
Daniel Jasper83a54d22013-01-10 09:26:47 +00005514TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005515 verifyFormat("void f() { return; }\n42");
5516 verifyFormat("void f() {\n"
5517 " if (0)\n"
5518 " return;\n"
5519 "}\n"
5520 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005521 verifyFormat("void f() { return }\n42");
5522 verifyFormat("void f() {\n"
5523 " if (0)\n"
5524 " return\n"
5525 "}\n"
5526 "42");
5527}
5528
5529TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5530 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5531 EXPECT_EQ("void f() {\n"
5532 " if (a)\n"
5533 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005534 "}",
5535 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005536 EXPECT_EQ("namespace N {\n"
5537 "void f()\n"
5538 "}",
5539 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005540 EXPECT_EQ("namespace N {\n"
5541 "void f() {}\n"
5542 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00005543 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005544 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005545}
5546
Daniel Jasper2df93312013-01-09 10:16:05 +00005547TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5548 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005549 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005550 " b;",
5551 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005552 verifyFormat("function(\n"
5553 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005554 " LoooooooooooongArgument);\n",
5555 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005556}
5557
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005558TEST_F(FormatTest, IncorrectAccessSpecifier) {
5559 verifyFormat("public:");
5560 verifyFormat("class A {\n"
5561 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005562 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005563 "};");
5564 verifyFormat("public\n"
5565 "int qwerty;");
5566 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005567 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005568 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005569 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005570 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005571 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005572}
Daniel Jasperf7935112012-12-03 18:12:45 +00005573
Daniel Jasper291f9362013-03-20 15:58:10 +00005574TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5575 verifyFormat("{");
5576 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005577 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005578}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005579
5580TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005581 verifyFormat("do {\n}");
5582 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005583 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005584 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005585 "wheeee(fun);");
5586 verifyFormat("do {\n"
5587 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005588 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005589}
5590
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005591TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005592 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005593 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005594 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005595 verifyFormat("while {\n foo;\n foo();\n}");
5596 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005597}
5598
Daniel Jasperc0880a92013-01-04 18:52:56 +00005599TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005600 verifyIncompleteFormat("namespace {\n"
5601 "class Foo { Foo (\n"
5602 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005603 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005604}
5605
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005606TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005607 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005608 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5609 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005610 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005611
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005612 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005613 " {\n"
5614 " breakme(\n"
5615 " qwe);\n"
5616 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005617 format("{\n"
5618 " {\n"
5619 " breakme(qwe);\n"
5620 "}\n",
5621 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005622}
5623
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005624TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005625 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005626 " avariable,\n"
5627 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005628 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005629}
5630
Manuel Klimek762dd182013-01-21 10:07:49 +00005631TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005632 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005633}
5634
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005635TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005636 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005637 verifyFormat("vector<int> x{\n"
5638 " 1, 2, 3, 4,\n"
5639 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005640 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5641 verifyFormat("f({1, 2});");
5642 verifyFormat("auto v = Foo{-1};");
5643 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5644 verifyFormat("Class::Class : member{1, 2, 3} {}");
5645 verifyFormat("new vector<int>{1, 2, 3};");
5646 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005647 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005648 verifyFormat("return {arg1, arg2};");
5649 verifyFormat("return {arg1, SomeType{parameter}};");
5650 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5651 verifyFormat("new T{arg1, arg2};");
5652 verifyFormat("f(MyMap[{composite, key}]);");
5653 verifyFormat("class Class {\n"
5654 " T member = {arg1, arg2};\n"
5655 "};");
5656 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005657 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5658 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005659
Daniel Jasper438059e2014-05-22 12:11:13 +00005660 verifyFormat("int foo(int i) { return fo1{}(i); }");
5661 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005662 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005663 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005664 verifyFormat("Node n{1, Node{1000}, //\n"
5665 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005666 verifyFormat("Aaaa aaaaaaa{\n"
5667 " {\n"
5668 " aaaa,\n"
5669 " },\n"
5670 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005671 verifyFormat("class C : public D {\n"
5672 " SomeClass SC{2};\n"
5673 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005674 verifyFormat("class C : public A {\n"
5675 " class D : public B {\n"
5676 " void f() { int i{2}; }\n"
5677 " };\n"
5678 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005679 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005680
Daniel Jaspere4ada022016-12-13 10:05:03 +00005681 // Cases where distinguising braced lists and blocks is hard.
5682 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5683 verifyFormat("void f() {\n"
5684 " return; // comment\n"
5685 "}\n"
5686 "SomeType t;");
5687 verifyFormat("void f() {\n"
5688 " if (a) {\n"
5689 " f();\n"
5690 " }\n"
5691 "}\n"
5692 "SomeType t;");
5693
Daniel Jasper08434342015-05-26 07:26:26 +00005694 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005695 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005696 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005697 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5698 " bbbbb,\n"
5699 " ccccc,\n"
5700 " ddddd,\n"
5701 " eeeee,\n"
5702 " ffffff,\n"
5703 " ggggg,\n"
5704 " hhhhhh,\n"
5705 " iiiiii,\n"
5706 " jjjjjj,\n"
5707 " kkkkkk};",
5708 NoBinPacking);
5709 verifyFormat("const Aaaaaa aaaaa = {\n"
5710 " aaaaa,\n"
5711 " bbbbb,\n"
5712 " ccccc,\n"
5713 " ddddd,\n"
5714 " eeeee,\n"
5715 " ffffff,\n"
5716 " ggggg,\n"
5717 " hhhhhh,\n"
5718 " iiiiii,\n"
5719 " jjjjjj,\n"
5720 " kkkkkk,\n"
5721 "};",
5722 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005723 verifyFormat(
5724 "const Aaaaaa aaaaa = {\n"
5725 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5726 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5727 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5728 "};",
5729 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005730
Chandler Carruthf8b72662014-03-02 12:37:31 +00005731 // FIXME: The alignment of these trailing comments might be bad. Then again,
5732 // this might be utterly useless in real code.
5733 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005734 " : some_value{ //\n"
5735 " aaaaaaa, //\n"
5736 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005737
Chandler Carruthf8b72662014-03-02 12:37:31 +00005738 // In braced lists, the first comment is always assumed to belong to the
5739 // first element. Thus, it can be moved to the next or previous line as
5740 // appropriate.
5741 EXPECT_EQ("function({// First element:\n"
5742 " 1,\n"
5743 " // Second element:\n"
5744 " 2});",
5745 format("function({\n"
5746 " // First element:\n"
5747 " 1,\n"
5748 " // Second element:\n"
5749 " 2});"));
5750 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5751 " // First element:\n"
5752 " 1,\n"
5753 " // Second element:\n"
5754 " 2};",
5755 format("std::vector<int> MyNumbers{// First element:\n"
5756 " 1,\n"
5757 " // Second element:\n"
5758 " 2};",
5759 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005760 // A trailing comma should still lead to an enforced line break.
5761 EXPECT_EQ("vector<int> SomeVector = {\n"
5762 " // aaa\n"
5763 " 1, 2,\n"
5764 "};",
5765 format("vector<int> SomeVector = { // aaa\n"
5766 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005767
Chandler Carruthf8b72662014-03-02 12:37:31 +00005768 FormatStyle ExtraSpaces = getLLVMStyle();
5769 ExtraSpaces.Cpp11BracedListStyle = false;
5770 ExtraSpaces.ColumnLimit = 75;
5771 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5772 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5773 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5774 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5775 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5776 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5777 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5778 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5779 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5780 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5781 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5782 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5783 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5784 verifyFormat("class Class {\n"
5785 " T member = { arg1, arg2 };\n"
5786 "};",
5787 ExtraSpaces);
5788 verifyFormat(
5789 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5790 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5791 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5792 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5793 ExtraSpaces);
5794 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005795 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005796 ExtraSpaces);
5797 verifyFormat(
5798 "someFunction(OtherParam,\n"
5799 " BracedList{ // comment 1 (Forcing interesting break)\n"
5800 " param1, param2,\n"
5801 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005802 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005803 ExtraSpaces);
5804 verifyFormat(
5805 "std::this_thread::sleep_for(\n"
5806 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5807 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005808 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005809 " aaaaaaa,\n"
5810 " aaaaaaaaaa,\n"
5811 " aaaaa,\n"
5812 " aaaaaaaaaaaaaaa,\n"
5813 " aaa,\n"
5814 " aaaaaaaaaa,\n"
5815 " a,\n"
5816 " aaaaaaaaaaaaaaaaaaaaa,\n"
5817 " aaaaaaaaaaaa,\n"
5818 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5819 " aaaaaaa,\n"
5820 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005821 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005822}
5823
Daniel Jasper33b909c2013-10-25 14:29:37 +00005824TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005825 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5826 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5827 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5828 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5829 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5830 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005831 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005832 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005833 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005834 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5835 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005836 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005837 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5838 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5839 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5840 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5841 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5842 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5843 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005844 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005845 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5846 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005847 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5848 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5849 " // Separating comment.\n"
5850 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5851 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5852 " // Leading comment\n"
5853 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5854 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005855 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5856 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005857 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005858 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5859 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005860 getLLVMStyleWithColumns(38));
5861 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005862 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5863 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005864 verifyFormat(
5865 "static unsigned SomeValues[10][3] = {\n"
5866 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5867 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5868 verifyFormat("static auto fields = new vector<string>{\n"
5869 " \"aaaaaaaaaaaaa\",\n"
5870 " \"aaaaaaaaaaaaa\",\n"
5871 " \"aaaaaaaaaaaa\",\n"
5872 " \"aaaaaaaaaaaaaa\",\n"
5873 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5874 " \"aaaaaaaaaaaa\",\n"
5875 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5876 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005877 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5878 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5879 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5880 " 3, cccccccccccccccccccccc};",
5881 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005882
5883 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005884 verifyFormat("vector<int> x = {\n"
5885 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5886 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005887 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005888 verifyFormat("vector<int> x = {\n"
5889 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005890 "};",
5891 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005892 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5893 " 1, 1, 1, 1,\n"
5894 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005895 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005896
Daniel Jasper60c27072015-05-13 08:16:00 +00005897 // Trailing comment in the first line.
5898 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5899 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5900 " 111111111, 222222222, 3333333333, 444444444, //\n"
5901 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005902 // Trailing comment in the last line.
5903 verifyFormat("int aaaaa[] = {\n"
5904 " 1, 2, 3, // comment\n"
5905 " 4, 5, 6 // comment\n"
5906 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005907
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005908 // With nested lists, we should either format one item per line or all nested
5909 // lists one on line.
5910 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005911 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5912 " {aaaaaaaaaaaaaaaaaaa},\n"
5913 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5914 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005915 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005916 verifyFormat(
5917 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005918 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5919 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5920 " {aaa, aaa},\n"
5921 " {aaa, aaa},\n"
5922 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5923 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5924 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005925
5926 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005927 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5928 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005929
5930 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005931
Daniel Jaspereb65e912015-12-21 18:31:15 +00005932 // No braced initializer here.
5933 verifyFormat("void f() {\n"
5934 " struct Dummy {};\n"
5935 " f(v);\n"
5936 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005937
5938 // Long lists should be formatted in columns even if they are nested.
5939 verifyFormat(
5940 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5941 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5942 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5943 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5944 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5945 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005946
5947 // Allow "single-column" layout even if that violates the column limit. There
5948 // isn't going to be a better way.
5949 verifyFormat("std::vector<int> a = {\n"
5950 " aaaaaaaa,\n"
5951 " aaaaaaaa,\n"
5952 " aaaaaaaa,\n"
5953 " aaaaaaaa,\n"
5954 " aaaaaaaaaa,\n"
5955 " aaaaaaaa,\n"
5956 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5957 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005958 verifyFormat("vector<int> aaaa = {\n"
5959 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5960 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5961 " aaaaaa.aaaaaaa,\n"
5962 " aaaaaa.aaaaaaa,\n"
5963 " aaaaaa.aaaaaaa,\n"
5964 " aaaaaa.aaaaaaa,\n"
5965 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005966
5967 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005968 verifyFormat("someFunction(Param, {List1, List2,\n"
5969 " List3});",
5970 getLLVMStyleWithColumns(35));
5971 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005972 " {List1, List2,\n"
5973 " List3});",
5974 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005975 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5976 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005977}
5978
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005979TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005980 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005981 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005982
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005983 verifyFormat("void f() { return 42; }");
5984 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005985 " return 42;\n"
5986 "}",
5987 DoNotMerge);
5988 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005989 " // Comment\n"
5990 "}");
5991 verifyFormat("{\n"
5992 "#error {\n"
5993 " int a;\n"
5994 "}");
5995 verifyFormat("{\n"
5996 " int a;\n"
5997 "#error {\n"
5998 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005999 verifyFormat("void f() {} // comment");
6000 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006001 verifyFormat("void f() {\n"
6002 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006003 DoNotMerge);
6004 verifyFormat("void f() {\n"
6005 " int a;\n"
6006 "} // comment",
6007 DoNotMerge);
6008 verifyFormat("void f() {\n"
6009 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006010 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006011
6012 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6013 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6014
6015 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6016 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006017 verifyFormat("class C {\n"
6018 " C()\n"
6019 " : iiiiiiii(nullptr),\n"
6020 " kkkkkkk(nullptr),\n"
6021 " mmmmmmm(nullptr),\n"
6022 " nnnnnnn(nullptr) {}\n"
6023 "};",
6024 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006025
6026 FormatStyle NoColumnLimit = getLLVMStyle();
6027 NoColumnLimit.ColumnLimit = 0;
6028 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6029 EXPECT_EQ("class C {\n"
6030 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006031 "};",
6032 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006033 EXPECT_EQ("A()\n"
6034 " : b(0) {\n"
6035 "}",
6036 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6037
6038 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006039 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6040 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006041 EXPECT_EQ("A()\n"
6042 " : b(0) {\n"
6043 "}",
6044 format("A():b(0){}", DoNotMergeNoColumnLimit));
6045 EXPECT_EQ("A()\n"
6046 " : b(0) {\n"
6047 "}",
6048 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006049
6050 verifyFormat("#define A \\\n"
6051 " void f() { \\\n"
6052 " int i; \\\n"
6053 " }",
6054 getLLVMStyleWithColumns(20));
6055 verifyFormat("#define A \\\n"
6056 " void f() { int i; }",
6057 getLLVMStyleWithColumns(21));
6058 verifyFormat("#define A \\\n"
6059 " void f() { \\\n"
6060 " int i; \\\n"
6061 " } \\\n"
6062 " int j;",
6063 getLLVMStyleWithColumns(22));
6064 verifyFormat("#define A \\\n"
6065 " void f() { int i; } \\\n"
6066 " int j;",
6067 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006068}
6069
Daniel Jasperd74cf402014-04-08 12:46:38 +00006070TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6071 FormatStyle MergeInlineOnly = getLLVMStyle();
6072 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6073 verifyFormat("class C {\n"
6074 " int f() { return 42; }\n"
6075 "};",
6076 MergeInlineOnly);
6077 verifyFormat("int f() {\n"
6078 " return 42;\n"
6079 "}",
6080 MergeInlineOnly);
6081}
6082
Manuel Klimeke01bab52013-01-15 13:38:33 +00006083TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6084 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006085 verifyFormat("struct foo a = {bar};\nint n;");
6086 verifyFormat("class foo a = {bar};\nint n;");
6087 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006088
6089 // Elaborate types inside function definitions.
6090 verifyFormat("struct foo f() {}\nint n;");
6091 verifyFormat("class foo f() {}\nint n;");
6092 verifyFormat("union foo f() {}\nint n;");
6093
6094 // Templates.
6095 verifyFormat("template <class X> void f() {}\nint n;");
6096 verifyFormat("template <struct X> void f() {}\nint n;");
6097 verifyFormat("template <union X> void f() {}\nint n;");
6098
6099 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006100 verifyFormat("struct {\n} n;");
6101 verifyFormat(
6102 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006103 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006104 verifyFormat("class MACRO Z {\n} n;");
6105 verifyFormat("class MACRO(X) Z {\n} n;");
6106 verifyFormat("class __attribute__(X) Z {\n} n;");
6107 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006108 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006109 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006110 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6111 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006112
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006113 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006114 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006115
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006116 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006117 verifyFormat(
6118 "template <typename F>\n"
6119 "Matcher(const Matcher<F> &Other,\n"
6120 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6121 " !is_same<F, T>::value>::type * = 0)\n"
6122 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6123
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006124 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006125 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006126 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006127
6128 // FIXME:
6129 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006130 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006131
Manuel Klimeke01bab52013-01-15 13:38:33 +00006132 // Elaborate types where incorrectly parsing the structural element would
6133 // break the indent.
6134 verifyFormat("if (true)\n"
6135 " class X x;\n"
6136 "else\n"
6137 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006138
6139 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006140 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006141}
6142
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006143TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006144 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6145 format("#error Leave all white!!!!! space* alone!\n"));
6146 EXPECT_EQ(
6147 "#warning Leave all white!!!!! space* alone!\n",
6148 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006149 EXPECT_EQ("#error 1", format(" # error 1"));
6150 EXPECT_EQ("#warning 1", format(" # warning 1"));
6151}
6152
Daniel Jasper4431aa92013-04-23 13:54:04 +00006153TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006154 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006155 verifyFormat("#if (AAAA && BBBB)");
6156 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006157 // FIXME: Come up with a better indentation for #elif.
6158 verifyFormat(
6159 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6160 " defined(BBBBBBBB)\n"
6161 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6162 " defined(BBBBBBBB)\n"
6163 "#endif",
6164 getLLVMStyleWithColumns(65));
6165}
6166
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006167TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6168 FormatStyle AllowsMergedIf = getGoogleStyle();
6169 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6170 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6171 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006172 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6173 EXPECT_EQ("if (true) return 42;",
6174 format("if (true)\nreturn 42;", AllowsMergedIf));
6175 FormatStyle ShortMergedIf = AllowsMergedIf;
6176 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006177 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006178 " if (true) return 42;",
6179 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006180 verifyFormat("#define A \\\n"
6181 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006182 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006183 "#define B",
6184 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006185 verifyFormat("#define A \\\n"
6186 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006187 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006188 "g();",
6189 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006190 verifyFormat("{\n"
6191 "#ifdef A\n"
6192 " // Comment\n"
6193 " if (true) continue;\n"
6194 "#endif\n"
6195 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006196 " if (true) continue;\n"
6197 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006198 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006199 ShortMergedIf.ColumnLimit = 29;
6200 verifyFormat("#define A \\\n"
6201 " if (aaaaaaaaaa) return 1; \\\n"
6202 " return 2;",
6203 ShortMergedIf);
6204 ShortMergedIf.ColumnLimit = 28;
6205 verifyFormat("#define A \\\n"
6206 " if (aaaaaaaaaa) \\\n"
6207 " return 1; \\\n"
6208 " return 2;",
6209 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006210}
6211
Manuel Klimekd33516e2013-01-23 10:09:28 +00006212TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006213 verifyFormat("void f(int *a);");
6214 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006215 verifyFormat("class A {\n void f(int *a);\n};");
6216 verifyFormat("class A {\n int *a;\n};");
6217 verifyFormat("namespace a {\n"
6218 "namespace b {\n"
6219 "class A {\n"
6220 " void f() {}\n"
6221 " int *a;\n"
6222 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006223 "} // namespace b\n"
6224 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006225}
6226
Manuel Klimekd33516e2013-01-23 10:09:28 +00006227TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6228 verifyFormat("while");
6229 verifyFormat("operator");
6230}
6231
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006232TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6233 // This code would be painfully slow to format if we didn't skip it.
6234 std::string Code("A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" // 20x
6235 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6236 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6237 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6238 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6239 "A(1, 1)\n"
6240 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6241 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6242 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6243 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6244 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6245 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6246 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6247 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6248 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6249 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6250 // Deeply nested part is untouched, rest is formatted.
6251 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6252 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00006253 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006254}
6255
Nico Weber7e6a7a12013-01-08 17:56:31 +00006256//===----------------------------------------------------------------------===//
6257// Objective-C tests.
6258//===----------------------------------------------------------------------===//
6259
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006260TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6261 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6262 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6263 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006264 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006265 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6266 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6267 format("-(NSInteger)Method3:(id)anObject;"));
6268 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6269 format("-(NSInteger)Method4:(id)anObject;"));
6270 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6271 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6272 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6273 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006274 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6275 "forAllCells:(BOOL)flag;",
6276 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6277 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006278
6279 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006280 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6281 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006282 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6283 " inRange:(NSRange)range\n"
6284 " outRange:(NSRange)out_range\n"
6285 " outRange1:(NSRange)out_range1\n"
6286 " outRange2:(NSRange)out_range2\n"
6287 " outRange3:(NSRange)out_range3\n"
6288 " outRange4:(NSRange)out_range4\n"
6289 " outRange5:(NSRange)out_range5\n"
6290 " outRange6:(NSRange)out_range6\n"
6291 " outRange7:(NSRange)out_range7\n"
6292 " outRange8:(NSRange)out_range8\n"
6293 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006294
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006295 // When the function name has to be wrapped.
6296 FormatStyle Style = getLLVMStyle();
6297 Style.IndentWrappedFunctionNames = false;
6298 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6299 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6300 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6301 "}",
6302 Style);
6303 Style.IndentWrappedFunctionNames = true;
6304 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6305 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6306 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6307 "}",
6308 Style);
6309
Nico Weberd6f962f2013-01-10 20:18:33 +00006310 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006311 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006312 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6313 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006314 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006315
Daniel Jasper37194282013-05-28 08:33:00 +00006316 verifyFormat("- (int (*)())foo:(int (*)())f;");
6317 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006318
6319 // If there's no return type (very rare in practice!), LLVM and Google style
6320 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006321 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006322 verifyFormat("- foo:(int)f;");
6323 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006324}
6325
Nico Weber0588b502013-02-07 00:19:29 +00006326
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006327TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006328 EXPECT_EQ("\"some text \"\n"
6329 "\"other\";",
6330 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006331 EXPECT_EQ("\"some text \"\n"
6332 "\"other\";",
6333 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006334 EXPECT_EQ(
6335 "#define A \\\n"
6336 " \"some \" \\\n"
6337 " \"text \" \\\n"
6338 " \"other\";",
6339 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6340 EXPECT_EQ(
6341 "#define A \\\n"
6342 " \"so \" \\\n"
6343 " \"text \" \\\n"
6344 " \"other\";",
6345 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6346
6347 EXPECT_EQ("\"some text\"",
6348 format("\"some text\"", getLLVMStyleWithColumns(1)));
6349 EXPECT_EQ("\"some text\"",
6350 format("\"some text\"", getLLVMStyleWithColumns(11)));
6351 EXPECT_EQ("\"some \"\n"
6352 "\"text\"",
6353 format("\"some text\"", getLLVMStyleWithColumns(10)));
6354 EXPECT_EQ("\"some \"\n"
6355 "\"text\"",
6356 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006357 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006358 "\" tex\"\n"
6359 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006360 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006361 EXPECT_EQ("\"some\"\n"
6362 "\" tex\"\n"
6363 "\" and\"",
6364 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6365 EXPECT_EQ("\"some\"\n"
6366 "\"/tex\"\n"
6367 "\"/and\"",
6368 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006369
6370 EXPECT_EQ("variable =\n"
6371 " \"long string \"\n"
6372 " \"literal\";",
6373 format("variable = \"long string literal\";",
6374 getLLVMStyleWithColumns(20)));
6375
6376 EXPECT_EQ("variable = f(\n"
6377 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006378 " \"literal\",\n"
6379 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006380 " loooooooooooooooooooong);",
6381 format("variable = f(\"long string literal\", short, "
6382 "loooooooooooooooooooong);",
6383 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006384
Daniel Jaspera44991332015-04-29 13:06:49 +00006385 EXPECT_EQ(
6386 "f(g(\"long string \"\n"
6387 " \"literal\"),\n"
6388 " b);",
6389 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006390 EXPECT_EQ("f(g(\"long string \"\n"
6391 " \"literal\",\n"
6392 " a),\n"
6393 " b);",
6394 format("f(g(\"long string literal\", a), b);",
6395 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006396 EXPECT_EQ(
6397 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006398 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006399 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6400 EXPECT_EQ("f(\"one two three four five six \"\n"
6401 " \"seven\".split(\n"
6402 " really_looooong_variable));",
6403 format("f(\"one two three four five six seven\"."
6404 "split(really_looooong_variable));",
6405 getLLVMStyleWithColumns(33)));
6406
6407 EXPECT_EQ("f(\"some \"\n"
6408 " \"text\",\n"
6409 " other);",
6410 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006411
6412 // Only break as a last resort.
6413 verifyFormat(
6414 "aaaaaaaaaaaaaaaaaaaa(\n"
6415 " aaaaaaaaaaaaaaaaaaaa,\n"
6416 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006417
Daniel Jaspera44991332015-04-29 13:06:49 +00006418 EXPECT_EQ("\"splitmea\"\n"
6419 "\"trandomp\"\n"
6420 "\"oint\"",
6421 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006422
Daniel Jaspera44991332015-04-29 13:06:49 +00006423 EXPECT_EQ("\"split/\"\n"
6424 "\"pathat/\"\n"
6425 "\"slashes\"",
6426 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006427
Daniel Jaspera44991332015-04-29 13:06:49 +00006428 EXPECT_EQ("\"split/\"\n"
6429 "\"pathat/\"\n"
6430 "\"slashes\"",
6431 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006432 EXPECT_EQ("\"split at \"\n"
6433 "\"spaces/at/\"\n"
6434 "\"slashes.at.any$\"\n"
6435 "\"non-alphanumeric%\"\n"
6436 "\"1111111111characte\"\n"
6437 "\"rs\"",
6438 format("\"split at "
6439 "spaces/at/"
6440 "slashes.at."
6441 "any$non-"
6442 "alphanumeric%"
6443 "1111111111characte"
6444 "rs\"",
6445 getLLVMStyleWithColumns(20)));
6446
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006447 // Verify that splitting the strings understands
6448 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006449 EXPECT_EQ(
6450 "aaaaaaaaaaaa(\n"
6451 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6452 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6453 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6454 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6455 "aaaaaaaaaaaaaaaaaaaaaa\");",
6456 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006457 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6458 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6459 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6460 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6461 "aaaaaaaaaaaaaaaaaaaaaa\";",
6462 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006463 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6464 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6465 format("llvm::outs() << "
6466 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6467 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006468 EXPECT_EQ("ffff(\n"
6469 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6470 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6471 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6472 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6473 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006474
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006475 FormatStyle Style = getLLVMStyleWithColumns(12);
6476 Style.BreakStringLiterals = false;
6477 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6478
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006479 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00006480 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00006481 EXPECT_EQ("#define A \\\n"
6482 " \"some \" \\\n"
6483 " \"text \" \\\n"
6484 " \"other\";",
6485 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006486}
6487
Manuel Klimek9e321992015-07-28 15:50:24 +00006488TEST_F(FormatTest, FullyRemoveEmptyLines) {
6489 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6490 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6491 EXPECT_EQ("int i = a(b());",
6492 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6493}
6494
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006495TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6496 EXPECT_EQ(
6497 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6498 "(\n"
6499 " \"x\t\");",
6500 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6501 "aaaaaaa("
6502 "\"x\t\");"));
6503}
6504
Daniel Jasper174b0122014-01-09 14:18:12 +00006505TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006506 EXPECT_EQ(
6507 "u8\"utf8 string \"\n"
6508 "u8\"literal\";",
6509 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6510 EXPECT_EQ(
6511 "u\"utf16 string \"\n"
6512 "u\"literal\";",
6513 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6514 EXPECT_EQ(
6515 "U\"utf32 string \"\n"
6516 "U\"literal\";",
6517 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6518 EXPECT_EQ("L\"wide string \"\n"
6519 "L\"literal\";",
6520 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006521 EXPECT_EQ("@\"NSString \"\n"
6522 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006523 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00006524 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006525
6526 // This input makes clang-format try to split the incomplete unicode escape
6527 // sequence, which used to lead to a crasher.
6528 verifyNoCrash(
6529 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6530 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006531}
6532
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006533TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6534 FormatStyle Style = getGoogleStyleWithColumns(15);
6535 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6536 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6537 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6538 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6539 EXPECT_EQ("u8R\"x(raw literal)x\";",
6540 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006541}
6542
6543TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6544 FormatStyle Style = getLLVMStyleWithColumns(20);
6545 EXPECT_EQ(
6546 "_T(\"aaaaaaaaaaaaaa\")\n"
6547 "_T(\"aaaaaaaaaaaaaa\")\n"
6548 "_T(\"aaaaaaaaaaaa\")",
6549 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006550 EXPECT_EQ("f(x,\n"
6551 " _T(\"aaaaaaaaaaaa\")\n"
6552 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00006553 " z);",
6554 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6555
6556 // FIXME: Handle embedded spaces in one iteration.
6557 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6558 // "_T(\"aaaaaaaaaaaaa\")\n"
6559 // "_T(\"aaaaaaaaaaaaa\")\n"
6560 // "_T(\"a\")",
6561 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6562 // getLLVMStyleWithColumns(20)));
6563 EXPECT_EQ(
6564 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6565 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006566 EXPECT_EQ("f(\n"
6567 "#if !TEST\n"
6568 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6569 "#endif\n"
6570 " );",
6571 format("f(\n"
6572 "#if !TEST\n"
6573 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6574 "#endif\n"
6575 ");"));
6576 EXPECT_EQ("f(\n"
6577 "\n"
6578 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6579 format("f(\n"
6580 "\n"
6581 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006582}
6583
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006584TEST_F(FormatTest, BreaksStringLiteralOperands) {
6585 // In a function call with two operands, the second can be broken with no line
6586 // break before it.
6587 EXPECT_EQ("func(a, \"long long \"\n"
6588 " \"long long\");",
6589 format("func(a, \"long long long long\");",
6590 getLLVMStyleWithColumns(24)));
6591 // In a function call with three operands, the second must be broken with a
6592 // line break before it.
6593 EXPECT_EQ("func(a,\n"
6594 " \"long long long \"\n"
6595 " \"long\",\n"
6596 " c);",
6597 format("func(a, \"long long long long\", c);",
6598 getLLVMStyleWithColumns(24)));
6599 // In a function call with three operands, the third must be broken with a
6600 // line break before it.
6601 EXPECT_EQ("func(a, b,\n"
6602 " \"long long long \"\n"
6603 " \"long\");",
6604 format("func(a, b, \"long long long long\");",
6605 getLLVMStyleWithColumns(24)));
6606 // In a function call with three operands, both the second and the third must
6607 // be broken with a line break before them.
6608 EXPECT_EQ("func(a,\n"
6609 " \"long long long \"\n"
6610 " \"long\",\n"
6611 " \"long long long \"\n"
6612 " \"long\");",
6613 format("func(a, \"long long long long\", \"long long long long\");",
6614 getLLVMStyleWithColumns(24)));
6615 // In a chain of << with two operands, the second can be broken with no line
6616 // break before it.
6617 EXPECT_EQ("a << \"line line \"\n"
6618 " \"line\";",
6619 format("a << \"line line line\";",
6620 getLLVMStyleWithColumns(20)));
6621 // In a chain of << with three operands, the second can be broken with no line
6622 // break before it.
6623 EXPECT_EQ("abcde << \"line \"\n"
6624 " \"line line\"\n"
6625 " << c;",
6626 format("abcde << \"line line line\" << c;",
6627 getLLVMStyleWithColumns(20)));
6628 // In a chain of << with three operands, the third must be broken with a line
6629 // break before it.
6630 EXPECT_EQ("a << b\n"
6631 " << \"line line \"\n"
6632 " \"line\";",
6633 format("a << b << \"line line line\";",
6634 getLLVMStyleWithColumns(20)));
6635 // In a chain of << with three operands, the second can be broken with no line
6636 // break before it and the third must be broken with a line break before it.
6637 EXPECT_EQ("abcd << \"line line \"\n"
6638 " \"line\"\n"
6639 " << \"line line \"\n"
6640 " \"line\";",
6641 format("abcd << \"line line line\" << \"line line line\";",
6642 getLLVMStyleWithColumns(20)));
6643 // In a chain of binary operators with two operands, the second can be broken
6644 // with no line break before it.
6645 EXPECT_EQ("abcd + \"line line \"\n"
6646 " \"line line\";",
6647 format("abcd + \"line line line line\";",
6648 getLLVMStyleWithColumns(20)));
6649 // In a chain of binary operators with three operands, the second must be
6650 // broken with a line break before it.
6651 EXPECT_EQ("abcd +\n"
6652 " \"line line \"\n"
6653 " \"line line\" +\n"
6654 " e;",
6655 format("abcd + \"line line line line\" + e;",
6656 getLLVMStyleWithColumns(20)));
6657 // In a function call with two operands, with AlignAfterOpenBracket enabled,
6658 // the first must be broken with a line break before it.
6659 FormatStyle Style = getLLVMStyleWithColumns(25);
6660 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6661 EXPECT_EQ("someFunction(\n"
6662 " \"long long long \"\n"
6663 " \"long\",\n"
6664 " a);",
6665 format("someFunction(\"long long long long\", a);", Style));
6666}
6667
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006668TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006669 EXPECT_EQ(
6670 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6673 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6676}
6677
6678TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6679 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006680 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006681 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6682 "multiline raw string literal xxxxxxxxxxxxxx\n"
6683 ")x\",\n"
6684 " a),\n"
6685 " b);",
6686 format("fffffffffff(g(R\"x(\n"
6687 "multiline raw string literal xxxxxxxxxxxxxx\n"
6688 ")x\", a), b);",
6689 getGoogleStyleWithColumns(20)));
6690 EXPECT_EQ("fffffffffff(\n"
6691 " g(R\"x(qqq\n"
6692 "multiline raw string literal xxxxxxxxxxxxxx\n"
6693 ")x\",\n"
6694 " a),\n"
6695 " b);",
6696 format("fffffffffff(g(R\"x(qqq\n"
6697 "multiline raw string literal xxxxxxxxxxxxxx\n"
6698 ")x\", a), b);",
6699 getGoogleStyleWithColumns(20)));
6700
6701 EXPECT_EQ("fffffffffff(R\"x(\n"
6702 "multiline raw string literal xxxxxxxxxxxxxx\n"
6703 ")x\");",
6704 format("fffffffffff(R\"x(\n"
6705 "multiline raw string literal xxxxxxxxxxxxxx\n"
6706 ")x\");",
6707 getGoogleStyleWithColumns(20)));
6708 EXPECT_EQ("fffffffffff(R\"x(\n"
6709 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006710 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006711 format("fffffffffff(R\"x(\n"
6712 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006713 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006714 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006715 EXPECT_EQ("fffffffffff(\n"
6716 " R\"x(\n"
6717 "multiline raw string literal xxxxxxxxxxxxxx\n"
6718 ")x\" +\n"
6719 " bbbbbb);",
6720 format("fffffffffff(\n"
6721 " R\"x(\n"
6722 "multiline raw string literal xxxxxxxxxxxxxx\n"
6723 ")x\" + bbbbbb);",
6724 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006725}
6726
Alexander Kornienkobe633902013-06-14 11:46:10 +00006727TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006728 verifyFormat("string a = \"unterminated;");
6729 EXPECT_EQ("function(\"unterminated,\n"
6730 " OtherParameter);",
6731 format("function( \"unterminated,\n"
6732 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006733}
6734
6735TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006736 FormatStyle Style = getLLVMStyle();
6737 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006738 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006739 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006740}
6741
Daniel Jaspera44991332015-04-29 13:06:49 +00006742TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006743
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006744TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6745 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6746 " \"ddeeefff\");",
6747 format("someFunction(\"aaabbbcccdddeeefff\");",
6748 getLLVMStyleWithColumns(25)));
6749 EXPECT_EQ("someFunction1234567890(\n"
6750 " \"aaabbbcccdddeeefff\");",
6751 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6752 getLLVMStyleWithColumns(26)));
6753 EXPECT_EQ("someFunction1234567890(\n"
6754 " \"aaabbbcccdddeeeff\"\n"
6755 " \"f\");",
6756 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6757 getLLVMStyleWithColumns(25)));
6758 EXPECT_EQ("someFunction1234567890(\n"
6759 " \"aaabbbcccdddeeeff\"\n"
6760 " \"f\");",
6761 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6762 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006763 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6764 " \"ddde \"\n"
6765 " \"efff\");",
6766 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006767 getLLVMStyleWithColumns(25)));
6768 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6769 " \"ddeeefff\");",
6770 format("someFunction(\"aaabbbccc ddeeefff\");",
6771 getLLVMStyleWithColumns(25)));
6772 EXPECT_EQ("someFunction1234567890(\n"
6773 " \"aaabb \"\n"
6774 " \"cccdddeeefff\");",
6775 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6776 getLLVMStyleWithColumns(25)));
6777 EXPECT_EQ("#define A \\\n"
6778 " string s = \\\n"
6779 " \"123456789\" \\\n"
6780 " \"0\"; \\\n"
6781 " int i;",
6782 format("#define A string s = \"1234567890\"; int i;",
6783 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006784 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6785 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6786 " \"dddeeeff\"\n"
6787 " \"f\");",
6788 format("someFunction(\"aaabbbcc dddeeefff\");",
6789 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006790}
6791
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006792TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006793 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6794 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006795 EXPECT_EQ("\"test\"\n"
6796 "\"\\n\"",
6797 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6798 EXPECT_EQ("\"tes\\\\\"\n"
6799 "\"n\"",
6800 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6801 EXPECT_EQ("\"\\\\\\\\\"\n"
6802 "\"\\n\"",
6803 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006804 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006805 EXPECT_EQ("\"\\uff01\"\n"
6806 "\"test\"",
6807 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6808 EXPECT_EQ("\"\\Uff01ff02\"",
6809 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6810 EXPECT_EQ("\"\\x000000000001\"\n"
6811 "\"next\"",
6812 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6813 EXPECT_EQ("\"\\x000000000001next\"",
6814 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6815 EXPECT_EQ("\"\\x000000000001\"",
6816 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6817 EXPECT_EQ("\"test\"\n"
6818 "\"\\000000\"\n"
6819 "\"000001\"",
6820 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6821 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006822 "\"00000000\"\n"
6823 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006824 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006825}
6826
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006827TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6828 verifyFormat("void f() {\n"
6829 " return g() {}\n"
6830 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006831 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006832 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006833 "}");
6834}
6835
Manuel Klimek421147e2014-01-24 09:25:23 +00006836TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6837 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006838 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006839}
6840
Manuel Klimek13b97d82013-05-13 08:42:42 +00006841TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6842 verifyFormat("class X {\n"
6843 " void f() {\n"
6844 " }\n"
6845 "};",
6846 getLLVMStyleWithColumns(12));
6847}
6848
6849TEST_F(FormatTest, ConfigurableIndentWidth) {
6850 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6851 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006852 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006853 verifyFormat("void f() {\n"
6854 " someFunction();\n"
6855 " if (true) {\n"
6856 " f();\n"
6857 " }\n"
6858 "}",
6859 EightIndent);
6860 verifyFormat("class X {\n"
6861 " void f() {\n"
6862 " }\n"
6863 "};",
6864 EightIndent);
6865 verifyFormat("int x[] = {\n"
6866 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006867 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006868 EightIndent);
6869}
6870
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006871TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006872 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006873 "f();",
6874 getLLVMStyleWithColumns(8));
6875}
6876
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006877TEST_F(FormatTest, ConfigurableUseOfTab) {
6878 FormatStyle Tab = getLLVMStyleWithColumns(42);
6879 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006880 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00006881 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006882
6883 EXPECT_EQ("if (aaaaaaaa && // q\n"
6884 " bb)\t\t// w\n"
6885 "\t;",
6886 format("if (aaaaaaaa &&// q\n"
6887 "bb)// w\n"
6888 ";",
6889 Tab));
6890 EXPECT_EQ("if (aaa && bbb) // w\n"
6891 "\t;",
6892 format("if(aaa&&bbb)// w\n"
6893 ";",
6894 Tab));
6895
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006896 verifyFormat("class X {\n"
6897 "\tvoid f() {\n"
6898 "\t\tsomeFunction(parameter1,\n"
6899 "\t\t\t parameter2);\n"
6900 "\t}\n"
6901 "};",
6902 Tab);
6903 verifyFormat("#define A \\\n"
6904 "\tvoid f() { \\\n"
6905 "\t\tsomeFunction( \\\n"
6906 "\t\t parameter1, \\\n"
6907 "\t\t parameter2); \\\n"
6908 "\t}",
6909 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006910
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006911 Tab.TabWidth = 4;
6912 Tab.IndentWidth = 8;
6913 verifyFormat("class TabWidth4Indent8 {\n"
6914 "\t\tvoid f() {\n"
6915 "\t\t\t\tsomeFunction(parameter1,\n"
6916 "\t\t\t\t\t\t\t parameter2);\n"
6917 "\t\t}\n"
6918 "};",
6919 Tab);
6920
6921 Tab.TabWidth = 4;
6922 Tab.IndentWidth = 4;
6923 verifyFormat("class TabWidth4Indent4 {\n"
6924 "\tvoid f() {\n"
6925 "\t\tsomeFunction(parameter1,\n"
6926 "\t\t\t\t\t parameter2);\n"
6927 "\t}\n"
6928 "};",
6929 Tab);
6930
6931 Tab.TabWidth = 8;
6932 Tab.IndentWidth = 4;
6933 verifyFormat("class TabWidth8Indent4 {\n"
6934 " void f() {\n"
6935 "\tsomeFunction(parameter1,\n"
6936 "\t\t parameter2);\n"
6937 " }\n"
6938 "};",
6939 Tab);
6940
Alexander Kornienko39856b72013-09-10 09:38:25 +00006941 Tab.TabWidth = 8;
6942 Tab.IndentWidth = 8;
6943 EXPECT_EQ("/*\n"
6944 "\t a\t\tcomment\n"
6945 "\t in multiple lines\n"
6946 " */",
6947 format(" /*\t \t \n"
6948 " \t \t a\t\tcomment\t \t\n"
6949 " \t \t in multiple lines\t\n"
6950 " \t */",
6951 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006952
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006953 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006954 verifyFormat("{\n"
6955 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6956 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6957 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6958 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6959 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6960 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006961 "};",
6962 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006963 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006964 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006965 "\ta2,\n"
6966 "\ta3\n"
6967 "};",
6968 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006969 EXPECT_EQ("if (aaaaaaaa && // q\n"
6970 " bb) // w\n"
6971 "\t;",
6972 format("if (aaaaaaaa &&// q\n"
6973 "bb)// w\n"
6974 ";",
6975 Tab));
6976 verifyFormat("class X {\n"
6977 "\tvoid f() {\n"
6978 "\t\tsomeFunction(parameter1,\n"
6979 "\t\t parameter2);\n"
6980 "\t}\n"
6981 "};",
6982 Tab);
6983 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006984 "\tQ(\n"
6985 "\t {\n"
6986 "\t\t int a;\n"
6987 "\t\t someFunction(aaaaaaaa,\n"
6988 "\t\t bbbbbbb);\n"
6989 "\t },\n"
6990 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006991 "}",
6992 Tab);
6993 EXPECT_EQ("{\n"
6994 "\t/* aaaa\n"
6995 "\t bbbb */\n"
6996 "}",
6997 format("{\n"
6998 "/* aaaa\n"
6999 " bbbb */\n"
7000 "}",
7001 Tab));
7002 EXPECT_EQ("{\n"
7003 "\t/*\n"
7004 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7005 "\t bbbbbbbbbbbbb\n"
7006 "\t*/\n"
7007 "}",
7008 format("{\n"
7009 "/*\n"
7010 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7011 "*/\n"
7012 "}",
7013 Tab));
7014 EXPECT_EQ("{\n"
7015 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7016 "\t// bbbbbbbbbbbbb\n"
7017 "}",
7018 format("{\n"
7019 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7020 "}",
7021 Tab));
7022 EXPECT_EQ("{\n"
7023 "\t/*\n"
7024 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7025 "\t bbbbbbbbbbbbb\n"
7026 "\t*/\n"
7027 "}",
7028 format("{\n"
7029 "\t/*\n"
7030 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7031 "\t*/\n"
7032 "}",
7033 Tab));
7034 EXPECT_EQ("{\n"
7035 "\t/*\n"
7036 "\n"
7037 "\t*/\n"
7038 "}",
7039 format("{\n"
7040 "\t/*\n"
7041 "\n"
7042 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007043 "}",
7044 Tab));
7045 EXPECT_EQ("{\n"
7046 "\t/*\n"
7047 " asdf\n"
7048 "\t*/\n"
7049 "}",
7050 format("{\n"
7051 "\t/*\n"
7052 " asdf\n"
7053 "\t*/\n"
7054 "}",
7055 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007056
7057 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007058 EXPECT_EQ("/*\n"
7059 " a\t\tcomment\n"
7060 " in multiple lines\n"
7061 " */",
7062 format(" /*\t \t \n"
7063 " \t \t a\t\tcomment\t \t\n"
7064 " \t \t in multiple lines\t\n"
7065 " \t */",
7066 Tab));
7067 EXPECT_EQ("/* some\n"
7068 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007069 format(" \t \t /* some\n"
7070 " \t \t comment */",
7071 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007072 EXPECT_EQ("int a; /* some\n"
7073 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007074 format(" \t \t int a; /* some\n"
7075 " \t \t comment */",
7076 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007077
Alexander Kornienko39856b72013-09-10 09:38:25 +00007078 EXPECT_EQ("int a; /* some\n"
7079 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007080 format(" \t \t int\ta; /* some\n"
7081 " \t \t comment */",
7082 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007083 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7084 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007085 format(" \t \t f(\"\t\t\"); /* some\n"
7086 " \t \t comment */",
7087 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007088 EXPECT_EQ("{\n"
7089 " /*\n"
7090 " * Comment\n"
7091 " */\n"
7092 " int i;\n"
7093 "}",
7094 format("{\n"
7095 "\t/*\n"
7096 "\t * Comment\n"
7097 "\t */\n"
7098 "\t int i;\n"
7099 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007100
7101 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7102 Tab.TabWidth = 8;
7103 Tab.IndentWidth = 8;
7104 EXPECT_EQ("if (aaaaaaaa && // q\n"
7105 " bb) // w\n"
7106 "\t;",
7107 format("if (aaaaaaaa &&// q\n"
7108 "bb)// w\n"
7109 ";",
7110 Tab));
7111 EXPECT_EQ("if (aaa && bbb) // w\n"
7112 "\t;",
7113 format("if(aaa&&bbb)// w\n"
7114 ";",
7115 Tab));
7116 verifyFormat("class X {\n"
7117 "\tvoid f() {\n"
7118 "\t\tsomeFunction(parameter1,\n"
7119 "\t\t\t parameter2);\n"
7120 "\t}\n"
7121 "};",
7122 Tab);
7123 verifyFormat("#define A \\\n"
7124 "\tvoid f() { \\\n"
7125 "\t\tsomeFunction( \\\n"
7126 "\t\t parameter1, \\\n"
7127 "\t\t parameter2); \\\n"
7128 "\t}",
7129 Tab);
7130 Tab.TabWidth = 4;
7131 Tab.IndentWidth = 8;
7132 verifyFormat("class TabWidth4Indent8 {\n"
7133 "\t\tvoid f() {\n"
7134 "\t\t\t\tsomeFunction(parameter1,\n"
7135 "\t\t\t\t\t\t\t parameter2);\n"
7136 "\t\t}\n"
7137 "};",
7138 Tab);
7139 Tab.TabWidth = 4;
7140 Tab.IndentWidth = 4;
7141 verifyFormat("class TabWidth4Indent4 {\n"
7142 "\tvoid f() {\n"
7143 "\t\tsomeFunction(parameter1,\n"
7144 "\t\t\t\t\t parameter2);\n"
7145 "\t}\n"
7146 "};",
7147 Tab);
7148 Tab.TabWidth = 8;
7149 Tab.IndentWidth = 4;
7150 verifyFormat("class TabWidth8Indent4 {\n"
7151 " void f() {\n"
7152 "\tsomeFunction(parameter1,\n"
7153 "\t\t parameter2);\n"
7154 " }\n"
7155 "};",
7156 Tab);
7157 Tab.TabWidth = 8;
7158 Tab.IndentWidth = 8;
7159 EXPECT_EQ("/*\n"
7160 "\t a\t\tcomment\n"
7161 "\t in multiple lines\n"
7162 " */",
7163 format(" /*\t \t \n"
7164 " \t \t a\t\tcomment\t \t\n"
7165 " \t \t in multiple lines\t\n"
7166 " \t */",
7167 Tab));
7168 verifyFormat("{\n"
7169 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7170 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7171 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7172 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7173 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7174 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7175 "};",
7176 Tab);
7177 verifyFormat("enum AA {\n"
7178 "\ta1, // Force multiple lines\n"
7179 "\ta2,\n"
7180 "\ta3\n"
7181 "};",
7182 Tab);
7183 EXPECT_EQ("if (aaaaaaaa && // q\n"
7184 " bb) // w\n"
7185 "\t;",
7186 format("if (aaaaaaaa &&// q\n"
7187 "bb)// w\n"
7188 ";",
7189 Tab));
7190 verifyFormat("class X {\n"
7191 "\tvoid f() {\n"
7192 "\t\tsomeFunction(parameter1,\n"
7193 "\t\t\t parameter2);\n"
7194 "\t}\n"
7195 "};",
7196 Tab);
7197 verifyFormat("{\n"
7198 "\tQ(\n"
7199 "\t {\n"
7200 "\t\t int a;\n"
7201 "\t\t someFunction(aaaaaaaa,\n"
7202 "\t\t\t\t bbbbbbb);\n"
7203 "\t },\n"
7204 "\t p);\n"
7205 "}",
7206 Tab);
7207 EXPECT_EQ("{\n"
7208 "\t/* aaaa\n"
7209 "\t bbbb */\n"
7210 "}",
7211 format("{\n"
7212 "/* aaaa\n"
7213 " bbbb */\n"
7214 "}",
7215 Tab));
7216 EXPECT_EQ("{\n"
7217 "\t/*\n"
7218 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7219 "\t bbbbbbbbbbbbb\n"
7220 "\t*/\n"
7221 "}",
7222 format("{\n"
7223 "/*\n"
7224 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7225 "*/\n"
7226 "}",
7227 Tab));
7228 EXPECT_EQ("{\n"
7229 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7230 "\t// bbbbbbbbbbbbb\n"
7231 "}",
7232 format("{\n"
7233 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7234 "}",
7235 Tab));
7236 EXPECT_EQ("{\n"
7237 "\t/*\n"
7238 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7239 "\t bbbbbbbbbbbbb\n"
7240 "\t*/\n"
7241 "}",
7242 format("{\n"
7243 "\t/*\n"
7244 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7245 "\t*/\n"
7246 "}",
7247 Tab));
7248 EXPECT_EQ("{\n"
7249 "\t/*\n"
7250 "\n"
7251 "\t*/\n"
7252 "}",
7253 format("{\n"
7254 "\t/*\n"
7255 "\n"
7256 "\t*/\n"
7257 "}",
7258 Tab));
7259 EXPECT_EQ("{\n"
7260 "\t/*\n"
7261 " asdf\n"
7262 "\t*/\n"
7263 "}",
7264 format("{\n"
7265 "\t/*\n"
7266 " asdf\n"
7267 "\t*/\n"
7268 "}",
7269 Tab));
7270 EXPECT_EQ("/*\n"
7271 "\t a\t\tcomment\n"
7272 "\t in multiple lines\n"
7273 " */",
7274 format(" /*\t \t \n"
7275 " \t \t a\t\tcomment\t \t\n"
7276 " \t \t in multiple lines\t\n"
7277 " \t */",
7278 Tab));
7279 EXPECT_EQ("/* some\n"
7280 " comment */",
7281 format(" \t \t /* some\n"
7282 " \t \t comment */",
7283 Tab));
7284 EXPECT_EQ("int a; /* some\n"
7285 " comment */",
7286 format(" \t \t int a; /* some\n"
7287 " \t \t comment */",
7288 Tab));
7289 EXPECT_EQ("int a; /* some\n"
7290 "comment */",
7291 format(" \t \t int\ta; /* some\n"
7292 " \t \t comment */",
7293 Tab));
7294 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7295 " comment */",
7296 format(" \t \t f(\"\t\t\"); /* some\n"
7297 " \t \t comment */",
7298 Tab));
7299 EXPECT_EQ("{\n"
7300 " /*\n"
7301 " * Comment\n"
7302 " */\n"
7303 " int i;\n"
7304 "}",
7305 format("{\n"
7306 "\t/*\n"
7307 "\t * Comment\n"
7308 "\t */\n"
7309 "\t int i;\n"
7310 "}"));
7311 Tab.AlignConsecutiveAssignments = true;
7312 Tab.AlignConsecutiveDeclarations = true;
7313 Tab.TabWidth = 4;
7314 Tab.IndentWidth = 4;
7315 verifyFormat("class Assign {\n"
7316 "\tvoid f() {\n"
7317 "\t\tint x = 123;\n"
7318 "\t\tint random = 4;\n"
7319 "\t\tstd::string alphabet =\n"
7320 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7321 "\t}\n"
7322 "};",
7323 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007324}
7325
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007326TEST_F(FormatTest, CalculatesOriginalColumn) {
7327 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7328 "q\"; /* some\n"
7329 " comment */",
7330 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7331 "q\"; /* some\n"
7332 " comment */",
7333 getLLVMStyle()));
7334 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7335 "/* some\n"
7336 " comment */",
7337 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7338 " /* some\n"
7339 " comment */",
7340 getLLVMStyle()));
7341 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7342 "qqq\n"
7343 "/* some\n"
7344 " comment */",
7345 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7346 "qqq\n"
7347 " /* some\n"
7348 " comment */",
7349 getLLVMStyle()));
7350 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7351 "wwww; /* some\n"
7352 " comment */",
7353 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7354 "wwww; /* some\n"
7355 " comment */",
7356 getLLVMStyle()));
7357}
7358
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007359TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007360 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007361 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007362
7363 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007364 " continue;",
7365 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007366 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007367 " continue;",
7368 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007369 verifyFormat("if(true)\n"
7370 " f();\n"
7371 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007372 " f();",
7373 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007374 verifyFormat("do {\n"
7375 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007376 "} while(something());",
7377 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007378 verifyFormat("switch(x) {\n"
7379 "default:\n"
7380 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007381 "}",
7382 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007383 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007384 verifyFormat("size_t x = sizeof(x);", NoSpace);
7385 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7386 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7387 verifyFormat("alignas(128) char a[128];", NoSpace);
7388 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7389 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7390 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007391 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007392 verifyFormat("T A::operator()();", NoSpace);
7393 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007394
7395 FormatStyle Space = getLLVMStyle();
7396 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7397
7398 verifyFormat("int f ();", Space);
7399 verifyFormat("void f (int a, T b) {\n"
7400 " while (true)\n"
7401 " continue;\n"
7402 "}",
7403 Space);
7404 verifyFormat("if (true)\n"
7405 " f ();\n"
7406 "else if (true)\n"
7407 " f ();",
7408 Space);
7409 verifyFormat("do {\n"
7410 " do_something ();\n"
7411 "} while (something ());",
7412 Space);
7413 verifyFormat("switch (x) {\n"
7414 "default:\n"
7415 " break;\n"
7416 "}",
7417 Space);
7418 verifyFormat("A::A () : a (1) {}", Space);
7419 verifyFormat("void f () __attribute__ ((asdf));", Space);
7420 verifyFormat("*(&a + 1);\n"
7421 "&((&a)[1]);\n"
7422 "a[(b + c) * d];\n"
7423 "(((a + 1) * 2) + 3) * 4;",
7424 Space);
7425 verifyFormat("#define A(x) x", Space);
7426 verifyFormat("#define A (x) x", Space);
7427 verifyFormat("#if defined(x)\n"
7428 "#endif",
7429 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007430 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007431 verifyFormat("size_t x = sizeof (x);", Space);
7432 verifyFormat("auto f (int x) -> decltype (x);", Space);
7433 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7434 verifyFormat("alignas (128) char a[128];", Space);
7435 verifyFormat("size_t x = alignof (MyType);", Space);
7436 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7437 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007438 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007439 verifyFormat("T A::operator() ();", Space);
7440 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007441}
7442
7443TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7444 FormatStyle Spaces = getLLVMStyle();
7445
7446 Spaces.SpacesInParentheses = true;
7447 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007448 verifyFormat("call();", Spaces);
7449 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007450 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7451 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007452 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007453 " continue;",
7454 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007455 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007456 " continue;",
7457 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007458 verifyFormat("if ( true )\n"
7459 " f();\n"
7460 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007461 " f();",
7462 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007463 verifyFormat("do {\n"
7464 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007465 "} while ( something() );",
7466 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007467 verifyFormat("switch ( x ) {\n"
7468 "default:\n"
7469 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007470 "}",
7471 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007472
7473 Spaces.SpacesInParentheses = false;
7474 Spaces.SpacesInCStyleCastParentheses = true;
7475 verifyFormat("Type *A = ( Type * )P;", Spaces);
7476 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7477 verifyFormat("x = ( int32 )y;", Spaces);
7478 verifyFormat("int a = ( int )(2.0f);", Spaces);
7479 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7480 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7481 verifyFormat("#define x (( int )-1)", Spaces);
7482
Daniel Jasper92e09822015-03-18 12:59:19 +00007483 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007484 Spaces.SpacesInParentheses = false;
7485 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007486 Spaces.SpacesInCStyleCastParentheses = true;
7487 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007488 verifyFormat("call( );", Spaces);
7489 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007490 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007491 " continue;",
7492 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007493 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007494 " continue;",
7495 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007496 verifyFormat("if (true)\n"
7497 " f( );\n"
7498 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007499 " f( );",
7500 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007501 verifyFormat("do {\n"
7502 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007503 "} while (something( ));",
7504 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007505 verifyFormat("switch (x) {\n"
7506 "default:\n"
7507 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007508 "}",
7509 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007510
Daniel Jasper92e09822015-03-18 12:59:19 +00007511 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007512 Spaces.SpaceAfterCStyleCast = true;
7513 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007514 verifyFormat("call( );", Spaces);
7515 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007516 verifyFormat("while (( bool ) 1)\n"
7517 " continue;",
7518 Spaces);
7519 verifyFormat("for (;;)\n"
7520 " continue;",
7521 Spaces);
7522 verifyFormat("if (true)\n"
7523 " f( );\n"
7524 "else if (true)\n"
7525 " f( );",
7526 Spaces);
7527 verifyFormat("do {\n"
7528 " do_something(( int ) i);\n"
7529 "} while (something( ));",
7530 Spaces);
7531 verifyFormat("switch (x) {\n"
7532 "default:\n"
7533 " break;\n"
7534 "}",
7535 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007536
7537 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007538 Spaces.SpacesInCStyleCastParentheses = false;
7539 Spaces.SpaceAfterCStyleCast = true;
7540 verifyFormat("while ((bool) 1)\n"
7541 " continue;",
7542 Spaces);
7543 verifyFormat("do {\n"
7544 " do_something((int) i);\n"
7545 "} while (something( ));",
7546 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007547}
7548
Daniel Jasperad981f82014-08-26 11:41:14 +00007549TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7550 verifyFormat("int a[5];");
7551 verifyFormat("a[3] += 42;");
7552
7553 FormatStyle Spaces = getLLVMStyle();
7554 Spaces.SpacesInSquareBrackets = true;
7555 // Lambdas unchanged.
7556 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7557 verifyFormat("return [i, args...] {};", Spaces);
7558
7559 // Not lambdas.
7560 verifyFormat("int a[ 5 ];", Spaces);
7561 verifyFormat("a[ 3 ] += 42;", Spaces);
7562 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7563 verifyFormat("double &operator[](int i) { return 0; }\n"
7564 "int i;",
7565 Spaces);
7566 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7567 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7568 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7569}
7570
Daniel Jasperd94bff32013-09-25 15:15:02 +00007571TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7572 verifyFormat("int a = 5;");
7573 verifyFormat("a += 42;");
7574 verifyFormat("a or_eq 8;");
7575
7576 FormatStyle Spaces = getLLVMStyle();
7577 Spaces.SpaceBeforeAssignmentOperators = false;
7578 verifyFormat("int a= 5;", Spaces);
7579 verifyFormat("a+= 42;", Spaces);
7580 verifyFormat("a or_eq 8;", Spaces);
7581}
7582
Daniel Jaspera44991332015-04-29 13:06:49 +00007583TEST_F(FormatTest, AlignConsecutiveAssignments) {
7584 FormatStyle Alignment = getLLVMStyle();
7585 Alignment.AlignConsecutiveAssignments = false;
7586 verifyFormat("int a = 5;\n"
7587 "int oneTwoThree = 123;",
7588 Alignment);
7589 verifyFormat("int a = 5;\n"
7590 "int oneTwoThree = 123;",
7591 Alignment);
7592
7593 Alignment.AlignConsecutiveAssignments = true;
7594 verifyFormat("int a = 5;\n"
7595 "int oneTwoThree = 123;",
7596 Alignment);
7597 verifyFormat("int a = method();\n"
7598 "int oneTwoThree = 133;",
7599 Alignment);
7600 verifyFormat("a &= 5;\n"
7601 "bcd *= 5;\n"
7602 "ghtyf += 5;\n"
7603 "dvfvdb -= 5;\n"
7604 "a /= 5;\n"
7605 "vdsvsv %= 5;\n"
7606 "sfdbddfbdfbb ^= 5;\n"
7607 "dvsdsv |= 5;\n"
7608 "int dsvvdvsdvvv = 123;",
7609 Alignment);
7610 verifyFormat("int i = 1, j = 10;\n"
7611 "something = 2000;",
7612 Alignment);
7613 verifyFormat("something = 2000;\n"
7614 "int i = 1, j = 10;\n",
7615 Alignment);
7616 verifyFormat("something = 2000;\n"
7617 "another = 911;\n"
7618 "int i = 1, j = 10;\n"
7619 "oneMore = 1;\n"
7620 "i = 2;",
7621 Alignment);
7622 verifyFormat("int a = 5;\n"
7623 "int one = 1;\n"
7624 "method();\n"
7625 "int oneTwoThree = 123;\n"
7626 "int oneTwo = 12;",
7627 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007628 verifyFormat("int oneTwoThree = 123;\n"
7629 "int oneTwo = 12;\n"
7630 "method();\n",
7631 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007632 verifyFormat("int oneTwoThree = 123; // comment\n"
7633 "int oneTwo = 12; // comment",
7634 Alignment);
7635 EXPECT_EQ("int a = 5;\n"
7636 "\n"
7637 "int oneTwoThree = 123;",
7638 format("int a = 5;\n"
7639 "\n"
7640 "int oneTwoThree= 123;",
7641 Alignment));
7642 EXPECT_EQ("int a = 5;\n"
7643 "int one = 1;\n"
7644 "\n"
7645 "int oneTwoThree = 123;",
7646 format("int a = 5;\n"
7647 "int one = 1;\n"
7648 "\n"
7649 "int oneTwoThree = 123;",
7650 Alignment));
7651 EXPECT_EQ("int a = 5;\n"
7652 "int one = 1;\n"
7653 "\n"
7654 "int oneTwoThree = 123;\n"
7655 "int oneTwo = 12;",
7656 format("int a = 5;\n"
7657 "int one = 1;\n"
7658 "\n"
7659 "int oneTwoThree = 123;\n"
7660 "int oneTwo = 12;",
7661 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007662 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
7663 verifyFormat("#define A \\\n"
7664 " int aaaa = 12; \\\n"
7665 " int b = 23; \\\n"
7666 " int ccc = 234; \\\n"
7667 " int dddddddddd = 2345;",
7668 Alignment);
7669 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007670 verifyFormat("#define A \\\n"
7671 " int aaaa = 12; \\\n"
7672 " int b = 23; \\\n"
7673 " int ccc = 234; \\\n"
7674 " int dddddddddd = 2345;",
7675 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007676 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00007677 verifyFormat("#define A "
7678 " \\\n"
7679 " int aaaa = 12; "
7680 " \\\n"
7681 " int b = 23; "
7682 " \\\n"
7683 " int ccc = 234; "
7684 " \\\n"
7685 " int dddddddddd = 2345;",
7686 Alignment);
7687 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7688 "k = 4, int l = 5,\n"
7689 " int m = 6) {\n"
7690 " int j = 10;\n"
7691 " otherThing = 1;\n"
7692 "}",
7693 Alignment);
7694 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7695 " int i = 1;\n"
7696 " int j = 2;\n"
7697 " int big = 10000;\n"
7698 "}",
7699 Alignment);
7700 verifyFormat("class C {\n"
7701 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007702 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007703 " virtual void f() = 0;\n"
7704 "};",
7705 Alignment);
7706 verifyFormat("int i = 1;\n"
7707 "if (SomeType t = getSomething()) {\n"
7708 "}\n"
7709 "int j = 2;\n"
7710 "int big = 10000;",
7711 Alignment);
7712 verifyFormat("int j = 7;\n"
7713 "for (int k = 0; k < N; ++k) {\n"
7714 "}\n"
7715 "int j = 2;\n"
7716 "int big = 10000;\n"
7717 "}",
7718 Alignment);
7719 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7720 verifyFormat("int i = 1;\n"
7721 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7722 " = someLooooooooooooooooongFunction();\n"
7723 "int j = 2;",
7724 Alignment);
7725 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7726 verifyFormat("int i = 1;\n"
7727 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7728 " someLooooooooooooooooongFunction();\n"
7729 "int j = 2;",
7730 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007731
7732 verifyFormat("auto lambda = []() {\n"
7733 " auto i = 0;\n"
7734 " return 0;\n"
7735 "};\n"
7736 "int i = 0;\n"
7737 "auto v = type{\n"
7738 " i = 1, //\n"
7739 " (i = 2), //\n"
7740 " i = 3 //\n"
7741 "};",
7742 Alignment);
7743
Daniel Jaspera44991332015-04-29 13:06:49 +00007744 verifyFormat(
7745 "int i = 1;\n"
7746 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7747 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007748 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00007749 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007750
7751 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7752 " typename B = very_long_type_name_1,\n"
7753 " typename T_2 = very_long_type_name_2>\n"
7754 "auto foo() {}\n",
7755 Alignment);
7756 verifyFormat("int a, b = 1;\n"
7757 "int c = 2;\n"
7758 "int dd = 3;\n",
7759 Alignment);
7760 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7761 "float b[1][] = {{3.f}};\n",
7762 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007763 verifyFormat("for (int i = 0; i < 1; i++)\n"
7764 " int x = 1;\n",
7765 Alignment);
7766 verifyFormat("for (i = 0; i < 1; i++)\n"
7767 " x = 1;\n"
7768 "y = 1;\n",
7769 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007770}
7771
Daniel Jaspere12597c2015-10-01 10:06:54 +00007772TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7773 FormatStyle Alignment = getLLVMStyle();
7774 Alignment.AlignConsecutiveDeclarations = false;
7775 verifyFormat("float const a = 5;\n"
7776 "int oneTwoThree = 123;",
7777 Alignment);
7778 verifyFormat("int a = 5;\n"
7779 "float const oneTwoThree = 123;",
7780 Alignment);
7781
7782 Alignment.AlignConsecutiveDeclarations = true;
7783 verifyFormat("float const a = 5;\n"
7784 "int oneTwoThree = 123;",
7785 Alignment);
7786 verifyFormat("int a = method();\n"
7787 "float const oneTwoThree = 133;",
7788 Alignment);
7789 verifyFormat("int i = 1, j = 10;\n"
7790 "something = 2000;",
7791 Alignment);
7792 verifyFormat("something = 2000;\n"
7793 "int i = 1, j = 10;\n",
7794 Alignment);
7795 verifyFormat("float something = 2000;\n"
7796 "double another = 911;\n"
7797 "int i = 1, j = 10;\n"
7798 "const int *oneMore = 1;\n"
7799 "unsigned i = 2;",
7800 Alignment);
7801 verifyFormat("float a = 5;\n"
7802 "int one = 1;\n"
7803 "method();\n"
7804 "const double oneTwoThree = 123;\n"
7805 "const unsigned int oneTwo = 12;",
7806 Alignment);
7807 verifyFormat("int oneTwoThree{0}; // comment\n"
7808 "unsigned oneTwo; // comment",
7809 Alignment);
7810 EXPECT_EQ("float const a = 5;\n"
7811 "\n"
7812 "int oneTwoThree = 123;",
7813 format("float const a = 5;\n"
7814 "\n"
7815 "int oneTwoThree= 123;",
7816 Alignment));
7817 EXPECT_EQ("float a = 5;\n"
7818 "int one = 1;\n"
7819 "\n"
7820 "unsigned oneTwoThree = 123;",
7821 format("float a = 5;\n"
7822 "int one = 1;\n"
7823 "\n"
7824 "unsigned oneTwoThree = 123;",
7825 Alignment));
7826 EXPECT_EQ("float a = 5;\n"
7827 "int one = 1;\n"
7828 "\n"
7829 "unsigned oneTwoThree = 123;\n"
7830 "int oneTwo = 12;",
7831 format("float a = 5;\n"
7832 "int one = 1;\n"
7833 "\n"
7834 "unsigned oneTwoThree = 123;\n"
7835 "int oneTwo = 12;",
7836 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007837 // Function prototype alignment
7838 verifyFormat("int a();\n"
7839 "double b();",
7840 Alignment);
7841 verifyFormat("int a(int x);\n"
7842 "double b();",
7843 Alignment);
7844 unsigned OldColumnLimit = Alignment.ColumnLimit;
7845 // We need to set ColumnLimit to zero, in order to stress nested alignments,
7846 // otherwise the function parameters will be re-flowed onto a single line.
7847 Alignment.ColumnLimit = 0;
7848 EXPECT_EQ("int a(int x,\n"
7849 " float y);\n"
7850 "double b(int x,\n"
7851 " double y);",
7852 format("int a(int x,\n"
7853 " float y);\n"
7854 "double b(int x,\n"
7855 " double y);",
7856 Alignment));
7857 // This ensures that function parameters of function declarations are
7858 // correctly indented when their owning functions are indented.
7859 // The failure case here is for 'double y' to not be indented enough.
7860 EXPECT_EQ("double a(int x);\n"
7861 "int b(int y,\n"
7862 " double z);",
7863 format("double a(int x);\n"
7864 "int b(int y,\n"
7865 " double z);",
7866 Alignment));
7867 // Set ColumnLimit low so that we induce wrapping immediately after
7868 // the function name and opening paren.
7869 Alignment.ColumnLimit = 13;
7870 verifyFormat("int function(\n"
7871 " int x,\n"
7872 " bool y);",
7873 Alignment);
7874 Alignment.ColumnLimit = OldColumnLimit;
7875 // Ensure function pointers don't screw up recursive alignment
7876 verifyFormat("int a(int x, void (*fp)(int y));\n"
7877 "double b();",
7878 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007879 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007880 // Ensure recursive alignment is broken by function braces, so that the
7881 // "a = 1" does not align with subsequent assignments inside the function
7882 // body.
7883 verifyFormat("int func(int a = 1) {\n"
7884 " int b = 2;\n"
7885 " int cc = 3;\n"
7886 "}",
7887 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007888 verifyFormat("float something = 2000;\n"
7889 "double another = 911;\n"
7890 "int i = 1, j = 10;\n"
7891 "const int *oneMore = 1;\n"
7892 "unsigned i = 2;",
7893 Alignment);
7894 verifyFormat("int oneTwoThree = {0}; // comment\n"
7895 "unsigned oneTwo = 0; // comment",
7896 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007897 // Make sure that scope is correctly tracked, in the absence of braces
7898 verifyFormat("for (int i = 0; i < n; i++)\n"
7899 " j = i;\n"
7900 "double x = 1;\n",
7901 Alignment);
7902 verifyFormat("if (int i = 0)\n"
7903 " j = i;\n"
7904 "double x = 1;\n",
7905 Alignment);
7906 // Ensure operator[] and operator() are comprehended
7907 verifyFormat("struct test {\n"
7908 " long long int foo();\n"
7909 " int operator[](int a);\n"
7910 " double bar();\n"
7911 "};\n",
7912 Alignment);
7913 verifyFormat("struct test {\n"
7914 " long long int foo();\n"
7915 " int operator()(int a);\n"
7916 " double bar();\n"
7917 "};\n",
7918 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007919 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7920 " int const i = 1;\n"
7921 " int * j = 2;\n"
7922 " int big = 10000;\n"
7923 "\n"
7924 " unsigned oneTwoThree = 123;\n"
7925 " int oneTwo = 12;\n"
7926 " method();\n"
7927 " float k = 2;\n"
7928 " int ll = 10000;\n"
7929 "}",
7930 format("void SomeFunction(int parameter= 0) {\n"
7931 " int const i= 1;\n"
7932 " int *j=2;\n"
7933 " int big = 10000;\n"
7934 "\n"
7935 "unsigned oneTwoThree =123;\n"
7936 "int oneTwo = 12;\n"
7937 " method();\n"
7938 "float k= 2;\n"
7939 "int ll=10000;\n"
7940 "}",
7941 Alignment));
7942 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007943 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
7944 verifyFormat("#define A \\\n"
7945 " int aaaa = 12; \\\n"
7946 " float b = 23; \\\n"
7947 " const int ccc = 234; \\\n"
7948 " unsigned dddddddddd = 2345;",
7949 Alignment);
7950 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007951 verifyFormat("#define A \\\n"
7952 " int aaaa = 12; \\\n"
7953 " float b = 23; \\\n"
7954 " const int ccc = 234; \\\n"
7955 " unsigned dddddddddd = 2345;",
7956 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007957 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007958 Alignment.ColumnLimit = 30;
7959 verifyFormat("#define A \\\n"
7960 " int aaaa = 12; \\\n"
7961 " float b = 23; \\\n"
7962 " const int ccc = 234; \\\n"
7963 " int dddddddddd = 2345;",
7964 Alignment);
7965 Alignment.ColumnLimit = 80;
7966 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7967 "k = 4, int l = 5,\n"
7968 " int m = 6) {\n"
7969 " const int j = 10;\n"
7970 " otherThing = 1;\n"
7971 "}",
7972 Alignment);
7973 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7974 " int const i = 1;\n"
7975 " int * j = 2;\n"
7976 " int big = 10000;\n"
7977 "}",
7978 Alignment);
7979 verifyFormat("class C {\n"
7980 "public:\n"
7981 " int i = 1;\n"
7982 " virtual void f() = 0;\n"
7983 "};",
7984 Alignment);
7985 verifyFormat("float i = 1;\n"
7986 "if (SomeType t = getSomething()) {\n"
7987 "}\n"
7988 "const unsigned j = 2;\n"
7989 "int big = 10000;",
7990 Alignment);
7991 verifyFormat("float j = 7;\n"
7992 "for (int k = 0; k < N; ++k) {\n"
7993 "}\n"
7994 "unsigned j = 2;\n"
7995 "int big = 10000;\n"
7996 "}",
7997 Alignment);
7998 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7999 verifyFormat("float i = 1;\n"
8000 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8001 " = someLooooooooooooooooongFunction();\n"
8002 "int j = 2;",
8003 Alignment);
8004 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8005 verifyFormat("int i = 1;\n"
8006 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8007 " someLooooooooooooooooongFunction();\n"
8008 "int j = 2;",
8009 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008010
8011 Alignment.AlignConsecutiveAssignments = true;
8012 verifyFormat("auto lambda = []() {\n"
8013 " auto ii = 0;\n"
8014 " float j = 0;\n"
8015 " return 0;\n"
8016 "};\n"
8017 "int i = 0;\n"
8018 "float i2 = 0;\n"
8019 "auto v = type{\n"
8020 " i = 1, //\n"
8021 " (i = 2), //\n"
8022 " i = 3 //\n"
8023 "};",
8024 Alignment);
8025 Alignment.AlignConsecutiveAssignments = false;
8026
Daniel Jaspere12597c2015-10-01 10:06:54 +00008027 verifyFormat(
8028 "int i = 1;\n"
8029 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8030 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008031 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008032 Alignment);
8033
8034 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8035 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008036 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008037 // happens.
8038 Alignment.AlignConsecutiveAssignments = true;
8039 Alignment.ColumnLimit = 30;
8040 verifyFormat("float ii = 1;\n"
8041 "unsigned j = 2;\n"
8042 "int someVerylongVariable = 1;\n"
8043 "AnotherLongType ll = 123456;\n"
8044 "VeryVeryLongType k = 2;\n"
8045 "int myvar = 1;",
8046 Alignment);
8047 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008048 Alignment.AlignConsecutiveAssignments = false;
8049
8050 verifyFormat(
8051 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8052 " typename LongType, typename B>\n"
8053 "auto foo() {}\n",
8054 Alignment);
8055 verifyFormat("float a, b = 1;\n"
8056 "int c = 2;\n"
8057 "int dd = 3;\n",
8058 Alignment);
8059 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8060 "float b[1][] = {{3.f}};\n",
8061 Alignment);
8062 Alignment.AlignConsecutiveAssignments = true;
8063 verifyFormat("float a, b = 1;\n"
8064 "int c = 2;\n"
8065 "int dd = 3;\n",
8066 Alignment);
8067 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8068 "float b[1][] = {{3.f}};\n",
8069 Alignment);
8070 Alignment.AlignConsecutiveAssignments = false;
8071
8072 Alignment.ColumnLimit = 30;
8073 Alignment.BinPackParameters = false;
8074 verifyFormat("void foo(float a,\n"
8075 " float b,\n"
8076 " int c,\n"
8077 " uint32_t *d) {\n"
8078 " int * e = 0;\n"
8079 " float f = 0;\n"
8080 " double g = 0;\n"
8081 "}\n"
8082 "void bar(ino_t a,\n"
8083 " int b,\n"
8084 " uint32_t *c,\n"
8085 " bool d) {}\n",
8086 Alignment);
8087 Alignment.BinPackParameters = true;
8088 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008089}
8090
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008091TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008092 FormatStyle LinuxBraceStyle = getLLVMStyle();
8093 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008094 verifyFormat("namespace a\n"
8095 "{\n"
8096 "class A\n"
8097 "{\n"
8098 " void f()\n"
8099 " {\n"
8100 " if (true) {\n"
8101 " a();\n"
8102 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008103 " } else {\n"
8104 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008105 " }\n"
8106 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008107 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008108 "};\n"
8109 "struct B {\n"
8110 " int x;\n"
8111 "};\n"
8112 "}\n",
8113 LinuxBraceStyle);
8114 verifyFormat("enum X {\n"
8115 " Y = 0,\n"
8116 "}\n",
8117 LinuxBraceStyle);
8118 verifyFormat("struct S {\n"
8119 " int Type;\n"
8120 " union {\n"
8121 " int x;\n"
8122 " double y;\n"
8123 " } Value;\n"
8124 " class C\n"
8125 " {\n"
8126 " MyFavoriteType Value;\n"
8127 " } Class;\n"
8128 "}\n",
8129 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008130}
8131
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008132TEST_F(FormatTest, MozillaBraceBreaking) {
8133 FormatStyle MozillaBraceStyle = getLLVMStyle();
8134 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008135 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008136 verifyFormat("namespace a {\n"
8137 "class A\n"
8138 "{\n"
8139 " void f()\n"
8140 " {\n"
8141 " if (true) {\n"
8142 " a();\n"
8143 " b();\n"
8144 " }\n"
8145 " }\n"
8146 " void g() { return; }\n"
8147 "};\n"
8148 "enum E\n"
8149 "{\n"
8150 " A,\n"
8151 " // foo\n"
8152 " B,\n"
8153 " C\n"
8154 "};\n"
8155 "struct B\n"
8156 "{\n"
8157 " int x;\n"
8158 "};\n"
8159 "}\n",
8160 MozillaBraceStyle);
8161 verifyFormat("struct S\n"
8162 "{\n"
8163 " int Type;\n"
8164 " union\n"
8165 " {\n"
8166 " int x;\n"
8167 " double y;\n"
8168 " } Value;\n"
8169 " class C\n"
8170 " {\n"
8171 " MyFavoriteType Value;\n"
8172 " } Class;\n"
8173 "}\n",
8174 MozillaBraceStyle);
8175}
8176
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008177TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008178 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8179 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008180 verifyFormat("namespace a {\n"
8181 "class A {\n"
8182 " void f()\n"
8183 " {\n"
8184 " if (true) {\n"
8185 " a();\n"
8186 " b();\n"
8187 " }\n"
8188 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008189 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008190 "};\n"
8191 "struct B {\n"
8192 " int x;\n"
8193 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008194 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008195 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008196
Daniel Jasperd9670872014-08-05 12:06:20 +00008197 verifyFormat("void foo()\n"
8198 "{\n"
8199 " if (a) {\n"
8200 " a();\n"
8201 " }\n"
8202 " else {\n"
8203 " b();\n"
8204 " }\n"
8205 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008206 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008207
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008208 verifyFormat("#ifdef _DEBUG\n"
8209 "int foo(int i = 0)\n"
8210 "#else\n"
8211 "int foo(int i = 5)\n"
8212 "#endif\n"
8213 "{\n"
8214 " return i;\n"
8215 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008216 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008217
8218 verifyFormat("void foo() {}\n"
8219 "void bar()\n"
8220 "#ifdef _DEBUG\n"
8221 "{\n"
8222 " foo();\n"
8223 "}\n"
8224 "#else\n"
8225 "{\n"
8226 "}\n"
8227 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008228 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008229
8230 verifyFormat("void foobar() { int i = 5; }\n"
8231 "#ifdef _DEBUG\n"
8232 "void bar() {}\n"
8233 "#else\n"
8234 "void bar() { foobar(); }\n"
8235 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008236 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008237}
8238
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008239TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008240 FormatStyle AllmanBraceStyle = getLLVMStyle();
8241 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008242 verifyFormat("namespace a\n"
8243 "{\n"
8244 "class A\n"
8245 "{\n"
8246 " void f()\n"
8247 " {\n"
8248 " if (true)\n"
8249 " {\n"
8250 " a();\n"
8251 " b();\n"
8252 " }\n"
8253 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008254 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008255 "};\n"
8256 "struct B\n"
8257 "{\n"
8258 " int x;\n"
8259 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008260 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008261 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008262
8263 verifyFormat("void f()\n"
8264 "{\n"
8265 " if (true)\n"
8266 " {\n"
8267 " a();\n"
8268 " }\n"
8269 " else if (false)\n"
8270 " {\n"
8271 " b();\n"
8272 " }\n"
8273 " else\n"
8274 " {\n"
8275 " c();\n"
8276 " }\n"
8277 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008278 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008279
8280 verifyFormat("void f()\n"
8281 "{\n"
8282 " for (int i = 0; i < 10; ++i)\n"
8283 " {\n"
8284 " a();\n"
8285 " }\n"
8286 " while (false)\n"
8287 " {\n"
8288 " b();\n"
8289 " }\n"
8290 " do\n"
8291 " {\n"
8292 " c();\n"
8293 " } while (false)\n"
8294 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008295 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008296
8297 verifyFormat("void f(int a)\n"
8298 "{\n"
8299 " switch (a)\n"
8300 " {\n"
8301 " case 0:\n"
8302 " break;\n"
8303 " case 1:\n"
8304 " {\n"
8305 " break;\n"
8306 " }\n"
8307 " case 2:\n"
8308 " {\n"
8309 " }\n"
8310 " break;\n"
8311 " default:\n"
8312 " break;\n"
8313 " }\n"
8314 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008315 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008316
8317 verifyFormat("enum X\n"
8318 "{\n"
8319 " Y = 0,\n"
8320 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008321 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008322 verifyFormat("enum X\n"
8323 "{\n"
8324 " Y = 0\n"
8325 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008326 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008327
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008328 verifyFormat("@interface BSApplicationController ()\n"
8329 "{\n"
8330 "@private\n"
8331 " id _extraIvar;\n"
8332 "}\n"
8333 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008334 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008335
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008336 verifyFormat("#ifdef _DEBUG\n"
8337 "int foo(int i = 0)\n"
8338 "#else\n"
8339 "int foo(int i = 5)\n"
8340 "#endif\n"
8341 "{\n"
8342 " return i;\n"
8343 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008344 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008345
8346 verifyFormat("void foo() {}\n"
8347 "void bar()\n"
8348 "#ifdef _DEBUG\n"
8349 "{\n"
8350 " foo();\n"
8351 "}\n"
8352 "#else\n"
8353 "{\n"
8354 "}\n"
8355 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008356 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008357
8358 verifyFormat("void foobar() { int i = 5; }\n"
8359 "#ifdef _DEBUG\n"
8360 "void bar() {}\n"
8361 "#else\n"
8362 "void bar() { foobar(); }\n"
8363 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008364 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008365
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008366 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008367 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008368 " // ...\n"
8369 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008370 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008371 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008372 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008373 " // ...\n"
8374 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008375 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008376 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008377 // .. or dict literals.
8378 verifyFormat("void f()\n"
8379 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008380 " // ...\n"
8381 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
8382 "}",
8383 AllmanBraceStyle);
8384 verifyFormat("void f()\n"
8385 "{\n"
8386 " // ...\n"
8387 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008388 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008389 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008390 verifyFormat("int f()\n"
8391 "{ // comment\n"
8392 " return 42;\n"
8393 "}",
8394 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008395
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008396 AllmanBraceStyle.ColumnLimit = 19;
8397 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8398 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008399 verifyFormat("void f()\n"
8400 "{\n"
8401 " int i;\n"
8402 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008403 AllmanBraceStyle);
8404 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008405
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008406 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008407 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8408 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8409 verifyFormat("void f(bool b)\n"
8410 "{\n"
8411 " if (b)\n"
8412 " {\n"
8413 " return;\n"
8414 " }\n"
8415 "}\n",
8416 BreakBeforeBraceShortIfs);
8417 verifyFormat("void f(bool b)\n"
8418 "{\n"
8419 " if (b) return;\n"
8420 "}\n",
8421 BreakBeforeBraceShortIfs);
8422 verifyFormat("void f(bool b)\n"
8423 "{\n"
8424 " while (b)\n"
8425 " {\n"
8426 " return;\n"
8427 " }\n"
8428 "}\n",
8429 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008430}
8431
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008432TEST_F(FormatTest, GNUBraceBreaking) {
8433 FormatStyle GNUBraceStyle = getLLVMStyle();
8434 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8435 verifyFormat("namespace a\n"
8436 "{\n"
8437 "class A\n"
8438 "{\n"
8439 " void f()\n"
8440 " {\n"
8441 " int a;\n"
8442 " {\n"
8443 " int b;\n"
8444 " }\n"
8445 " if (true)\n"
8446 " {\n"
8447 " a();\n"
8448 " b();\n"
8449 " }\n"
8450 " }\n"
8451 " void g() { return; }\n"
8452 "}\n"
8453 "}",
8454 GNUBraceStyle);
8455
8456 verifyFormat("void f()\n"
8457 "{\n"
8458 " if (true)\n"
8459 " {\n"
8460 " a();\n"
8461 " }\n"
8462 " else if (false)\n"
8463 " {\n"
8464 " b();\n"
8465 " }\n"
8466 " else\n"
8467 " {\n"
8468 " c();\n"
8469 " }\n"
8470 "}\n",
8471 GNUBraceStyle);
8472
8473 verifyFormat("void f()\n"
8474 "{\n"
8475 " for (int i = 0; i < 10; ++i)\n"
8476 " {\n"
8477 " a();\n"
8478 " }\n"
8479 " while (false)\n"
8480 " {\n"
8481 " b();\n"
8482 " }\n"
8483 " do\n"
8484 " {\n"
8485 " c();\n"
8486 " }\n"
8487 " while (false);\n"
8488 "}\n",
8489 GNUBraceStyle);
8490
8491 verifyFormat("void f(int a)\n"
8492 "{\n"
8493 " switch (a)\n"
8494 " {\n"
8495 " case 0:\n"
8496 " break;\n"
8497 " case 1:\n"
8498 " {\n"
8499 " break;\n"
8500 " }\n"
8501 " case 2:\n"
8502 " {\n"
8503 " }\n"
8504 " break;\n"
8505 " default:\n"
8506 " break;\n"
8507 " }\n"
8508 "}\n",
8509 GNUBraceStyle);
8510
8511 verifyFormat("enum X\n"
8512 "{\n"
8513 " Y = 0,\n"
8514 "}\n",
8515 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008516
8517 verifyFormat("@interface BSApplicationController ()\n"
8518 "{\n"
8519 "@private\n"
8520 " id _extraIvar;\n"
8521 "}\n"
8522 "@end\n",
8523 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008524
8525 verifyFormat("#ifdef _DEBUG\n"
8526 "int foo(int i = 0)\n"
8527 "#else\n"
8528 "int foo(int i = 5)\n"
8529 "#endif\n"
8530 "{\n"
8531 " return i;\n"
8532 "}",
8533 GNUBraceStyle);
8534
8535 verifyFormat("void foo() {}\n"
8536 "void bar()\n"
8537 "#ifdef _DEBUG\n"
8538 "{\n"
8539 " foo();\n"
8540 "}\n"
8541 "#else\n"
8542 "{\n"
8543 "}\n"
8544 "#endif",
8545 GNUBraceStyle);
8546
8547 verifyFormat("void foobar() { int i = 5; }\n"
8548 "#ifdef _DEBUG\n"
8549 "void bar() {}\n"
8550 "#else\n"
8551 "void bar() { foobar(); }\n"
8552 "#endif",
8553 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008554}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008555
8556TEST_F(FormatTest, WebKitBraceBreaking) {
8557 FormatStyle WebKitBraceStyle = getLLVMStyle();
8558 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008559 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008560 verifyFormat("namespace a {\n"
8561 "class A {\n"
8562 " void f()\n"
8563 " {\n"
8564 " if (true) {\n"
8565 " a();\n"
8566 " b();\n"
8567 " }\n"
8568 " }\n"
8569 " void g() { return; }\n"
8570 "};\n"
8571 "enum E {\n"
8572 " A,\n"
8573 " // foo\n"
8574 " B,\n"
8575 " C\n"
8576 "};\n"
8577 "struct B {\n"
8578 " int x;\n"
8579 "};\n"
8580 "}\n",
8581 WebKitBraceStyle);
8582 verifyFormat("struct S {\n"
8583 " int Type;\n"
8584 " union {\n"
8585 " int x;\n"
8586 " double y;\n"
8587 " } Value;\n"
8588 " class C {\n"
8589 " MyFavoriteType Value;\n"
8590 " } Class;\n"
8591 "};\n",
8592 WebKitBraceStyle);
8593}
8594
Manuel Klimekd5735502013-08-12 03:51:17 +00008595TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8596 verifyFormat("void f() {\n"
8597 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008598 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008599 " }\n"
8600 "}\n",
8601 getLLVMStyle());
8602}
8603
Daniel Jasper9613c812013-08-07 16:29:23 +00008604TEST_F(FormatTest, UnderstandsPragmas) {
8605 verifyFormat("#pragma omp reduction(| : var)");
8606 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008607
8608 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8609 "(including parentheses).",
8610 format("#pragma mark Any non-hyphenated or hyphenated string "
8611 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008612}
8613
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008614TEST_F(FormatTest, UnderstandPragmaOption) {
8615 verifyFormat("#pragma option -C -A");
8616
8617 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8618}
8619
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008620#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8621 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008622 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8623 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008624
8625TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008626 SmallVector<FormatStyle, 3> Styles;
8627 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008628
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008629 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008630 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8631 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8632 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008633
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008634 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008635 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8636 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8637 EXPECT_ALL_STYLES_EQUAL(Styles);
8638
Nico Weber514ecc82014-02-02 20:50:45 +00008639 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008640 EXPECT_TRUE(
8641 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8642 EXPECT_TRUE(
8643 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8644 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008645
Nico Weber514ecc82014-02-02 20:50:45 +00008646 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008647 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8648 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8649 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008650
8651 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008652 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8653 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8654 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008655
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008656 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008657 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8658 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8659 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008660
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008661 Styles[0] = getGNUStyle();
8662 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8663 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8664 EXPECT_ALL_STYLES_EQUAL(Styles);
8665
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008666 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8667}
8668
8669TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8670 SmallVector<FormatStyle, 8> Styles;
8671 Styles.resize(2);
8672
8673 Styles[0] = getGoogleStyle();
8674 Styles[1] = getLLVMStyle();
8675 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8676 EXPECT_ALL_STYLES_EQUAL(Styles);
8677
8678 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008679 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008680 Styles[1] = getLLVMStyle();
8681 Styles[1].Language = FormatStyle::LK_JavaScript;
8682 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8683
8684 Styles[2] = getLLVMStyle();
8685 Styles[2].Language = FormatStyle::LK_JavaScript;
8686 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8687 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008688 &Styles[2])
8689 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008690
8691 Styles[3] = getLLVMStyle();
8692 Styles[3].Language = FormatStyle::LK_JavaScript;
8693 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8694 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008695 &Styles[3])
8696 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008697
8698 Styles[4] = getLLVMStyle();
8699 Styles[4].Language = FormatStyle::LK_JavaScript;
8700 EXPECT_EQ(0, parseConfiguration("---\n"
8701 "BasedOnStyle: LLVM\n"
8702 "IndentWidth: 123\n"
8703 "---\n"
8704 "BasedOnStyle: Google\n"
8705 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008706 &Styles[4])
8707 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008708 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008709}
8710
Daniel Jasper91881d92014-09-29 08:07:46 +00008711#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008712 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008713 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008714 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008715 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008716 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008717
Daniel Jasper91881d92014-09-29 08:07:46 +00008718#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8719
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008720#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8721 Style.STRUCT.FIELD = false; \
8722 EXPECT_EQ(0, \
8723 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8724 .value()); \
8725 EXPECT_TRUE(Style.STRUCT.FIELD); \
8726 EXPECT_EQ(0, \
8727 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8728 .value()); \
8729 EXPECT_FALSE(Style.STRUCT.FIELD);
8730
8731#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8732 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8733
Daniel Jasper00853002014-09-16 16:22:30 +00008734#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8735 EXPECT_NE(VALUE, Style.FIELD); \
8736 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8737 EXPECT_EQ(VALUE, Style.FIELD)
8738
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008739TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008740 FormatStyle Style = {};
8741 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00008742 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008743 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008744 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008745 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008746 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008747 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008748 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008749 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008750 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008751 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008752 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008753 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008754 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008755 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008756 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008757 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00008758 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Alexander Kornienkod6538332013-05-07 15:32:14 +00008759 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008760 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008761 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008762 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008763 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008764 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008765 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008766 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008767 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008768 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008769 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008770 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008771 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008772 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008773 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008774 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008775 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008776 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008777 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008778 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008779 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008780
8781 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8782 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8783 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8784 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8785 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8786 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8787 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8788 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8789 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8790 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8791 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008792}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008793
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008794#undef CHECK_PARSE_BOOL
8795
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008796TEST_F(FormatTest, ParsesConfiguration) {
8797 FormatStyle Style = {};
8798 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008799 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008800 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8801 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008802 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008803 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8804 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008805 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8806 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008807 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8808 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8809 PenaltyReturnTypeOnItsOwnLine, 1234u);
8810 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8811 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008812 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008813 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008814 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008815
Daniel Jasper553d4872014-06-17 12:40:34 +00008816 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008817 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8818 FormatStyle::PAS_Left);
8819 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8820 FormatStyle::PAS_Right);
8821 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8822 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008823 // For backward compatibility:
8824 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8825 FormatStyle::PAS_Left);
8826 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8827 FormatStyle::PAS_Right);
8828 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8829 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008830
Alexander Kornienkod6538332013-05-07 15:32:14 +00008831 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008832 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8833 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008834 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8835 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8836 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8837
Daniel Jasperac043c92014-09-15 11:11:00 +00008838 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008839 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8840 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008841 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8842 FormatStyle::BOS_None);
8843 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8844 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008845 // For backward compatibility:
8846 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8847 FormatStyle::BOS_None);
8848 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8849 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008850
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008851 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8852 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8853 FormatStyle::BAS_Align);
8854 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8855 FormatStyle::BAS_DontAlign);
8856 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8857 FormatStyle::BAS_AlwaysBreak);
8858 // For backward compatibility:
8859 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8860 FormatStyle::BAS_DontAlign);
8861 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8862 FormatStyle::BAS_Align);
8863
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008864 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8865 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
8866 FormatStyle::ENAS_DontAlign);
8867 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
8868 FormatStyle::ENAS_Left);
8869 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
8870 FormatStyle::ENAS_Right);
8871 // For backward compatibility:
8872 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
8873 FormatStyle::ENAS_Left);
8874 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
8875 FormatStyle::ENAS_Right);
8876
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008877 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008878 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8879 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8880 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008881 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8882 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008883 // For backward compatibility:
8884 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8885 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008886
Daniel Jasperd74cf402014-04-08 12:46:38 +00008887 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008888 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8889 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8890 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8891 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008892 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8893 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008894 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8895 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008896 // For backward compatibility:
8897 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8898 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8899 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8900 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008901
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008902 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8903 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8904 FormatStyle::SBPO_Never);
8905 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8906 FormatStyle::SBPO_Always);
8907 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8908 FormatStyle::SBPO_ControlStatements);
8909 // For backward compatibility:
8910 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8911 FormatStyle::SBPO_Never);
8912 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8913 FormatStyle::SBPO_ControlStatements);
8914
Alexander Kornienkod6538332013-05-07 15:32:14 +00008915 Style.ColumnLimit = 123;
8916 FormatStyle BaseStyle = getLLVMStyle();
8917 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8918 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8919
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008920 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8921 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8922 FormatStyle::BS_Attach);
8923 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8924 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008925 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8926 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008927 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8928 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008929 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8930 FormatStyle::BS_Allman);
8931 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008932 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8933 FormatStyle::BS_WebKit);
8934 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8935 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008936
Zachary Turner448592e2015-12-18 22:20:15 +00008937 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8938 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8939 FormatStyle::RTBS_None);
8940 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8941 FormatStyle::RTBS_All);
8942 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008943 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008944 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8945 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8946 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8947 AlwaysBreakAfterReturnType,
8948 FormatStyle::RTBS_TopLevelDefinitions);
8949
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008950 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8951 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8952 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8953 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8954 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8955 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8956 AlwaysBreakAfterDefinitionReturnType,
8957 FormatStyle::DRTBS_TopLevel);
8958
Daniel Jasper65ee3472013-07-31 23:16:02 +00008959 Style.NamespaceIndentation = FormatStyle::NI_All;
8960 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8961 FormatStyle::NI_None);
8962 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8963 FormatStyle::NI_Inner);
8964 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8965 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008966
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008967 // FIXME: This is required because parsing a configuration simply overwrites
8968 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008969 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008970 std::vector<std::string> BoostForeach;
8971 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008972 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008973 std::vector<std::string> BoostAndQForeach;
8974 BoostAndQForeach.push_back("BOOST_FOREACH");
8975 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008976 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8977 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008978
8979 Style.IncludeCategories.clear();
8980 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8981 {".*", 1}};
8982 CHECK_PARSE("IncludeCategories:\n"
8983 " - Regex: abc/.*\n"
8984 " Priority: 2\n"
8985 " - Regex: .*\n"
8986 " Priority: 1",
8987 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008988 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008989}
8990
8991TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8992 FormatStyle Style = {};
8993 Style.Language = FormatStyle::LK_Cpp;
8994 CHECK_PARSE("Language: Cpp\n"
8995 "IndentWidth: 12",
8996 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008997 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8998 "IndentWidth: 34",
8999 &Style),
9000 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009001 EXPECT_EQ(12u, Style.IndentWidth);
9002 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9003 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9004
9005 Style.Language = FormatStyle::LK_JavaScript;
9006 CHECK_PARSE("Language: JavaScript\n"
9007 "IndentWidth: 12",
9008 IndentWidth, 12u);
9009 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009010 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9011 "IndentWidth: 34",
9012 &Style),
9013 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009014 EXPECT_EQ(23u, Style.IndentWidth);
9015 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9016 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9017
9018 CHECK_PARSE("BasedOnStyle: LLVM\n"
9019 "IndentWidth: 67",
9020 IndentWidth, 67u);
9021
9022 CHECK_PARSE("---\n"
9023 "Language: JavaScript\n"
9024 "IndentWidth: 12\n"
9025 "---\n"
9026 "Language: Cpp\n"
9027 "IndentWidth: 34\n"
9028 "...\n",
9029 IndentWidth, 12u);
9030
9031 Style.Language = FormatStyle::LK_Cpp;
9032 CHECK_PARSE("---\n"
9033 "Language: JavaScript\n"
9034 "IndentWidth: 12\n"
9035 "---\n"
9036 "Language: Cpp\n"
9037 "IndentWidth: 34\n"
9038 "...\n",
9039 IndentWidth, 34u);
9040 CHECK_PARSE("---\n"
9041 "IndentWidth: 78\n"
9042 "---\n"
9043 "Language: JavaScript\n"
9044 "IndentWidth: 56\n"
9045 "...\n",
9046 IndentWidth, 78u);
9047
9048 Style.ColumnLimit = 123;
9049 Style.IndentWidth = 234;
9050 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9051 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009052 EXPECT_FALSE(parseConfiguration("---\n"
9053 "IndentWidth: 456\n"
9054 "BreakBeforeBraces: Allman\n"
9055 "---\n"
9056 "Language: JavaScript\n"
9057 "IndentWidth: 111\n"
9058 "TabWidth: 111\n"
9059 "---\n"
9060 "Language: Cpp\n"
9061 "BreakBeforeBraces: Stroustrup\n"
9062 "TabWidth: 789\n"
9063 "...\n",
9064 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009065 EXPECT_EQ(123u, Style.ColumnLimit);
9066 EXPECT_EQ(456u, Style.IndentWidth);
9067 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9068 EXPECT_EQ(789u, Style.TabWidth);
9069
Rafael Espindola1f243172014-06-12 11:35:17 +00009070 EXPECT_EQ(parseConfiguration("---\n"
9071 "Language: JavaScript\n"
9072 "IndentWidth: 56\n"
9073 "---\n"
9074 "IndentWidth: 78\n"
9075 "...\n",
9076 &Style),
9077 ParseError::Error);
9078 EXPECT_EQ(parseConfiguration("---\n"
9079 "Language: JavaScript\n"
9080 "IndentWidth: 56\n"
9081 "---\n"
9082 "Language: JavaScript\n"
9083 "IndentWidth: 78\n"
9084 "...\n",
9085 &Style),
9086 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009087
9088 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9089}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009090
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009091#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009092
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009093TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9094 FormatStyle Style = {};
9095 Style.Language = FormatStyle::LK_JavaScript;
9096 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009097 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009098 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009099
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009100 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009101 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009102 "BasedOnStyle: Google\n"
9103 "---\n"
9104 "Language: JavaScript\n"
9105 "IndentWidth: 76\n"
9106 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009107 &Style)
9108 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009109 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009110 EXPECT_EQ(76u, Style.IndentWidth);
9111 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9112}
9113
Alexander Kornienkod6538332013-05-07 15:32:14 +00009114TEST_F(FormatTest, ConfigurationRoundTripTest) {
9115 FormatStyle Style = getLLVMStyle();
9116 std::string YAML = configurationAsText(Style);
9117 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009118 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009119 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9120 EXPECT_EQ(Style, ParsedStyle);
9121}
9122
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009123TEST_F(FormatTest, WorksFor8bitEncodings) {
9124 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9125 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9126 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9127 "\"\xef\xee\xf0\xf3...\"",
9128 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9129 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9130 "\xef\xee\xf0\xf3...\"",
9131 getLLVMStyleWithColumns(12)));
9132}
9133
Alexander Kornienko393e3082013-11-13 14:04:17 +00009134TEST_F(FormatTest, HandlesUTF8BOM) {
9135 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9136 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9137 format("\xef\xbb\xbf#include <iostream>"));
9138 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9139 format("\xef\xbb\xbf\n#include <iostream>"));
9140}
9141
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009142// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9143#if !defined(_MSC_VER)
9144
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009145TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9146 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9147 getLLVMStyleWithColumns(35));
9148 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009149 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009150 verifyFormat("// Однажды в студёную зимнюю пору...",
9151 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009152 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009153 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9154 getLLVMStyleWithColumns(39));
9155 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009156 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009157}
9158
9159TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009160 // Non-printable characters' width is currently considered to be the length in
9161 // bytes in UTF8. The characters can be displayed in very different manner
9162 // (zero-width, single width with a substitution glyph, expanded to their code
9163 // (e.g. "<8d>"), so there's no single correct way to handle them.
9164 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009165 "\"\xc2\x8d\";",
9166 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009167 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009168 "\"\xc2\x8d\";",
9169 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009170 EXPECT_EQ("\"Однажды, в \"\n"
9171 "\"студёную \"\n"
9172 "\"зимнюю \"\n"
9173 "\"пору,\"",
9174 format("\"Однажды, в студёную зимнюю пору,\"",
9175 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009176 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009177 "\"一 二 三 \"\n"
9178 "\"四 五六 \"\n"
9179 "\"七 八 九 \"\n"
9180 "\"十\"",
9181 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009182 EXPECT_EQ("\"一\t二 \"\n"
9183 "\"\t三 \"\n"
9184 "\"四 五\t六 \"\n"
9185 "\"\t七 \"\n"
9186 "\"八九十\tqq\"",
9187 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9188 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009189
9190 // UTF8 character in an escape sequence.
9191 EXPECT_EQ("\"aaaaaa\"\n"
9192 "\"\\\xC2\x8D\"",
9193 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009194}
9195
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009196TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9197 EXPECT_EQ("const char *sssss =\n"
9198 " \"一二三四五六七八\\\n"
9199 " 九 十\";",
9200 format("const char *sssss = \"一二三四五六七八\\\n"
9201 " 九 十\";",
9202 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009203}
9204
9205TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009206 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9207 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009208 EXPECT_EQ("// Я из лесу\n"
9209 "// вышел; был\n"
9210 "// сильный\n"
9211 "// мороз.",
9212 format("// Я из лесу вышел; был сильный мороз.",
9213 getLLVMStyleWithColumns(13)));
9214 EXPECT_EQ("// 一二三\n"
9215 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009216 "// 八 九\n"
9217 "// 十",
9218 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009219}
9220
9221TEST_F(FormatTest, SplitsUTF8BlockComments) {
9222 EXPECT_EQ("/* Гляжу,\n"
9223 " * поднимается\n"
9224 " * медленно в\n"
9225 " * гору\n"
9226 " * Лошадка,\n"
9227 " * везущая\n"
9228 " * хворосту\n"
9229 " * воз. */",
9230 format("/* Гляжу, поднимается медленно в гору\n"
9231 " * Лошадка, везущая хворосту воз. */",
9232 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009233 EXPECT_EQ(
9234 "/* 一二三\n"
9235 " * 四五六七\n"
9236 " * 八 九\n"
9237 " * 十 */",
9238 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009239 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9240 " * 𝕓𝕪𝕥𝕖\n"
9241 " * 𝖀𝕿𝕱-𝟠 */",
9242 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009243}
9244
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009245#endif // _MSC_VER
9246
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009247TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9248 FormatStyle Style = getLLVMStyle();
9249
9250 Style.ConstructorInitializerIndentWidth = 4;
9251 verifyFormat(
9252 "SomeClass::Constructor()\n"
9253 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9254 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9255 Style);
9256
9257 Style.ConstructorInitializerIndentWidth = 2;
9258 verifyFormat(
9259 "SomeClass::Constructor()\n"
9260 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9261 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9262 Style);
9263
9264 Style.ConstructorInitializerIndentWidth = 0;
9265 verifyFormat(
9266 "SomeClass::Constructor()\n"
9267 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9268 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9269 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009270 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9271 verifyFormat(
9272 "SomeLongTemplateVariableName<\n"
9273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9274 Style);
9275 verifyFormat(
9276 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9278 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009279}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009280
Daniel Jasper00853002014-09-16 16:22:30 +00009281TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9282 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009283 Style.BreakConstructorInitializersBeforeComma = true;
9284 Style.ConstructorInitializerIndentWidth = 4;
9285 verifyFormat("SomeClass::Constructor()\n"
9286 " : a(a)\n"
9287 " , b(b)\n"
9288 " , c(c) {}",
9289 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009290 verifyFormat("SomeClass::Constructor()\n"
9291 " : a(a) {}",
9292 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009293
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009294 Style.ColumnLimit = 0;
9295 verifyFormat("SomeClass::Constructor()\n"
9296 " : a(a) {}",
9297 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009298 verifyFormat("SomeClass::Constructor() noexcept\n"
9299 " : a(a) {}",
9300 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009301 verifyFormat("SomeClass::Constructor()\n"
9302 " : a(a)\n"
9303 " , b(b)\n"
9304 " , c(c) {}",
9305 Style);
9306 verifyFormat("SomeClass::Constructor()\n"
9307 " : a(a) {\n"
9308 " foo();\n"
9309 " bar();\n"
9310 "}",
9311 Style);
9312
Daniel Jasperd74cf402014-04-08 12:46:38 +00009313 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009314 verifyFormat("SomeClass::Constructor()\n"
9315 " : a(a)\n"
9316 " , b(b)\n"
9317 " , c(c) {\n}",
9318 Style);
9319 verifyFormat("SomeClass::Constructor()\n"
9320 " : a(a) {\n}",
9321 Style);
9322
9323 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009324 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009325 Style.ConstructorInitializerIndentWidth = 2;
9326 verifyFormat("SomeClass::Constructor()\n"
9327 " : a(a)\n"
9328 " , b(b)\n"
9329 " , c(c) {}",
9330 Style);
9331
9332 Style.ConstructorInitializerIndentWidth = 0;
9333 verifyFormat("SomeClass::Constructor()\n"
9334 ": a(a)\n"
9335 ", b(b)\n"
9336 ", c(c) {}",
9337 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009338
9339 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9340 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009341 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9342 verifyFormat(
9343 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9344 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009345 verifyFormat(
9346 "SomeClass::Constructor()\n"
9347 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9348 Style);
9349 Style.ConstructorInitializerIndentWidth = 4;
9350 Style.ColumnLimit = 60;
9351 verifyFormat("SomeClass::Constructor()\n"
9352 " : aaaaaaaa(aaaaaaaa)\n"
9353 " , aaaaaaaa(aaaaaaaa)\n"
9354 " , aaaaaaaa(aaaaaaaa) {}",
9355 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009356}
9357
Daniel Jasper38efc132014-10-21 07:51:54 +00009358TEST_F(FormatTest, Destructors) {
9359 verifyFormat("void F(int &i) { i.~int(); }");
9360 verifyFormat("void F(int &i) { i->~int(); }");
9361}
9362
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009363TEST_F(FormatTest, FormatsWithWebKitStyle) {
9364 FormatStyle Style = getWebKitStyle();
9365
9366 // Don't indent in outer namespaces.
9367 verifyFormat("namespace outer {\n"
9368 "int i;\n"
9369 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009370 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009371 "} // namespace inner\n"
9372 "} // namespace outer\n"
9373 "namespace other_outer {\n"
9374 "int i;\n"
9375 "}",
9376 Style);
9377
9378 // Don't indent case labels.
9379 verifyFormat("switch (variable) {\n"
9380 "case 1:\n"
9381 "case 2:\n"
9382 " doSomething();\n"
9383 " break;\n"
9384 "default:\n"
9385 " ++variable;\n"
9386 "}",
9387 Style);
9388
9389 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009390 EXPECT_EQ("void f()\n"
9391 "{\n"
9392 " if (aaaaaaaaaaaaaaaa\n"
9393 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9394 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9395 " return;\n"
9396 "}",
9397 format("void f() {\n"
9398 "if (aaaaaaaaaaaaaaaa\n"
9399 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9400 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9401 "return;\n"
9402 "}",
9403 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009404
Daniel Jasper35995672014-04-29 14:05:20 +00009405 // Allow functions on a single line.
9406 verifyFormat("void f() { return; }", Style);
9407
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009408 // Constructor initializers are formatted one per line with the "," on the
9409 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009410 verifyFormat("Constructor()\n"
9411 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9412 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009413 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009414 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9415 "{\n"
9416 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009417 Style);
9418 verifyFormat("SomeClass::Constructor()\n"
9419 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009420 "{\n"
9421 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009422 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009423 EXPECT_EQ("SomeClass::Constructor()\n"
9424 " : a(a)\n"
9425 "{\n"
9426 "}",
9427 format("SomeClass::Constructor():a(a){}", Style));
9428 verifyFormat("SomeClass::Constructor()\n"
9429 " : a(a)\n"
9430 " , b(b)\n"
9431 " , c(c)\n"
9432 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009433 "}",
9434 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009435 verifyFormat("SomeClass::Constructor()\n"
9436 " : a(a)\n"
9437 "{\n"
9438 " foo();\n"
9439 " bar();\n"
9440 "}",
9441 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009442
Daniel Jasper65ee3472013-07-31 23:16:02 +00009443 // Access specifiers should be aligned left.
9444 verifyFormat("class C {\n"
9445 "public:\n"
9446 " int i;\n"
9447 "};",
9448 Style);
9449
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009450 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009451 verifyFormat("int a; // Do not\n"
9452 "double b; // align comments.",
9453 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009454
Daniel Jasper3219e432014-12-02 13:24:51 +00009455 // Do not align operands.
9456 EXPECT_EQ("ASSERT(aaaa\n"
9457 " || bbbb);",
9458 format("ASSERT ( aaaa\n||bbbb);", Style));
9459
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009460 // Accept input's line breaks.
9461 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9462 " || bbbbbbbbbbbbbbb) {\n"
9463 " i++;\n"
9464 "}",
9465 format("if (aaaaaaaaaaaaaaa\n"
9466 "|| bbbbbbbbbbbbbbb) { i++; }",
9467 Style));
9468 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9469 " i++;\n"
9470 "}",
9471 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009472
9473 // Don't automatically break all macro definitions (llvm.org/PR17842).
9474 verifyFormat("#define aNumber 10", Style);
9475 // However, generally keep the line breaks that the user authored.
9476 EXPECT_EQ("#define aNumber \\\n"
9477 " 10",
9478 format("#define aNumber \\\n"
9479 " 10",
9480 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009481
9482 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009483 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9484 " copyItems:YES];",
9485 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9486 "copyItems:YES];",
9487 Style));
9488 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9489 " copyItems:YES];",
9490 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9491 " copyItems:YES];",
9492 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009493 // FIXME: This does not seem right, there should be more indentation before
9494 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009495 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009496 " @\"a\",\n"
9497 " @\"a\"\n"
9498 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009499 " copyItems:YES];",
9500 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9501 " @\"a\",\n"
9502 " @\"a\"\n"
9503 " ]\n"
9504 " copyItems:YES];",
9505 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009506 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009507 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9508 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009509 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9510 " copyItems:YES];",
9511 Style));
9512
9513 verifyFormat("[self.a b:c c:d];", Style);
9514 EXPECT_EQ("[self.a b:c\n"
9515 " c:d];",
9516 format("[self.a b:c\n"
9517 "c:d];",
9518 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009519}
9520
Manuel Klimekffdeb592013-09-03 15:10:01 +00009521TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009522 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9523 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9524 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9525 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9526 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009527 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009528 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009529 verifyFormat("void f() {\n"
9530 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9531 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009532 verifyFormat("void f() {\n"
9533 " other(x.begin(), //\n"
9534 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009535 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009536 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009537 verifyFormat("SomeFunction([]() { // A cool function...\n"
9538 " return 43;\n"
9539 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009540 EXPECT_EQ("SomeFunction([]() {\n"
9541 "#define A a\n"
9542 " return 43;\n"
9543 "});",
9544 format("SomeFunction([](){\n"
9545 "#define A a\n"
9546 "return 43;\n"
9547 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009548 verifyFormat("void f() {\n"
9549 " SomeFunction([](decltype(x), A *a) {});\n"
9550 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009551 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9552 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009553 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9554 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9555 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009556 verifyFormat("Constructor()\n"
9557 " : Field([] { // comment\n"
9558 " int i;\n"
9559 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009560 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9561 " return some_parameter.size();\n"
9562 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009563 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9564 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009565 verifyFormat("int i = aaaaaa ? 1 //\n"
9566 " : [] {\n"
9567 " return 2; //\n"
9568 " }();");
9569 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9570 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9571 " return x == 2; // force break\n"
9572 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009573 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9574 " [=](int iiiiiiiiiiii) {\n"
9575 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
9576 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
9577 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009578 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009579 verifyFormat("SomeFunction({[&] {\n"
9580 " // comment\n"
9581 " },\n"
9582 " [&] {\n"
9583 " // comment\n"
9584 " }});");
9585 verifyFormat("SomeFunction({[&] {\n"
9586 " // comment\n"
9587 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009588 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9589 " [&]() { return true; },\n"
9590 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009591
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009592 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009593 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009594 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009595 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9596 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009597 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009598 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009599 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9600 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009601 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009602 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9603 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009604 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009605 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009606 verifyFormat(
9607 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9608 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9609 " return aaaaaaaaaaaaaaaaa;\n"
9610 " });",
9611 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009612 verifyFormat("[]() //\n"
9613 " -> int {\n"
9614 " return 1; //\n"
9615 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009616
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009617 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009618 verifyFormat("SomeFunction(\n"
9619 " []() {\n"
9620 " int i = 42;\n"
9621 " return i;\n"
9622 " },\n"
9623 " []() {\n"
9624 " int j = 43;\n"
9625 " return j;\n"
9626 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009627
Daniel Jasperda18fd82014-06-10 06:39:03 +00009628 // More complex introducers.
9629 verifyFormat("return [i, args...] {};");
9630
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009631 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009632 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009633 verifyFormat("double &operator[](int i) { return 0; }\n"
9634 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009635 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009636 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009637 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009638
9639 // Other corner cases.
9640 verifyFormat("void f() {\n"
9641 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9642 " );\n"
9643 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009644
9645 // Lambdas created through weird macros.
9646 verifyFormat("void f() {\n"
9647 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009648 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009649 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009650
9651 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9652 " doo_dah();\n"
9653 " doo_dah();\n"
9654 " })) {\n"
9655 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009656 verifyFormat("auto lambda = []() {\n"
9657 " int a = 2\n"
9658 "#if A\n"
9659 " + 2\n"
9660 "#endif\n"
9661 " ;\n"
9662 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009663
9664 // Lambdas with complex multiline introducers.
9665 verifyFormat(
9666 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9667 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
9668 " -> ::std::unordered_set<\n"
9669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
9670 " //\n"
9671 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009672}
9673
Manuel Klimek516e0542013-09-04 13:25:30 +00009674TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009675 FormatStyle ShortBlocks = getLLVMStyle();
9676 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9677 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9678 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9679 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9680 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9681 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9682 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009683
Daniel Jasper76284682014-10-22 09:12:44 +00009684 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9685 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9686 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009687
Daniel Jasper76284682014-10-22 09:12:44 +00009688 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009689 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009690 "}];");
9691 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009692 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009693 "}]};");
9694 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009695 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009696 "}];");
9697 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009698 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009699 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009700 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009701 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009702 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009703 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009704 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009705
9706 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009707 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009708 "}];",
9709 getLLVMStyleWithColumns(60));
9710 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009711 " NSString *path = [self sessionFilePath];\n"
9712 " if (path) {\n"
9713 " // ...\n"
9714 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009715 "});");
9716 verifyFormat("[[SessionService sharedService]\n"
9717 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009718 " if (window) {\n"
9719 " [self windowDidLoad:window];\n"
9720 " } else {\n"
9721 " [self errorLoadingWindow];\n"
9722 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009723 " }];");
9724 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009725 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009726 "};\n",
9727 getLLVMStyleWithColumns(40));
9728 verifyFormat("[[SessionService sharedService]\n"
9729 " loadWindowWithCompletionBlock: //\n"
9730 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009731 " if (window) {\n"
9732 " [self windowDidLoad:window];\n"
9733 " } else {\n"
9734 " [self errorLoadingWindow];\n"
9735 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009736 " }];",
9737 getLLVMStyleWithColumns(60));
9738 verifyFormat("[myObject doSomethingWith:arg1\n"
9739 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009740 " // ...\n"
9741 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009742 " }\n"
9743 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009744 " // ...\n"
9745 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009746 " }\n"
9747 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009748 " // ...\n"
9749 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009750 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009751 verifyFormat("[myObject doSomethingWith:arg1\n"
9752 " firstBlock:-1\n"
9753 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009754 " // ...\n"
9755 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009756 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009757
9758 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009759 " @autoreleasepool {\n"
9760 " if (a) {\n"
9761 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009762 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009763 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009764 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009765 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009766 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9767 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009768
9769 FormatStyle FourIndent = getLLVMStyle();
9770 FourIndent.ObjCBlockIndentWidth = 4;
9771 verifyFormat("[operation setCompletionBlock:^{\n"
9772 " [self onOperationDone];\n"
9773 "}];",
9774 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009775}
9776
Daniel Jasper289afc02015-04-23 09:23:17 +00009777TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9778 FormatStyle ZeroColumn = getLLVMStyle();
9779 ZeroColumn.ColumnLimit = 0;
9780
9781 verifyFormat("[[SessionService sharedService] "
9782 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9783 " if (window) {\n"
9784 " [self windowDidLoad:window];\n"
9785 " } else {\n"
9786 " [self errorLoadingWindow];\n"
9787 " }\n"
9788 "}];",
9789 ZeroColumn);
9790 EXPECT_EQ("[[SessionService sharedService]\n"
9791 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9792 " if (window) {\n"
9793 " [self windowDidLoad:window];\n"
9794 " } else {\n"
9795 " [self errorLoadingWindow];\n"
9796 " }\n"
9797 " }];",
9798 format("[[SessionService sharedService]\n"
9799 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9800 " if (window) {\n"
9801 " [self windowDidLoad:window];\n"
9802 " } else {\n"
9803 " [self errorLoadingWindow];\n"
9804 " }\n"
9805 "}];",
9806 ZeroColumn));
9807 verifyFormat("[myObject doSomethingWith:arg1\n"
9808 " firstBlock:^(Foo *a) {\n"
9809 " // ...\n"
9810 " int i;\n"
9811 " }\n"
9812 " secondBlock:^(Bar *b) {\n"
9813 " // ...\n"
9814 " int i;\n"
9815 " }\n"
9816 " thirdBlock:^Foo(Bar *b) {\n"
9817 " // ...\n"
9818 " int i;\n"
9819 " }];",
9820 ZeroColumn);
9821 verifyFormat("f(^{\n"
9822 " @autoreleasepool {\n"
9823 " if (a) {\n"
9824 " g();\n"
9825 " }\n"
9826 " }\n"
9827 "});",
9828 ZeroColumn);
9829 verifyFormat("void (^largeBlock)(void) = ^{\n"
9830 " // ...\n"
9831 "};",
9832 ZeroColumn);
9833
9834 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9835 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009836 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009837 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9838 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9839 " int i;\n"
9840 "};",
9841 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9842}
9843
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009844TEST_F(FormatTest, SupportsCRLF) {
9845 EXPECT_EQ("int a;\r\n"
9846 "int b;\r\n"
9847 "int c;\r\n",
9848 format("int a;\r\n"
9849 " int b;\r\n"
9850 " int c;\r\n",
9851 getLLVMStyle()));
9852 EXPECT_EQ("int a;\r\n"
9853 "int b;\r\n"
9854 "int c;\r\n",
9855 format("int a;\r\n"
9856 " int b;\n"
9857 " int c;\r\n",
9858 getLLVMStyle()));
9859 EXPECT_EQ("int a;\n"
9860 "int b;\n"
9861 "int c;\n",
9862 format("int a;\r\n"
9863 " int b;\n"
9864 " int c;\n",
9865 getLLVMStyle()));
9866 EXPECT_EQ("\"aaaaaaa \"\r\n"
9867 "\"bbbbbbb\";\r\n",
9868 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9869 EXPECT_EQ("#define A \\\r\n"
9870 " b; \\\r\n"
9871 " c; \\\r\n"
9872 " d;\r\n",
9873 format("#define A \\\r\n"
9874 " b; \\\r\n"
9875 " c; d; \r\n",
9876 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009877
9878 EXPECT_EQ("/*\r\n"
9879 "multi line block comments\r\n"
9880 "should not introduce\r\n"
9881 "an extra carriage return\r\n"
9882 "*/\r\n",
9883 format("/*\r\n"
9884 "multi line block comments\r\n"
9885 "should not introduce\r\n"
9886 "an extra carriage return\r\n"
9887 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009888}
9889
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009890TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9891 verifyFormat("MY_CLASS(C) {\n"
9892 " int i;\n"
9893 " int j;\n"
9894 "};");
9895}
9896
Daniel Jasper6633ab82013-10-18 10:38:14 +00009897TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9898 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9899 TwoIndent.ContinuationIndentWidth = 2;
9900
9901 EXPECT_EQ("int i =\n"
9902 " longFunction(\n"
9903 " arg);",
9904 format("int i = longFunction(arg);", TwoIndent));
9905
9906 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9907 SixIndent.ContinuationIndentWidth = 6;
9908
9909 EXPECT_EQ("int i =\n"
9910 " longFunction(\n"
9911 " arg);",
9912 format("int i = longFunction(arg);", SixIndent));
9913}
9914
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009915TEST_F(FormatTest, SpacesInAngles) {
9916 FormatStyle Spaces = getLLVMStyle();
9917 Spaces.SpacesInAngles = true;
9918
9919 verifyFormat("static_cast< int >(arg);", Spaces);
9920 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9921 verifyFormat("f< int, float >();", Spaces);
9922 verifyFormat("template <> g() {}", Spaces);
9923 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009924 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9925 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9926 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009927
9928 Spaces.Standard = FormatStyle::LS_Cpp03;
9929 Spaces.SpacesInAngles = true;
9930 verifyFormat("A< A< int > >();", Spaces);
9931
9932 Spaces.SpacesInAngles = false;
9933 verifyFormat("A<A<int> >();", Spaces);
9934
9935 Spaces.Standard = FormatStyle::LS_Cpp11;
9936 Spaces.SpacesInAngles = true;
9937 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009938
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009939 Spaces.SpacesInAngles = false;
9940 verifyFormat("A<A<int>>();", Spaces);
9941}
9942
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009943TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9944 FormatStyle Style = getLLVMStyle();
9945 Style.SpaceAfterTemplateKeyword = false;
9946 verifyFormat("template<int> void foo();", Style);
9947}
9948
Jacques Pienaarfc275112015-02-18 23:48:37 +00009949TEST_F(FormatTest, TripleAngleBrackets) {
9950 verifyFormat("f<<<1, 1>>>();");
9951 verifyFormat("f<<<1, 1, 1, s>>>();");
9952 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009953 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009954 verifyFormat("f<param><<<1, 1>>>();");
9955 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009956 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009957 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9958 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009959 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9960 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009961}
9962
9963TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009964 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009965 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009966 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9967 "aaallvm::outs() <<");
9968 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9969 "aaaallvm::outs()\n <<");
9970}
9971
Manuel Klimek819788d2014-03-18 11:22:45 +00009972TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9973 std::string code = "#if A\n"
9974 "#if B\n"
9975 "a.\n"
9976 "#endif\n"
9977 " a = 1;\n"
9978 "#else\n"
9979 "#endif\n"
9980 "#if C\n"
9981 "#else\n"
9982 "#endif\n";
9983 EXPECT_EQ(code, format(code));
9984}
9985
Manuel Klimek68b03042014-04-14 09:14:11 +00009986TEST_F(FormatTest, HandleConflictMarkers) {
9987 // Git/SVN conflict markers.
9988 EXPECT_EQ("int a;\n"
9989 "void f() {\n"
9990 " callme(some(parameter1,\n"
9991 "<<<<<<< text by the vcs\n"
9992 " parameter2),\n"
9993 "||||||| text by the vcs\n"
9994 " parameter2),\n"
9995 " parameter3,\n"
9996 "======= text by the vcs\n"
9997 " parameter2, parameter3),\n"
9998 ">>>>>>> text by the vcs\n"
9999 " otherparameter);\n",
10000 format("int a;\n"
10001 "void f() {\n"
10002 " callme(some(parameter1,\n"
10003 "<<<<<<< text by the vcs\n"
10004 " parameter2),\n"
10005 "||||||| text by the vcs\n"
10006 " parameter2),\n"
10007 " parameter3,\n"
10008 "======= text by the vcs\n"
10009 " parameter2,\n"
10010 " parameter3),\n"
10011 ">>>>>>> text by the vcs\n"
10012 " otherparameter);\n"));
10013
10014 // Perforce markers.
10015 EXPECT_EQ("void f() {\n"
10016 " function(\n"
10017 ">>>> text by the vcs\n"
10018 " parameter,\n"
10019 "==== text by the vcs\n"
10020 " parameter,\n"
10021 "==== text by the vcs\n"
10022 " parameter,\n"
10023 "<<<< text by the vcs\n"
10024 " parameter);\n",
10025 format("void f() {\n"
10026 " function(\n"
10027 ">>>> text by the vcs\n"
10028 " parameter,\n"
10029 "==== text by the vcs\n"
10030 " parameter,\n"
10031 "==== text by the vcs\n"
10032 " parameter,\n"
10033 "<<<< text by the vcs\n"
10034 " parameter);\n"));
10035
10036 EXPECT_EQ("<<<<<<<\n"
10037 "|||||||\n"
10038 "=======\n"
10039 ">>>>>>>",
10040 format("<<<<<<<\n"
10041 "|||||||\n"
10042 "=======\n"
10043 ">>>>>>>"));
10044
10045 EXPECT_EQ("<<<<<<<\n"
10046 "|||||||\n"
10047 "int i;\n"
10048 "=======\n"
10049 ">>>>>>>",
10050 format("<<<<<<<\n"
10051 "|||||||\n"
10052 "int i;\n"
10053 "=======\n"
10054 ">>>>>>>"));
10055
10056 // FIXME: Handle parsing of macros around conflict markers correctly:
10057 EXPECT_EQ("#define Macro \\\n"
10058 "<<<<<<<\n"
10059 "Something \\\n"
10060 "|||||||\n"
10061 "Else \\\n"
10062 "=======\n"
10063 "Other \\\n"
10064 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010065 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010066 format("#define Macro \\\n"
10067 "<<<<<<<\n"
10068 " Something \\\n"
10069 "|||||||\n"
10070 " Else \\\n"
10071 "=======\n"
10072 " Other \\\n"
10073 ">>>>>>>\n"
10074 " End\n"
10075 "int i;\n"));
10076}
10077
Daniel Jasper471894432014-08-06 13:40:26 +000010078TEST_F(FormatTest, DisableRegions) {
10079 EXPECT_EQ("int i;\n"
10080 "// clang-format off\n"
10081 " int j;\n"
10082 "// clang-format on\n"
10083 "int k;",
10084 format(" int i;\n"
10085 " // clang-format off\n"
10086 " int j;\n"
10087 " // clang-format on\n"
10088 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010089 EXPECT_EQ("int i;\n"
10090 "/* clang-format off */\n"
10091 " int j;\n"
10092 "/* clang-format on */\n"
10093 "int k;",
10094 format(" int i;\n"
10095 " /* clang-format off */\n"
10096 " int j;\n"
10097 " /* clang-format on */\n"
10098 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010099
10100 // Don't reflow comments within disabled regions.
10101 EXPECT_EQ(
10102 "// clang-format off\n"
10103 "// long long long long long long line\n"
10104 "/* clang-format on */\n"
10105 "/* long long long\n"
10106 " * long long long\n"
10107 " * line */\n"
10108 "int i;\n"
10109 "/* clang-format off */\n"
10110 "/* long long long long long long line */\n",
10111 format("// clang-format off\n"
10112 "// long long long long long long line\n"
10113 "/* clang-format on */\n"
10114 "/* long long long long long long line */\n"
10115 "int i;\n"
10116 "/* clang-format off */\n"
10117 "/* long long long long long long line */\n",
10118 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010119}
10120
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010121TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10122 format("? ) =");
10123 verifyNoCrash("#define a\\\n /**/}");
10124}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010125
Daniel Jasper498f5582015-12-25 08:53:31 +000010126TEST_F(FormatTest, FormatsTableGenCode) {
10127 FormatStyle Style = getLLVMStyle();
10128 Style.Language = FormatStyle::LK_TableGen;
10129 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10130}
10131
Nico Weberb2673a12016-11-10 21:49:25 +000010132TEST_F(FormatTest, ArrayOfTemplates) {
10133 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10134 format("auto a = new unique_ptr<int > [ 10];"));
10135
10136 FormatStyle Spaces = getLLVMStyle();
10137 Spaces.SpacesInSquareBrackets = true;
10138 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10139 format("auto a = new unique_ptr<int > [10];", Spaces));
10140}
10141
10142TEST_F(FormatTest, ArrayAsTemplateType) {
10143 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10144 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10145
10146 FormatStyle Spaces = getLLVMStyle();
10147 Spaces.SpacesInSquareBrackets = true;
10148 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10149 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10150}
10151
Martin Probstc9c51c42017-03-16 10:21:35 +000010152TEST_F(FormatTest, NoSpaceAfterSuper) {
10153 verifyFormat("__super::FooBar();");
10154}
10155
Eric Liu547d8792016-03-24 13:22:42 +000010156TEST(FormatStyle, GetStyleOfFile) {
10157 vfs::InMemoryFileSystem FS;
10158 // Test 1: format file in the same directory.
10159 ASSERT_TRUE(
10160 FS.addFile("/a/.clang-format", 0,
10161 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10162 ASSERT_TRUE(
10163 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010164 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010165 ASSERT_TRUE((bool)Style1);
10166 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010167
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010168 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010169 ASSERT_TRUE(
10170 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010171 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010172 ASSERT_TRUE((bool)Style2);
10173 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010174
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010175 // Test 2.2: no format on 'none' fallback style.
10176 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10177 ASSERT_TRUE((bool)Style2);
10178 ASSERT_EQ(*Style2, getNoStyle());
10179
10180 // Test 2.3: format if config is found with no based style while fallback is
10181 // 'none'.
10182 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10183 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10184 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10185 ASSERT_TRUE((bool)Style2);
10186 ASSERT_EQ(*Style2, getLLVMStyle());
10187
10188 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
10189 Style2 = getStyle("{}", "a.h", "none", "", &FS);
10190 ASSERT_TRUE((bool)Style2);
10191 ASSERT_EQ(*Style2, getLLVMStyle());
10192
Eric Liu547d8792016-03-24 13:22:42 +000010193 // Test 3: format file in parent directory.
10194 ASSERT_TRUE(
10195 FS.addFile("/c/.clang-format", 0,
10196 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10197 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10198 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010199 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010200 ASSERT_TRUE((bool)Style3);
10201 ASSERT_EQ(*Style3, getGoogleStyle());
10202
10203 // Test 4: error on invalid fallback style
10204 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10205 ASSERT_FALSE((bool)Style4);
10206 llvm::consumeError(Style4.takeError());
10207
10208 // Test 5: error on invalid yaml on command line
10209 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10210 ASSERT_FALSE((bool)Style5);
10211 llvm::consumeError(Style5.takeError());
10212
10213 // Test 6: error on invalid style
10214 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10215 ASSERT_FALSE((bool)Style6);
10216 llvm::consumeError(Style6.takeError());
10217
10218 // Test 7: found config file, error on parsing it
10219 ASSERT_TRUE(
10220 FS.addFile("/d/.clang-format", 0,
10221 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10222 "InvalidKey: InvalidValue")));
10223 ASSERT_TRUE(
10224 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10225 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10226 ASSERT_FALSE((bool)Style7);
10227 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010228}
10229
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010230TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10231 // Column limit is 20.
10232 std::string Code = "Type *a =\n"
10233 " new Type();\n"
10234 "g(iiiii, 0, jjjjj,\n"
10235 " 0, kkkkk, 0, mm);\n"
10236 "int bad = format ;";
10237 std::string Expected = "auto a = new Type();\n"
10238 "g(iiiii, nullptr,\n"
10239 " jjjjj, nullptr,\n"
10240 " kkkkk, nullptr,\n"
10241 " mm);\n"
10242 "int bad = format ;";
10243 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010244 tooling::Replacements Replaces = toReplacements(
10245 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10246 "auto "),
10247 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10248 "nullptr"),
10249 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10250 "nullptr"),
10251 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10252 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010253
10254 format::FormatStyle Style = format::getLLVMStyle();
10255 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010256 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10257 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10258 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10259 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10260 EXPECT_TRUE(static_cast<bool>(Result));
10261 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010262}
10263
Eric Liubaf58c22016-05-18 13:43:48 +000010264TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10265 std::string Code = "#include \"a.h\"\n"
10266 "#include \"c.h\"\n"
10267 "\n"
10268 "int main() {\n"
10269 " return 0;\n"
10270 "}";
10271 std::string Expected = "#include \"a.h\"\n"
10272 "#include \"b.h\"\n"
10273 "#include \"c.h\"\n"
10274 "\n"
10275 "int main() {\n"
10276 " return 0;\n"
10277 "}";
10278 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010279 tooling::Replacements Replaces = toReplacements(
10280 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10281 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010282
10283 format::FormatStyle Style = format::getLLVMStyle();
10284 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010285 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10286 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10287 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10288 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10289 EXPECT_TRUE(static_cast<bool>(Result));
10290 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010291}
10292
Nico Weberdc065182017-04-05 18:10:42 +000010293TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
10294 format::FormatStyle Style = format::getLLVMStyle();
10295 Style.Standard = FormatStyle::LS_Cpp03;
10296 // cpp03 recognize this string as identifier u8 and literal character 'a'
10297 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
10298}
10299
10300TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
10301 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
10302 // all modes, including C++11, C++14 and C++17
10303 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
10304}
10305
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010306} // end namespace
10307} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010308} // end namespace clang