blob: 4577a67fd130fd5535468605a7457d9e282d4000 [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
Francois Ferranda6b6d512017-05-24 11:36:58 +000060 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000061 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Francois Ferranda6b6d512017-05-24 11:36:58 +000065 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
66 return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
67 }
68
Daniel Jasper1b750ed2013-01-14 16:24:39 +000069 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
Francois Ferranda6b6d512017-05-24 11:36:58 +000070 return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
Daniel Jasper1b750ed2013-01-14 16:24:39 +000071 }
72
Manuel Klimekb69e3c62013-01-02 18:33:23 +000073 void verifyFormat(llvm::StringRef Code,
74 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000075 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Nico Weberd96ae862017-02-24 19:10:12 +000076 if (Style.Language == FormatStyle::LK_Cpp) {
77 // Objective-C++ is a superset of C++, so everything checked for C++
78 // needs to be checked for Objective-C++ as well.
79 FormatStyle ObjCStyle = Style;
80 ObjCStyle.Language = FormatStyle::LK_ObjC;
81 EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
82 }
Daniel Jasperf7935112012-12-03 18:12:45 +000083 }
84
Manuel Klimekec5c3db2015-05-07 12:26:30 +000085 void verifyIncompleteFormat(llvm::StringRef Code,
86 const FormatStyle &Style = getLLVMStyle()) {
87 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000088 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000089 }
90
Daniel Jasperf7935112012-12-03 18:12:45 +000091 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000092 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000093 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000094
95 void verifyIndependentOfContext(llvm::StringRef text) {
96 verifyFormat(text);
97 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
98 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000099
Daniel Jasper675b4f82015-01-19 10:51:23 +0000100 /// \brief Verify that clang-format does not crash on the given input.
101 void verifyNoCrash(llvm::StringRef Code,
102 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000103 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000104 }
105
Daniel Jasper7b038a22013-01-30 09:46:12 +0000106 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000107};
108
Manuel Klimek52b15152013-01-09 15:25:02 +0000109TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000110 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
111 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
112 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
113 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
114 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000115}
116
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000117//===----------------------------------------------------------------------===//
118// Basic function tests.
119//===----------------------------------------------------------------------===//
120
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000121TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000122 EXPECT_EQ(";", format(";"));
123}
124
125TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
126 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000127 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000128 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
129 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
130}
131
132TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
133 EXPECT_EQ("int i;", format("int\ni;"));
134}
135
136TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000137 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000138}
139
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000140TEST_F(FormatTest, FormatsNestedCall) {
141 verifyFormat("Method(f1, f2(f3));");
142 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000143 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000144}
145
Daniel Jasper14556742013-02-07 21:08:36 +0000146TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000147 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000148 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000149 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000150 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000151 verifyFormat("ALWAYS_INLINE ::std::string getName();");
152 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000153}
154
Daniel Jasper7b038a22013-01-30 09:46:12 +0000155TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
156 EXPECT_EQ("if (a) {\n"
157 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000158 "}",
159 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000160 EXPECT_EQ(4, ReplacementCount);
161 EXPECT_EQ("if (a) {\n"
162 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000163 "}",
164 format("if (a) {\n"
165 " f();\n"
166 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000167 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000168 EXPECT_EQ("/*\r\n"
169 "\r\n"
170 "*/\r\n",
171 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000172 "\r\n"
173 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000174 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000175}
176
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000177TEST_F(FormatTest, RemovesEmptyLines) {
178 EXPECT_EQ("class C {\n"
179 " int i;\n"
180 "};",
181 format("class C {\n"
182 " int i;\n"
183 "\n"
184 "};"));
185
Nico Weber34272652014-11-13 16:25:37 +0000186 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000187 EXPECT_EQ("namespace N {\n"
188 "\n"
189 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000190 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000191 format("namespace N {\n"
192 "\n"
193 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000194 "}",
195 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000196 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
197 "\n"
198 "int i;\n"
199 "}",
200 format("extern /**/ \"C\" /**/ {\n"
201 "\n"
202 "int i;\n"
203 "}",
204 getGoogleStyle()));
205
206 // ...but do keep inlining and removing empty lines for non-block extern "C"
207 // functions.
208 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
209 EXPECT_EQ("extern \"C\" int f() {\n"
210 " int i = 42;\n"
211 " return i;\n"
212 "}",
213 format("extern \"C\" int f() {\n"
214 "\n"
215 " int i = 42;\n"
216 " return i;\n"
217 "}",
218 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000219
Daniel Jasper11164bd2014-03-21 12:58:53 +0000220 // Remove empty lines at the beginning and end of blocks.
221 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000222 "\n"
223 " if (a) {\n"
224 "\n"
225 " f();\n"
226 " }\n"
227 "}",
228 format("void f() {\n"
229 "\n"
230 " if (a) {\n"
231 "\n"
232 " f();\n"
233 "\n"
234 " }\n"
235 "\n"
236 "}",
237 getLLVMStyle()));
238 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000239 " if (a) {\n"
240 " f();\n"
241 " }\n"
242 "}",
243 format("void f() {\n"
244 "\n"
245 " if (a) {\n"
246 "\n"
247 " f();\n"
248 "\n"
249 " }\n"
250 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000251 "}",
252 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000253
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000254 // Don't remove empty lines in more complex control statements.
255 EXPECT_EQ("void f() {\n"
256 " if (a) {\n"
257 " f();\n"
258 "\n"
259 " } else if (b) {\n"
260 " f();\n"
261 " }\n"
262 "}",
263 format("void f() {\n"
264 " if (a) {\n"
265 " f();\n"
266 "\n"
267 " } else if (b) {\n"
268 " f();\n"
269 "\n"
270 " }\n"
271 "\n"
272 "}"));
273
274 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000275 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
276 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000277 EXPECT_EQ("namespace {\n"
278 "int i;\n"
279 "}",
280 format("namespace {\n"
281 "int i;\n"
282 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000283 "}", LLVMWithNoNamespaceFix));
284 EXPECT_EQ("namespace {\n"
285 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000286 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000287 format("namespace {\n"
288 "int i;\n"
289 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000290 "}"));
291 EXPECT_EQ("namespace {\n"
292 "int i;\n"
293 "\n"
294 "} // namespace",
295 format("namespace {\n"
296 "int i;\n"
297 "\n"
298 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000299
300 FormatStyle Style = getLLVMStyle();
301 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
302 Style.MaxEmptyLinesToKeep = 2;
303 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
304 Style.BraceWrapping.AfterClass = true;
305 Style.BraceWrapping.AfterFunction = true;
306 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
307
308 EXPECT_EQ("class Foo\n"
309 "{\n"
310 " Foo() {}\n"
311 "\n"
312 " void funk() {}\n"
313 "};",
314 format("class Foo\n"
315 "{\n"
316 " Foo()\n"
317 " {\n"
318 " }\n"
319 "\n"
320 " void funk() {}\n"
321 "};",
322 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323}
324
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000325TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000326 verifyFormat("x = (a) and (b);");
327 verifyFormat("x = (a) or (b);");
328 verifyFormat("x = (a) bitand (b);");
329 verifyFormat("x = (a) bitor (b);");
330 verifyFormat("x = (a) not_eq (b);");
331 verifyFormat("x = (a) and_eq (b);");
332 verifyFormat("x = (a) or_eq (b);");
333 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000334}
335
Olivier Goffart90f981b2017-07-14 09:23:40 +0000336TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
337 verifyFormat("x = compl(a);");
338 verifyFormat("x = not(a);");
339 verifyFormat("x = bitand(a);");
340 // Unary operator must not be merged with the next identifier
341 verifyFormat("x = compl a;");
342 verifyFormat("x = not a;");
343 verifyFormat("x = bitand a;");
344}
345
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000346//===----------------------------------------------------------------------===//
347// Tests for control statements.
348//===----------------------------------------------------------------------===//
349
Daniel Jaspercdd06622013-05-14 10:31:09 +0000350TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000351 verifyFormat("if (true)\n f();\ng();");
352 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000353 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000354 verifyFormat("if constexpr (true)\n"
355 " f();\ng();");
356 verifyFormat("if constexpr (a)\n"
357 " if constexpr (b)\n"
358 " if constexpr (c)\n"
359 " g();\n"
360 "h();");
361 verifyFormat("if constexpr (a)\n"
362 " if constexpr (b) {\n"
363 " f();\n"
364 " }\n"
365 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000366
Daniel Jasper3a685df2013-05-16 12:12:21 +0000367 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000368 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000369 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
370 verifyFormat("if (a)\n"
371 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000372 " f();",
373 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000374 verifyFormat("{\n"
375 " if (a)\n"
376 " label:\n"
377 " f();\n"
378 "}",
379 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000380 verifyFormat("#define A \\\n"
381 " if (a) \\\n"
382 " label: \\\n"
383 " f()",
384 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000385 verifyFormat("if (a)\n"
386 " ;",
387 AllowsMergedIf);
388 verifyFormat("if (a)\n"
389 " if (b) return;",
390 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000391
Daniel Jasper3a685df2013-05-16 12:12:21 +0000392 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000393 " f();\n",
394 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000395 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000396 " f();",
397 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000398 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000399 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000400 "}",
401 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000402 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000403 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000404 "}",
405 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000406
407 AllowsMergedIf.ColumnLimit = 14;
408 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000409 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000410 " return;",
411 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000412
413 AllowsMergedIf.ColumnLimit = 13;
414 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000415}
416
Daniel Jasper3a685df2013-05-16 12:12:21 +0000417TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
418 FormatStyle AllowsMergedLoops = getLLVMStyle();
419 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
420 verifyFormat("while (true) continue;", AllowsMergedLoops);
421 verifyFormat("for (;;) continue;", AllowsMergedLoops);
422 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
423 verifyFormat("while (true)\n"
424 " ;",
425 AllowsMergedLoops);
426 verifyFormat("for (;;)\n"
427 " ;",
428 AllowsMergedLoops);
429 verifyFormat("for (;;)\n"
430 " for (;;) continue;",
431 AllowsMergedLoops);
432 verifyFormat("for (;;) // Can't merge this\n"
433 " continue;",
434 AllowsMergedLoops);
435 verifyFormat("for (;;) /* still don't merge */\n"
436 " continue;",
437 AllowsMergedLoops);
438}
439
Daniel Jasper17605d32014-05-14 09:33:35 +0000440TEST_F(FormatTest, FormatShortBracedStatements) {
441 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
442 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
443
444 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
445 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
446
447 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000448 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000449 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
450 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
451 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000452 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000453 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
454 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
455 verifyFormat("if (true) { //\n"
456 " f();\n"
457 "}",
458 AllowSimpleBracedStatements);
459 verifyFormat("if (true) {\n"
460 " f();\n"
461 " f();\n"
462 "}",
463 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000464 verifyFormat("if (true) {\n"
465 " f();\n"
466 "} else {\n"
467 " f();\n"
468 "}",
469 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000470
Daniel Jasperf92659e2017-06-19 07:45:41 +0000471 verifyFormat("struct A2 {\n"
472 " int X;\n"
473 "};",
474 AllowSimpleBracedStatements);
475 verifyFormat("typedef struct A2 {\n"
476 " int X;\n"
477 "} A2_t;",
478 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000479 verifyFormat("template <int> struct A2 {\n"
480 " struct B {};\n"
481 "};",
482 AllowSimpleBracedStatements);
483
Daniel Jasper17605d32014-05-14 09:33:35 +0000484 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
485 verifyFormat("if (true) {\n"
486 " f();\n"
487 "}",
488 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000489 verifyFormat("if (true) {\n"
490 " f();\n"
491 "} else {\n"
492 " f();\n"
493 "}",
494 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000495
496 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
497 verifyFormat("while (true) {\n"
498 " f();\n"
499 "}",
500 AllowSimpleBracedStatements);
501 verifyFormat("for (;;) {\n"
502 " f();\n"
503 "}",
504 AllowSimpleBracedStatements);
505}
506
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000507TEST_F(FormatTest, ParseIfElse) {
508 verifyFormat("if (true)\n"
509 " if (true)\n"
510 " if (true)\n"
511 " f();\n"
512 " else\n"
513 " g();\n"
514 " else\n"
515 " h();\n"
516 "else\n"
517 " i();");
518 verifyFormat("if (true)\n"
519 " if (true)\n"
520 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000521 " if (true)\n"
522 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000523 " } else {\n"
524 " g();\n"
525 " }\n"
526 " else\n"
527 " h();\n"
528 "else {\n"
529 " i();\n"
530 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000531 verifyFormat("if (true)\n"
532 " if constexpr (true)\n"
533 " if (true) {\n"
534 " if constexpr (true)\n"
535 " f();\n"
536 " } else {\n"
537 " g();\n"
538 " }\n"
539 " else\n"
540 " h();\n"
541 "else {\n"
542 " i();\n"
543 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000544 verifyFormat("void f() {\n"
545 " if (a) {\n"
546 " } else {\n"
547 " }\n"
548 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000549}
550
551TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000552 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000553 verifyFormat("if (a)\n"
554 " f();\n"
555 "else if (b)\n"
556 " g();\n"
557 "else\n"
558 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000559 verifyFormat("if constexpr (a)\n"
560 " f();\n"
561 "else if constexpr (b)\n"
562 " g();\n"
563 "else\n"
564 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000565 verifyFormat("if (a) {\n"
566 " f();\n"
567 "}\n"
568 "// or else ..\n"
569 "else {\n"
570 " g()\n"
571 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000572
573 verifyFormat("if (a) {\n"
574 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
576 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000577 verifyFormat("if (a) {\n"
578 "} else if (\n"
579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
580 "}",
581 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000582 verifyFormat("if (a) {\n"
583 "} else if constexpr (\n"
584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
585 "}",
586 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000587}
588
Daniel Jasperf7935112012-12-03 18:12:45 +0000589TEST_F(FormatTest, FormatsForLoop) {
590 verifyFormat(
591 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000592 " ++VeryVeryLongLoopVariable)\n"
593 " ;");
594 verifyFormat("for (;;)\n"
595 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000596 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000597 verifyFormat("for (;;) {\n"
598 " f();\n"
599 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000600 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000601
602 verifyFormat(
603 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
604 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000605 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000606
607 verifyFormat(
608 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000609 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000610 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
611 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000612 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000613 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
614 " I = FD->getDeclsInPrototypeScope().begin(),\n"
615 " E = FD->getDeclsInPrototypeScope().end();\n"
616 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000617 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
618 " I = Container.begin(),\n"
619 " E = Container.end();\n"
620 " I != E; ++I) {\n}",
621 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000622
Daniel Jasper48c62f92013-01-28 17:30:17 +0000623 verifyFormat(
624 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000628 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000629 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
630 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
631 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000632 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
633 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
634 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000635 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
636 " aaaaaaaaaa);\n"
637 " iter; ++iter) {\n"
638 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000639 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
641 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
642 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000643
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000644 FormatStyle NoBinPacking = getLLVMStyle();
645 NoBinPacking.BinPackParameters = false;
646 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
647 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
648 " aaaaaaaaaaaaaaaa,\n"
649 " aaaaaaaaaaaaaaaa,\n"
650 " aaaaaaaaaaaaaaaa);\n"
651 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
652 "}",
653 NoBinPacking);
654 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000655 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
656 " E = UnwrappedLines.end();\n"
657 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000658 " ++I) {\n}",
659 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000660}
661
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000662TEST_F(FormatTest, RangeBasedForLoops) {
663 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
665 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
666 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000667 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000669 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
670 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000671}
672
Daniel Jaspere1e43192014-04-01 12:55:11 +0000673TEST_F(FormatTest, ForEachLoops) {
674 verifyFormat("void f() {\n"
675 " foreach (Item *item, itemlist) {}\n"
676 " Q_FOREACH (Item *item, itemlist) {}\n"
677 " BOOST_FOREACH (Item *item, itemlist) {}\n"
678 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
679 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000680
681 // As function-like macros.
682 verifyFormat("#define foreach(x, y)\n"
683 "#define Q_FOREACH(x, y)\n"
684 "#define BOOST_FOREACH(x, y)\n"
685 "#define UNKNOWN_FOREACH(x, y)\n");
686
687 // Not as function-like macros.
688 verifyFormat("#define foreach (x, y)\n"
689 "#define Q_FOREACH (x, y)\n"
690 "#define BOOST_FOREACH (x, y)\n"
691 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000692}
693
Daniel Jasperf7935112012-12-03 18:12:45 +0000694TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000695 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000696 verifyFormat("while (true)\n"
697 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000698 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000699 verifyFormat("while () {\n"
700 " f();\n"
701 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000702}
703
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000704TEST_F(FormatTest, FormatsDoWhile) {
705 verifyFormat("do {\n"
706 " do_something();\n"
707 "} while (something());");
708 verifyFormat("do\n"
709 " do_something();\n"
710 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000711}
712
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000713TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000714 verifyFormat("switch (x) {\n"
715 "case 1:\n"
716 " f();\n"
717 " break;\n"
718 "case kFoo:\n"
719 "case ns::kBar:\n"
720 "case kBaz:\n"
721 " break;\n"
722 "default:\n"
723 " g();\n"
724 " break;\n"
725 "}");
726 verifyFormat("switch (x) {\n"
727 "case 1: {\n"
728 " f();\n"
729 " break;\n"
730 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000731 "case 2: {\n"
732 " break;\n"
733 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000734 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000735 verifyFormat("switch (x) {\n"
736 "case 1: {\n"
737 " f();\n"
738 " {\n"
739 " g();\n"
740 " h();\n"
741 " }\n"
742 " break;\n"
743 "}\n"
744 "}");
745 verifyFormat("switch (x) {\n"
746 "case 1: {\n"
747 " f();\n"
748 " if (foo) {\n"
749 " g();\n"
750 " h();\n"
751 " }\n"
752 " break;\n"
753 "}\n"
754 "}");
755 verifyFormat("switch (x) {\n"
756 "case 1: {\n"
757 " f();\n"
758 " g();\n"
759 "} break;\n"
760 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000761 verifyFormat("switch (test)\n"
762 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000763 verifyFormat("switch (x) {\n"
764 "default: {\n"
765 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000766 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000767 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000768 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000769 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000770 "// if 1, do f()\n"
771 "case 1:\n"
772 " f();\n"
773 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000774 verifyFormat("switch (x) {\n"
775 "case 1:\n"
776 " // Do amazing stuff\n"
777 " {\n"
778 " f();\n"
779 " g();\n"
780 " }\n"
781 " break;\n"
782 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000783 verifyFormat("#define A \\\n"
784 " switch (x) { \\\n"
785 " case a: \\\n"
786 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000787 " }",
788 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000789 verifyFormat("#define OPERATION_CASE(name) \\\n"
790 " case OP_name: \\\n"
791 " return operations::Operation##name\n",
792 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000793 verifyFormat("switch (x) {\n"
794 "case 1:;\n"
795 "default:;\n"
796 " int i;\n"
797 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000798
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000799 verifyGoogleFormat("switch (x) {\n"
800 " case 1:\n"
801 " f();\n"
802 " break;\n"
803 " case kFoo:\n"
804 " case ns::kBar:\n"
805 " case kBaz:\n"
806 " break;\n"
807 " default:\n"
808 " g();\n"
809 " break;\n"
810 "}");
811 verifyGoogleFormat("switch (x) {\n"
812 " case 1: {\n"
813 " f();\n"
814 " break;\n"
815 " }\n"
816 "}");
817 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000818 " ;");
819
820 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
821 " case OP_name: \\\n"
822 " return operations::Operation##name\n");
823 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
824 " // Get the correction operation class.\n"
825 " switch (OpCode) {\n"
826 " CASE(Add);\n"
827 " CASE(Subtract);\n"
828 " default:\n"
829 " return operations::Unknown;\n"
830 " }\n"
831 "#undef OPERATION_CASE\n"
832 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000833 verifyFormat("DEBUG({\n"
834 " switch (x) {\n"
835 " case A:\n"
836 " f();\n"
837 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000838 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000839 " case B:\n"
840 " g();\n"
841 " break;\n"
842 " }\n"
843 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000844 EXPECT_EQ("DEBUG({\n"
845 " switch (x) {\n"
846 " case A:\n"
847 " f();\n"
848 " break;\n"
849 " // On B:\n"
850 " case B:\n"
851 " g();\n"
852 " break;\n"
853 " }\n"
854 "});",
855 format("DEBUG({\n"
856 " switch (x) {\n"
857 " case A:\n"
858 " f();\n"
859 " break;\n"
860 " // On B:\n"
861 " case B:\n"
862 " g();\n"
863 " break;\n"
864 " }\n"
865 "});",
866 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000867 verifyFormat("switch (a) {\n"
868 "case (b):\n"
869 " return;\n"
870 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000871
872 verifyFormat("switch (a) {\n"
873 "case some_namespace::\n"
874 " some_constant:\n"
875 " return;\n"
876 "}",
877 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000878}
879
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000880TEST_F(FormatTest, CaseRanges) {
881 verifyFormat("switch (x) {\n"
882 "case 'A' ... 'Z':\n"
883 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000884 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000885 " break;\n"
886 "}");
887}
888
Daniel Jasperb87899b2014-09-10 13:11:45 +0000889TEST_F(FormatTest, ShortCaseLabels) {
890 FormatStyle Style = getLLVMStyle();
891 Style.AllowShortCaseLabelsOnASingleLine = true;
892 verifyFormat("switch (a) {\n"
893 "case 1: x = 1; break;\n"
894 "case 2: return;\n"
895 "case 3:\n"
896 "case 4:\n"
897 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000898 "case 6: // comment\n"
899 " return;\n"
900 "case 7:\n"
901 " // comment\n"
902 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000903 "case 8:\n"
904 " x = 8; // comment\n"
905 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000906 "default: y = 1; break;\n"
907 "}",
908 Style);
909 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +0000910 "case 0: return; // comment\n"
911 "case 1: break; // comment\n"
912 "case 2: return;\n"
913 "// comment\n"
914 "case 3: return;\n"
915 "// comment 1\n"
916 "// comment 2\n"
917 "// comment 3\n"
918 "case 4: break; /* comment */\n"
919 "case 5:\n"
920 " // comment\n"
921 " break;\n"
922 "case 6: /* comment */ x = 1; break;\n"
923 "case 7: x = /* comment */ 1; break;\n"
924 "case 8:\n"
925 " x = 1; /* comment */\n"
926 " break;\n"
927 "case 9:\n"
928 " break; // comment line 1\n"
929 " // comment line 2\n"
930 "}",
931 Style);
932 EXPECT_EQ("switch (a) {\n"
933 "case 1:\n"
934 " x = 8;\n"
935 " // fall through\n"
936 "case 2: x = 8;\n"
937 "// comment\n"
938 "case 3:\n"
939 " return; /* comment line 1\n"
940 " * comment line 2 */\n"
941 "case 4: i = 8;\n"
942 "// something else\n"
943 "#if FOO\n"
944 "case 5: break;\n"
945 "#endif\n"
946 "}",
947 format("switch (a) {\n"
948 "case 1: x = 8;\n"
949 " // fall through\n"
950 "case 2:\n"
951 " x = 8;\n"
952 "// comment\n"
953 "case 3:\n"
954 " return; /* comment line 1\n"
955 " * comment line 2 */\n"
956 "case 4:\n"
957 " i = 8;\n"
958 "// something else\n"
959 "#if FOO\n"
960 "case 5: break;\n"
961 "#endif\n"
962 "}",
963 Style));
964 EXPECT_EQ("switch (a) {\n" "case 0:\n"
965 " return; // long long long long long long long long long long long long comment\n"
966 " // line\n" "}",
967 format("switch (a) {\n"
968 "case 0: return; // long long long long long long long long long long long long comment line\n"
969 "}",
970 Style));
971 EXPECT_EQ("switch (a) {\n"
972 "case 0:\n"
973 " return; /* long long long long long long long long long long long long comment\n"
974 " line */\n"
975 "}",
976 format("switch (a) {\n"
977 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
978 "}",
979 Style));
980 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000981 "#if FOO\n"
982 "case 0: return 0;\n"
983 "#endif\n"
984 "}",
985 Style);
986 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000987 "case 1: {\n"
988 "}\n"
989 "case 2: {\n"
990 " return;\n"
991 "}\n"
992 "case 3: {\n"
993 " x = 1;\n"
994 " return;\n"
995 "}\n"
996 "case 4:\n"
997 " if (x)\n"
998 " return;\n"
999 "}",
1000 Style);
1001 Style.ColumnLimit = 21;
1002 verifyFormat("switch (a) {\n"
1003 "case 1: x = 1; break;\n"
1004 "case 2: return;\n"
1005 "case 3:\n"
1006 "case 4:\n"
1007 "case 5: return;\n"
1008 "default:\n"
1009 " y = 1;\n"
1010 " break;\n"
1011 "}",
1012 Style);
1013}
1014
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001015TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001016 verifyFormat("void f() {\n"
1017 " some_code();\n"
1018 "test_label:\n"
1019 " some_other_code();\n"
1020 " {\n"
1021 " some_more_code();\n"
1022 " another_label:\n"
1023 " some_more_code();\n"
1024 " }\n"
1025 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001026 verifyFormat("{\n"
1027 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001028 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001029 " some_other_code();\n"
1030 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001031 verifyFormat("{\n"
1032 " some_code();\n"
1033 "test_label:;\n"
1034 " int i = 0;\n"
1035 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001036}
1037
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001038//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001039// Tests for classes, namespaces, etc.
1040//===----------------------------------------------------------------------===//
1041
1042TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001043 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001044}
1045
1046TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1047 verifyFormat("class A {\n"
1048 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001049 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001050 "protected:\n"
1051 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001052 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001053 "};");
1054 verifyGoogleFormat("class A {\n"
1055 " public:\n"
1056 " protected:\n"
1057 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001058 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001059 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001060 verifyFormat("class A {\n"
1061 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001062 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001063 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001064 " void f2() {}\n"
1065 "protected slots:\n"
1066 " void f3() {}\n"
1067 "protected Q_SLOTS:\n"
1068 " void f4() {}\n"
1069 "private slots:\n"
1070 " void f5() {}\n"
1071 "private Q_SLOTS:\n"
1072 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001073 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001074 " void g1();\n"
1075 "Q_SIGNALS:\n"
1076 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001077 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001078
1079 // Don't interpret 'signals' the wrong way.
1080 verifyFormat("signals.set();");
1081 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001082 verifyFormat("{\n"
1083 " signals.set(); // This needs indentation.\n"
1084 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001085 verifyFormat("void f() {\n"
1086 "label:\n"
1087 " signals.baz();\n"
1088 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001089}
1090
Alexander Kornienkofd433362013-03-27 17:08:02 +00001091TEST_F(FormatTest, SeparatesLogicalBlocks) {
1092 EXPECT_EQ("class A {\n"
1093 "public:\n"
1094 " void f();\n"
1095 "\n"
1096 "private:\n"
1097 " void g() {}\n"
1098 " // test\n"
1099 "protected:\n"
1100 " int h;\n"
1101 "};",
1102 format("class A {\n"
1103 "public:\n"
1104 "void f();\n"
1105 "private:\n"
1106 "void g() {}\n"
1107 "// test\n"
1108 "protected:\n"
1109 "int h;\n"
1110 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001111 EXPECT_EQ("class A {\n"
1112 "protected:\n"
1113 "public:\n"
1114 " void f();\n"
1115 "};",
1116 format("class A {\n"
1117 "protected:\n"
1118 "\n"
1119 "public:\n"
1120 "\n"
1121 " void f();\n"
1122 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001123
1124 // Even ensure proper spacing inside macros.
1125 EXPECT_EQ("#define B \\\n"
1126 " class A { \\\n"
1127 " protected: \\\n"
1128 " public: \\\n"
1129 " void f(); \\\n"
1130 " };",
1131 format("#define B \\\n"
1132 " class A { \\\n"
1133 " protected: \\\n"
1134 " \\\n"
1135 " public: \\\n"
1136 " \\\n"
1137 " void f(); \\\n"
1138 " };",
1139 getGoogleStyle()));
1140 // But don't remove empty lines after macros ending in access specifiers.
1141 EXPECT_EQ("#define A private:\n"
1142 "\n"
1143 "int i;",
1144 format("#define A private:\n"
1145 "\n"
1146 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001147}
1148
Daniel Jasper83193602013-04-05 17:22:09 +00001149TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001150 verifyFormat("class A : public B {};");
1151 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001152
1153 verifyFormat(
1154 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001155 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001156 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1157 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001158 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001159 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001160 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001161 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1162 " public C,\n"
1163 " public D,\n"
1164 " public E,\n"
1165 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001166 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001167
1168 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001169 " ReallyReallyLongClassName {\n"
1170 " int i;\n"
1171 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001172 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001173 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1174 " aaaaaaaaaaaaaaaa> {};");
1175 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1176 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1177 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001178 verifyFormat("template <class R, class C>\n"
1179 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1180 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001181 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001182}
1183
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001184TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1185 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1186 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1187
1188 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1189 verifyFormat("class MyClass\n"
1190 " : public X\n"
1191 " , public Y {};",
1192 StyleWithInheritanceBreak);
1193}
1194
Manuel Klimek28cacc72013-01-07 18:10:23 +00001195TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001196 verifyFormat("class A {\n} a, b;");
1197 verifyFormat("struct A {\n} a, b;");
1198 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001199}
1200
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001201TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001202 verifyFormat("enum {\n"
1203 " Zero,\n"
1204 " One = 1,\n"
1205 " Two = One + 1,\n"
1206 " Three = (One + Two),\n"
1207 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1208 " Five = (One, Two, Three, Four, 5)\n"
1209 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001210 verifyGoogleFormat("enum {\n"
1211 " Zero,\n"
1212 " One = 1,\n"
1213 " Two = One + 1,\n"
1214 " Three = (One + Two),\n"
1215 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1216 " Five = (One, Two, Three, Four, 5)\n"
1217 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001218 verifyFormat("enum Enum {};");
1219 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001220 verifyFormat("enum X E {} d;");
1221 verifyFormat("enum __attribute__((...)) E {} d;");
1222 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001223 verifyFormat("enum {\n"
1224 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001225 "};",
1226 getLLVMStyleWithColumns(30));
1227
1228 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001229 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001230
1231 EXPECT_EQ("enum KeepEmptyLines {\n"
1232 " ONE,\n"
1233 "\n"
1234 " TWO,\n"
1235 "\n"
1236 " THREE\n"
1237 "}",
1238 format("enum KeepEmptyLines {\n"
1239 " ONE,\n"
1240 "\n"
1241 " TWO,\n"
1242 "\n"
1243 "\n"
1244 " THREE\n"
1245 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001246 verifyFormat("enum E { // comment\n"
1247 " ONE,\n"
1248 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001249 "};\n"
1250 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001251 // Not enums.
1252 verifyFormat("enum X f() {\n"
1253 " a();\n"
1254 " return 42;\n"
1255 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001256 verifyFormat("enum X Type::f() {\n"
1257 " a();\n"
1258 " return 42;\n"
1259 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001260 verifyFormat("enum ::X f() {\n"
1261 " a();\n"
1262 " return 42;\n"
1263 "}");
1264 verifyFormat("enum ns::X f() {\n"
1265 " a();\n"
1266 " return 42;\n"
1267 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001268}
1269
Daniel Jasperb7150872013-08-30 10:10:19 +00001270TEST_F(FormatTest, FormatsEnumsWithErrors) {
1271 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001272 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001273 " Two = 1;\n"
1274 "};");
1275 verifyFormat("namespace n {\n"
1276 "enum Type {\n"
1277 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001278 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001279 " int i;\n"
1280 "}\n"
1281 "void g() {}");
1282}
1283
Daniel Jasper2b41a822013-08-20 12:42:50 +00001284TEST_F(FormatTest, FormatsEnumStruct) {
1285 verifyFormat("enum struct {\n"
1286 " Zero,\n"
1287 " One = 1,\n"
1288 " Two = One + 1,\n"
1289 " Three = (One + Two),\n"
1290 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1291 " Five = (One, Two, Three, Four, 5)\n"
1292 "};");
1293 verifyFormat("enum struct Enum {};");
1294 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001295 verifyFormat("enum struct X E {} d;");
1296 verifyFormat("enum struct __attribute__((...)) E {} d;");
1297 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001298 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1299}
1300
1301TEST_F(FormatTest, FormatsEnumClass) {
1302 verifyFormat("enum class {\n"
1303 " Zero,\n"
1304 " One = 1,\n"
1305 " Two = One + 1,\n"
1306 " Three = (One + Two),\n"
1307 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1308 " Five = (One, Two, Three, Four, 5)\n"
1309 "};");
1310 verifyFormat("enum class Enum {};");
1311 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001312 verifyFormat("enum class X E {} d;");
1313 verifyFormat("enum class __attribute__((...)) E {} d;");
1314 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001315 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1316}
1317
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001318TEST_F(FormatTest, FormatsEnumTypes) {
1319 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001320 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001321 " B\n"
1322 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001323 verifyFormat("enum X : int { A, B };");
1324 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001325}
1326
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001327TEST_F(FormatTest, FormatsNSEnums) {
1328 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1329 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1330 " // Information about someDecentlyLongValue.\n"
1331 " someDecentlyLongValue,\n"
1332 " // Information about anotherDecentlyLongValue.\n"
1333 " anotherDecentlyLongValue,\n"
1334 " // Information about aThirdDecentlyLongValue.\n"
1335 " aThirdDecentlyLongValue\n"
1336 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001337 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1338 " a = 1,\n"
1339 " b = 2,\n"
1340 " c = 3,\n"
1341 "};");
1342 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1343 " a = 1,\n"
1344 " b = 2,\n"
1345 " c = 3,\n"
1346 "};");
1347 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1348 " a = 1,\n"
1349 " b = 2,\n"
1350 " c = 3,\n"
1351 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001352}
1353
Nico Weber7769a902013-01-14 05:49:49 +00001354TEST_F(FormatTest, FormatsBitfields) {
1355 verifyFormat("struct Bitfields {\n"
1356 " unsigned sClass : 8;\n"
1357 " unsigned ValueKind : 2;\n"
1358 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001359 verifyFormat("struct A {\n"
1360 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1361 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1362 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001363 verifyFormat("struct MyStruct {\n"
1364 " uchar data;\n"
1365 " uchar : 8;\n"
1366 " uchar : 8;\n"
1367 " uchar other;\n"
1368 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001369}
1370
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001371TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001372 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1373 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1374
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001375 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001376 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001377 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001378 "}",
1379 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001380 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001381 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001382 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001383 "}",
1384 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001385 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001386 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001387 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001388 "}",
1389 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001390 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001391 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001392 "void f() { f(); }",
1393 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001394
1395 // This code is more common than we thought; if we
1396 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001397 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001398 verifyFormat("namespace {};",
1399 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001400 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001401 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001402 "};",
1403 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001404
1405 verifyFormat("namespace {\n"
1406 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001407 "} // namespace",
1408 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001409 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1410 "#define HEADER_GUARD\n"
1411 "namespace my_namespace {\n"
1412 "int i;\n"
1413 "} // my_namespace\n"
1414 "#endif // HEADER_GUARD",
1415 format("#ifndef HEADER_GUARD\n"
1416 " #define HEADER_GUARD\n"
1417 " namespace my_namespace {\n"
1418 "int i;\n"
1419 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001420 "#endif // HEADER_GUARD",
1421 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001422
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001423 EXPECT_EQ("namespace A::B {\n"
1424 "class C {};\n"
1425 "}",
1426 format("namespace A::B {\n"
1427 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001428 "}",
1429 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001430
Daniel Jasper65ee3472013-07-31 23:16:02 +00001431 FormatStyle Style = getLLVMStyle();
1432 Style.NamespaceIndentation = FormatStyle::NI_All;
1433 EXPECT_EQ("namespace out {\n"
1434 " int i;\n"
1435 " namespace in {\n"
1436 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001437 " } // namespace in\n"
1438 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001439 format("namespace out {\n"
1440 "int i;\n"
1441 "namespace in {\n"
1442 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001443 "} // namespace in\n"
1444 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001445 Style));
1446
1447 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1448 EXPECT_EQ("namespace out {\n"
1449 "int i;\n"
1450 "namespace in {\n"
1451 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001452 "} // namespace in\n"
1453 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001454 format("namespace out {\n"
1455 "int i;\n"
1456 "namespace in {\n"
1457 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001458 "} // namespace in\n"
1459 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001460 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001461}
1462
Francois Ferrande56a8292017-06-14 12:29:47 +00001463TEST_F(FormatTest, FormatsCompactNamespaces) {
1464 FormatStyle Style = getLLVMStyle();
1465 Style.CompactNamespaces = true;
1466
1467 verifyFormat("namespace A { namespace B {\n"
1468 "}} // namespace A::B",
1469 Style);
1470
1471 EXPECT_EQ("namespace out { namespace in {\n"
1472 "}} // namespace out::in",
1473 format("namespace out {\n"
1474 "namespace in {\n"
1475 "} // namespace in\n"
1476 "} // namespace out",
1477 Style));
1478
1479 // Only namespaces which have both consecutive opening and end get compacted
1480 EXPECT_EQ("namespace out {\n"
1481 "namespace in1 {\n"
1482 "} // namespace in1\n"
1483 "namespace in2 {\n"
1484 "} // namespace in2\n"
1485 "} // namespace out",
1486 format("namespace out {\n"
1487 "namespace in1 {\n"
1488 "} // namespace in1\n"
1489 "namespace in2 {\n"
1490 "} // namespace in2\n"
1491 "} // namespace out",
1492 Style));
1493
1494 EXPECT_EQ("namespace out {\n"
1495 "int i;\n"
1496 "namespace in {\n"
1497 "int j;\n"
1498 "} // namespace in\n"
1499 "int k;\n"
1500 "} // namespace out",
1501 format("namespace out { int i;\n"
1502 "namespace in { int j; } // namespace in\n"
1503 "int k; } // namespace out",
1504 Style));
1505
1506 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1507 "}}} // namespace A::B::C\n",
1508 format("namespace A { namespace B {\n"
1509 "namespace C {\n"
1510 "}} // namespace B::C\n"
1511 "} // namespace A\n",
1512 Style));
1513
1514 Style.ColumnLimit = 40;
1515 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1516 "namespace bbbbbbbbbb {\n"
1517 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1518 format("namespace aaaaaaaaaa {\n"
1519 "namespace bbbbbbbbbb {\n"
1520 "} // namespace bbbbbbbbbb\n"
1521 "} // namespace aaaaaaaaaa",
1522 Style));
1523
1524 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1525 "namespace cccccc {\n"
1526 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1527 format("namespace aaaaaa {\n"
1528 "namespace bbbbbb {\n"
1529 "namespace cccccc {\n"
1530 "} // namespace cccccc\n"
1531 "} // namespace bbbbbb\n"
1532 "} // namespace aaaaaa",
1533 Style));
1534 Style.ColumnLimit = 80;
1535
1536 // Extra semicolon after 'inner' closing brace prevents merging
1537 EXPECT_EQ("namespace out { namespace in {\n"
1538 "}; } // namespace out::in",
1539 format("namespace out {\n"
1540 "namespace in {\n"
1541 "}; // namespace in\n"
1542 "} // namespace out",
1543 Style));
1544
1545 // Extra semicolon after 'outer' closing brace is conserved
1546 EXPECT_EQ("namespace out { namespace in {\n"
1547 "}}; // namespace out::in",
1548 format("namespace out {\n"
1549 "namespace in {\n"
1550 "} // namespace in\n"
1551 "}; // namespace out",
1552 Style));
1553
1554 Style.NamespaceIndentation = FormatStyle::NI_All;
1555 EXPECT_EQ("namespace out { namespace in {\n"
1556 " int i;\n"
1557 "}} // namespace out::in",
1558 format("namespace out {\n"
1559 "namespace in {\n"
1560 "int i;\n"
1561 "} // namespace in\n"
1562 "} // namespace out",
1563 Style));
1564 EXPECT_EQ("namespace out { namespace mid {\n"
1565 " namespace in {\n"
1566 " int j;\n"
1567 " } // namespace in\n"
1568 " int k;\n"
1569 "}} // namespace out::mid",
1570 format("namespace out { namespace mid {\n"
1571 "namespace in { int j; } // namespace in\n"
1572 "int k; }} // namespace out::mid",
1573 Style));
1574
1575 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1576 EXPECT_EQ("namespace out { namespace in {\n"
1577 " int i;\n"
1578 "}} // namespace out::in",
1579 format("namespace out {\n"
1580 "namespace in {\n"
1581 "int i;\n"
1582 "} // namespace in\n"
1583 "} // namespace out",
1584 Style));
1585 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1586 " int i;\n"
1587 "}}} // namespace out::mid::in",
1588 format("namespace out {\n"
1589 "namespace mid {\n"
1590 "namespace in {\n"
1591 "int i;\n"
1592 "} // namespace in\n"
1593 "} // namespace mid\n"
1594 "} // namespace out",
1595 Style));
1596}
1597
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001598TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001599
Daniel Jasper40aacf42013-03-14 13:45:21 +00001600TEST_F(FormatTest, FormatsInlineASM) {
1601 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001602 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001603 verifyFormat(
1604 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1605 " \"cpuid\\n\\t\"\n"
1606 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001607 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001608 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001609 EXPECT_EQ(
1610 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001611 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001612 " mov edx,[that] // vtable in edx\n"
1613 " mov eax,methodIndex\n"
1614 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001615 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001616 "}",
1617 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1618 " __asm {\n"
1619 " mov edx,[that] // vtable in edx\n"
1620 " mov eax,methodIndex\n"
1621 " call [edx][eax*4] // stdcall\n"
1622 " }\n"
1623 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001624 EXPECT_EQ("_asm {\n"
1625 " xor eax, eax;\n"
1626 " cpuid;\n"
1627 "}",
1628 format("_asm {\n"
1629 " xor eax, eax;\n"
1630 " cpuid;\n"
1631 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001632 verifyFormat("void function() {\n"
1633 " // comment\n"
1634 " asm(\"\");\n"
1635 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001636 EXPECT_EQ("__asm {\n"
1637 "}\n"
1638 "int i;",
1639 format("__asm {\n"
1640 "}\n"
1641 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001642}
1643
Nico Weberd5650bd2013-01-07 16:36:17 +00001644TEST_F(FormatTest, FormatTryCatch) {
1645 verifyFormat("try {\n"
1646 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001647 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001648 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001649 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001650 " exit(42);\n"
1651 "}");
1652
1653 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001654 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001655 " return 5;\n"
1656 "}");
1657 verifyFormat("class A {\n"
1658 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001659 " A() try : a(0) {\n"
1660 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001661 " throw;\n"
1662 " }\n"
1663 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001664
1665 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001666 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001667}
1668
Nico Weberfac23712015-02-04 15:26:27 +00001669TEST_F(FormatTest, FormatSEHTryCatch) {
1670 verifyFormat("__try {\n"
1671 " int a = b * c;\n"
1672 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1673 " // Do nothing.\n"
1674 "}");
1675
1676 verifyFormat("__try {\n"
1677 " int a = b * c;\n"
1678 "} __finally {\n"
1679 " // Do nothing.\n"
1680 "}");
1681
1682 verifyFormat("DEBUG({\n"
1683 " __try {\n"
1684 " } __finally {\n"
1685 " }\n"
1686 "});\n");
1687}
1688
Daniel Jasper04a71a42014-05-08 11:58:24 +00001689TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1690 verifyFormat("try {\n"
1691 " f();\n"
1692 "} catch {\n"
1693 " g();\n"
1694 "}");
1695 verifyFormat("try {\n"
1696 " f();\n"
1697 "} catch (A a) MACRO(x) {\n"
1698 " g();\n"
1699 "} catch (B b) MACRO(x) {\n"
1700 " g();\n"
1701 "}");
1702}
1703
1704TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1705 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001706 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1707 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001708 Style.BreakBeforeBraces = BraceStyle;
1709 verifyFormat("try {\n"
1710 " // something\n"
1711 "} catch (...) {\n"
1712 " // something\n"
1713 "}",
1714 Style);
1715 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001716 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1717 verifyFormat("try {\n"
1718 " // something\n"
1719 "}\n"
1720 "catch (...) {\n"
1721 " // something\n"
1722 "}",
1723 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001724 verifyFormat("__try {\n"
1725 " // something\n"
1726 "}\n"
1727 "__finally {\n"
1728 " // something\n"
1729 "}",
1730 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001731 verifyFormat("@try {\n"
1732 " // something\n"
1733 "}\n"
1734 "@finally {\n"
1735 " // something\n"
1736 "}",
1737 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001738 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1739 verifyFormat("try\n"
1740 "{\n"
1741 " // something\n"
1742 "}\n"
1743 "catch (...)\n"
1744 "{\n"
1745 " // something\n"
1746 "}",
1747 Style);
1748 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1749 verifyFormat("try\n"
1750 " {\n"
1751 " // something\n"
1752 " }\n"
1753 "catch (...)\n"
1754 " {\n"
1755 " // something\n"
1756 " }",
1757 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001758 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1759 Style.BraceWrapping.BeforeCatch = true;
1760 verifyFormat("try {\n"
1761 " // something\n"
1762 "}\n"
1763 "catch (...) {\n"
1764 " // something\n"
1765 "}",
1766 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001767}
1768
Daniel Jaspere25509f2012-12-17 11:29:41 +00001769TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001770 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001771
Daniel Jaspera44991332015-04-29 13:06:49 +00001772 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1773 " 100000000, "
1774 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001775
Daniel Jasper473c62c2013-05-17 09:35:01 +00001776 // Here, everything other than the "}" would fit on a line.
1777 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001778 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001779 EXPECT_EQ("S s = {a,\n"
1780 "\n"
1781 " b};",
1782 format("S s = {\n"
1783 " a,\n"
1784 "\n"
1785 " b\n"
1786 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001787
1788 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1789 // line. However, the formatting looks a bit off and this probably doesn't
1790 // happen often in practice.
1791 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001792 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001793 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001794}
1795
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001796TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001797 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1798 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1799 " .bbbbbbbbbb = 2,\n"
1800 " .cccccccccc = 3,\n"
1801 " .dddddddddd = 4,\n"
1802 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001803 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001804 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1805 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1806 " .ccccccccccccccccccccccccccc = 3,\n"
1807 " .ddddddddddddddddddddddddddd = 4,\n"
1808 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001809
1810 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001811
1812 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1813 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1814 " [2] = bbbbbbbbbb,\n"
1815 " [3] = cccccccccc,\n"
1816 " [4] = dddddddddd,\n"
1817 " [5] = eeeeeeeeee};");
1818 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1819 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1820 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1821 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1822 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1823 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001824}
1825
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001826TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001827 verifyFormat("static A x = {{{}}};\n");
1828 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1829 " {init1, init2, init3, init4}}};",
1830 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001831
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001832 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001833 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1834 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1835 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1836 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001837 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001838 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1839 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1840 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001841 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1842 " {rect.fRight - rect.fLeft, rect.fBottom - "
1843 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001844
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001845 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001846 "SomeArrayOfSomeType a = {\n"
1847 " {{1, 2, 3},\n"
1848 " {1, 2, 3},\n"
1849 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1850 " 333333333333333333333333333333},\n"
1851 " {1, 2, 3},\n"
1852 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001853 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001854 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001855 " {{1, 2, 3}},\n"
1856 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001857 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1858 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001859 " {{1, 2, 3}},\n"
1860 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001861
Daniel Jaspera44991332015-04-29 13:06:49 +00001862 verifyFormat("struct {\n"
1863 " unsigned bit;\n"
1864 " const char *const name;\n"
1865 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1866 " {kOsWin, \"Windows\"},\n"
1867 " {kOsLinux, \"Linux\"},\n"
1868 " {kOsCrOS, \"Chrome OS\"}};");
1869 verifyFormat("struct {\n"
1870 " unsigned bit;\n"
1871 " const char *const name;\n"
1872 "} kBitsToOs[] = {\n"
1873 " {kOsMac, \"Mac\"},\n"
1874 " {kOsWin, \"Windows\"},\n"
1875 " {kOsLinux, \"Linux\"},\n"
1876 " {kOsCrOS, \"Chrome OS\"},\n"
1877 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001878}
1879
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001880TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1881 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1882 " \\\n"
1883 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1884}
1885
Daniel Jasperda16db32013-01-07 10:48:50 +00001886TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001887 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1888 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001889
1890 // Do break defaulted and deleted functions.
1891 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1892 " default;",
1893 getLLVMStyleWithColumns(40));
1894 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1895 " delete;",
1896 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001897}
1898
1899TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1900 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1901 getLLVMStyleWithColumns(40));
1902 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1903 getLLVMStyleWithColumns(40));
1904 EXPECT_EQ("#define Q \\\n"
1905 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1906 " \"aaaaaaaa.cpp\"",
1907 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1908 getLLVMStyleWithColumns(40)));
1909}
1910
1911TEST_F(FormatTest, UnderstandsLinePPDirective) {
1912 EXPECT_EQ("# 123 \"A string literal\"",
1913 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001914}
1915
Manuel Klimek591b5802013-01-31 15:58:48 +00001916TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001917 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001918 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001919}
1920
1921TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1922 EXPECT_EQ("#line 42 \"test\"\n",
1923 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001924 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1925 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001926}
1927
1928TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1929 EXPECT_EQ("#line 42 \"test\"",
1930 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001931 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001932}
1933
Daniel Jasper877615c2013-10-11 19:45:02 +00001934TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1935 verifyFormat("#define A \\x20");
1936 verifyFormat("#define A \\ x20");
1937 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1938 verifyFormat("#define A ''");
1939 verifyFormat("#define A ''qqq");
1940 verifyFormat("#define A `qqq");
1941 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001942 EXPECT_EQ("const char *c = STRINGIFY(\n"
1943 "\\na : b);",
1944 format("const char * c = STRINGIFY(\n"
1945 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001946
1947 verifyFormat("a\r\\");
1948 verifyFormat("a\v\\");
1949 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001950}
1951
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001952TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001953 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1954 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001955 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001956 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001957 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001958
1959 verifyFormat("#define A A\n#define A A");
1960 verifyFormat("#define A(X) A\n#define A A");
1961
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001962 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1963 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001964}
1965
1966TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001967 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001968 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001969 "#define A( \\\n"
1970 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001971 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001972 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001973 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001974 " #include \"a.h\"\n"
1975 "#define A(A,\\\n"
1976 " B)\n"
1977 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001978 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001979 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001980}
1981
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001982TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001983
1984TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1985 EXPECT_EQ("#define A \\\n"
1986 " c; \\\n"
1987 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001988 "f;",
1989 format("#define A c; e;\n"
1990 "f;",
1991 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001992}
1993
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001994TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001995
Manuel Klimek1abf7892013-01-04 23:34:14 +00001996TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001997 EXPECT_EQ("int x,\n"
1998 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001999 " y;",
2000 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002001}
2002
Manuel Klimek09e07972013-01-05 21:34:55 +00002003TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002004 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002005 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002006 verifyFormat("#define A \\\n"
2007 " { \\\n"
2008 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002009 " }",
2010 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002011
2012 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002013 " void function##X()",
2014 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002015
2016 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002017 " void a##b##c()",
2018 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002019
Daniel Jasper39825ea2013-01-14 15:40:57 +00002020 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002021}
2022
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002023TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002024 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2025 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002026}
2027
Manuel Klimek0c137952013-02-11 12:33:24 +00002028TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2029 EXPECT_EQ("#define A b;", format("#define A \\\n"
2030 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002031 " b;",
2032 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002033 EXPECT_EQ("#define A \\\n"
2034 " \\\n"
2035 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002036 " b;",
2037 format("#define A \\\n"
2038 " \\\n"
2039 " a; \\\n"
2040 " b;",
2041 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002042 EXPECT_EQ("#define A \\\n"
2043 " a; \\\n"
2044 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002045 " b;",
2046 format("#define A \\\n"
2047 " a; \\\n"
2048 " \\\n"
2049 " b;",
2050 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002051}
2052
Daniel Jasper00475962013-02-19 17:14:38 +00002053TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002054 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002055 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002056 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002057 " case 2\n",
2058 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002059 verifyFormat("#define MACRO(a) \\\n"
2060 " if (a) \\\n"
2061 " f(); \\\n"
2062 " else \\\n"
2063 " g()",
2064 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002065 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002066 verifyIncompleteFormat("#define STR(x) #x\n"
2067 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002068 verifyFormat("#pragma omp threadprivate( \\\n"
2069 " y)), // expected-warning",
2070 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002071 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002072 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002073 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002074 "#define b \\\n"
2075 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002076 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002077 "a",
2078 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002079 verifyFormat("#define A \\\n"
2080 " { \\\n"
2081 " {\n"
2082 "#define B \\\n"
2083 " } \\\n"
2084 " }",
2085 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002086 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002087 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002088 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002089 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002090}
2091
Daniel Jasper40e19212013-05-29 13:16:10 +00002092TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2093 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2094 EXPECT_EQ("class A : public QObject {\n"
2095 " Q_OBJECT\n"
2096 "\n"
2097 " A() {}\n"
2098 "};",
2099 format("class A : public QObject {\n"
2100 " Q_OBJECT\n"
2101 "\n"
2102 " A() {\n}\n"
2103 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002104 EXPECT_EQ("MACRO\n"
2105 "/*static*/ int i;",
2106 format("MACRO\n"
2107 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002108 EXPECT_EQ("SOME_MACRO\n"
2109 "namespace {\n"
2110 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002111 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002112 format("SOME_MACRO\n"
2113 " namespace {\n"
2114 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002115 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002116 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002117 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2118 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002119 // Only if everything is upper case.
2120 EXPECT_EQ("class A : public QObject {\n"
2121 " Q_Object A() {}\n"
2122 "};",
2123 format("class A : public QObject {\n"
2124 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002125 " A() {\n}\n"
2126 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002127
2128 // Only if the next line can actually start an unwrapped line.
2129 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2130 format("SOME_WEIRD_LOG_MACRO\n"
2131 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002132
2133 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002134 "(n, buffers))\n",
2135 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002136}
2137
Alexander Kornienkode644272013-04-08 22:16:06 +00002138TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2139 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2140 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2141 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002142 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002143 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2144 "int *createScopDetectionPass() { return 0; }",
2145 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2146 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2147 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2148 " class X {};\n"
2149 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2150 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002151 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2152 // braces, so that inner block is indented one level more.
2153 EXPECT_EQ("int q() {\n"
2154 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2155 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2156 " IPC_END_MESSAGE_MAP()\n"
2157 "}",
2158 format("int q() {\n"
2159 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2160 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2161 " IPC_END_MESSAGE_MAP()\n"
2162 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002163
Daniel Jasper352dae12014-01-03 11:50:46 +00002164 // Same inside macros.
2165 EXPECT_EQ("#define LIST(L) \\\n"
2166 " L(A) \\\n"
2167 " L(B) \\\n"
2168 " L(C)",
2169 format("#define LIST(L) \\\n"
2170 " L(A) \\\n"
2171 " L(B) \\\n"
2172 " L(C)",
2173 getGoogleStyle()));
2174
Daniel Jasper545c6522013-09-17 09:26:07 +00002175 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002176 EXPECT_EQ("int q() {\n"
2177 " f(x);\n"
2178 " f(x) {}\n"
2179 " f(x)->g();\n"
2180 " f(x)->*g();\n"
2181 " f(x).g();\n"
2182 " f(x) = x;\n"
2183 " f(x) += x;\n"
2184 " f(x) -= x;\n"
2185 " f(x) *= x;\n"
2186 " f(x) /= x;\n"
2187 " f(x) %= x;\n"
2188 " f(x) &= x;\n"
2189 " f(x) |= x;\n"
2190 " f(x) ^= x;\n"
2191 " f(x) >>= x;\n"
2192 " f(x) <<= x;\n"
2193 " f(x)[y].z();\n"
2194 " LOG(INFO) << x;\n"
2195 " ifstream(x) >> x;\n"
2196 "}\n",
2197 format("int q() {\n"
2198 " f(x)\n;\n"
2199 " f(x)\n {}\n"
2200 " f(x)\n->g();\n"
2201 " f(x)\n->*g();\n"
2202 " f(x)\n.g();\n"
2203 " f(x)\n = x;\n"
2204 " f(x)\n += x;\n"
2205 " f(x)\n -= x;\n"
2206 " f(x)\n *= x;\n"
2207 " f(x)\n /= x;\n"
2208 " f(x)\n %= x;\n"
2209 " f(x)\n &= x;\n"
2210 " f(x)\n |= x;\n"
2211 " f(x)\n ^= x;\n"
2212 " f(x)\n >>= x;\n"
2213 " f(x)\n <<= x;\n"
2214 " f(x)\n[y].z();\n"
2215 " LOG(INFO)\n << x;\n"
2216 " ifstream(x)\n >> x;\n"
2217 "}\n"));
2218 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002219 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002220 " if (1) {\n"
2221 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002222 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002223 " while (1) {\n"
2224 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002225 " F(x)\n"
2226 " G(x);\n"
2227 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002228 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002229 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002230 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002231 " }\n"
2232 "}\n",
2233 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002234 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002235 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002236 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002237 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002238 "F(x)\n"
2239 "G(x);\n"
2240 "F(x)\n"
2241 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002242 "}\n"));
2243 EXPECT_EQ("class A {\n"
2244 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002245 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002246 " A(X x)\n" // FIXME: function-level try blocks are broken.
2247 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002248 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002249 " }\n"
2250 "};",
2251 format("class A {\n"
2252 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002253 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002254 " A(X x)\n"
2255 " try : t(0) {} catch (...) {}\n"
2256 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002257 EXPECT_EQ("class SomeClass {\n"
2258 "public:\n"
2259 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2260 "};",
2261 format("class SomeClass {\n"
2262 "public:\n"
2263 " SomeClass()\n"
2264 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2265 "};"));
2266 EXPECT_EQ("class SomeClass {\n"
2267 "public:\n"
2268 " SomeClass()\n"
2269 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2270 "};",
2271 format("class SomeClass {\n"
2272 "public:\n"
2273 " SomeClass()\n"
2274 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2275 "};",
2276 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002277
2278 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002279}
2280
Manuel Klimek4fe43002013-05-22 12:51:29 +00002281TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2282 verifyFormat("#define A \\\n"
2283 " f({ \\\n"
2284 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002285 " });",
2286 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002287}
2288
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002289TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
2290 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
2291}
2292
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002293TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002294 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002295}
2296
Manuel Klimek1058d982013-01-06 20:07:31 +00002297TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2298 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2299 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2300 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2301 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2302}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002303
Daniel Jaspere2408e32015-05-06 11:16:43 +00002304TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002305 EXPECT_EQ(
2306 "#define A \\\n int i; \\\n int j;",
2307 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002308 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002309 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002310 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002311 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002312}
2313
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002314TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2315 verifyFormat("#define A \\\n"
2316 " int v( \\\n"
2317 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002318 " int i;",
2319 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002320}
2321
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002322TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002323 EXPECT_EQ(
2324 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2325 " \\\n"
2326 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2327 "\n"
2328 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2329 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2330 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2331 "\\\n"
2332 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2333 " \n"
2334 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2335 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002336}
2337
Manuel Klimek52b15152013-01-09 15:25:02 +00002338TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2339 EXPECT_EQ("int\n"
2340 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002341 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002342 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002343 verifyFormat("functionCallTo(\n"
2344 " someOtherFunction(\n"
2345 " withSomeParameters, whichInSequence,\n"
2346 " areLongerThanALine(andAnotherCall,\n"
2347 "#define A B\n"
2348 " withMoreParamters,\n"
2349 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002350 " andMoreParameters),\n"
2351 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002352 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002353 verifyFormat("Foo::Foo()\n"
2354 "#ifdef BAR\n"
2355 " : baz(0)\n"
2356 "#endif\n"
2357 "{\n"
2358 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002359 verifyFormat("void f() {\n"
2360 " if (true)\n"
2361 "#ifdef A\n"
2362 " f(42);\n"
2363 " x();\n"
2364 "#else\n"
2365 " g();\n"
2366 " x();\n"
2367 "#endif\n"
2368 "}");
2369 verifyFormat("void f(param1, param2,\n"
2370 " param3,\n"
2371 "#ifdef A\n"
2372 " param4(param5,\n"
2373 "#ifdef A1\n"
2374 " param6,\n"
2375 "#ifdef A2\n"
2376 " param7),\n"
2377 "#else\n"
2378 " param8),\n"
2379 " param9,\n"
2380 "#endif\n"
2381 " param10,\n"
2382 "#endif\n"
2383 " param11)\n"
2384 "#else\n"
2385 " param12)\n"
2386 "#endif\n"
2387 "{\n"
2388 " x();\n"
2389 "}",
2390 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002391 verifyFormat("#if 1\n"
2392 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002393 verifyFormat("#if 1\n"
2394 "#endif\n"
2395 "#if 1\n"
2396 "#else\n"
2397 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002398 verifyFormat("DEBUG({\n"
2399 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2401 "});\n"
2402 "#if a\n"
2403 "#else\n"
2404 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002405
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002406 verifyIncompleteFormat("void f(\n"
2407 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002408 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002409 "#else\n"
2410 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002411}
2412
Manuel Klimek14bd9172014-01-29 08:49:02 +00002413TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2414 verifyFormat("#endif\n"
2415 "#if B");
2416}
2417
Manuel Klimek88033d72013-10-21 08:11:15 +00002418TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2419 FormatStyle SingleLine = getLLVMStyle();
2420 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002421 verifyFormat("#if 0\n"
2422 "#elif 1\n"
2423 "#endif\n"
2424 "void foo() {\n"
2425 " if (test) foo2();\n"
2426 "}",
2427 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002428}
2429
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002430TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002431 verifyFormat("functionCall({ int i; });");
2432 verifyFormat("functionCall({\n"
2433 " int i;\n"
2434 " int j;\n"
2435 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002436 verifyFormat("functionCall(\n"
2437 " {\n"
2438 " int i;\n"
2439 " int j;\n"
2440 " },\n"
2441 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002442 verifyFormat("functionA(functionB({\n"
2443 " int i;\n"
2444 " int j;\n"
2445 " }),\n"
2446 " aaaa, bbbb, cccc);");
2447 verifyFormat("functionCall(\n"
2448 " {\n"
2449 " int i;\n"
2450 " int j;\n"
2451 " },\n"
2452 " aaaa, bbbb, // comment\n"
2453 " cccc);");
2454 verifyFormat("functionA(functionB({\n"
2455 " int i;\n"
2456 " int j;\n"
2457 " }),\n"
2458 " aaaa, bbbb, // comment\n"
2459 " cccc);");
2460 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2461 verifyFormat("functionCall(aaaa, bbbb, {\n"
2462 " int i;\n"
2463 " int j;\n"
2464 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002465 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002466 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002467 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002468 " int i; // break\n"
2469 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2471 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002472 verifyFormat("DEBUG({\n"
2473 " if (a)\n"
2474 " f();\n"
2475 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002476}
2477
2478TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002479 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002480 "int i;",
2481 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002482}
2483
2484TEST_F(FormatTest, LayoutNestedBlocks) {
2485 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2486 " struct s {\n"
2487 " int i;\n"
2488 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002489 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002490 " for (int i = 0; i < 10; ++i)\n"
2491 " return;\n"
2492 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002493 verifyFormat("call(parameter, {\n"
2494 " something();\n"
2495 " // Comment using all columns.\n"
2496 " somethingelse();\n"
2497 "});",
2498 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002499 verifyFormat("DEBUG( //\n"
2500 " { f(); }, a);");
2501 verifyFormat("DEBUG( //\n"
2502 " {\n"
2503 " f(); //\n"
2504 " },\n"
2505 " a);");
2506
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002507 EXPECT_EQ("call(parameter, {\n"
2508 " something();\n"
2509 " // Comment too\n"
2510 " // looooooooooong.\n"
2511 " somethingElse();\n"
2512 "});",
2513 format("call(parameter, {\n"
2514 " something();\n"
2515 " // Comment too looooooooooong.\n"
2516 " somethingElse();\n"
2517 "});",
2518 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002519 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002520 EXPECT_EQ("DEBUG({ // comment\n"
2521 " int i;\n"
2522 "});",
2523 format("DEBUG({ // comment\n"
2524 "int i;\n"
2525 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002526 EXPECT_EQ("DEBUG({\n"
2527 " int i;\n"
2528 "\n"
2529 " // comment\n"
2530 " int j;\n"
2531 "});",
2532 format("DEBUG({\n"
2533 " int i;\n"
2534 "\n"
2535 " // comment\n"
2536 " int j;\n"
2537 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002538
2539 verifyFormat("DEBUG({\n"
2540 " if (a)\n"
2541 " return;\n"
2542 "});");
2543 verifyGoogleFormat("DEBUG({\n"
2544 " if (a) return;\n"
2545 "});");
2546 FormatStyle Style = getGoogleStyle();
2547 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002548 verifyFormat("Debug(aaaaa,\n"
2549 " {\n"
2550 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2551 " },\n"
2552 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002553 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002554
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002555 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2556
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002557 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002558}
2559
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002560TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2561 EXPECT_EQ("#define MACRO() \\\n"
2562 " Debug(aaa, /* force line break */ \\\n"
2563 " { \\\n"
2564 " int i; \\\n"
2565 " int j; \\\n"
2566 " })",
2567 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2568 " { int i; int j; })",
2569 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002570
2571 EXPECT_EQ("#define A \\\n"
2572 " [] { \\\n"
2573 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2574 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2575 " }",
2576 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2577 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2578 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002579}
2580
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002581TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2582 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002583 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002584 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002585}
2586
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002587TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2588 FormatStyle Style = getLLVMStyle();
2589 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2590 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2591 verifyFormat("FOO_BEGIN\n"
2592 " FOO_ENTRY\n"
2593 "FOO_END", Style);
2594 verifyFormat("FOO_BEGIN\n"
2595 " NESTED_FOO_BEGIN\n"
2596 " NESTED_FOO_ENTRY\n"
2597 " NESTED_FOO_END\n"
2598 "FOO_END", Style);
2599 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2600 " int x;\n"
2601 " x = 1;\n"
2602 "FOO_END(Baz)", Style);
2603}
2604
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002605//===----------------------------------------------------------------------===//
2606// Line break tests.
2607//===----------------------------------------------------------------------===//
2608
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002609TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002610 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002611 "void f() {\n"
2612 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2613 " parameter, parameter, parameter)),\n"
2614 " SecondLongCall(parameter));\n"
2615 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002616 verifyFormat(
2617 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2618 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2620 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2621 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002622 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2623 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2624 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2625 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002626 verifyFormat(
2627 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2628 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2630 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002631 verifyFormat("int a = bbbb && ccc &&\n"
2632 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002633 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002634 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002635}
2636
Daniel Jasperd69fc772013-05-08 14:12:04 +00002637TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2638 verifyFormat(
2639 "bool aaaaaaa =\n"
2640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2641 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002642 verifyFormat(
2643 "bool aaaaaaa =\n"
2644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2645 " bbbbbbbb();");
2646
Daniel Jasperd69fc772013-05-08 14:12:04 +00002647 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2648 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2649 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002650 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2652 " ccccccccc == ddddddddddd;");
2653 verifyFormat(
2654 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2656 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002657
2658 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2659 " aaaaaa) &&\n"
2660 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002661 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2662 " aaaaaa) >>\n"
2663 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002664 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002665 " SourceMgr.getSpellingColumnNumber(\n"
2666 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2667 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002668
Daniel Jasper68d888c2013-06-03 08:42:05 +00002669 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2670 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2671 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00002672 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2673 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
2674 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002675 verifyFormat("b = a &&\n"
2676 " // Comment\n"
2677 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002678
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002679 // If the LHS of a comparison is not a binary expression itself, the
2680 // additional linebreak confuses many people.
2681 verifyFormat(
2682 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2684 "}");
2685 verifyFormat(
2686 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2688 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002689 verifyFormat(
2690 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2692 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002693 // Even explicit parentheses stress the precedence enough to make the
2694 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002695 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2697 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002698 // This cases is borderline, but with the indentation it is still readable.
2699 verifyFormat(
2700 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2701 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2703 "}",
2704 getLLVMStyleWithColumns(75));
2705
2706 // If the LHS is a binary expression, we should still use the additional break
2707 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002708 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2710 " 5) {\n"
2711 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002712
Daniel Jasper571f1af2013-05-14 20:39:56 +00002713 FormatStyle OnePerLine = getLLVMStyle();
2714 OnePerLine.BinPackParameters = false;
2715 verifyFormat(
2716 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2719 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002720
2721 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2722 " .aaa(aaaaaaaaaaaaa) *\n"
2723 " aaaaaaa +\n"
2724 " aaaaaaa;",
2725 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002726}
2727
Daniel Jasper6bee6822013-04-08 20:33:42 +00002728TEST_F(FormatTest, ExpressionIndentation) {
2729 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2733 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2734 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2737 " ccccccccccccccccccccccccccccccccccccccccc;");
2738 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2741 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2742 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2745 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2746 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2749 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002750 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002751 "} else if (aaaaa && bbbbb > // break\n"
2752 " ccccc) {\n"
2753 "}");
2754 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002755 "} else if (aaaaa &&\n"
2756 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002757 " ccccc &&\n"
2758 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002759 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002760
2761 // Presence of a trailing comment used to change indentation of b.
2762 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2763 " b;\n"
2764 "return aaaaaaaaaaaaaaaaaaa +\n"
2765 " b; //",
2766 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002767}
2768
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002769TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2770 // Not sure what the best system is here. Like this, the LHS can be found
2771 // immediately above an operator (everything with the same or a higher
2772 // indent). The RHS is aligned right of the operator and so compasses
2773 // everything until something with the same indent as the operator is found.
2774 // FIXME: Is this a good system?
2775 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002776 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002777 verifyFormat(
2778 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002779 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2780 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2781 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2782 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2783 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002784 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002785 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2786 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002787 Style);
2788 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002789 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2790 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002791 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2792 Style);
2793 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002794 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2795 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002796 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2797 Style);
2798 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2799 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002800 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2801 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002802 Style);
2803 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002804 "} else if (aaaaa\n"
2805 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002806 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002807 "}",
2808 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002809 verifyFormat("return (a)\n"
2810 " // comment\n"
2811 " + b;",
2812 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002813 verifyFormat(
2814 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2815 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2816 " + cc;",
2817 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002818
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002819 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2820 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2821 Style);
2822
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002823 // Forced by comments.
2824 verifyFormat(
2825 "unsigned ContentSize =\n"
2826 " sizeof(int16_t) // DWARF ARange version number\n"
2827 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2828 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2829 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002830
2831 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2832 " == boost::fusion::at_c<1>(iiii).second;",
2833 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002834
2835 Style.ColumnLimit = 60;
2836 verifyFormat("zzzzzzzzzz\n"
2837 " = bbbbbbbbbbbbbbbbb\n"
2838 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2839 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002840}
2841
Daniel Jasperb1270392017-02-01 23:27:37 +00002842TEST_F(FormatTest, EnforcedOperatorWraps) {
2843 // Here we'd like to wrap after the || operators, but a comment is forcing an
2844 // earlier wrap.
2845 verifyFormat("bool x = aaaaa //\n"
2846 " || bbbbb\n"
2847 " //\n"
2848 " || cccc;");
2849}
2850
Daniel Jasper3219e432014-12-02 13:24:51 +00002851TEST_F(FormatTest, NoOperandAlignment) {
2852 FormatStyle Style = getLLVMStyle();
2853 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002854 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2857 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002858 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002859 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2860 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2861 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2862 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2863 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2864 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2865 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2866 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2867 " > ccccccccccccccccccccccccccccccccccccccccc;",
2868 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002869
2870 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2871 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2872 " + cc;",
2873 Style);
2874 verifyFormat("int a = aa\n"
2875 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002876 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002877 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002878
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002879 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002880 verifyFormat("return (a > b\n"
2881 " // comment1\n"
2882 " // comment2\n"
2883 " || c);",
2884 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002885}
2886
Daniel Jasperac043c92014-09-15 11:11:00 +00002887TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2888 FormatStyle Style = getLLVMStyle();
2889 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2890 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002892 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2893 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002894}
2895
Daniel Jasper988e7e42017-05-08 15:07:52 +00002896TEST_F(FormatTest, AllowBinPackingInsideArguments) {
2897 FormatStyle Style = getLLVMStyle();
2898 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2899 Style.BinPackArguments = false;
2900 Style.ColumnLimit = 40;
2901 verifyFormat("void test() {\n"
2902 " someFunction(\n"
2903 " this + argument + is + quite\n"
2904 " + long + so + it + gets + wrapped\n"
2905 " + but + remains + bin - packed);\n"
2906 "}",
2907 Style);
2908 verifyFormat("void test() {\n"
2909 " someFunction(arg1,\n"
2910 " this + argument + is\n"
2911 " + quite + long + so\n"
2912 " + it + gets + wrapped\n"
2913 " + but + remains + bin\n"
2914 " - packed,\n"
2915 " arg3);\n"
2916 "}",
2917 Style);
2918 verifyFormat("void test() {\n"
2919 " someFunction(\n"
2920 " arg1,\n"
2921 " this + argument + has\n"
2922 " + anotherFunc(nested,\n"
2923 " calls + whose\n"
2924 " + arguments\n"
2925 " + are + also\n"
2926 " + wrapped,\n"
2927 " in + addition)\n"
2928 " + to + being + bin - packed,\n"
2929 " arg3);\n"
2930 "}",
2931 Style);
2932
2933 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
2934 verifyFormat("void test() {\n"
2935 " someFunction(\n"
2936 " arg1,\n"
2937 " this + argument + has +\n"
2938 " anotherFunc(nested,\n"
2939 " calls + whose +\n"
2940 " arguments +\n"
2941 " are + also +\n"
2942 " wrapped,\n"
2943 " in + addition) +\n"
2944 " to + being + bin - packed,\n"
2945 " arg3);\n"
2946 "}",
2947 Style);
2948}
2949
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002950TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002951 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002952 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2953 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002954 verifyFormat("Constructor()\n"
2955 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002956 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002957 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002958 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002959 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002960
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002961 verifyFormat("template <typename T>\n"
2962 "Constructor() : Initializer(FitsOnTheLine) {}",
2963 getLLVMStyleWithColumns(45));
2964
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002965 verifyFormat(
2966 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002967 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002968
2969 verifyFormat(
2970 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002971 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002972 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002973 verifyFormat(
2974 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002975 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002976 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002977 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2978 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2979 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002980
2981 verifyFormat("Constructor()\n"
2982 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2983 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2984 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002985 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002986
Daniel Jasper65585ed2013-01-28 13:31:35 +00002987 verifyFormat("Constructor()\n"
2988 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002990
Daniel Jasper62e68172013-02-25 15:59:54 +00002991 verifyFormat("Constructor(int Parameter = 0)\n"
2992 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2993 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002994 verifyFormat("Constructor()\n"
2995 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2996 "}",
2997 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002998 verifyFormat("Constructor()\n"
2999 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3000 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003001
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003002 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003003 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003004 verifyFormat("Constructor()\n"
3005 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3006 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3007 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003008
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003009 FormatStyle OnePerLine = getLLVMStyle();
3010 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003011 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003012 verifyFormat("SomeClass::Constructor()\n"
3013 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3014 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003015 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003016 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003017 verifyFormat("SomeClass::Constructor()\n"
3018 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3019 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003020 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003021 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003022 verifyFormat("MyClass::MyClass(int var)\n"
3023 " : some_var_(var), // 4 space indent\n"
3024 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003025 "}",
3026 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003027 verifyFormat("Constructor()\n"
3028 " : aaaaa(aaaaaa),\n"
3029 " aaaaa(aaaaaa),\n"
3030 " aaaaa(aaaaaa),\n"
3031 " aaaaa(aaaaaa),\n"
3032 " aaaaa(aaaaaa) {}",
3033 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003034 verifyFormat("Constructor()\n"
3035 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3036 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3037 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003038 OnePerLine.BinPackParameters = false;
3039 verifyFormat(
3040 "Constructor()\n"
3041 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3042 " aaaaaaaaaaa().aaa(),\n"
3043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3044 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003045 OnePerLine.ColumnLimit = 60;
3046 verifyFormat("Constructor()\n"
3047 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3048 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3049 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003050
3051 EXPECT_EQ("Constructor()\n"
3052 " : // Comment forcing unwanted break.\n"
3053 " aaaa(aaaa) {}",
3054 format("Constructor() :\n"
3055 " // Comment forcing unwanted break.\n"
3056 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003057}
3058
Francois Ferranda6b6d512017-05-24 11:36:58 +00003059TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3060 FormatStyle Style = getLLVMStyle();
3061 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3062
3063 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3064 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3065 getStyleWithColumns(Style, 45));
3066 verifyFormat("Constructor() :\n"
3067 " Initializer(FitsOnTheLine) {}",
3068 getStyleWithColumns(Style, 44));
3069 verifyFormat("Constructor() :\n"
3070 " Initializer(FitsOnTheLine) {}",
3071 getStyleWithColumns(Style, 43));
3072
3073 verifyFormat("template <typename T>\n"
3074 "Constructor() : Initializer(FitsOnTheLine) {}",
3075 getStyleWithColumns(Style, 50));
3076
3077 verifyFormat(
3078 "SomeClass::Constructor() :\n"
3079 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3080 Style);
3081
3082 verifyFormat(
3083 "SomeClass::Constructor() :\n"
3084 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3085 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3086 Style);
3087 verifyFormat(
3088 "SomeClass::Constructor() :\n"
3089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3090 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3091 Style);
3092 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3093 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3094 " aaaaaaaaaa(aaaaaa) {}",
3095 Style);
3096
3097 verifyFormat("Constructor() :\n"
3098 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3099 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3100 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3101 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3102 Style);
3103
3104 verifyFormat("Constructor() :\n"
3105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3107 Style);
3108
3109 verifyFormat("Constructor(int Parameter = 0) :\n"
3110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3111 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3112 Style);
3113 verifyFormat("Constructor() :\n"
3114 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3115 "}",
3116 getStyleWithColumns(Style, 60));
3117 verifyFormat("Constructor() :\n"
3118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3120 Style);
3121
3122 // Here a line could be saved by splitting the second initializer onto two
3123 // lines, but that is not desirable.
3124 verifyFormat("Constructor() :\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3126 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3127 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3128 Style);
3129
3130 FormatStyle OnePerLine = Style;
3131 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3132 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3133 verifyFormat("SomeClass::Constructor() :\n"
3134 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3135 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3136 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3137 OnePerLine);
3138 verifyFormat("SomeClass::Constructor() :\n"
3139 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3140 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3141 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3142 OnePerLine);
3143 verifyFormat("MyClass::MyClass(int var) :\n"
3144 " some_var_(var), // 4 space indent\n"
3145 " some_other_var_(var + 1) { // lined up\n"
3146 "}",
3147 OnePerLine);
3148 verifyFormat("Constructor() :\n"
3149 " aaaaa(aaaaaa),\n"
3150 " aaaaa(aaaaaa),\n"
3151 " aaaaa(aaaaaa),\n"
3152 " aaaaa(aaaaaa),\n"
3153 " aaaaa(aaaaaa) {}",
3154 OnePerLine);
3155 verifyFormat("Constructor() :\n"
3156 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3157 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3158 OnePerLine);
3159 OnePerLine.BinPackParameters = false;
3160 verifyFormat(
3161 "Constructor() :\n"
3162 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3163 " aaaaaaaaaaa().aaa(),\n"
3164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3165 OnePerLine);
3166 OnePerLine.ColumnLimit = 60;
3167 verifyFormat("Constructor() :\n"
3168 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3169 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3170 OnePerLine);
3171
3172 EXPECT_EQ("Constructor() :\n"
3173 " // Comment forcing unwanted break.\n"
3174 " aaaa(aaaa) {}",
3175 format("Constructor() :\n"
3176 " // Comment forcing unwanted break.\n"
3177 " aaaa(aaaa) {}",
3178 Style));
3179
3180 Style.ColumnLimit = 0;
3181 verifyFormat("SomeClass::Constructor() :\n"
3182 " a(a) {}",
3183 Style);
3184 verifyFormat("SomeClass::Constructor() noexcept :\n"
3185 " a(a) {}",
3186 Style);
3187 verifyFormat("SomeClass::Constructor() :\n"
3188 " a(a), b(b), c(c) {}",
3189 Style);
3190 verifyFormat("SomeClass::Constructor() :\n"
3191 " a(a) {\n"
3192 " foo();\n"
3193 " bar();\n"
3194 "}",
3195 Style);
3196
3197 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3198 verifyFormat("SomeClass::Constructor() :\n"
3199 " a(a), b(b), c(c) {\n"
3200 "}",
3201 Style);
3202 verifyFormat("SomeClass::Constructor() :\n"
3203 " a(a) {\n"
3204 "}",
3205 Style);
3206
3207 Style.ColumnLimit = 80;
3208 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3209 Style.ConstructorInitializerIndentWidth = 2;
3210 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3211 Style);
3212 verifyFormat("SomeClass::Constructor() :\n"
3213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3214 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3215 Style);
3216}
3217
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003218TEST_F(FormatTest, MemoizationTests) {
3219 // This breaks if the memoization lookup does not take \c Indent and
3220 // \c LastSpace into account.
3221 verifyFormat(
3222 "extern CFRunLoopTimerRef\n"
3223 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3224 " CFTimeInterval interval, CFOptionFlags flags,\n"
3225 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003226 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003227
3228 // Deep nesting somewhat works around our memoization.
3229 verifyFormat(
3230 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3231 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3232 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3233 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3234 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3235 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003236 verifyFormat(
3237 "aaaaa(\n"
3238 " aaaaa,\n"
3239 " aaaaa(\n"
3240 " aaaaa,\n"
3241 " aaaaa(\n"
3242 " aaaaa,\n"
3243 " aaaaa(\n"
3244 " aaaaa,\n"
3245 " aaaaa(\n"
3246 " aaaaa,\n"
3247 " aaaaa(\n"
3248 " aaaaa,\n"
3249 " aaaaa(\n"
3250 " aaaaa,\n"
3251 " aaaaa(\n"
3252 " aaaaa,\n"
3253 " aaaaa(\n"
3254 " aaaaa,\n"
3255 " aaaaa(\n"
3256 " aaaaa,\n"
3257 " aaaaa(\n"
3258 " aaaaa,\n"
3259 " aaaaa(\n"
3260 " aaaaa,\n"
3261 " aaaaa))))))))))));",
3262 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003263 verifyFormat(
3264 "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"
3265 " a),\n"
3266 " a),\n"
3267 " a),\n"
3268 " a),\n"
3269 " a),\n"
3270 " a),\n"
3271 " a),\n"
3272 " a),\n"
3273 " a),\n"
3274 " a),\n"
3275 " a),\n"
3276 " a),\n"
3277 " a),\n"
3278 " a),\n"
3279 " a),\n"
3280 " a),\n"
3281 " a)",
3282 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003283
3284 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003285 FormatStyle OnePerLine = getLLVMStyle();
3286 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003287 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003288 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003289 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003290 for (unsigned i = 0, e = 80; i != e; ++i) {
3291 input += " a,\n";
3292 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003293 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003294 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003295}
3296
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003297TEST_F(FormatTest, BreaksAsHighAsPossible) {
3298 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003299 "void f() {\n"
3300 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3301 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3302 " f();\n"
3303 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003304 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003305 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003306}
3307
Daniel Jasper6728fc12013-04-11 14:29:13 +00003308TEST_F(FormatTest, BreaksFunctionDeclarations) {
3309 // Principially, we break function declarations in a certain order:
3310 // 1) break amongst arguments.
3311 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3312 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003313 verifyFormat("template <class TemplateIt>\n"
3314 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3315 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003316
3317 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003318 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003319 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003320 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003321 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003322
3323 // 3) break after (.
3324 verifyFormat(
3325 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003326 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3327 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003328
3329 // 4) break before after nested name specifiers.
3330 verifyFormat(
3331 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003332 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3333 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003334 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003335
3336 // However, there are exceptions, if a sufficient amount of lines can be
3337 // saved.
3338 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3339 // more adjusting.
3340 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3341 " Cccccccccccccc cccccccccc,\n"
3342 " Cccccccccccccc cccccccccc,\n"
3343 " Cccccccccccccc cccccccccc,\n"
3344 " Cccccccccccccc cccccccccc);");
3345 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003346 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003347 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3348 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3349 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003350 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003351 verifyFormat(
3352 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3353 " Cccccccccccccc cccccccccc,\n"
3354 " Cccccccccccccc cccccccccc,\n"
3355 " Cccccccccccccc cccccccccc,\n"
3356 " Cccccccccccccc cccccccccc,\n"
3357 " Cccccccccccccc cccccccccc,\n"
3358 " Cccccccccccccc cccccccccc);");
3359 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3360 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3361 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3362 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3363 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003364
3365 // Break after multi-line parameters.
3366 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3369 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003370 verifyFormat("void SomeLoooooooooooongFunction(\n"
3371 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3372 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3373 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003374
3375 // Treat overloaded operators like other functions.
3376 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3377 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003378 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3379 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003380 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3381 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3382 verifyGoogleFormat(
3383 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3384 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003385 verifyGoogleFormat(
3386 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3387 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003388 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3389 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3390 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3391 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003392 verifyGoogleFormat(
3393 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3394 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3395 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003396 verifyGoogleFormat(
3397 "template <typename T>\n"
3398 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3399 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3400 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003401
3402 FormatStyle Style = getLLVMStyle();
3403 Style.PointerAlignment = FormatStyle::PAS_Left;
3404 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3405 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3406 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003407 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3409 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003410}
3411
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003412TEST_F(FormatTest, TrailingReturnType) {
3413 verifyFormat("auto foo() -> int;\n");
3414 verifyFormat("struct S {\n"
3415 " auto bar() const -> int;\n"
3416 "};");
3417 verifyFormat("template <size_t Order, typename T>\n"
3418 "auto load_img(const std::string &filename)\n"
3419 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003420 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3421 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003422 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003423 verifyFormat("template <typename T>\n"
3424 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3425 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003426
3427 // Not trailing return types.
3428 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003429}
3430
Daniel Jasper5be31f72013-05-21 09:16:31 +00003431TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003432 // Avoid breaking before trailing 'const' or other trailing annotations, if
3433 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003434 FormatStyle Style = getGoogleStyle();
3435 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003436 verifyFormat("void someLongFunction(\n"
3437 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003438 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003439 verifyFormat("LoooooongReturnType\n"
3440 "someLoooooooongFunction() const {}",
3441 getLLVMStyleWithColumns(47));
3442 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3443 " const {}",
3444 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003445 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3446 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3447 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3448 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3449 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3450 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003451 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3452 " aaaaaaaaaaa aaaaa) const override;");
3453 verifyGoogleFormat(
3454 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3455 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003456
Daniel Jasper5550de62014-02-17 07:57:46 +00003457 // Even if the first parameter has to be wrapped.
3458 verifyFormat("void someLongFunction(\n"
3459 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003460 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003461 verifyFormat("void someLongFunction(\n"
3462 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003463 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003464 verifyFormat("void someLongFunction(\n"
3465 " int someLongParameter) override {}",
3466 Style);
3467 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003468 " int someLongParameter) OVERRIDE {}",
3469 Style);
3470 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003471 " int someLongParameter) final {}",
3472 Style);
3473 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003474 " int someLongParameter) FINAL {}",
3475 Style);
3476 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003477 " int parameter) const override {}",
3478 Style);
3479
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003480 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3481 verifyFormat("void someLongFunction(\n"
3482 " int someLongParameter) const\n"
3483 "{\n"
3484 "}",
3485 Style);
3486
Daniel Jasper5550de62014-02-17 07:57:46 +00003487 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003488 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3489 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3490 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003491
3492 // Breaking before function-like trailing annotations is fine to keep them
3493 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003494 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3495 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3496 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3497 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3498 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3499 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003500 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3501 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003502 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003503
3504 verifyFormat(
3505 "void aaaaaaaaaaaaaaaaaa()\n"
3506 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3507 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3508 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3509 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003510 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003511 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003512 " GUARDED_BY(aaaaaaaaaaaa);");
3513 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003514 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003515 " GUARDED_BY(aaaaaaaaaaaa);");
3516 verifyGoogleFormat(
3517 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3518 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003519 verifyGoogleFormat(
3520 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3521 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003522}
3523
Daniel Jasperf090f032015-05-18 09:47:22 +00003524TEST_F(FormatTest, FunctionAnnotations) {
3525 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003526 "int OldFunction(const string &parameter) {}");
3527 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003528 "string OldFunction(const string &parameter) {}");
3529 verifyFormat("template <typename T>\n"
3530 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3531 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003532
3533 // Not function annotations.
3534 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3535 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003536 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3537 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003538 verifyFormat("MACRO(abc).function() // wrap\n"
3539 " << abc;");
3540 verifyFormat("MACRO(abc)->function() // wrap\n"
3541 " << abc;");
3542 verifyFormat("MACRO(abc)::function() // wrap\n"
3543 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003544}
3545
Daniel Jasperf7935112012-12-03 18:12:45 +00003546TEST_F(FormatTest, BreaksDesireably) {
3547 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3548 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003549 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003550 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3552 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003553
3554 verifyFormat(
3555 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003557
3558 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3559 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3560 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003561
3562 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003563 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3564 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003566 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003568
3569 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3570 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3571
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003572 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003573 "void f() {\n"
3574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3576 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003577 verifyFormat(
3578 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3580 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003581 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3583 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003584 "aaaaaa(aaa,\n"
3585 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3587 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003588 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003591
Daniel Jasper739b85f2015-06-29 10:42:59 +00003592 // Indent consistently independent of call expression and unary operator.
3593 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3594 " dddddddddddddddddddddddddddddd));");
3595 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3596 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003597 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003598 " dddddddddddddddddddddddddddddd));");
3599
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003600 // This test case breaks on an incorrect memoization, i.e. an optimization not
3601 // taking into account the StopAt value.
3602 verifyFormat(
3603 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003604 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3605 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3606 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003607
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003608 verifyFormat("{\n {\n {\n"
3609 " Annotation.SpaceRequiredBefore =\n"
3610 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3611 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3612 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003613
3614 // Break on an outer level if there was a break on an inner level.
3615 EXPECT_EQ("f(g(h(a, // comment\n"
3616 " b, c),\n"
3617 " d, e),\n"
3618 " x, y);",
3619 format("f(g(h(a, // comment\n"
3620 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003621
3622 // Prefer breaking similar line breaks.
3623 verifyFormat(
3624 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3625 " NSTrackingMouseEnteredAndExited |\n"
3626 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003627}
3628
Daniel Jasper18210d72014-10-09 09:52:05 +00003629TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3630 FormatStyle NoBinPacking = getGoogleStyle();
3631 NoBinPacking.BinPackParameters = false;
3632 NoBinPacking.BinPackArguments = true;
3633 verifyFormat("void f() {\n"
3634 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3636 "}",
3637 NoBinPacking);
3638 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3639 " int aaaaaaaaaaaaaaaaaaaa,\n"
3640 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3641 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003642
Daniel Jasper00693b082016-01-09 15:56:47 +00003643 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3644 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3645 " vector<int> bbbbbbbbbbbbbbb);",
3646 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003647 // FIXME: This behavior difference is probably not wanted. However, currently
3648 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3649 // template arguments from BreakBeforeParameter being set because of the
3650 // one-per-line formatting.
3651 verifyFormat(
3652 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3653 " aaaaaaaaaa> aaaaaaaaaa);",
3654 NoBinPacking);
3655 verifyFormat(
3656 "void fffffffffff(\n"
3657 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3658 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003659}
3660
Daniel Jasper9278eb92013-01-16 14:59:02 +00003661TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003662 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003663 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003664 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003665 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3666 " aaaaaaaaaaaaaaaaaaaa,\n"
3667 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3668 NoBinPacking);
3669 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3670 " aaaaaaaaaaaaa,\n"
3671 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3672 NoBinPacking);
3673 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003674 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3675 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3677 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3679 NoBinPacking);
3680 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3681 " .aaaaaaaaaaaaaaaaaa();",
3682 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003683 verifyFormat("void f() {\n"
3684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3685 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3686 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003687 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003688
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003689 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003690 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3691 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003692 " aaaaaaaaaaaa);",
3693 NoBinPacking);
3694 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003695 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3696 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003697 " test);",
3698 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003699
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003700 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3701 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003702 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3703 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003704 NoBinPacking);
3705 verifyFormat("a(\"a\"\n"
3706 " \"a\",\n"
3707 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003708
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003709 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003710 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003711 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003713 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003714 verifyFormat(
3715 "void f() {\n"
3716 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3717 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003718 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003719 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003720 verifyFormat(
3721 "template <class SomeType, class SomeOtherType>\n"
3722 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3723 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003724}
3725
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003726TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3727 FormatStyle Style = getLLVMStyleWithColumns(15);
3728 Style.ExperimentalAutoDetectBinPacking = true;
3729 EXPECT_EQ("aaa(aaaa,\n"
3730 " aaaa,\n"
3731 " aaaa);\n"
3732 "aaa(aaaa,\n"
3733 " aaaa,\n"
3734 " aaaa);",
3735 format("aaa(aaaa,\n" // one-per-line
3736 " aaaa,\n"
3737 " aaaa );\n"
3738 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3739 Style));
3740 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3741 " aaaa);\n"
3742 "aaa(aaaa, aaaa,\n"
3743 " aaaa);",
3744 format("aaa(aaaa, aaaa,\n" // bin-packed
3745 " aaaa );\n"
3746 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3747 Style));
3748}
3749
Daniel Jasper04468962013-01-18 10:56:38 +00003750TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003751 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3752 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3753 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3754 " .StartsWith(\".init\", ORDER_INIT)\n"
3755 " .StartsWith(\".fini\", ORDER_FINI)\n"
3756 " .StartsWith(\".hash\", ORDER_HASH)\n"
3757 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003758
Daniel Jaspereb50c672013-02-15 20:33:06 +00003759 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003760 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003761 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003762 "aaaaaaa->aaaaaaa\n"
3763 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003765 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003766 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003767 "aaaaaaa->aaaaaaa\n"
3768 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3769 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3770 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003771 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003772 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003773 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003774 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3775 " aaaaaa->aaaaaaaaaaaa()\n"
3776 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003778 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003779 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003780 "void f() {\n"
3781 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003782 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003783 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003784 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003785 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003786 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003787 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003788 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003789 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003790 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003791 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003792 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003793
3794 verifyFormat(
3795 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3796 verifyFormat("aaaaaaaaaaaaaaa()\n"
3797 " .aaaaaaaaaaaaaaa()\n"
3798 " .aaaaaaaaaaaaaaa()\n"
3799 " .aaaaaaaaaaaaaaa()\n"
3800 " .aaaaaaaaaaaaaaa();");
3801 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3802 " .aaaaaaaaaaaaaaa()\n"
3803 " .aaaaaaaaaaaaaaa()\n"
3804 " .aaaaaaaaaaaaaaa();");
3805 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3806 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3807 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003808 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3809 " ->aaaaaaaaaaaaaae(0)\n"
3810 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003811
Daniel Jasper775954b2015-04-24 10:08:09 +00003812 // Don't linewrap after very short segments.
3813 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3814 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3815 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3816 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3817 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3818 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3819 verifyFormat("aaa()\n"
3820 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3821 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3822 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3823
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003824 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3825 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3826 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3827 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3828 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003830
Daniel Jaspera41aa532014-09-19 08:01:25 +00003831 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003832 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3833 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003834
3835 // Prefer not to create "hanging" indents.
3836 verifyFormat(
3837 "return !soooooooooooooome_map\n"
3838 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3839 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003840 verifyFormat(
3841 "return aaaaaaaaaaaaaaaa\n"
3842 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3843 " .aaaa(aaaaaaaaaaaaaa);");
3844 // No hanging indent here.
3845 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3846 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3847 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003849 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3850 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3851 getLLVMStyleWithColumns(60));
3852 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3853 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3854 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3855 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003856 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3858 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003859}
3860
Daniel Jasperde5c2072012-12-24 00:13:23 +00003861TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3862 verifyFormat(
3863 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003864 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003865 verifyFormat(
3866 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3867 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3868
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003869 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003870 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003871 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3872 " ccccccccccccccccccccccccc) {\n}");
3873
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003874 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003875 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003876 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3877 " ccccccccccccccccccccccccc) {\n}");
3878
Daniel Jasperde5c2072012-12-24 00:13:23 +00003879 verifyFormat(
3880 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003881 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003882 verifyFormat(
3883 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3884 " ccccccccccccccccccccccccc) {\n}");
3885
Daniel Jasper400adc62013-02-08 15:28:42 +00003886 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3887 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3888 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3889 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003890 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3891 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3892 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3893 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3894
Daniel Jasper400adc62013-02-08 15:28:42 +00003895 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3897 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003898 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3899 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3900 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003901}
3902
Daniel Jasper43b65482013-01-23 12:27:43 +00003903TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003904 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003905 "unsigned Cost =\n"
3906 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3907 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003908 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003909 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3910 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003911
3912 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003913 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3914 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003915 verifyFormat("unsigned OriginalStartColumn =\n"
3916 " SourceMgr.getSpellingColumnNumber(\n"
3917 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3918 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003919}
3920
Francois Ferrand9976efa2017-05-22 08:28:17 +00003921TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
3922 FormatStyle Style = getLLVMStyle();
3923 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3924 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
3925 Style);
3926
3927 Style.PenaltyBreakAssignment = 20;
3928 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3929 " cccccccccccccccccccccccccc;",
3930 Style);
3931}
3932
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003933TEST_F(FormatTest, AlignsAfterAssignments) {
3934 verifyFormat(
3935 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003936 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003937 verifyFormat(
3938 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003939 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003940 verifyFormat(
3941 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003942 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003943 verifyFormat(
3944 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003945 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003946 verifyFormat(
3947 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3948 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3949 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003950}
3951
3952TEST_F(FormatTest, AlignsAfterReturn) {
3953 verifyFormat(
3954 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3955 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3956 verifyFormat(
3957 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3958 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003959 verifyFormat(
3960 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003961 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003962 verifyFormat(
3963 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003964 " aaaaaaaaaaaaaaaaaaaaaa());");
3965 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3967 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003970 verifyFormat("return\n"
3971 " // true if code is one of a or b.\n"
3972 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003973}
3974
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003975TEST_F(FormatTest, AlignsAfterOpenBracket) {
3976 verifyFormat(
3977 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3978 " aaaaaaaaa aaaaaaa) {}");
3979 verifyFormat(
3980 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3981 " aaaaaaaaaaa aaaaaaaaa);");
3982 verifyFormat(
3983 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3984 " aaaaaaaaaaaaaaaaaaaaa));");
3985 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003986 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003987 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3988 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3989 Style);
3990 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3991 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3992 Style);
3993 verifyFormat("SomeLongVariableName->someFunction(\n"
3994 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3995 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003996 verifyFormat(
3997 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3998 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3999 Style);
4000 verifyFormat(
4001 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4002 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4003 Style);
4004 verifyFormat(
4005 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4006 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4007 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004008
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004009 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4010 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4011 " b));",
4012 Style);
4013
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004014 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4015 Style.BinPackArguments = false;
4016 Style.BinPackParameters = false;
4017 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4018 " aaaaaaaaaaa aaaaaaaa,\n"
4019 " aaaaaaaaa aaaaaaa,\n"
4020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4021 Style);
4022 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4023 " aaaaaaaaaaa aaaaaaaaa,\n"
4024 " aaaaaaaaaaa aaaaaaaaa,\n"
4025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4026 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004027 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4028 " aaaaaaaaaaaaaaa,\n"
4029 " aaaaaaaaaaaaaaaaaaaaa,\n"
4030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004031 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004032 verifyFormat(
4033 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4034 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4035 Style);
4036 verifyFormat(
4037 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4038 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4039 Style);
4040 verifyFormat(
4041 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4042 " aaaaaaaaaaaaaaaaaaaaa(\n"
4043 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4044 " aaaaaaaaaaaaaaaa);",
4045 Style);
4046 verifyFormat(
4047 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4048 " aaaaaaaaaaaaaaaaaaaaa(\n"
4049 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4050 " aaaaaaaaaaaaaaaa);",
4051 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004052}
4053
Daniel Jasper3219e432014-12-02 13:24:51 +00004054TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4055 FormatStyle Style = getLLVMStyleWithColumns(40);
4056 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4057 " bbbbbbbbbbbbbbbbbbbbbb);",
4058 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004059 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004060 Style.AlignOperands = false;
4061 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4062 " bbbbbbbbbbbbbbbbbbbbbb);",
4063 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004064 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004065 Style.AlignOperands = true;
4066 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4067 " bbbbbbbbbbbbbbbbbbbbbb);",
4068 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004069 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004070 Style.AlignOperands = false;
4071 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4072 " bbbbbbbbbbbbbbbbbbbbbb);",
4073 Style);
4074}
4075
Daniel Jasper399d24b2013-01-09 07:06:56 +00004076TEST_F(FormatTest, BreaksConditionalExpressions) {
4077 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004078 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4079 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4080 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4081 verifyFormat(
4082 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004083 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4084 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004085 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004086 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4087 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4088 verifyFormat(
4089 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004090 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4091 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004092 verifyFormat(
4093 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4094 " : aaaaaaaaaaaaa);");
4095 verifyFormat(
4096 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004097 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004098 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4099 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004100 verifyFormat(
4101 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4102 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4103 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004104 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4105 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4107 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4109 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4111 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4113 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4115 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004116 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4118 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4120 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004121 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4122 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4123 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004124 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4126 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4127 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004128 verifyFormat(
4129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4130 " ? aaaaaaaaaaaaaaa\n"
4131 " : aaaaaaaaaaaaaaa;");
4132 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004133 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004134 " ? b\n"
4135 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004136 verifyFormat("return aaaa == bbbb\n"
4137 " // comment\n"
4138 " ? aaaa\n"
4139 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004140 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004141 " format(TheLine.First,\n"
4142 " IndentForLevel[TheLine.Level] >= 0\n"
4143 " ? IndentForLevel[TheLine.Level]\n"
4144 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004145 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004146 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004147 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4148 " ? aaaaaaaaaaaaaaa\n"
4149 " : bbbbbbbbbbbbbbb //\n"
4150 " ? ccccccccccccccc\n"
4151 " : ddddddddddddddd;");
4152 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4153 " ? aaaaaaaaaaaaaaa\n"
4154 " : (bbbbbbbbbbbbbbb //\n"
4155 " ? ccccccccccccccc\n"
4156 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004157 verifyFormat(
4158 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4159 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4160 " aaaaaaaaaaaaaaaaaaaaa +\n"
4161 " aaaaaaaaaaaaaaaaaaaaa\n"
4162 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004163 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004164 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4165 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4166 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004167
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004168 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004169 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004170 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004171 "void f() {\n"
4172 " g(aaa,\n"
4173 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4175 " ? aaaaaaaaaaaaaaa\n"
4176 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004177 "}",
4178 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004179 verifyFormat(
4180 "void f() {\n"
4181 " g(aaa,\n"
4182 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4184 " ?: aaaaaaaaaaaaaaa);\n"
4185 "}",
4186 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004187
4188 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4189 " // comment.\n"
4190 " ccccccccccccccccccccccccccccccccccccccc\n"
4191 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4192 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004193
4194 // Assignments in conditional expressions. Apparently not uncommon :-(.
4195 verifyFormat("return a != b\n"
4196 " // comment\n"
4197 " ? a = b\n"
4198 " : a = b;");
4199 verifyFormat("return a != b\n"
4200 " // comment\n"
4201 " ? a = a != b\n"
4202 " // comment\n"
4203 " ? a = b\n"
4204 " : a\n"
4205 " : a;\n");
4206 verifyFormat("return a != b\n"
4207 " // comment\n"
4208 " ? a\n"
4209 " : a = a != b\n"
4210 " // comment\n"
4211 " ? a = b\n"
4212 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004213}
4214
Daniel Jasper165b29e2013-11-08 00:57:11 +00004215TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4216 FormatStyle Style = getLLVMStyle();
4217 Style.BreakBeforeTernaryOperators = false;
4218 Style.ColumnLimit = 70;
4219 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004220 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4223 Style);
4224 verifyFormat(
4225 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004226 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004228 Style);
4229 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004230 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4232 Style);
4233 verifyFormat(
4234 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004235 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004237 Style);
4238 verifyFormat(
4239 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4240 " aaaaaaaaaaaaa);",
4241 Style);
4242 verifyFormat(
4243 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4244 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4246 " aaaaaaaaaaaaa);",
4247 Style);
4248 verifyFormat(
4249 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4250 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4251 " aaaaaaaaaaaaa);",
4252 Style);
4253 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4258 Style);
4259 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4265 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4266 Style);
4267 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4272 Style);
4273 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4274 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4275 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4276 Style);
4277 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4281 Style);
4282 verifyFormat(
4283 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4284 " aaaaaaaaaaaaaaa :\n"
4285 " aaaaaaaaaaaaaaa;",
4286 Style);
4287 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4288 " aaaaaaaaa ?\n"
4289 " b :\n"
4290 " c);",
4291 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004292 verifyFormat("unsigned Indent =\n"
4293 " format(TheLine.First,\n"
4294 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4295 " IndentForLevel[TheLine.Level] :\n"
4296 " TheLine * 2,\n"
4297 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4298 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004299 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4300 " aaaaaaaaaaaaaaa :\n"
4301 " bbbbbbbbbbbbbbb ? //\n"
4302 " ccccccccccccccc :\n"
4303 " ddddddddddddddd;",
4304 Style);
4305 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4306 " aaaaaaaaaaaaaaa :\n"
4307 " (bbbbbbbbbbbbbbb ? //\n"
4308 " ccccccccccccccc :\n"
4309 " ddddddddddddddd);",
4310 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004311 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4312 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4313 " ccccccccccccccccccccccccccc;",
4314 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004315 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4316 " aaaaa :\n"
4317 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4318 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004319}
4320
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004321TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4322 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4323 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4324 verifyFormat("bool a = true, b = false;");
4325
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004326 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004327 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004328 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004329 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004330 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004331 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004332 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004333 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004334 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4335 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4336 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4337 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4338 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4339 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004340
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004341 FormatStyle Style = getGoogleStyle();
4342 Style.PointerAlignment = FormatStyle::PAS_Left;
4343 Style.DerivePointerAlignment = false;
4344 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4345 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4346 " *b = bbbbbbbbbbbbbbbbbbb;",
4347 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004348 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4349 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4350 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004351 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004352 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004353}
4354
Nico Weber4a5030c2013-01-12 01:28:06 +00004355TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4356 verifyFormat("arr[foo ? bar : baz];");
4357 verifyFormat("f()[foo ? bar : baz];");
4358 verifyFormat("(a + b)[foo ? bar : baz];");
4359 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4360}
4361
Daniel Jasperf7935112012-12-03 18:12:45 +00004362TEST_F(FormatTest, AlignsStringLiterals) {
4363 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4364 " \"short literal\");");
4365 verifyFormat(
4366 "looooooooooooooooooooooooongFunction(\n"
4367 " \"short literal\"\n"
4368 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004369 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4370 " \" string literals\",\n"
4371 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004372 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4373 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004374 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004375 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004376 getLLVMStyleWithColumns(28)));
4377 EXPECT_EQ(
4378 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4379 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4380 " \"aaaaaaaaaaaaaaaa\";",
4381 format("aaaaaa ="
4382 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4383 "aaaaaaaaaaaaaaaaaaaaa\" "
4384 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004385 verifyFormat("a = a + \"a\"\n"
4386 " \"a\"\n"
4387 " \"a\";");
4388 verifyFormat("f(\"a\", \"b\"\n"
4389 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004390
4391 verifyFormat(
4392 "#define LL_FORMAT \"ll\"\n"
4393 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4394 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004395
4396 verifyFormat("#define A(X) \\\n"
4397 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4398 " \"ccccc\"",
4399 getLLVMStyleWithColumns(23));
4400 verifyFormat("#define A \"def\"\n"
4401 "f(\"abc\" A \"ghi\"\n"
4402 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004403
4404 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004405 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004406 verifyFormat("#define A(X) \\\n"
4407 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4408 " L\"ccccc\"",
4409 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004410
4411 verifyFormat("f(@\"a\"\n"
4412 " @\"b\");");
4413 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004414 " @\"b\"\n"
4415 " @\"c\";");
4416 verifyFormat("NSString s = @\"a\"\n"
4417 " \"b\"\n"
4418 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004419}
4420
Zachary Turner448592e2015-12-18 22:20:15 +00004421TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004422 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004423 // No declarations or definitions should be moved to own line.
4424 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4425 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004426 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004427 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004428 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004429 "int f() { return 1; }\n"
4430 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004431 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004432
4433 // All declarations and definitions should have the return type moved to its
4434 // own
4435 // line.
4436 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4437 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004438 " int\n"
4439 " f() {\n"
4440 " return 1;\n"
4441 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004442 " int\n"
4443 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004444 "};\n"
4445 "int\n"
4446 "f() {\n"
4447 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004448 "}\n"
4449 "int\n"
4450 "g();\n",
4451 Style);
4452
4453 // Top-level definitions, and no kinds of declarations should have the
4454 // return type moved to its own line.
4455 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4456 verifyFormat("class B {\n"
4457 " int f() { return 1; }\n"
4458 " int g();\n"
4459 "};\n"
4460 "int\n"
4461 "f() {\n"
4462 " return 1;\n"
4463 "}\n"
4464 "int g();\n",
4465 Style);
4466
4467 // Top-level definitions and declarations should have the return type moved
4468 // to its own line.
4469 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4470 verifyFormat("class C {\n"
4471 " int f() { return 1; }\n"
4472 " int g();\n"
4473 "};\n"
4474 "int\n"
4475 "f() {\n"
4476 " return 1;\n"
4477 "}\n"
4478 "int\n"
4479 "g();\n",
4480 Style);
4481
4482 // All definitions should have the return type moved to its own line, but no
4483 // kinds of declarations.
4484 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4485 verifyFormat("class D {\n"
4486 " int\n"
4487 " f() {\n"
4488 " return 1;\n"
4489 " }\n"
4490 " int g();\n"
4491 "};\n"
4492 "int\n"
4493 "f() {\n"
4494 " return 1;\n"
4495 "}\n"
4496 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004497 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004498 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004499 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004500 " return \"\";\n"
4501 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004502 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004503 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004504 verifyFormat("template <class T>\n"
4505 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004506 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004507 " return NULL;\n"
4508 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004509 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004510 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004511 verifyFormat("class C {\n"
4512 " int\n"
4513 " operator+() {\n"
4514 " return 1;\n"
4515 " }\n"
4516 " int\n"
4517 " operator()() {\n"
4518 " return 1;\n"
4519 " }\n"
4520 "};\n",
4521 Style);
4522 verifyFormat("void\n"
4523 "A::operator()() {}\n"
4524 "void\n"
4525 "A::operator>>() {}\n"
4526 "void\n"
4527 "A::operator+() {}\n",
4528 Style);
4529 verifyFormat("void *operator new(std::size_t s);", // No break here.
4530 Style);
4531 verifyFormat("void *\n"
4532 "operator new(std::size_t s) {}",
4533 Style);
4534 verifyFormat("void *\n"
4535 "operator delete[](void *ptr) {}",
4536 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004537 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004538 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004539 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004540 "{\n"
4541 " return \"\";\n"
4542 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004543 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004544 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004545 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004546 "T *\n" // Problem here: no line break
4547 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004548 "{\n"
4549 " return NULL;\n"
4550 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004551 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004552 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004553}
4554
Alexander Kornienko58611712013-07-04 12:02:44 +00004555TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4556 FormatStyle NoBreak = getLLVMStyle();
4557 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4558 FormatStyle Break = getLLVMStyle();
4559 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004560 verifyFormat("aaaa = \"bbbb\"\n"
4561 " \"cccc\";",
4562 NoBreak);
4563 verifyFormat("aaaa =\n"
4564 " \"bbbb\"\n"
4565 " \"cccc\";",
4566 Break);
4567 verifyFormat("aaaa(\"bbbb\"\n"
4568 " \"cccc\");",
4569 NoBreak);
4570 verifyFormat("aaaa(\n"
4571 " \"bbbb\"\n"
4572 " \"cccc\");",
4573 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004574 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4575 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004576 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004577 verifyFormat("aaaa(qqq,\n"
4578 " \"bbbb\"\n"
4579 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004580 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004581 verifyFormat("aaaa(qqq,\n"
4582 " L\"bbbb\"\n"
4583 " L\"cccc\");",
4584 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004585 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4586 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004587 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004588 verifyFormat("string s = someFunction(\n"
4589 " \"abc\"\n"
4590 " \"abc\");",
4591 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004592
Daniel Jasper3251fff2014-06-10 06:27:23 +00004593 // As we break before unary operators, breaking right after them is bad.
4594 verifyFormat("string foo = abc ? \"x\"\n"
4595 " \"blah blah blah blah blah blah\"\n"
4596 " : \"y\";",
4597 Break);
4598
Daniel Jasperc834c702013-07-17 15:38:19 +00004599 // Don't break if there is no column gain.
4600 verifyFormat("f(\"aaaa\"\n"
4601 " \"bbbb\");",
4602 Break);
4603
4604 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004605 EXPECT_EQ("x = \"a\\\n"
4606 "b\\\n"
4607 "c\";",
4608 format("x = \"a\\\n"
4609 "b\\\n"
4610 "c\";",
4611 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004612 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004613 " \"a\\\n"
4614 "b\\\n"
4615 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004616 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004617 "b\\\n"
4618 "c\";",
4619 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004620
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004621 EXPECT_EQ("NSString *const kString =\n"
4622 " @\"aaaa\"\n"
4623 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004624 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004625 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004626 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004627
4628 Break.ColumnLimit = 0;
4629 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004630}
4631
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004632TEST_F(FormatTest, AlignsPipes) {
4633 verifyFormat(
4634 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4635 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4636 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4637 verifyFormat(
4638 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4639 " << aaaaaaaaaaaaaaaaaaaa;");
4640 verifyFormat(
4641 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4642 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4643 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004644 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4645 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4646 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004647 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4648 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4649 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4650 verifyFormat(
4651 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4652 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4653 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004654 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4656 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4657 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004658 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4659 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004660 verifyFormat(
4661 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004663 verifyFormat(
4664 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4665 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004666
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004667 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4668 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004669 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4671 " aaaaaaaaaaaaaaaaaaaaa)\n"
4672 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004673 verifyFormat("LOG_IF(aaa == //\n"
4674 " bbb)\n"
4675 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004676
Daniel Jasper467ddb12013-08-12 12:58:05 +00004677 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004678 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4679 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004680 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4681 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4682 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004683 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4684 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004685 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4686 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4688 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4689 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4691 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004692
Daniel Jasperc238c872013-04-02 14:33:13 +00004693 verifyFormat(
4694 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4695 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004696
4697 // Incomplete string literal.
4698 EXPECT_EQ("llvm::errs() << \"\n"
4699 " << a;",
4700 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004701
4702 verifyFormat("void f() {\n"
4703 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4704 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4705 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004706
4707 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004708 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4709 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4710 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004711
4712 // Handle '\n'.
4713 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4714 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4715 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4716 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4717 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4718 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4719 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004720}
4721
Daniel Jasper7209bb92016-12-13 11:16:42 +00004722TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4723 verifyFormat("return out << \"somepacket = {\\n\"\n"
4724 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4725 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4726 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4727 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4728 " << \"}\";");
4729
4730 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4731 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4732 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4733 verifyFormat(
4734 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4735 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4736 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4737 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4738 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4739 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4740 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4741 verifyFormat(
4742 "void f() {\n"
4743 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4744 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4745 "}");
4746
4747 // Breaking before the first "<<" is generally not desirable.
4748 verifyFormat(
4749 "llvm::errs()\n"
4750 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4751 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4752 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4753 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4754 getLLVMStyleWithColumns(70));
4755 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4756 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4757 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4758 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4759 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4760 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4761 getLLVMStyleWithColumns(70));
4762
4763 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4764 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4765 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4766 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4767 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4768 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004769 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4770 " (aaaa + aaaa);",
4771 getLLVMStyleWithColumns(40));
4772 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4773 " (aaaaaaa + aaaaa));",
4774 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004775 verifyFormat(
4776 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4777 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4778 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004779}
4780
Daniel Jasperf7935112012-12-03 18:12:45 +00004781TEST_F(FormatTest, UnderstandsEquals) {
4782 verifyFormat(
4783 "aaaaaaaaaaaaaaaaa =\n"
4784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4785 verifyFormat(
4786 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004788 verifyFormat(
4789 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004790 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004791 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004792 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4793 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004794
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004795 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4796 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004797}
4798
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004799TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004800 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4801 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004802
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004803 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4804 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004805
4806 verifyFormat(
4807 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4808 " Parameter2);");
4809
4810 verifyFormat(
4811 "ShortObject->shortFunction(\n"
4812 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4813 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4814
4815 verifyFormat("loooooooooooooongFunction(\n"
4816 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4817
4818 verifyFormat(
4819 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4820 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4821
Daniel Jasper687af3b2013-02-14 14:26:07 +00004822 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4823 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004824 verifyFormat("void f() {\n"
4825 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4826 " .Times(2)\n"
4827 " .WillRepeatedly(Return(SomeValue));\n"
4828 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004829 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4830 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004831 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4833 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004834 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004835 verifyFormat("void f() {\n"
4836 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4837 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4838 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004839 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4840 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4841 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4842 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4843 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004844 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4845 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4846 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4847 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4848 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004849
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004850 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004851 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004852 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004853 verifyFormat(
4854 "aaaaaaaaaaa->aaaaaaaaa(\n"
4855 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4856 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004857
4858 verifyFormat(
4859 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004861 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4862 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4863 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4864 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004865
Daniel Jasper9b334242013-03-15 14:57:30 +00004866 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4868 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004869
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004870 FormatStyle NoBinPacking = getLLVMStyle();
4871 NoBinPacking.BinPackParameters = false;
4872 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4873 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4874 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4875 " aaaaaaaaaaaaaaaaaaa,\n"
4876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4877 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004878
4879 // If there is a subsequent call, change to hanging indentation.
4880 verifyFormat(
4881 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4882 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4883 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4884 verifyFormat(
4885 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4886 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004887 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4889 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4890 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4892 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004893}
4894
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004895TEST_F(FormatTest, WrapsTemplateDeclarations) {
4896 verifyFormat("template <typename T>\n"
4897 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004898 verifyFormat("template <typename T>\n"
4899 "// T should be one of {A, B}.\n"
4900 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004901 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004902 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004903 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004904 verifyFormat("template <typename T>\n"
4905 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4906 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004907 verifyFormat(
4908 "template <typename T>\n"
4909 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4910 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004911 verifyFormat(
4912 "template <typename T>\n"
4913 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4914 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004916 verifyFormat("template <typename T>\n"
4917 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004918 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004919 verifyFormat(
4920 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4921 " typename T4 = char>\n"
4922 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004923 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4924 " template <typename> class cccccccccccccccccccccc,\n"
4925 " typename ddddddddddddd>\n"
4926 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004927 verifyFormat(
4928 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4929 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004930
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004931 verifyFormat("void f() {\n"
4932 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4933 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4934 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004935
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004936 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004937 verifyFormat("template <typename T> void f();");
4938 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004939 verifyFormat(
4940 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4943 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4945 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4946 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4947 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004948 EXPECT_EQ("static_cast<A< //\n"
4949 " B> *>(\n"
4950 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00004951 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00004952 format("static_cast<A<//\n"
4953 " B>*>(\n"
4954 "\n"
4955 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004956 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4957 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004958
4959 FormatStyle AlwaysBreak = getLLVMStyle();
4960 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4961 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4962 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4963 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4964 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4965 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4966 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4967 verifyFormat("template <template <typename> class Fooooooo,\n"
4968 " template <typename> class Baaaaaaar>\n"
4969 "struct C {};",
4970 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004971 verifyFormat("template <typename T> // T can be A, B or C.\n"
4972 "struct C {};",
4973 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004974 verifyFormat("template <enum E> class A {\n"
4975 "public:\n"
4976 " E *f();\n"
4977 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004978}
4979
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004980TEST_F(FormatTest, WrapsTemplateParameters) {
4981 FormatStyle Style = getLLVMStyle();
4982 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4983 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4984 verifyFormat(
4985 "template <typename... a> struct q {};\n"
4986 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4987 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4988 " y;",
4989 Style);
4990 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4991 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4992 verifyFormat(
4993 "template <typename... a> struct r {};\n"
4994 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4995 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4996 " y;",
4997 Style);
4998 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4999 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5000 verifyFormat(
5001 "template <typename... a> struct s {};\n"
5002 "extern s<\n"
5003 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5004 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5005 " y;",
5006 Style);
5007 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5008 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5009 verifyFormat(
5010 "template <typename... a> struct t {};\n"
5011 "extern t<\n"
5012 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5013 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5014 " y;",
5015 Style);
5016}
5017
Daniel Jasper45797022013-01-25 10:57:27 +00005018TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5019 verifyFormat(
5020 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5022 verifyFormat(
5023 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5026
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005027 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005028 verifyFormat(
5029 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005032
Daniel Jasper45797022013-01-25 10:57:27 +00005033 verifyFormat(
5034 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005035 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005036
5037 // Breaking at nested name specifiers is generally not desirable.
5038 verifyFormat(
5039 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005041
5042 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005043 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005046 " aaaaaaaaaaaaaaaaaaaaa);",
5047 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005048
5049 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5051 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005052}
5053
Daniel Jasperf7935112012-12-03 18:12:45 +00005054TEST_F(FormatTest, UnderstandsTemplateParameters) {
5055 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005056 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005057 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5058 verifyFormat("bool x = a < 1 || 2 > a;");
5059 verifyFormat("bool x = 5 < f<int>();");
5060 verifyFormat("bool x = f<int>() > 5;");
5061 verifyFormat("bool x = 5 < a<int>::x;");
5062 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5063 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5064
5065 verifyGoogleFormat("A<A<int>> a;");
5066 verifyGoogleFormat("A<A<A<int>>> a;");
5067 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005068 verifyGoogleFormat("A<A<int> > a;");
5069 verifyGoogleFormat("A<A<A<int> > > a;");
5070 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005071 verifyGoogleFormat("A<::A<int>> a;");
5072 verifyGoogleFormat("A<::A> a;");
5073 verifyGoogleFormat("A< ::A> a;");
5074 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005075 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5076 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005077 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5078 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005079 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5080 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005081
Nico Weber7533b4d2014-09-24 17:17:32 +00005082 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5083
Daniel Jasperf7935112012-12-03 18:12:45 +00005084 verifyFormat("test >> a >> b;");
5085 verifyFormat("test << a >> b;");
5086
5087 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005088 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005089 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005090 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5091 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005092 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005093 verifyFormat("f(a.operator()<A>());");
5094 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5095 " .template operator()<A>());",
5096 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005097
5098 // Not template parameters.
5099 verifyFormat("return a < b && c > d;");
5100 verifyFormat("void f() {\n"
5101 " while (a < b && c > d) {\n"
5102 " }\n"
5103 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005104 verifyFormat("template <typename... Types>\n"
5105 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005106
5107 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5109 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005110 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005111 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005112 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005113}
5114
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005115TEST_F(FormatTest, BitshiftOperatorWidth) {
5116 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5117 " bar */",
5118 format("int a=1<<2; /* foo\n"
5119 " bar */"));
5120
5121 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5122 " bar */",
5123 format("int b =256>>1 ; /* foo\n"
5124 " bar */"));
5125}
5126
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005127TEST_F(FormatTest, UnderstandsBinaryOperators) {
5128 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005129 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005130}
5131
5132TEST_F(FormatTest, UnderstandsPointersToMembers) {
5133 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005134 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005135 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005136 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005137 verifyFormat("void f() {\n"
5138 " (a->*f)();\n"
5139 " a->*x;\n"
5140 " (a.*f)();\n"
5141 " ((*a).*f)();\n"
5142 " a.*x;\n"
5143 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005144 verifyFormat("void f() {\n"
5145 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5146 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5147 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005148 verifyFormat(
5149 "(aaaaaaaaaa->*bbbbbbb)(\n"
5150 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005151 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005152 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005153 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005154}
5155
Daniel Jasper8dd40472012-12-21 09:41:31 +00005156TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005157 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005158 verifyFormat("f(-1, -2, -3);");
5159 verifyFormat("a[-1] = 5;");
5160 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005161 verifyFormat("if (i == -1) {\n}");
5162 verifyFormat("if (i != -1) {\n}");
5163 verifyFormat("if (i > -1) {\n}");
5164 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005165 verifyFormat("++(a->f());");
5166 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005167 verifyFormat("(a->f())++;");
5168 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005169 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005170
5171 verifyFormat("a-- > b;");
5172 verifyFormat("b ? -a : c;");
5173 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005174 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005175 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005176 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005177
5178 verifyFormat("return -1;");
5179 verifyFormat("switch (a) {\n"
5180 "case -1:\n"
5181 " break;\n"
5182 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005183 verifyFormat("#define X -1");
5184 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005185
Chandler Carruthf8b72662014-03-02 12:37:31 +00005186 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5187 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005188
5189 verifyFormat("int a = /* confusing comment */ -1;");
5190 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5191 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005192}
5193
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005194TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005195 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005196 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005197 "}");
5198 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005199 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005200 verifyFormat("*aaa = aaaaaaa( // break\n"
5201 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005202}
5203
Daniel Jasper8863ada2013-08-26 08:10:17 +00005204TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005205 verifyFormat("bool operator<();");
5206 verifyFormat("bool operator>();");
5207 verifyFormat("bool operator=();");
5208 verifyFormat("bool operator==();");
5209 verifyFormat("bool operator!=();");
5210 verifyFormat("int operator+();");
5211 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005212 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005213 verifyFormat("bool operator();");
5214 verifyFormat("bool operator()();");
5215 verifyFormat("bool operator[]();");
5216 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005217 verifyFormat("operator int();");
5218 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005219 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005220 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005221 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005222 verifyFormat("void *operator new(std::size_t size);");
5223 verifyFormat("void *operator new[](std::size_t size);");
5224 verifyFormat("void operator delete(void *ptr);");
5225 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005226 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5227 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005228 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005229 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005230
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005231 verifyFormat(
5232 "ostream &operator<<(ostream &OutputStream,\n"
5233 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005234 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5235 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5236 " return left.group < right.group;\n"
5237 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005238 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005239 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005240
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005241 verifyGoogleFormat("operator void*();");
5242 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005243 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005244
5245 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005246 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5247 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005248}
5249
Daniel Jasper1c220482015-02-25 10:30:06 +00005250TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005251 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5252 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5253 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5254 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5255 verifyFormat("Deleted &operator=(const Deleted &) &;");
5256 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5257 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5258 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5259 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5260 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5261 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005262 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005263 verifyFormat("template <typename T>\n"
5264 "void F(T) && = delete;",
5265 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005266
Daniel Jasperaf642c62015-08-25 13:40:51 +00005267 FormatStyle AlignLeft = getLLVMStyle();
5268 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005269 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005270 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5271 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5272 AlignLeft);
5273 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5274 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005275 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5276 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5277 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5278 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005279 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005280
5281 FormatStyle Spaces = getLLVMStyle();
5282 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005283 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5284 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5285 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5286 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005287
5288 Spaces.SpacesInCStyleCastParentheses = false;
5289 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005290 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5291 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5292 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5293 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005294}
5295
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005296TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005297 verifyFormat("void f() {\n"
5298 " A *a = new A;\n"
5299 " A *a = new (placement) A;\n"
5300 " delete a;\n"
5301 " delete (A *)a;\n"
5302 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005303 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5304 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005305 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5306 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5307 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005308 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005309}
5310
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005311TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005312 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005313 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005314 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005315 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005316 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005317 verifyIndependentOfContext("int a = b * 10;");
5318 verifyIndependentOfContext("int a = 10 * b;");
5319 verifyIndependentOfContext("int a = b * c;");
5320 verifyIndependentOfContext("int a += b * c;");
5321 verifyIndependentOfContext("int a -= b * c;");
5322 verifyIndependentOfContext("int a *= b * c;");
5323 verifyIndependentOfContext("int a /= b * c;");
5324 verifyIndependentOfContext("int a = *b;");
5325 verifyIndependentOfContext("int a = *b * c;");
5326 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005327 verifyIndependentOfContext("int a = b * (10);");
5328 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005329 verifyIndependentOfContext("return 10 * b;");
5330 verifyIndependentOfContext("return *b * *c;");
5331 verifyIndependentOfContext("return a & ~b;");
5332 verifyIndependentOfContext("f(b ? *c : *d);");
5333 verifyIndependentOfContext("int a = b ? *c : *d;");
5334 verifyIndependentOfContext("*b = a;");
5335 verifyIndependentOfContext("a * ~b;");
5336 verifyIndependentOfContext("a * !b;");
5337 verifyIndependentOfContext("a * +b;");
5338 verifyIndependentOfContext("a * -b;");
5339 verifyIndependentOfContext("a * ++b;");
5340 verifyIndependentOfContext("a * --b;");
5341 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005342 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005343 verifyIndependentOfContext("f() * b;");
5344 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005345 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005346 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005347 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005348 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005349 verifyIndependentOfContext("return sizeof(int **);");
5350 verifyIndependentOfContext("return sizeof(int ******);");
5351 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005352 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005353 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005354 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005355 verifyGoogleFormat("return sizeof(int**);");
5356 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5357 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005358 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005359 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005360 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005361 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005362 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005363 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005364 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005365 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005366 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005367 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005368 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005369 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005370 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005371 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005372 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005373 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005374 verifyFormat("void f(const MyOverride &override);");
5375 verifyFormat("void f(const MyFinal &final);");
5376 verifyIndependentOfContext("bool a = f() && override.f();");
5377 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005378
Daniel Jasper5b49f472013-01-23 12:10:53 +00005379 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005380
Daniel Jasper5b49f472013-01-23 12:10:53 +00005381 verifyIndependentOfContext("A<int *> a;");
5382 verifyIndependentOfContext("A<int **> a;");
5383 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005384 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005385 verifyIndependentOfContext(
5386 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005387 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005388 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005389 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005390 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005391 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005392
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005393 verifyFormat(
5394 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5396
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005397 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005398 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005399 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005400 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005401 verifyGoogleFormat("A<int*> a;");
5402 verifyGoogleFormat("A<int**> a;");
5403 verifyGoogleFormat("A<int*, int*> a;");
5404 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005405 verifyGoogleFormat("f(b ? *c : *d);");
5406 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005407 verifyGoogleFormat("Type* t = **x;");
5408 verifyGoogleFormat("Type* t = *++*x;");
5409 verifyGoogleFormat("*++*x;");
5410 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5411 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005412 verifyGoogleFormat(
5413 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005414 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005415 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5416 verifyGoogleFormat("template <typename T>\n"
5417 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005418
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005419 FormatStyle Left = getLLVMStyle();
5420 Left.PointerAlignment = FormatStyle::PAS_Left;
5421 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005422 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005423 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005424 verifyFormat("throw *x;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005425
Daniel Jasper5b49f472013-01-23 12:10:53 +00005426 verifyIndependentOfContext("a = *(x + y);");
5427 verifyIndependentOfContext("a = &(x + y);");
5428 verifyIndependentOfContext("*(x + y).call();");
5429 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005430 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005431
Daniel Jasper5b49f472013-01-23 12:10:53 +00005432 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005433 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005434 "int *MyValues = {\n"
5435 " *A, // Operator detection might be confused by the '{'\n"
5436 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005437 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005438
Daniel Jasper5b49f472013-01-23 12:10:53 +00005439 verifyIndependentOfContext("if (int *a = &b)");
5440 verifyIndependentOfContext("if (int &a = *b)");
5441 verifyIndependentOfContext("if (a & b[i])");
5442 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5443 verifyIndependentOfContext("if (*b[i])");
5444 verifyIndependentOfContext("if (int *a = (&b))");
5445 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005446 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005447 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005448 verifyFormat("void f() {\n"
5449 " for (const int &v : Values) {\n"
5450 " }\n"
5451 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005452 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5453 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005454 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005455
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005456 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005457 verifyFormat("#define MACRO \\\n"
5458 " int *i = a * b; \\\n"
5459 " void f(a *b);",
5460 getLLVMStyleWithColumns(19));
5461
Daniel Jasper97b89482013-03-13 07:49:51 +00005462 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005463 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005464 verifyIndependentOfContext("T **t = new T *;");
5465 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005466 verifyGoogleFormat("A = new SomeType*[Length]();");
5467 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005468 verifyGoogleFormat("T** t = new T*;");
5469 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005470
Daniel Jasper990ff972013-05-07 14:17:18 +00005471 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005472 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005473 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005474 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5475 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005476 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005477 "typename t::if<x && y>::type f() {}");
5478 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005479 verifyFormat("vector<int *> v;");
5480 verifyFormat("vector<int *const> v;");
5481 verifyFormat("vector<int *const **const *> v;");
5482 verifyFormat("vector<int *volatile> v;");
5483 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005484 verifyFormat("foo<b && false>();");
5485 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005486 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005487 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005488 "template <class T, class = typename std::enable_if<\n"
5489 " std::is_integral<T>::value &&\n"
5490 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5491 "void F();",
5492 getLLVMStyleWithColumns(70));
5493 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005494 "template <class T,\n"
5495 " class = typename std::enable_if<\n"
5496 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005497 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5498 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005499 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005500 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005501 verifyFormat(
5502 "template <class T,\n"
5503 " class = typename ::std::enable_if<\n"
5504 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5505 "void F();",
5506 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005507
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005508 verifyIndependentOfContext("MACRO(int *i);");
5509 verifyIndependentOfContext("MACRO(auto *a);");
5510 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005511 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005512 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005513 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005514 // FIXME: Is there a way to make this work?
5515 // verifyIndependentOfContext("MACRO(A *a);");
5516
Daniel Jasper32ccb032014-06-23 07:36:18 +00005517 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005518 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005519
Daniel Jasper866468a2014-04-14 13:15:29 +00005520 EXPECT_EQ("#define OP(x) \\\n"
5521 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5522 " return s << a.DebugString(); \\\n"
5523 " }",
5524 format("#define OP(x) \\\n"
5525 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5526 " return s << a.DebugString(); \\\n"
5527 " }",
5528 getLLVMStyleWithColumns(50)));
5529
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005530 // FIXME: We cannot handle this case yet; we might be able to figure out that
5531 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005532 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005533
5534 FormatStyle PointerMiddle = getLLVMStyle();
5535 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5536 verifyFormat("delete *x;", PointerMiddle);
5537 verifyFormat("int * x;", PointerMiddle);
5538 verifyFormat("template <int * y> f() {}", PointerMiddle);
5539 verifyFormat("int * f(int * a) {}", PointerMiddle);
5540 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5541 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5542 verifyFormat("A<int *> a;", PointerMiddle);
5543 verifyFormat("A<int **> a;", PointerMiddle);
5544 verifyFormat("A<int *, int *> a;", PointerMiddle);
5545 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005546 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5547 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005548 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005549
5550 // Member function reference qualifiers aren't binary operators.
5551 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005552 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005553 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005554 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005555 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005556 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005557}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005558
Daniel Jasperee6d6502013-07-17 20:25:02 +00005559TEST_F(FormatTest, UnderstandsAttributes) {
5560 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005561 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5562 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005563 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005564 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005565 verifyFormat("__attribute__((nodebug)) void\n"
5566 "foo() {}\n",
5567 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005568}
5569
Daniel Jasper10cd5812013-05-06 06:35:44 +00005570TEST_F(FormatTest, UnderstandsEllipsis) {
5571 verifyFormat("int printf(const char *fmt, ...);");
5572 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005573 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5574
5575 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005576 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005577 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005578}
5579
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005580TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005581 EXPECT_EQ("int *a;\n"
5582 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005583 "int *a;",
5584 format("int *a;\n"
5585 "int* a;\n"
5586 "int *a;",
5587 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005588 EXPECT_EQ("int* a;\n"
5589 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005590 "int* a;",
5591 format("int* a;\n"
5592 "int* a;\n"
5593 "int *a;",
5594 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005595 EXPECT_EQ("int *a;\n"
5596 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005597 "int *a;",
5598 format("int *a;\n"
5599 "int * a;\n"
5600 "int * a;",
5601 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005602 EXPECT_EQ("auto x = [] {\n"
5603 " int *a;\n"
5604 " int *a;\n"
5605 " int *a;\n"
5606 "};",
5607 format("auto x=[]{int *a;\n"
5608 "int * a;\n"
5609 "int * a;};",
5610 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005611}
5612
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005613TEST_F(FormatTest, UnderstandsRvalueReferences) {
5614 verifyFormat("int f(int &&a) {}");
5615 verifyFormat("int f(int a, char &&b) {}");
5616 verifyFormat("void f() { int &&a = b; }");
5617 verifyGoogleFormat("int f(int a, char&& b) {}");
5618 verifyGoogleFormat("void f() { int&& a = b; }");
5619
Daniel Jasper1eff9082013-05-27 16:36:33 +00005620 verifyIndependentOfContext("A<int &&> a;");
5621 verifyIndependentOfContext("A<int &&, int &&> a;");
5622 verifyGoogleFormat("A<int&&> a;");
5623 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005624
5625 // Not rvalue references:
5626 verifyFormat("template <bool B, bool C> class A {\n"
5627 " static_assert(B && C, \"Something is wrong\");\n"
5628 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005629 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5630 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005631 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005632}
5633
Manuel Klimekc1237a82013-01-23 14:08:21 +00005634TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5635 verifyFormat("void f() {\n"
5636 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005637 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005638 "}",
5639 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005640}
5641
Daniel Jasperef906a92013-01-13 08:01:36 +00005642TEST_F(FormatTest, FormatsCasts) {
5643 verifyFormat("Type *A = static_cast<Type *>(P);");
5644 verifyFormat("Type *A = (Type *)P;");
5645 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5646 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005647 verifyFormat("int a = (int)2.0f;");
5648 verifyFormat("x[(int32)y];");
5649 verifyFormat("x = (int32)y;");
5650 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5651 verifyFormat("int a = (int)*b;");
5652 verifyFormat("int a = (int)2.0f;");
5653 verifyFormat("int a = (int)~0;");
5654 verifyFormat("int a = (int)++a;");
5655 verifyFormat("int a = (int)sizeof(int);");
5656 verifyFormat("int a = (int)+2;");
5657 verifyFormat("my_int a = (my_int)2.0f;");
5658 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005659 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005660 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005661 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005662 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005663 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005664
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005665 verifyFormat("void f() { my_int a = (my_int)*b; }");
5666 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5667 verifyFormat("my_int a = (my_int)~0;");
5668 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005669 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005670 verifyFormat("my_int a = (my_int)1;");
5671 verifyFormat("my_int a = (my_int *)1;");
5672 verifyFormat("my_int a = (const my_int)-1;");
5673 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005674 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005675 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005676 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005677 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005678
5679 // FIXME: single value wrapped with paren will be treated as cast.
5680 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005681
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005682 verifyFormat("{ (void)F; }");
5683
Daniel Jasper998cabc2013-07-18 14:46:07 +00005684 // Don't break after a cast's
5685 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5686 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5687 " bbbbbbbbbbbbbbbbbbbbbb);");
5688
Daniel Jasperef906a92013-01-13 08:01:36 +00005689 // These are not casts.
5690 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005691 verifyFormat("f(foo)->b;");
5692 verifyFormat("f(foo).b;");
5693 verifyFormat("f(foo)(b);");
5694 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005695 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005696 verifyFormat("(*funptr)(foo)[4];");
5697 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005698 verifyFormat("void f(int *);");
5699 verifyFormat("void f(int *) = 0;");
5700 verifyFormat("void f(SmallVector<int>) {}");
5701 verifyFormat("void f(SmallVector<int>);");
5702 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005703 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005704 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005705 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005706 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5707 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005708 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005709
Daniel Jasperba0bda92013-02-23 08:07:18 +00005710 // These are not casts, but at some point were confused with casts.
5711 verifyFormat("virtual void foo(int *) override;");
5712 verifyFormat("virtual void foo(char &) const;");
5713 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005714 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005715 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005716 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005717 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005718
5719 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5720 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005721 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005722 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005723 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5724 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5725 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005726}
5727
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005728TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005729 verifyFormat("A<bool()> a;");
5730 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005731 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005732 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005733 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005734 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005735 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005736 verifyFormat("template <class CallbackClass>\n"
5737 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005738
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005739 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5740 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005741 verifyGoogleFormat(
5742 "template <class CallbackClass>\n"
5743 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005744
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005745 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005746 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005747 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005748 verifyFormat("some_var = function(*some_pointer_var)[0];");
5749 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005750 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005751 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005752 verifyFormat("std::function<\n"
5753 " LooooooooooongTemplatedType<\n"
5754 " SomeType>*(\n"
5755 " LooooooooooooooooongType type)>\n"
5756 " function;",
5757 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005758}
5759
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005760TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5761 verifyFormat("A (*foo_)[6];");
5762 verifyFormat("vector<int> (*foo_)[6];");
5763}
5764
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005765TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5766 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5767 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5768 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5769 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005770 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5771 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005772
5773 // Different ways of ()-initializiation.
5774 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5775 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5776 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5777 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5778 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5779 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005780 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5781 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005782
5783 // Lambdas should not confuse the variable declaration heuristic.
5784 verifyFormat("LooooooooooooooooongType\n"
5785 " variable(nullptr, [](A *a) {});",
5786 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005787}
5788
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005789TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005790 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005791 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005792 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005793 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005794 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005795 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005796 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5797 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005798 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5799 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005800 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5801 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005802 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5803 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005804 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5805 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005806 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5807 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5808 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5809 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005810 FormatStyle Indented = getLLVMStyle();
5811 Indented.IndentWrappedFunctionNames = true;
5812 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5813 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5814 Indented);
5815 verifyFormat(
5816 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5817 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5818 Indented);
5819 verifyFormat(
5820 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5821 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5822 Indented);
5823 verifyFormat(
5824 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5825 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5826 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005827
5828 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005829 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5830 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5831 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005832
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005833 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005834 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005835 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005836 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5837 " SourceLocation L, IdentifierIn *II,\n"
5838 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005839 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005840 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005841 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005842 " const SomeType<string, SomeOtherTemplateParameter>\n"
5843 " &ReallyReallyLongParameterName,\n"
5844 " const SomeType<string, SomeOtherTemplateParameter>\n"
5845 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005846 verifyFormat("template <typename A>\n"
5847 "SomeLoooooooooooooooooooooongType<\n"
5848 " typename some_namespace::SomeOtherType<A>::Type>\n"
5849 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005850
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005851 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005852 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5853 " aaaaaaaaaaaaaaaaaaaaaaa;");
5854 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005855 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5856 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005857 verifyGoogleFormat(
5858 "some_namespace::LongReturnType\n"
5859 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005860 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005861
5862 verifyGoogleFormat("template <typename T>\n"
5863 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005864 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005865 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5866 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005867
5868 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005869 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5870 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005871 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5872 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5873 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5874 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5875 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005878
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005879 verifyFormat("template <typename T> // Templates on own line.\n"
5880 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005881 "MyFunction(int a);",
5882 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005883}
5884
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005885TEST_F(FormatTest, FormatsArrays) {
5886 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5887 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005888 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5889 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005890 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5891 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005892 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5893 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5894 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5895 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5896 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5897 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5898 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5899 verifyFormat(
5900 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5901 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5902 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005903 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5904 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005905
5906 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005908 verifyFormat(
5909 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5910 " .aaaaaaa[0]\n"
5911 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005912 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005913
5914 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005915
5916 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5917 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005918}
5919
Daniel Jaspere9de2602012-12-06 09:56:08 +00005920TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5921 verifyFormat("(a)->b();");
5922 verifyFormat("--a;");
5923}
5924
Daniel Jasper8b529712012-12-04 13:02:32 +00005925TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005926 verifyFormat("#include <string>\n"
5927 "#include <a/b/c.h>\n"
5928 "#include \"a/b/string\"\n"
5929 "#include \"string.h\"\n"
5930 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005931 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005932 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005933 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005934 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005935 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005936 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5937 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005938 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5939 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005940
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005941 verifyFormat("#import <string>");
5942 verifyFormat("#import <a/b/c.h>");
5943 verifyFormat("#import \"a/b/string\"");
5944 verifyFormat("#import \"string.h\"");
5945 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005946 verifyFormat("#if __has_include(<strstream>)\n"
5947 "#include <strstream>\n"
5948 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005949
Daniel Jasper343643b2014-08-13 08:29:18 +00005950 verifyFormat("#define MY_IMPORT <a/b>");
5951
Nico Weber21088802017-02-10 19:36:52 +00005952 verifyFormat("#if __has_include(<a/b>)");
5953 verifyFormat("#if __has_include_next(<a/b>)");
5954 verifyFormat("#define F __has_include(<a/b>)");
5955 verifyFormat("#define F __has_include_next(<a/b>)");
5956
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005957 // Protocol buffer definition or missing "#".
5958 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5959 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005960
5961 FormatStyle Style = getLLVMStyle();
5962 Style.AlwaysBreakBeforeMultilineStrings = true;
5963 Style.ColumnLimit = 0;
5964 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005965
5966 // But 'import' might also be a regular C++ namespace.
5967 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005969}
5970
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005971//===----------------------------------------------------------------------===//
5972// Error recovery tests.
5973//===----------------------------------------------------------------------===//
5974
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005975TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005976 FormatStyle NoBinPacking = getLLVMStyle();
5977 NoBinPacking.BinPackParameters = false;
5978 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5979 " double *min_x,\n"
5980 " double *max_x,\n"
5981 " double *min_y,\n"
5982 " double *max_y,\n"
5983 " double *min_z,\n"
5984 " double *max_z, ) {}",
5985 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005986}
5987
Daniel Jasper83a54d22013-01-10 09:26:47 +00005988TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005989 verifyFormat("void f() { return; }\n42");
5990 verifyFormat("void f() {\n"
5991 " if (0)\n"
5992 " return;\n"
5993 "}\n"
5994 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005995 verifyFormat("void f() { return }\n42");
5996 verifyFormat("void f() {\n"
5997 " if (0)\n"
5998 " return\n"
5999 "}\n"
6000 "42");
6001}
6002
6003TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6004 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6005 EXPECT_EQ("void f() {\n"
6006 " if (a)\n"
6007 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006008 "}",
6009 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006010 EXPECT_EQ("namespace N {\n"
6011 "void f()\n"
6012 "}",
6013 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006014 EXPECT_EQ("namespace N {\n"
6015 "void f() {}\n"
6016 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006017 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006018 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006019}
6020
Daniel Jasper2df93312013-01-09 10:16:05 +00006021TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6022 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006023 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006024 " b;",
6025 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006026 verifyFormat("function(\n"
6027 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006028 " LoooooooooooongArgument);\n",
6029 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006030}
6031
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006032TEST_F(FormatTest, IncorrectAccessSpecifier) {
6033 verifyFormat("public:");
6034 verifyFormat("class A {\n"
6035 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006036 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006037 "};");
6038 verifyFormat("public\n"
6039 "int qwerty;");
6040 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006041 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006042 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006043 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006044 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006045 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006046}
Daniel Jasperf7935112012-12-03 18:12:45 +00006047
Daniel Jasper291f9362013-03-20 15:58:10 +00006048TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6049 verifyFormat("{");
6050 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006051 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006052}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006053
6054TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006055 verifyFormat("do {\n}");
6056 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006057 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006058 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006059 "wheeee(fun);");
6060 verifyFormat("do {\n"
6061 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006062 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006063}
6064
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006065TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006066 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006067 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006068 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006069 verifyFormat("while {\n foo;\n foo();\n}");
6070 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006071}
6072
Daniel Jasperc0880a92013-01-04 18:52:56 +00006073TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006074 verifyIncompleteFormat("namespace {\n"
6075 "class Foo { Foo (\n"
6076 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006077 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006078}
6079
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006080TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006081 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006082 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6083 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006084 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006085
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006086 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006087 " {\n"
6088 " breakme(\n"
6089 " qwe);\n"
6090 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006091 format("{\n"
6092 " {\n"
6093 " breakme(qwe);\n"
6094 "}\n",
6095 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006096}
6097
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006098TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006099 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006100 " avariable,\n"
6101 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006102 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006103}
6104
Manuel Klimek762dd182013-01-21 10:07:49 +00006105TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006106 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006107}
6108
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006109TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006110 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006111 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006112 " 1,\n"
6113 " 2,\n"
6114 " 3,\n"
6115 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006116 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006117 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6118 verifyFormat("f({1, 2});");
6119 verifyFormat("auto v = Foo{-1};");
6120 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6121 verifyFormat("Class::Class : member{1, 2, 3} {}");
6122 verifyFormat("new vector<int>{1, 2, 3};");
6123 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006124 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006125 verifyFormat("return {arg1, arg2};");
6126 verifyFormat("return {arg1, SomeType{parameter}};");
6127 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6128 verifyFormat("new T{arg1, arg2};");
6129 verifyFormat("f(MyMap[{composite, key}]);");
6130 verifyFormat("class Class {\n"
6131 " T member = {arg1, arg2};\n"
6132 "};");
6133 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006134 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6135 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006136 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6137 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006138
Daniel Jasper438059e2014-05-22 12:11:13 +00006139 verifyFormat("int foo(int i) { return fo1{}(i); }");
6140 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006141 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006142 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006143 verifyFormat("Node n{1, Node{1000}, //\n"
6144 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006145 verifyFormat("Aaaa aaaaaaa{\n"
6146 " {\n"
6147 " aaaa,\n"
6148 " },\n"
6149 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006150 verifyFormat("class C : public D {\n"
6151 " SomeClass SC{2};\n"
6152 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006153 verifyFormat("class C : public A {\n"
6154 " class D : public B {\n"
6155 " void f() { int i{2}; }\n"
6156 " };\n"
6157 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006158 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006159
Francois Ferrandd2130f52017-06-30 20:00:02 +00006160 // Binpacking only if there is no trailing comma
6161 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6162 " cccccccccc, dddddddddd};",
6163 getLLVMStyleWithColumns(50));
6164 verifyFormat("const Aaaaaa aaaaa = {\n"
6165 " aaaaaaaaaaa,\n"
6166 " bbbbbbbbbbb,\n"
6167 " ccccccccccc,\n"
6168 " ddddddddddd,\n"
6169 "};", getLLVMStyleWithColumns(50));
6170
Daniel Jaspere4ada022016-12-13 10:05:03 +00006171 // Cases where distinguising braced lists and blocks is hard.
6172 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6173 verifyFormat("void f() {\n"
6174 " return; // comment\n"
6175 "}\n"
6176 "SomeType t;");
6177 verifyFormat("void f() {\n"
6178 " if (a) {\n"
6179 " f();\n"
6180 " }\n"
6181 "}\n"
6182 "SomeType t;");
6183
Daniel Jasper08434342015-05-26 07:26:26 +00006184 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006185 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006186 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006187 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6188 " bbbbb,\n"
6189 " ccccc,\n"
6190 " ddddd,\n"
6191 " eeeee,\n"
6192 " ffffff,\n"
6193 " ggggg,\n"
6194 " hhhhhh,\n"
6195 " iiiiii,\n"
6196 " jjjjjj,\n"
6197 " kkkkkk};",
6198 NoBinPacking);
6199 verifyFormat("const Aaaaaa aaaaa = {\n"
6200 " aaaaa,\n"
6201 " bbbbb,\n"
6202 " ccccc,\n"
6203 " ddddd,\n"
6204 " eeeee,\n"
6205 " ffffff,\n"
6206 " ggggg,\n"
6207 " hhhhhh,\n"
6208 " iiiiii,\n"
6209 " jjjjjj,\n"
6210 " kkkkkk,\n"
6211 "};",
6212 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006213 verifyFormat(
6214 "const Aaaaaa aaaaa = {\n"
6215 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6216 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6217 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6218 "};",
6219 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006220
Chandler Carruthf8b72662014-03-02 12:37:31 +00006221 // FIXME: The alignment of these trailing comments might be bad. Then again,
6222 // this might be utterly useless in real code.
6223 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006224 " : some_value{ //\n"
6225 " aaaaaaa, //\n"
6226 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006227
Chandler Carruthf8b72662014-03-02 12:37:31 +00006228 // In braced lists, the first comment is always assumed to belong to the
6229 // first element. Thus, it can be moved to the next or previous line as
6230 // appropriate.
6231 EXPECT_EQ("function({// First element:\n"
6232 " 1,\n"
6233 " // Second element:\n"
6234 " 2});",
6235 format("function({\n"
6236 " // First element:\n"
6237 " 1,\n"
6238 " // Second element:\n"
6239 " 2});"));
6240 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6241 " // First element:\n"
6242 " 1,\n"
6243 " // Second element:\n"
6244 " 2};",
6245 format("std::vector<int> MyNumbers{// First element:\n"
6246 " 1,\n"
6247 " // Second element:\n"
6248 " 2};",
6249 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006250 // A trailing comma should still lead to an enforced line break and no
6251 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006252 EXPECT_EQ("vector<int> SomeVector = {\n"
6253 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006254 " 1,\n"
6255 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006256 "};",
6257 format("vector<int> SomeVector = { // aaa\n"
6258 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006259
Chandler Carruthf8b72662014-03-02 12:37:31 +00006260 FormatStyle ExtraSpaces = getLLVMStyle();
6261 ExtraSpaces.Cpp11BracedListStyle = false;
6262 ExtraSpaces.ColumnLimit = 75;
6263 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6264 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6265 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6266 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6267 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6268 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6269 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6270 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6271 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6272 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6273 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6274 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6275 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6276 verifyFormat("class Class {\n"
6277 " T member = { arg1, arg2 };\n"
6278 "};",
6279 ExtraSpaces);
6280 verifyFormat(
6281 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6282 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6283 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6284 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6285 ExtraSpaces);
6286 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006287 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006288 ExtraSpaces);
6289 verifyFormat(
6290 "someFunction(OtherParam,\n"
6291 " BracedList{ // comment 1 (Forcing interesting break)\n"
6292 " param1, param2,\n"
6293 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006294 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006295 ExtraSpaces);
6296 verifyFormat(
6297 "std::this_thread::sleep_for(\n"
6298 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6299 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006300 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006301 " aaaaaaa,\n"
6302 " aaaaaaaaaa,\n"
6303 " aaaaa,\n"
6304 " aaaaaaaaaaaaaaa,\n"
6305 " aaa,\n"
6306 " aaaaaaaaaa,\n"
6307 " a,\n"
6308 " aaaaaaaaaaaaaaaaaaaaa,\n"
6309 " aaaaaaaaaaaa,\n"
6310 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6311 " aaaaaaa,\n"
6312 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006313 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006314 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6315 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006316}
6317
Daniel Jasper33b909c2013-10-25 14:29:37 +00006318TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006319 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6320 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6321 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6322 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6323 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6324 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006325 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006326 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006327 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006328 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6329 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006330 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006331 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6332 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6333 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6334 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6335 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6336 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6337 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006338 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006339 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6340 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006341 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6342 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6343 " // Separating comment.\n"
6344 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6345 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6346 " // Leading comment\n"
6347 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6348 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006349 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6350 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006351 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006352 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6353 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006354 getLLVMStyleWithColumns(38));
6355 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006356 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6357 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006358 verifyFormat(
6359 "static unsigned SomeValues[10][3] = {\n"
6360 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6361 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6362 verifyFormat("static auto fields = new vector<string>{\n"
6363 " \"aaaaaaaaaaaaa\",\n"
6364 " \"aaaaaaaaaaaaa\",\n"
6365 " \"aaaaaaaaaaaa\",\n"
6366 " \"aaaaaaaaaaaaaa\",\n"
6367 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6368 " \"aaaaaaaaaaaa\",\n"
6369 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6370 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006371 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6372 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6373 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6374 " 3, cccccccccccccccccccccc};",
6375 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006376
6377 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006378 verifyFormat("vector<int> x = {\n"
6379 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6380 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006381 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006382 verifyFormat("vector<int> x = {\n"
6383 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006384 "};",
6385 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006386 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6387 " 1, 1, 1, 1,\n"
6388 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006389 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006390
Daniel Jasper60c27072015-05-13 08:16:00 +00006391 // Trailing comment in the first line.
6392 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6393 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6394 " 111111111, 222222222, 3333333333, 444444444, //\n"
6395 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006396 // Trailing comment in the last line.
6397 verifyFormat("int aaaaa[] = {\n"
6398 " 1, 2, 3, // comment\n"
6399 " 4, 5, 6 // comment\n"
6400 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006401
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006402 // With nested lists, we should either format one item per line or all nested
6403 // lists one on line.
6404 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006405 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6406 " {aaaaaaaaaaaaaaaaaaa},\n"
6407 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6408 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006409 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006410 verifyFormat(
6411 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006412 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6413 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6414 " {aaa, aaa},\n"
6415 " {aaa, aaa},\n"
6416 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6417 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6418 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006419
6420 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006421 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006422 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006423
6424 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006425
Daniel Jaspereb65e912015-12-21 18:31:15 +00006426 // No braced initializer here.
6427 verifyFormat("void f() {\n"
6428 " struct Dummy {};\n"
6429 " f(v);\n"
6430 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006431
6432 // Long lists should be formatted in columns even if they are nested.
6433 verifyFormat(
6434 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6435 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6436 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6437 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6438 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6439 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006440
6441 // Allow "single-column" layout even if that violates the column limit. There
6442 // isn't going to be a better way.
6443 verifyFormat("std::vector<int> a = {\n"
6444 " aaaaaaaa,\n"
6445 " aaaaaaaa,\n"
6446 " aaaaaaaa,\n"
6447 " aaaaaaaa,\n"
6448 " aaaaaaaaaa,\n"
6449 " aaaaaaaa,\n"
6450 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6451 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006452 verifyFormat("vector<int> aaaa = {\n"
6453 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6454 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6455 " aaaaaa.aaaaaaa,\n"
6456 " aaaaaa.aaaaaaa,\n"
6457 " aaaaaa.aaaaaaa,\n"
6458 " aaaaaa.aaaaaaa,\n"
6459 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006460
6461 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006462 verifyFormat("someFunction(Param, {List1, List2,\n"
6463 " List3});",
6464 getLLVMStyleWithColumns(35));
6465 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006466 " {List1, List2,\n"
6467 " List3});",
6468 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006469 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6470 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006471}
6472
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006473TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006474 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006475 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006476
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006477 verifyFormat("void f() { return 42; }");
6478 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006479 " return 42;\n"
6480 "}",
6481 DoNotMerge);
6482 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006483 " // Comment\n"
6484 "}");
6485 verifyFormat("{\n"
6486 "#error {\n"
6487 " int a;\n"
6488 "}");
6489 verifyFormat("{\n"
6490 " int a;\n"
6491 "#error {\n"
6492 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006493 verifyFormat("void f() {} // comment");
6494 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006495 verifyFormat("void f() {\n"
6496 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006497 DoNotMerge);
6498 verifyFormat("void f() {\n"
6499 " int a;\n"
6500 "} // comment",
6501 DoNotMerge);
6502 verifyFormat("void f() {\n"
6503 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006504 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006505
6506 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6507 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6508
6509 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6510 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006511 verifyFormat("class C {\n"
6512 " C()\n"
6513 " : iiiiiiii(nullptr),\n"
6514 " kkkkkkk(nullptr),\n"
6515 " mmmmmmm(nullptr),\n"
6516 " nnnnnnn(nullptr) {}\n"
6517 "};",
6518 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006519
6520 FormatStyle NoColumnLimit = getLLVMStyle();
6521 NoColumnLimit.ColumnLimit = 0;
6522 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6523 EXPECT_EQ("class C {\n"
6524 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006525 "};",
6526 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006527 EXPECT_EQ("A()\n"
6528 " : b(0) {\n"
6529 "}",
6530 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6531
6532 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006533 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6534 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006535 EXPECT_EQ("A()\n"
6536 " : b(0) {\n"
6537 "}",
6538 format("A():b(0){}", DoNotMergeNoColumnLimit));
6539 EXPECT_EQ("A()\n"
6540 " : b(0) {\n"
6541 "}",
6542 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006543
6544 verifyFormat("#define A \\\n"
6545 " void f() { \\\n"
6546 " int i; \\\n"
6547 " }",
6548 getLLVMStyleWithColumns(20));
6549 verifyFormat("#define A \\\n"
6550 " void f() { int i; }",
6551 getLLVMStyleWithColumns(21));
6552 verifyFormat("#define A \\\n"
6553 " void f() { \\\n"
6554 " int i; \\\n"
6555 " } \\\n"
6556 " int j;",
6557 getLLVMStyleWithColumns(22));
6558 verifyFormat("#define A \\\n"
6559 " void f() { int i; } \\\n"
6560 " int j;",
6561 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006562}
6563
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006564TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6565 FormatStyle MergeEmptyOnly = getLLVMStyle();
6566 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6567 verifyFormat("class C {\n"
6568 " int f() {}\n"
6569 "};",
6570 MergeEmptyOnly);
6571 verifyFormat("class C {\n"
6572 " int f() {\n"
6573 " return 42;\n"
6574 " }\n"
6575 "};",
6576 MergeEmptyOnly);
6577 verifyFormat("int f() {}", MergeEmptyOnly);
6578 verifyFormat("int f() {\n"
6579 " return 42;\n"
6580 "}",
6581 MergeEmptyOnly);
6582
6583 // Also verify behavior when BraceWrapping.AfterFunction = true
6584 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6585 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6586 verifyFormat("int f() {}", MergeEmptyOnly);
6587 verifyFormat("class C {\n"
6588 " int f() {}\n"
6589 "};",
6590 MergeEmptyOnly);
6591}
6592
Daniel Jasperd74cf402014-04-08 12:46:38 +00006593TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6594 FormatStyle MergeInlineOnly = getLLVMStyle();
6595 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6596 verifyFormat("class C {\n"
6597 " int f() { return 42; }\n"
6598 "};",
6599 MergeInlineOnly);
6600 verifyFormat("int f() {\n"
6601 " return 42;\n"
6602 "}",
6603 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006604
6605 // SFS_Inline implies SFS_Empty
6606 verifyFormat("class C {\n"
6607 " int f() {}\n"
6608 "};",
6609 MergeInlineOnly);
6610 verifyFormat("int f() {}", MergeInlineOnly);
6611
6612 // Also verify behavior when BraceWrapping.AfterFunction = true
6613 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6614 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6615 verifyFormat("class C {\n"
6616 " int f() { return 42; }\n"
6617 "};",
6618 MergeInlineOnly);
6619 verifyFormat("int f()\n"
6620 "{\n"
6621 " return 42;\n"
6622 "}",
6623 MergeInlineOnly);
6624
6625 // SFS_Inline implies SFS_Empty
6626 verifyFormat("int f() {}", MergeInlineOnly);
6627 verifyFormat("class C {\n"
6628 " int f() {}\n"
6629 "};",
6630 MergeInlineOnly);
6631}
6632
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00006633TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6634 FormatStyle MergeInlineOnly = getLLVMStyle();
6635 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6636 FormatStyle::SFS_InlineOnly;
6637 verifyFormat("class C {\n"
6638 " int f() { return 42; }\n"
6639 "};",
6640 MergeInlineOnly);
6641 verifyFormat("int f() {\n"
6642 " return 42;\n"
6643 "}",
6644 MergeInlineOnly);
6645
6646 // SFS_InlineOnly does not imply SFS_Empty
6647 verifyFormat("class C {\n"
6648 " int f() {}\n"
6649 "};",
6650 MergeInlineOnly);
6651 verifyFormat("int f() {\n"
6652 "}",
6653 MergeInlineOnly);
6654
6655 // Also verify behavior when BraceWrapping.AfterFunction = true
6656 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6657 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6658 verifyFormat("class C {\n"
6659 " int f() { return 42; }\n"
6660 "};",
6661 MergeInlineOnly);
6662 verifyFormat("int f()\n"
6663 "{\n"
6664 " return 42;\n"
6665 "}",
6666 MergeInlineOnly);
6667
6668 // SFS_InlineOnly does not imply SFS_Empty
6669 verifyFormat("int f()\n"
6670 "{\n"
6671 "}",
6672 MergeInlineOnly);
6673 verifyFormat("class C {\n"
6674 " int f() {}\n"
6675 "};",
6676 MergeInlineOnly);
6677}
6678
Francois Ferrandad722562017-06-30 20:25:55 +00006679TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006680 FormatStyle Style = getLLVMStyle();
6681 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6682 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6683 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00006684 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006685 Style.ColumnLimit = 40;
6686
6687 verifyFormat("int f()\n"
6688 "{}",
6689 Style);
6690 verifyFormat("int f()\n"
6691 "{\n"
6692 " return 42;\n"
6693 "}",
6694 Style);
6695 verifyFormat("int f()\n"
6696 "{\n"
6697 " // some comment\n"
6698 "}",
6699 Style);
6700
6701 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6702 verifyFormat("int f() {}", Style);
6703 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6704 "{}",
6705 Style);
6706 verifyFormat("int f()\n"
6707 "{\n"
6708 " return 0;\n"
6709 "}",
6710 Style);
6711
6712 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6713 verifyFormat("class Foo {\n"
6714 " int f() {}\n"
6715 "};\n",
6716 Style);
6717 verifyFormat("class Foo {\n"
6718 " int f() { return 0; }\n"
6719 "};\n",
6720 Style);
6721 verifyFormat("class Foo {\n"
6722 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6723 " {}\n"
6724 "};\n",
6725 Style);
6726 verifyFormat("class Foo {\n"
6727 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6728 " {\n"
6729 " return 0;\n"
6730 " }\n"
6731 "};\n",
6732 Style);
6733
6734 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6735 verifyFormat("int f() {}", Style);
6736 verifyFormat("int f() { return 0; }", Style);
6737 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6738 "{}",
6739 Style);
6740 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6741 "{\n"
6742 " return 0;\n"
6743 "}",
6744 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006745}
6746
Francois Ferrandad722562017-06-30 20:25:55 +00006747TEST_F(FormatTest, SplitEmptyClass) {
6748 FormatStyle Style = getLLVMStyle();
6749 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6750 Style.BraceWrapping.AfterClass = true;
6751 Style.BraceWrapping.SplitEmptyRecord = false;
6752
6753 verifyFormat("class Foo\n"
6754 "{};",
6755 Style);
6756 verifyFormat("/* something */ class Foo\n"
6757 "{};",
6758 Style);
6759 verifyFormat("template <typename X> class Foo\n"
6760 "{};",
6761 Style);
6762 verifyFormat("class Foo\n"
6763 "{\n"
6764 " Foo();\n"
6765 "};",
6766 Style);
6767 verifyFormat("typedef class Foo\n"
6768 "{\n"
6769 "} Foo_t;",
6770 Style);
6771}
6772
6773TEST_F(FormatTest, SplitEmptyStruct) {
6774 FormatStyle Style = getLLVMStyle();
6775 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6776 Style.BraceWrapping.AfterStruct = true;
6777 Style.BraceWrapping.SplitEmptyRecord = false;
6778
6779 verifyFormat("struct Foo\n"
6780 "{};",
6781 Style);
6782 verifyFormat("/* something */ struct Foo\n"
6783 "{};",
6784 Style);
6785 verifyFormat("template <typename X> struct Foo\n"
6786 "{};",
6787 Style);
6788 verifyFormat("struct Foo\n"
6789 "{\n"
6790 " Foo();\n"
6791 "};",
6792 Style);
6793 verifyFormat("typedef struct Foo\n"
6794 "{\n"
6795 "} Foo_t;",
6796 Style);
6797 //typedef struct Bar {} Bar_t;
6798}
6799
6800TEST_F(FormatTest, SplitEmptyUnion) {
6801 FormatStyle Style = getLLVMStyle();
6802 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6803 Style.BraceWrapping.AfterUnion = true;
6804 Style.BraceWrapping.SplitEmptyRecord = false;
6805
6806 verifyFormat("union Foo\n"
6807 "{};",
6808 Style);
6809 verifyFormat("/* something */ union Foo\n"
6810 "{};",
6811 Style);
6812 verifyFormat("union Foo\n"
6813 "{\n"
6814 " A,\n"
6815 "};",
6816 Style);
6817 verifyFormat("typedef union Foo\n"
6818 "{\n"
6819 "} Foo_t;",
6820 Style);
6821}
6822
6823TEST_F(FormatTest, SplitEmptyNamespace) {
6824 FormatStyle Style = getLLVMStyle();
6825 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6826 Style.BraceWrapping.AfterNamespace = true;
6827 Style.BraceWrapping.SplitEmptyNamespace = false;
6828
6829 verifyFormat("namespace Foo\n"
6830 "{};",
6831 Style);
6832 verifyFormat("/* something */ namespace Foo\n"
6833 "{};",
6834 Style);
6835 verifyFormat("inline namespace Foo\n"
6836 "{};",
6837 Style);
6838 verifyFormat("namespace Foo\n"
6839 "{\n"
6840 "void Bar();\n"
6841 "};",
6842 Style);
6843}
6844
6845TEST_F(FormatTest, NeverMergeShortRecords) {
6846 FormatStyle Style = getLLVMStyle();
6847
6848 verifyFormat("class Foo {\n"
6849 " Foo();\n"
6850 "};",
6851 Style);
6852 verifyFormat("typedef class Foo {\n"
6853 " Foo();\n"
6854 "} Foo_t;",
6855 Style);
6856 verifyFormat("struct Foo {\n"
6857 " Foo();\n"
6858 "};",
6859 Style);
6860 verifyFormat("typedef struct Foo {\n"
6861 " Foo();\n"
6862 "} Foo_t;",
6863 Style);
6864 verifyFormat("union Foo {\n"
6865 " A,\n"
6866 "};",
6867 Style);
6868 verifyFormat("typedef union Foo {\n"
6869 " A,\n"
6870 "} Foo_t;",
6871 Style);
6872 verifyFormat("namespace Foo {\n"
6873 "void Bar();\n"
6874 "};",
6875 Style);
6876
6877 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6878 Style.BraceWrapping.AfterClass = true;
6879 Style.BraceWrapping.AfterStruct = true;
6880 Style.BraceWrapping.AfterUnion = true;
6881 Style.BraceWrapping.AfterNamespace = true;
6882 verifyFormat("class Foo\n"
6883 "{\n"
6884 " Foo();\n"
6885 "};",
6886 Style);
6887 verifyFormat("typedef class Foo\n"
6888 "{\n"
6889 " Foo();\n"
6890 "} Foo_t;",
6891 Style);
6892 verifyFormat("struct Foo\n"
6893 "{\n"
6894 " Foo();\n"
6895 "};",
6896 Style);
6897 verifyFormat("typedef struct Foo\n"
6898 "{\n"
6899 " Foo();\n"
6900 "} Foo_t;",
6901 Style);
6902 verifyFormat("union Foo\n"
6903 "{\n"
6904 " A,\n"
6905 "};",
6906 Style);
6907 verifyFormat("typedef union Foo\n"
6908 "{\n"
6909 " A,\n"
6910 "} Foo_t;",
6911 Style);
6912 verifyFormat("namespace Foo\n"
6913 "{\n"
6914 "void Bar();\n"
6915 "};",
6916 Style);
6917}
6918
Manuel Klimeke01bab52013-01-15 13:38:33 +00006919TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6920 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006921 verifyFormat("struct foo a = {bar};\nint n;");
6922 verifyFormat("class foo a = {bar};\nint n;");
6923 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006924
6925 // Elaborate types inside function definitions.
6926 verifyFormat("struct foo f() {}\nint n;");
6927 verifyFormat("class foo f() {}\nint n;");
6928 verifyFormat("union foo f() {}\nint n;");
6929
6930 // Templates.
6931 verifyFormat("template <class X> void f() {}\nint n;");
6932 verifyFormat("template <struct X> void f() {}\nint n;");
6933 verifyFormat("template <union X> void f() {}\nint n;");
6934
6935 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006936 verifyFormat("struct {\n} n;");
6937 verifyFormat(
6938 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006939 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006940 verifyFormat("class MACRO Z {\n} n;");
6941 verifyFormat("class MACRO(X) Z {\n} n;");
6942 verifyFormat("class __attribute__(X) Z {\n} n;");
6943 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006944 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006945 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006946 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6947 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006948
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006949 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006950 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006951
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006952 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006953 verifyFormat(
6954 "template <typename F>\n"
6955 "Matcher(const Matcher<F> &Other,\n"
6956 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6957 " !is_same<F, T>::value>::type * = 0)\n"
6958 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6959
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006960 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006961 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006962 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006963
6964 // FIXME:
6965 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006966 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006967
Manuel Klimeke01bab52013-01-15 13:38:33 +00006968 // Elaborate types where incorrectly parsing the structural element would
6969 // break the indent.
6970 verifyFormat("if (true)\n"
6971 " class X x;\n"
6972 "else\n"
6973 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006974
6975 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006976 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006977}
6978
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006979TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006980 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6981 format("#error Leave all white!!!!! space* alone!\n"));
6982 EXPECT_EQ(
6983 "#warning Leave all white!!!!! space* alone!\n",
6984 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006985 EXPECT_EQ("#error 1", format(" # error 1"));
6986 EXPECT_EQ("#warning 1", format(" # warning 1"));
6987}
6988
Daniel Jasper4431aa92013-04-23 13:54:04 +00006989TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006990 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006991 verifyFormat("#if (AAAA && BBBB)");
6992 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006993 // FIXME: Come up with a better indentation for #elif.
6994 verifyFormat(
6995 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6996 " defined(BBBBBBBB)\n"
6997 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6998 " defined(BBBBBBBB)\n"
6999 "#endif",
7000 getLLVMStyleWithColumns(65));
7001}
7002
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007003TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7004 FormatStyle AllowsMergedIf = getGoogleStyle();
7005 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7006 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7007 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007008 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7009 EXPECT_EQ("if (true) return 42;",
7010 format("if (true)\nreturn 42;", AllowsMergedIf));
7011 FormatStyle ShortMergedIf = AllowsMergedIf;
7012 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007013 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007014 " if (true) return 42;",
7015 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007016 verifyFormat("#define A \\\n"
7017 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007018 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007019 "#define B",
7020 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007021 verifyFormat("#define A \\\n"
7022 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007023 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007024 "g();",
7025 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007026 verifyFormat("{\n"
7027 "#ifdef A\n"
7028 " // Comment\n"
7029 " if (true) continue;\n"
7030 "#endif\n"
7031 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007032 " if (true) continue;\n"
7033 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007034 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007035 ShortMergedIf.ColumnLimit = 33;
7036 verifyFormat("#define A \\\n"
7037 " if constexpr (true) return 42;",
7038 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007039 ShortMergedIf.ColumnLimit = 29;
7040 verifyFormat("#define A \\\n"
7041 " if (aaaaaaaaaa) return 1; \\\n"
7042 " return 2;",
7043 ShortMergedIf);
7044 ShortMergedIf.ColumnLimit = 28;
7045 verifyFormat("#define A \\\n"
7046 " if (aaaaaaaaaa) \\\n"
7047 " return 1; \\\n"
7048 " return 2;",
7049 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007050 verifyFormat("#define A \\\n"
7051 " if constexpr (aaaaaaa) \\\n"
7052 " return 1; \\\n"
7053 " return 2;",
7054 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007055}
7056
Manuel Klimekd33516e2013-01-23 10:09:28 +00007057TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007058 verifyFormat("void f(int *a);");
7059 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007060 verifyFormat("class A {\n void f(int *a);\n};");
7061 verifyFormat("class A {\n int *a;\n};");
7062 verifyFormat("namespace a {\n"
7063 "namespace b {\n"
7064 "class A {\n"
7065 " void f() {}\n"
7066 " int *a;\n"
7067 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007068 "} // namespace b\n"
7069 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007070}
7071
Manuel Klimekd33516e2013-01-23 10:09:28 +00007072TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7073 verifyFormat("while");
7074 verifyFormat("operator");
7075}
7076
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007077TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7078 // This code would be painfully slow to format if we didn't skip it.
7079 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
7080 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7081 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7082 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7083 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7084 "A(1, 1)\n"
7085 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7086 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7087 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7088 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7089 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7090 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7091 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7092 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7093 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7094 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7095 // Deeply nested part is untouched, rest is formatted.
7096 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7097 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007098 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007099}
7100
Nico Weber7e6a7a12013-01-08 17:56:31 +00007101//===----------------------------------------------------------------------===//
7102// Objective-C tests.
7103//===----------------------------------------------------------------------===//
7104
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007105TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7106 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7107 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7108 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007109 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007110 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7111 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7112 format("-(NSInteger)Method3:(id)anObject;"));
7113 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7114 format("-(NSInteger)Method4:(id)anObject;"));
7115 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7116 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7117 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7118 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007119 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7120 "forAllCells:(BOOL)flag;",
7121 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7122 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007123
7124 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007125 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7126 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007127 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7128 " inRange:(NSRange)range\n"
7129 " outRange:(NSRange)out_range\n"
7130 " outRange1:(NSRange)out_range1\n"
7131 " outRange2:(NSRange)out_range2\n"
7132 " outRange3:(NSRange)out_range3\n"
7133 " outRange4:(NSRange)out_range4\n"
7134 " outRange5:(NSRange)out_range5\n"
7135 " outRange6:(NSRange)out_range6\n"
7136 " outRange7:(NSRange)out_range7\n"
7137 " outRange8:(NSRange)out_range8\n"
7138 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007139
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007140 // When the function name has to be wrapped.
7141 FormatStyle Style = getLLVMStyle();
7142 Style.IndentWrappedFunctionNames = false;
7143 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7144 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7145 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7146 "}",
7147 Style);
7148 Style.IndentWrappedFunctionNames = true;
7149 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7150 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7151 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7152 "}",
7153 Style);
7154
Nico Weberd6f962f2013-01-10 20:18:33 +00007155 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007156 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007157 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7158 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007159 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007160
Daniel Jasper37194282013-05-28 08:33:00 +00007161 verifyFormat("- (int (*)())foo:(int (*)())f;");
7162 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007163
7164 // If there's no return type (very rare in practice!), LLVM and Google style
7165 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007166 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007167 verifyFormat("- foo:(int)f;");
7168 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007169}
7170
Nico Weber0588b502013-02-07 00:19:29 +00007171
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007172TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007173 EXPECT_EQ("\"some text \"\n"
7174 "\"other\";",
7175 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007176 EXPECT_EQ("\"some text \"\n"
7177 "\"other\";",
7178 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007179 EXPECT_EQ(
7180 "#define A \\\n"
7181 " \"some \" \\\n"
7182 " \"text \" \\\n"
7183 " \"other\";",
7184 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7185 EXPECT_EQ(
7186 "#define A \\\n"
7187 " \"so \" \\\n"
7188 " \"text \" \\\n"
7189 " \"other\";",
7190 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7191
7192 EXPECT_EQ("\"some text\"",
7193 format("\"some text\"", getLLVMStyleWithColumns(1)));
7194 EXPECT_EQ("\"some text\"",
7195 format("\"some text\"", getLLVMStyleWithColumns(11)));
7196 EXPECT_EQ("\"some \"\n"
7197 "\"text\"",
7198 format("\"some text\"", getLLVMStyleWithColumns(10)));
7199 EXPECT_EQ("\"some \"\n"
7200 "\"text\"",
7201 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007202 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007203 "\" tex\"\n"
7204 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007205 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007206 EXPECT_EQ("\"some\"\n"
7207 "\" tex\"\n"
7208 "\" and\"",
7209 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7210 EXPECT_EQ("\"some\"\n"
7211 "\"/tex\"\n"
7212 "\"/and\"",
7213 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007214
7215 EXPECT_EQ("variable =\n"
7216 " \"long string \"\n"
7217 " \"literal\";",
7218 format("variable = \"long string literal\";",
7219 getLLVMStyleWithColumns(20)));
7220
7221 EXPECT_EQ("variable = f(\n"
7222 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007223 " \"literal\",\n"
7224 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007225 " loooooooooooooooooooong);",
7226 format("variable = f(\"long string literal\", short, "
7227 "loooooooooooooooooooong);",
7228 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007229
Daniel Jaspera44991332015-04-29 13:06:49 +00007230 EXPECT_EQ(
7231 "f(g(\"long string \"\n"
7232 " \"literal\"),\n"
7233 " b);",
7234 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007235 EXPECT_EQ("f(g(\"long string \"\n"
7236 " \"literal\",\n"
7237 " a),\n"
7238 " b);",
7239 format("f(g(\"long string literal\", a), b);",
7240 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007241 EXPECT_EQ(
7242 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007243 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007244 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7245 EXPECT_EQ("f(\"one two three four five six \"\n"
7246 " \"seven\".split(\n"
7247 " really_looooong_variable));",
7248 format("f(\"one two three four five six seven\"."
7249 "split(really_looooong_variable));",
7250 getLLVMStyleWithColumns(33)));
7251
7252 EXPECT_EQ("f(\"some \"\n"
7253 " \"text\",\n"
7254 " other);",
7255 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007256
7257 // Only break as a last resort.
7258 verifyFormat(
7259 "aaaaaaaaaaaaaaaaaaaa(\n"
7260 " aaaaaaaaaaaaaaaaaaaa,\n"
7261 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007262
Daniel Jaspera44991332015-04-29 13:06:49 +00007263 EXPECT_EQ("\"splitmea\"\n"
7264 "\"trandomp\"\n"
7265 "\"oint\"",
7266 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007267
Daniel Jaspera44991332015-04-29 13:06:49 +00007268 EXPECT_EQ("\"split/\"\n"
7269 "\"pathat/\"\n"
7270 "\"slashes\"",
7271 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007272
Daniel Jaspera44991332015-04-29 13:06:49 +00007273 EXPECT_EQ("\"split/\"\n"
7274 "\"pathat/\"\n"
7275 "\"slashes\"",
7276 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007277 EXPECT_EQ("\"split at \"\n"
7278 "\"spaces/at/\"\n"
7279 "\"slashes.at.any$\"\n"
7280 "\"non-alphanumeric%\"\n"
7281 "\"1111111111characte\"\n"
7282 "\"rs\"",
7283 format("\"split at "
7284 "spaces/at/"
7285 "slashes.at."
7286 "any$non-"
7287 "alphanumeric%"
7288 "1111111111characte"
7289 "rs\"",
7290 getLLVMStyleWithColumns(20)));
7291
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007292 // Verify that splitting the strings understands
7293 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007294 EXPECT_EQ(
7295 "aaaaaaaaaaaa(\n"
7296 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7297 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7298 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7299 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7300 "aaaaaaaaaaaaaaaaaaaaaa\");",
7301 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007302 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7303 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7304 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7305 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7306 "aaaaaaaaaaaaaaaaaaaaaa\";",
7307 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007308 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7309 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7310 format("llvm::outs() << "
7311 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7312 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007313 EXPECT_EQ("ffff(\n"
7314 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7315 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7316 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7317 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7318 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007319
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007320 FormatStyle Style = getLLVMStyleWithColumns(12);
7321 Style.BreakStringLiterals = false;
7322 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7323
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007324 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007325 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007326 EXPECT_EQ("#define A \\\n"
7327 " \"some \" \\\n"
7328 " \"text \" \\\n"
7329 " \"other\";",
7330 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007331}
7332
Manuel Klimek9e321992015-07-28 15:50:24 +00007333TEST_F(FormatTest, FullyRemoveEmptyLines) {
7334 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7335 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7336 EXPECT_EQ("int i = a(b());",
7337 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7338}
7339
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007340TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7341 EXPECT_EQ(
7342 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7343 "(\n"
7344 " \"x\t\");",
7345 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7346 "aaaaaaa("
7347 "\"x\t\");"));
7348}
7349
Daniel Jasper174b0122014-01-09 14:18:12 +00007350TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007351 EXPECT_EQ(
7352 "u8\"utf8 string \"\n"
7353 "u8\"literal\";",
7354 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7355 EXPECT_EQ(
7356 "u\"utf16 string \"\n"
7357 "u\"literal\";",
7358 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7359 EXPECT_EQ(
7360 "U\"utf32 string \"\n"
7361 "U\"literal\";",
7362 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7363 EXPECT_EQ("L\"wide string \"\n"
7364 "L\"literal\";",
7365 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007366 EXPECT_EQ("@\"NSString \"\n"
7367 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007368 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007369 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007370
7371 // This input makes clang-format try to split the incomplete unicode escape
7372 // sequence, which used to lead to a crasher.
7373 verifyNoCrash(
7374 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7375 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007376}
7377
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007378TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7379 FormatStyle Style = getGoogleStyleWithColumns(15);
7380 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7381 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7382 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7383 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7384 EXPECT_EQ("u8R\"x(raw literal)x\";",
7385 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007386}
7387
7388TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7389 FormatStyle Style = getLLVMStyleWithColumns(20);
7390 EXPECT_EQ(
7391 "_T(\"aaaaaaaaaaaaaa\")\n"
7392 "_T(\"aaaaaaaaaaaaaa\")\n"
7393 "_T(\"aaaaaaaaaaaa\")",
7394 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007395 EXPECT_EQ("f(x,\n"
7396 " _T(\"aaaaaaaaaaaa\")\n"
7397 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007398 " z);",
7399 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7400
7401 // FIXME: Handle embedded spaces in one iteration.
7402 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7403 // "_T(\"aaaaaaaaaaaaa\")\n"
7404 // "_T(\"aaaaaaaaaaaaa\")\n"
7405 // "_T(\"a\")",
7406 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7407 // getLLVMStyleWithColumns(20)));
7408 EXPECT_EQ(
7409 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7410 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007411 EXPECT_EQ("f(\n"
7412 "#if !TEST\n"
7413 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7414 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007415 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007416 format("f(\n"
7417 "#if !TEST\n"
7418 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7419 "#endif\n"
7420 ");"));
7421 EXPECT_EQ("f(\n"
7422 "\n"
7423 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7424 format("f(\n"
7425 "\n"
7426 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007427}
7428
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007429TEST_F(FormatTest, BreaksStringLiteralOperands) {
7430 // In a function call with two operands, the second can be broken with no line
7431 // break before it.
7432 EXPECT_EQ("func(a, \"long long \"\n"
7433 " \"long long\");",
7434 format("func(a, \"long long long long\");",
7435 getLLVMStyleWithColumns(24)));
7436 // In a function call with three operands, the second must be broken with a
7437 // line break before it.
7438 EXPECT_EQ("func(a,\n"
7439 " \"long long long \"\n"
7440 " \"long\",\n"
7441 " c);",
7442 format("func(a, \"long long long long\", c);",
7443 getLLVMStyleWithColumns(24)));
7444 // In a function call with three operands, the third must be broken with a
7445 // line break before it.
7446 EXPECT_EQ("func(a, b,\n"
7447 " \"long long long \"\n"
7448 " \"long\");",
7449 format("func(a, b, \"long long long long\");",
7450 getLLVMStyleWithColumns(24)));
7451 // In a function call with three operands, both the second and the third must
7452 // be broken with a line break before them.
7453 EXPECT_EQ("func(a,\n"
7454 " \"long long long \"\n"
7455 " \"long\",\n"
7456 " \"long long long \"\n"
7457 " \"long\");",
7458 format("func(a, \"long long long long\", \"long long long long\");",
7459 getLLVMStyleWithColumns(24)));
7460 // In a chain of << with two operands, the second can be broken with no line
7461 // break before it.
7462 EXPECT_EQ("a << \"line line \"\n"
7463 " \"line\";",
7464 format("a << \"line line line\";",
7465 getLLVMStyleWithColumns(20)));
7466 // In a chain of << with three operands, the second can be broken with no line
7467 // break before it.
7468 EXPECT_EQ("abcde << \"line \"\n"
7469 " \"line line\"\n"
7470 " << c;",
7471 format("abcde << \"line line line\" << c;",
7472 getLLVMStyleWithColumns(20)));
7473 // In a chain of << with three operands, the third must be broken with a line
7474 // break before it.
7475 EXPECT_EQ("a << b\n"
7476 " << \"line line \"\n"
7477 " \"line\";",
7478 format("a << b << \"line line line\";",
7479 getLLVMStyleWithColumns(20)));
7480 // In a chain of << with three operands, the second can be broken with no line
7481 // break before it and the third must be broken with a line break before it.
7482 EXPECT_EQ("abcd << \"line line \"\n"
7483 " \"line\"\n"
7484 " << \"line line \"\n"
7485 " \"line\";",
7486 format("abcd << \"line line line\" << \"line line line\";",
7487 getLLVMStyleWithColumns(20)));
7488 // In a chain of binary operators with two operands, the second can be broken
7489 // with no line break before it.
7490 EXPECT_EQ("abcd + \"line line \"\n"
7491 " \"line line\";",
7492 format("abcd + \"line line line line\";",
7493 getLLVMStyleWithColumns(20)));
7494 // In a chain of binary operators with three operands, the second must be
7495 // broken with a line break before it.
7496 EXPECT_EQ("abcd +\n"
7497 " \"line line \"\n"
7498 " \"line line\" +\n"
7499 " e;",
7500 format("abcd + \"line line line line\" + e;",
7501 getLLVMStyleWithColumns(20)));
7502 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7503 // the first must be broken with a line break before it.
7504 FormatStyle Style = getLLVMStyleWithColumns(25);
7505 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7506 EXPECT_EQ("someFunction(\n"
7507 " \"long long long \"\n"
7508 " \"long\",\n"
7509 " a);",
7510 format("someFunction(\"long long long long\", a);", Style));
7511}
7512
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007513TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007514 EXPECT_EQ(
7515 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7517 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7518 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7521}
7522
7523TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7524 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007525 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007526 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7527 "multiline raw string literal xxxxxxxxxxxxxx\n"
7528 ")x\",\n"
7529 " a),\n"
7530 " b);",
7531 format("fffffffffff(g(R\"x(\n"
7532 "multiline raw string literal xxxxxxxxxxxxxx\n"
7533 ")x\", a), b);",
7534 getGoogleStyleWithColumns(20)));
7535 EXPECT_EQ("fffffffffff(\n"
7536 " g(R\"x(qqq\n"
7537 "multiline raw string literal xxxxxxxxxxxxxx\n"
7538 ")x\",\n"
7539 " a),\n"
7540 " b);",
7541 format("fffffffffff(g(R\"x(qqq\n"
7542 "multiline raw string literal xxxxxxxxxxxxxx\n"
7543 ")x\", a), b);",
7544 getGoogleStyleWithColumns(20)));
7545
7546 EXPECT_EQ("fffffffffff(R\"x(\n"
7547 "multiline raw string literal xxxxxxxxxxxxxx\n"
7548 ")x\");",
7549 format("fffffffffff(R\"x(\n"
7550 "multiline raw string literal xxxxxxxxxxxxxx\n"
7551 ")x\");",
7552 getGoogleStyleWithColumns(20)));
7553 EXPECT_EQ("fffffffffff(R\"x(\n"
7554 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007555 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007556 format("fffffffffff(R\"x(\n"
7557 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007558 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007559 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007560 EXPECT_EQ("fffffffffff(\n"
7561 " R\"x(\n"
7562 "multiline raw string literal xxxxxxxxxxxxxx\n"
7563 ")x\" +\n"
7564 " bbbbbb);",
7565 format("fffffffffff(\n"
7566 " R\"x(\n"
7567 "multiline raw string literal xxxxxxxxxxxxxx\n"
7568 ")x\" + bbbbbb);",
7569 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007570}
7571
Alexander Kornienkobe633902013-06-14 11:46:10 +00007572TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007573 verifyFormat("string a = \"unterminated;");
7574 EXPECT_EQ("function(\"unterminated,\n"
7575 " OtherParameter);",
7576 format("function( \"unterminated,\n"
7577 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007578}
7579
7580TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007581 FormatStyle Style = getLLVMStyle();
7582 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007583 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007584 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007585}
7586
Daniel Jaspera44991332015-04-29 13:06:49 +00007587TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007588
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007589TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7590 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7591 " \"ddeeefff\");",
7592 format("someFunction(\"aaabbbcccdddeeefff\");",
7593 getLLVMStyleWithColumns(25)));
7594 EXPECT_EQ("someFunction1234567890(\n"
7595 " \"aaabbbcccdddeeefff\");",
7596 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7597 getLLVMStyleWithColumns(26)));
7598 EXPECT_EQ("someFunction1234567890(\n"
7599 " \"aaabbbcccdddeeeff\"\n"
7600 " \"f\");",
7601 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7602 getLLVMStyleWithColumns(25)));
7603 EXPECT_EQ("someFunction1234567890(\n"
7604 " \"aaabbbcccdddeeeff\"\n"
7605 " \"f\");",
7606 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7607 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007608 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7609 " \"ddde \"\n"
7610 " \"efff\");",
7611 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007612 getLLVMStyleWithColumns(25)));
7613 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7614 " \"ddeeefff\");",
7615 format("someFunction(\"aaabbbccc ddeeefff\");",
7616 getLLVMStyleWithColumns(25)));
7617 EXPECT_EQ("someFunction1234567890(\n"
7618 " \"aaabb \"\n"
7619 " \"cccdddeeefff\");",
7620 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7621 getLLVMStyleWithColumns(25)));
7622 EXPECT_EQ("#define A \\\n"
7623 " string s = \\\n"
7624 " \"123456789\" \\\n"
7625 " \"0\"; \\\n"
7626 " int i;",
7627 format("#define A string s = \"1234567890\"; int i;",
7628 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007629 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7630 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7631 " \"dddeeeff\"\n"
7632 " \"f\");",
7633 format("someFunction(\"aaabbbcc dddeeefff\");",
7634 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007635}
7636
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007637TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007638 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7639 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007640 EXPECT_EQ("\"test\"\n"
7641 "\"\\n\"",
7642 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7643 EXPECT_EQ("\"tes\\\\\"\n"
7644 "\"n\"",
7645 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7646 EXPECT_EQ("\"\\\\\\\\\"\n"
7647 "\"\\n\"",
7648 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007649 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007650 EXPECT_EQ("\"\\uff01\"\n"
7651 "\"test\"",
7652 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7653 EXPECT_EQ("\"\\Uff01ff02\"",
7654 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7655 EXPECT_EQ("\"\\x000000000001\"\n"
7656 "\"next\"",
7657 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7658 EXPECT_EQ("\"\\x000000000001next\"",
7659 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7660 EXPECT_EQ("\"\\x000000000001\"",
7661 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7662 EXPECT_EQ("\"test\"\n"
7663 "\"\\000000\"\n"
7664 "\"000001\"",
7665 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7666 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007667 "\"00000000\"\n"
7668 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007669 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007670}
7671
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007672TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7673 verifyFormat("void f() {\n"
7674 " return g() {}\n"
7675 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007676 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007677 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007678 "}");
7679}
7680
Manuel Klimek421147e2014-01-24 09:25:23 +00007681TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7682 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007683 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007684}
7685
Manuel Klimek13b97d82013-05-13 08:42:42 +00007686TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7687 verifyFormat("class X {\n"
7688 " void f() {\n"
7689 " }\n"
7690 "};",
7691 getLLVMStyleWithColumns(12));
7692}
7693
7694TEST_F(FormatTest, ConfigurableIndentWidth) {
7695 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7696 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007697 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007698 verifyFormat("void f() {\n"
7699 " someFunction();\n"
7700 " if (true) {\n"
7701 " f();\n"
7702 " }\n"
7703 "}",
7704 EightIndent);
7705 verifyFormat("class X {\n"
7706 " void f() {\n"
7707 " }\n"
7708 "};",
7709 EightIndent);
7710 verifyFormat("int x[] = {\n"
7711 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007712 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007713 EightIndent);
7714}
7715
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007716TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007717 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007718 "f();",
7719 getLLVMStyleWithColumns(8));
7720}
7721
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007722TEST_F(FormatTest, ConfigurableUseOfTab) {
7723 FormatStyle Tab = getLLVMStyleWithColumns(42);
7724 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007725 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007726 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007727
7728 EXPECT_EQ("if (aaaaaaaa && // q\n"
7729 " bb)\t\t// w\n"
7730 "\t;",
7731 format("if (aaaaaaaa &&// q\n"
7732 "bb)// w\n"
7733 ";",
7734 Tab));
7735 EXPECT_EQ("if (aaa && bbb) // w\n"
7736 "\t;",
7737 format("if(aaa&&bbb)// w\n"
7738 ";",
7739 Tab));
7740
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007741 verifyFormat("class X {\n"
7742 "\tvoid f() {\n"
7743 "\t\tsomeFunction(parameter1,\n"
7744 "\t\t\t parameter2);\n"
7745 "\t}\n"
7746 "};",
7747 Tab);
7748 verifyFormat("#define A \\\n"
7749 "\tvoid f() { \\\n"
7750 "\t\tsomeFunction( \\\n"
7751 "\t\t parameter1, \\\n"
7752 "\t\t parameter2); \\\n"
7753 "\t}",
7754 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007755
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007756 Tab.TabWidth = 4;
7757 Tab.IndentWidth = 8;
7758 verifyFormat("class TabWidth4Indent8 {\n"
7759 "\t\tvoid f() {\n"
7760 "\t\t\t\tsomeFunction(parameter1,\n"
7761 "\t\t\t\t\t\t\t parameter2);\n"
7762 "\t\t}\n"
7763 "};",
7764 Tab);
7765
7766 Tab.TabWidth = 4;
7767 Tab.IndentWidth = 4;
7768 verifyFormat("class TabWidth4Indent4 {\n"
7769 "\tvoid f() {\n"
7770 "\t\tsomeFunction(parameter1,\n"
7771 "\t\t\t\t\t parameter2);\n"
7772 "\t}\n"
7773 "};",
7774 Tab);
7775
7776 Tab.TabWidth = 8;
7777 Tab.IndentWidth = 4;
7778 verifyFormat("class TabWidth8Indent4 {\n"
7779 " void f() {\n"
7780 "\tsomeFunction(parameter1,\n"
7781 "\t\t parameter2);\n"
7782 " }\n"
7783 "};",
7784 Tab);
7785
Alexander Kornienko39856b72013-09-10 09:38:25 +00007786 Tab.TabWidth = 8;
7787 Tab.IndentWidth = 8;
7788 EXPECT_EQ("/*\n"
7789 "\t a\t\tcomment\n"
7790 "\t in multiple lines\n"
7791 " */",
7792 format(" /*\t \t \n"
7793 " \t \t a\t\tcomment\t \t\n"
7794 " \t \t in multiple lines\t\n"
7795 " \t */",
7796 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007797
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007798 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007799 verifyFormat("{\n"
7800 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7801 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7802 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7803 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7804 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7805 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007806 "};",
7807 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007808 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007809 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007810 "\ta2,\n"
7811 "\ta3\n"
7812 "};",
7813 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007814 EXPECT_EQ("if (aaaaaaaa && // q\n"
7815 " bb) // w\n"
7816 "\t;",
7817 format("if (aaaaaaaa &&// q\n"
7818 "bb)// w\n"
7819 ";",
7820 Tab));
7821 verifyFormat("class X {\n"
7822 "\tvoid f() {\n"
7823 "\t\tsomeFunction(parameter1,\n"
7824 "\t\t parameter2);\n"
7825 "\t}\n"
7826 "};",
7827 Tab);
7828 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007829 "\tQ(\n"
7830 "\t {\n"
7831 "\t\t int a;\n"
7832 "\t\t someFunction(aaaaaaaa,\n"
7833 "\t\t bbbbbbb);\n"
7834 "\t },\n"
7835 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007836 "}",
7837 Tab);
7838 EXPECT_EQ("{\n"
7839 "\t/* aaaa\n"
7840 "\t bbbb */\n"
7841 "}",
7842 format("{\n"
7843 "/* aaaa\n"
7844 " bbbb */\n"
7845 "}",
7846 Tab));
7847 EXPECT_EQ("{\n"
7848 "\t/*\n"
7849 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7850 "\t bbbbbbbbbbbbb\n"
7851 "\t*/\n"
7852 "}",
7853 format("{\n"
7854 "/*\n"
7855 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7856 "*/\n"
7857 "}",
7858 Tab));
7859 EXPECT_EQ("{\n"
7860 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7861 "\t// bbbbbbbbbbbbb\n"
7862 "}",
7863 format("{\n"
7864 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7865 "}",
7866 Tab));
7867 EXPECT_EQ("{\n"
7868 "\t/*\n"
7869 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7870 "\t bbbbbbbbbbbbb\n"
7871 "\t*/\n"
7872 "}",
7873 format("{\n"
7874 "\t/*\n"
7875 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7876 "\t*/\n"
7877 "}",
7878 Tab));
7879 EXPECT_EQ("{\n"
7880 "\t/*\n"
7881 "\n"
7882 "\t*/\n"
7883 "}",
7884 format("{\n"
7885 "\t/*\n"
7886 "\n"
7887 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007888 "}",
7889 Tab));
7890 EXPECT_EQ("{\n"
7891 "\t/*\n"
7892 " asdf\n"
7893 "\t*/\n"
7894 "}",
7895 format("{\n"
7896 "\t/*\n"
7897 " asdf\n"
7898 "\t*/\n"
7899 "}",
7900 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007901
7902 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007903 EXPECT_EQ("/*\n"
7904 " a\t\tcomment\n"
7905 " in multiple lines\n"
7906 " */",
7907 format(" /*\t \t \n"
7908 " \t \t a\t\tcomment\t \t\n"
7909 " \t \t in multiple lines\t\n"
7910 " \t */",
7911 Tab));
7912 EXPECT_EQ("/* some\n"
7913 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007914 format(" \t \t /* some\n"
7915 " \t \t comment */",
7916 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007917 EXPECT_EQ("int a; /* some\n"
7918 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007919 format(" \t \t int a; /* some\n"
7920 " \t \t comment */",
7921 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007922
Alexander Kornienko39856b72013-09-10 09:38:25 +00007923 EXPECT_EQ("int a; /* some\n"
7924 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007925 format(" \t \t int\ta; /* some\n"
7926 " \t \t comment */",
7927 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007928 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7929 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007930 format(" \t \t f(\"\t\t\"); /* some\n"
7931 " \t \t comment */",
7932 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007933 EXPECT_EQ("{\n"
7934 " /*\n"
7935 " * Comment\n"
7936 " */\n"
7937 " int i;\n"
7938 "}",
7939 format("{\n"
7940 "\t/*\n"
7941 "\t * Comment\n"
7942 "\t */\n"
7943 "\t int i;\n"
7944 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007945
7946 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7947 Tab.TabWidth = 8;
7948 Tab.IndentWidth = 8;
7949 EXPECT_EQ("if (aaaaaaaa && // q\n"
7950 " bb) // w\n"
7951 "\t;",
7952 format("if (aaaaaaaa &&// q\n"
7953 "bb)// w\n"
7954 ";",
7955 Tab));
7956 EXPECT_EQ("if (aaa && bbb) // w\n"
7957 "\t;",
7958 format("if(aaa&&bbb)// w\n"
7959 ";",
7960 Tab));
7961 verifyFormat("class X {\n"
7962 "\tvoid f() {\n"
7963 "\t\tsomeFunction(parameter1,\n"
7964 "\t\t\t parameter2);\n"
7965 "\t}\n"
7966 "};",
7967 Tab);
7968 verifyFormat("#define A \\\n"
7969 "\tvoid f() { \\\n"
7970 "\t\tsomeFunction( \\\n"
7971 "\t\t parameter1, \\\n"
7972 "\t\t parameter2); \\\n"
7973 "\t}",
7974 Tab);
7975 Tab.TabWidth = 4;
7976 Tab.IndentWidth = 8;
7977 verifyFormat("class TabWidth4Indent8 {\n"
7978 "\t\tvoid f() {\n"
7979 "\t\t\t\tsomeFunction(parameter1,\n"
7980 "\t\t\t\t\t\t\t parameter2);\n"
7981 "\t\t}\n"
7982 "};",
7983 Tab);
7984 Tab.TabWidth = 4;
7985 Tab.IndentWidth = 4;
7986 verifyFormat("class TabWidth4Indent4 {\n"
7987 "\tvoid f() {\n"
7988 "\t\tsomeFunction(parameter1,\n"
7989 "\t\t\t\t\t parameter2);\n"
7990 "\t}\n"
7991 "};",
7992 Tab);
7993 Tab.TabWidth = 8;
7994 Tab.IndentWidth = 4;
7995 verifyFormat("class TabWidth8Indent4 {\n"
7996 " void f() {\n"
7997 "\tsomeFunction(parameter1,\n"
7998 "\t\t parameter2);\n"
7999 " }\n"
8000 "};",
8001 Tab);
8002 Tab.TabWidth = 8;
8003 Tab.IndentWidth = 8;
8004 EXPECT_EQ("/*\n"
8005 "\t a\t\tcomment\n"
8006 "\t in multiple lines\n"
8007 " */",
8008 format(" /*\t \t \n"
8009 " \t \t a\t\tcomment\t \t\n"
8010 " \t \t in multiple lines\t\n"
8011 " \t */",
8012 Tab));
8013 verifyFormat("{\n"
8014 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8015 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8016 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8017 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8018 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8019 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8020 "};",
8021 Tab);
8022 verifyFormat("enum AA {\n"
8023 "\ta1, // Force multiple lines\n"
8024 "\ta2,\n"
8025 "\ta3\n"
8026 "};",
8027 Tab);
8028 EXPECT_EQ("if (aaaaaaaa && // q\n"
8029 " bb) // w\n"
8030 "\t;",
8031 format("if (aaaaaaaa &&// q\n"
8032 "bb)// w\n"
8033 ";",
8034 Tab));
8035 verifyFormat("class X {\n"
8036 "\tvoid f() {\n"
8037 "\t\tsomeFunction(parameter1,\n"
8038 "\t\t\t parameter2);\n"
8039 "\t}\n"
8040 "};",
8041 Tab);
8042 verifyFormat("{\n"
8043 "\tQ(\n"
8044 "\t {\n"
8045 "\t\t int a;\n"
8046 "\t\t someFunction(aaaaaaaa,\n"
8047 "\t\t\t\t bbbbbbb);\n"
8048 "\t },\n"
8049 "\t p);\n"
8050 "}",
8051 Tab);
8052 EXPECT_EQ("{\n"
8053 "\t/* aaaa\n"
8054 "\t bbbb */\n"
8055 "}",
8056 format("{\n"
8057 "/* aaaa\n"
8058 " bbbb */\n"
8059 "}",
8060 Tab));
8061 EXPECT_EQ("{\n"
8062 "\t/*\n"
8063 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8064 "\t bbbbbbbbbbbbb\n"
8065 "\t*/\n"
8066 "}",
8067 format("{\n"
8068 "/*\n"
8069 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8070 "*/\n"
8071 "}",
8072 Tab));
8073 EXPECT_EQ("{\n"
8074 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8075 "\t// bbbbbbbbbbbbb\n"
8076 "}",
8077 format("{\n"
8078 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8079 "}",
8080 Tab));
8081 EXPECT_EQ("{\n"
8082 "\t/*\n"
8083 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8084 "\t bbbbbbbbbbbbb\n"
8085 "\t*/\n"
8086 "}",
8087 format("{\n"
8088 "\t/*\n"
8089 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8090 "\t*/\n"
8091 "}",
8092 Tab));
8093 EXPECT_EQ("{\n"
8094 "\t/*\n"
8095 "\n"
8096 "\t*/\n"
8097 "}",
8098 format("{\n"
8099 "\t/*\n"
8100 "\n"
8101 "\t*/\n"
8102 "}",
8103 Tab));
8104 EXPECT_EQ("{\n"
8105 "\t/*\n"
8106 " asdf\n"
8107 "\t*/\n"
8108 "}",
8109 format("{\n"
8110 "\t/*\n"
8111 " asdf\n"
8112 "\t*/\n"
8113 "}",
8114 Tab));
8115 EXPECT_EQ("/*\n"
8116 "\t a\t\tcomment\n"
8117 "\t in multiple lines\n"
8118 " */",
8119 format(" /*\t \t \n"
8120 " \t \t a\t\tcomment\t \t\n"
8121 " \t \t in multiple lines\t\n"
8122 " \t */",
8123 Tab));
8124 EXPECT_EQ("/* some\n"
8125 " comment */",
8126 format(" \t \t /* some\n"
8127 " \t \t comment */",
8128 Tab));
8129 EXPECT_EQ("int a; /* some\n"
8130 " comment */",
8131 format(" \t \t int a; /* some\n"
8132 " \t \t comment */",
8133 Tab));
8134 EXPECT_EQ("int a; /* some\n"
8135 "comment */",
8136 format(" \t \t int\ta; /* some\n"
8137 " \t \t comment */",
8138 Tab));
8139 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8140 " comment */",
8141 format(" \t \t f(\"\t\t\"); /* some\n"
8142 " \t \t comment */",
8143 Tab));
8144 EXPECT_EQ("{\n"
8145 " /*\n"
8146 " * Comment\n"
8147 " */\n"
8148 " int i;\n"
8149 "}",
8150 format("{\n"
8151 "\t/*\n"
8152 "\t * Comment\n"
8153 "\t */\n"
8154 "\t int i;\n"
8155 "}"));
8156 Tab.AlignConsecutiveAssignments = true;
8157 Tab.AlignConsecutiveDeclarations = true;
8158 Tab.TabWidth = 4;
8159 Tab.IndentWidth = 4;
8160 verifyFormat("class Assign {\n"
8161 "\tvoid f() {\n"
8162 "\t\tint x = 123;\n"
8163 "\t\tint random = 4;\n"
8164 "\t\tstd::string alphabet =\n"
8165 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8166 "\t}\n"
8167 "};",
8168 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008169}
8170
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008171TEST_F(FormatTest, CalculatesOriginalColumn) {
8172 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8173 "q\"; /* some\n"
8174 " comment */",
8175 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8176 "q\"; /* some\n"
8177 " comment */",
8178 getLLVMStyle()));
8179 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8180 "/* some\n"
8181 " comment */",
8182 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8183 " /* some\n"
8184 " comment */",
8185 getLLVMStyle()));
8186 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8187 "qqq\n"
8188 "/* some\n"
8189 " comment */",
8190 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8191 "qqq\n"
8192 " /* some\n"
8193 " comment */",
8194 getLLVMStyle()));
8195 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8196 "wwww; /* some\n"
8197 " comment */",
8198 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8199 "wwww; /* some\n"
8200 " comment */",
8201 getLLVMStyle()));
8202}
8203
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008204TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008205 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008206 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008207
8208 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008209 " continue;",
8210 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008211 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008212 " continue;",
8213 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008214 verifyFormat("if(true)\n"
8215 " f();\n"
8216 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008217 " f();",
8218 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008219 verifyFormat("do {\n"
8220 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008221 "} while(something());",
8222 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008223 verifyFormat("switch(x) {\n"
8224 "default:\n"
8225 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008226 "}",
8227 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008228 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008229 verifyFormat("size_t x = sizeof(x);", NoSpace);
8230 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8231 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8232 verifyFormat("alignas(128) char a[128];", NoSpace);
8233 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8234 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8235 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008236 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008237 verifyFormat("T A::operator()();", NoSpace);
8238 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008239
8240 FormatStyle Space = getLLVMStyle();
8241 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8242
8243 verifyFormat("int f ();", Space);
8244 verifyFormat("void f (int a, T b) {\n"
8245 " while (true)\n"
8246 " continue;\n"
8247 "}",
8248 Space);
8249 verifyFormat("if (true)\n"
8250 " f ();\n"
8251 "else if (true)\n"
8252 " f ();",
8253 Space);
8254 verifyFormat("do {\n"
8255 " do_something ();\n"
8256 "} while (something ());",
8257 Space);
8258 verifyFormat("switch (x) {\n"
8259 "default:\n"
8260 " break;\n"
8261 "}",
8262 Space);
8263 verifyFormat("A::A () : a (1) {}", Space);
8264 verifyFormat("void f () __attribute__ ((asdf));", Space);
8265 verifyFormat("*(&a + 1);\n"
8266 "&((&a)[1]);\n"
8267 "a[(b + c) * d];\n"
8268 "(((a + 1) * 2) + 3) * 4;",
8269 Space);
8270 verifyFormat("#define A(x) x", Space);
8271 verifyFormat("#define A (x) x", Space);
8272 verifyFormat("#if defined(x)\n"
8273 "#endif",
8274 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008275 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008276 verifyFormat("size_t x = sizeof (x);", Space);
8277 verifyFormat("auto f (int x) -> decltype (x);", Space);
8278 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8279 verifyFormat("alignas (128) char a[128];", Space);
8280 verifyFormat("size_t x = alignof (MyType);", Space);
8281 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8282 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008283 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008284 verifyFormat("T A::operator() ();", Space);
8285 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008286}
8287
8288TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8289 FormatStyle Spaces = getLLVMStyle();
8290
8291 Spaces.SpacesInParentheses = true;
8292 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008293 verifyFormat("call();", Spaces);
8294 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008295 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8296 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008297 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008298 " continue;",
8299 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008300 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008301 " continue;",
8302 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008303 verifyFormat("if ( true )\n"
8304 " f();\n"
8305 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008306 " f();",
8307 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008308 verifyFormat("do {\n"
8309 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008310 "} while ( something() );",
8311 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008312 verifyFormat("switch ( x ) {\n"
8313 "default:\n"
8314 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008315 "}",
8316 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008317
8318 Spaces.SpacesInParentheses = false;
8319 Spaces.SpacesInCStyleCastParentheses = true;
8320 verifyFormat("Type *A = ( Type * )P;", Spaces);
8321 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8322 verifyFormat("x = ( int32 )y;", Spaces);
8323 verifyFormat("int a = ( int )(2.0f);", Spaces);
8324 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8325 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8326 verifyFormat("#define x (( int )-1)", Spaces);
8327
Daniel Jasper92e09822015-03-18 12:59:19 +00008328 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008329 Spaces.SpacesInParentheses = false;
8330 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008331 Spaces.SpacesInCStyleCastParentheses = true;
8332 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008333 verifyFormat("call( );", Spaces);
8334 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008335 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008336 " continue;",
8337 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008338 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008339 " continue;",
8340 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008341 verifyFormat("if (true)\n"
8342 " f( );\n"
8343 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008344 " f( );",
8345 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008346 verifyFormat("do {\n"
8347 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008348 "} while (something( ));",
8349 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008350 verifyFormat("switch (x) {\n"
8351 "default:\n"
8352 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008353 "}",
8354 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008355
Daniel Jasper92e09822015-03-18 12:59:19 +00008356 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008357 Spaces.SpaceAfterCStyleCast = true;
8358 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008359 verifyFormat("call( );", Spaces);
8360 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008361 verifyFormat("while (( bool ) 1)\n"
8362 " continue;",
8363 Spaces);
8364 verifyFormat("for (;;)\n"
8365 " continue;",
8366 Spaces);
8367 verifyFormat("if (true)\n"
8368 " f( );\n"
8369 "else if (true)\n"
8370 " f( );",
8371 Spaces);
8372 verifyFormat("do {\n"
8373 " do_something(( int ) i);\n"
8374 "} while (something( ));",
8375 Spaces);
8376 verifyFormat("switch (x) {\n"
8377 "default:\n"
8378 " break;\n"
8379 "}",
8380 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008381
8382 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008383 Spaces.SpacesInCStyleCastParentheses = false;
8384 Spaces.SpaceAfterCStyleCast = true;
8385 verifyFormat("while ((bool) 1)\n"
8386 " continue;",
8387 Spaces);
8388 verifyFormat("do {\n"
8389 " do_something((int) i);\n"
8390 "} while (something( ));",
8391 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008392}
8393
Daniel Jasperad981f82014-08-26 11:41:14 +00008394TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8395 verifyFormat("int a[5];");
8396 verifyFormat("a[3] += 42;");
8397
8398 FormatStyle Spaces = getLLVMStyle();
8399 Spaces.SpacesInSquareBrackets = true;
8400 // Lambdas unchanged.
8401 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8402 verifyFormat("return [i, args...] {};", Spaces);
8403
8404 // Not lambdas.
8405 verifyFormat("int a[ 5 ];", Spaces);
8406 verifyFormat("a[ 3 ] += 42;", Spaces);
8407 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8408 verifyFormat("double &operator[](int i) { return 0; }\n"
8409 "int i;",
8410 Spaces);
8411 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8412 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8413 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8414}
8415
Daniel Jasperd94bff32013-09-25 15:15:02 +00008416TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8417 verifyFormat("int a = 5;");
8418 verifyFormat("a += 42;");
8419 verifyFormat("a or_eq 8;");
8420
8421 FormatStyle Spaces = getLLVMStyle();
8422 Spaces.SpaceBeforeAssignmentOperators = false;
8423 verifyFormat("int a= 5;", Spaces);
8424 verifyFormat("a+= 42;", Spaces);
8425 verifyFormat("a or_eq 8;", Spaces);
8426}
8427
Daniel Jaspera44991332015-04-29 13:06:49 +00008428TEST_F(FormatTest, AlignConsecutiveAssignments) {
8429 FormatStyle Alignment = getLLVMStyle();
8430 Alignment.AlignConsecutiveAssignments = false;
8431 verifyFormat("int a = 5;\n"
8432 "int oneTwoThree = 123;",
8433 Alignment);
8434 verifyFormat("int a = 5;\n"
8435 "int oneTwoThree = 123;",
8436 Alignment);
8437
8438 Alignment.AlignConsecutiveAssignments = true;
8439 verifyFormat("int a = 5;\n"
8440 "int oneTwoThree = 123;",
8441 Alignment);
8442 verifyFormat("int a = method();\n"
8443 "int oneTwoThree = 133;",
8444 Alignment);
8445 verifyFormat("a &= 5;\n"
8446 "bcd *= 5;\n"
8447 "ghtyf += 5;\n"
8448 "dvfvdb -= 5;\n"
8449 "a /= 5;\n"
8450 "vdsvsv %= 5;\n"
8451 "sfdbddfbdfbb ^= 5;\n"
8452 "dvsdsv |= 5;\n"
8453 "int dsvvdvsdvvv = 123;",
8454 Alignment);
8455 verifyFormat("int i = 1, j = 10;\n"
8456 "something = 2000;",
8457 Alignment);
8458 verifyFormat("something = 2000;\n"
8459 "int i = 1, j = 10;\n",
8460 Alignment);
8461 verifyFormat("something = 2000;\n"
8462 "another = 911;\n"
8463 "int i = 1, j = 10;\n"
8464 "oneMore = 1;\n"
8465 "i = 2;",
8466 Alignment);
8467 verifyFormat("int a = 5;\n"
8468 "int one = 1;\n"
8469 "method();\n"
8470 "int oneTwoThree = 123;\n"
8471 "int oneTwo = 12;",
8472 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008473 verifyFormat("int oneTwoThree = 123;\n"
8474 "int oneTwo = 12;\n"
8475 "method();\n",
8476 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008477 verifyFormat("int oneTwoThree = 123; // comment\n"
8478 "int oneTwo = 12; // comment",
8479 Alignment);
8480 EXPECT_EQ("int a = 5;\n"
8481 "\n"
8482 "int oneTwoThree = 123;",
8483 format("int a = 5;\n"
8484 "\n"
8485 "int oneTwoThree= 123;",
8486 Alignment));
8487 EXPECT_EQ("int a = 5;\n"
8488 "int one = 1;\n"
8489 "\n"
8490 "int oneTwoThree = 123;",
8491 format("int a = 5;\n"
8492 "int one = 1;\n"
8493 "\n"
8494 "int oneTwoThree = 123;",
8495 Alignment));
8496 EXPECT_EQ("int a = 5;\n"
8497 "int one = 1;\n"
8498 "\n"
8499 "int oneTwoThree = 123;\n"
8500 "int oneTwo = 12;",
8501 format("int a = 5;\n"
8502 "int one = 1;\n"
8503 "\n"
8504 "int oneTwoThree = 123;\n"
8505 "int oneTwo = 12;",
8506 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008507 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8508 verifyFormat("#define A \\\n"
8509 " int aaaa = 12; \\\n"
8510 " int b = 23; \\\n"
8511 " int ccc = 234; \\\n"
8512 " int dddddddddd = 2345;",
8513 Alignment);
8514 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008515 verifyFormat("#define A \\\n"
8516 " int aaaa = 12; \\\n"
8517 " int b = 23; \\\n"
8518 " int ccc = 234; \\\n"
8519 " int dddddddddd = 2345;",
8520 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008521 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008522 verifyFormat("#define A "
8523 " \\\n"
8524 " int aaaa = 12; "
8525 " \\\n"
8526 " int b = 23; "
8527 " \\\n"
8528 " int ccc = 234; "
8529 " \\\n"
8530 " int dddddddddd = 2345;",
8531 Alignment);
8532 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8533 "k = 4, int l = 5,\n"
8534 " int m = 6) {\n"
8535 " int j = 10;\n"
8536 " otherThing = 1;\n"
8537 "}",
8538 Alignment);
8539 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8540 " int i = 1;\n"
8541 " int j = 2;\n"
8542 " int big = 10000;\n"
8543 "}",
8544 Alignment);
8545 verifyFormat("class C {\n"
8546 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008547 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008548 " virtual void f() = 0;\n"
8549 "};",
8550 Alignment);
8551 verifyFormat("int i = 1;\n"
8552 "if (SomeType t = getSomething()) {\n"
8553 "}\n"
8554 "int j = 2;\n"
8555 "int big = 10000;",
8556 Alignment);
8557 verifyFormat("int j = 7;\n"
8558 "for (int k = 0; k < N; ++k) {\n"
8559 "}\n"
8560 "int j = 2;\n"
8561 "int big = 10000;\n"
8562 "}",
8563 Alignment);
8564 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8565 verifyFormat("int i = 1;\n"
8566 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8567 " = someLooooooooooooooooongFunction();\n"
8568 "int j = 2;",
8569 Alignment);
8570 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8571 verifyFormat("int i = 1;\n"
8572 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8573 " someLooooooooooooooooongFunction();\n"
8574 "int j = 2;",
8575 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008576
8577 verifyFormat("auto lambda = []() {\n"
8578 " auto i = 0;\n"
8579 " return 0;\n"
8580 "};\n"
8581 "int i = 0;\n"
8582 "auto v = type{\n"
8583 " i = 1, //\n"
8584 " (i = 2), //\n"
8585 " i = 3 //\n"
8586 "};",
8587 Alignment);
8588
Daniel Jaspera44991332015-04-29 13:06:49 +00008589 verifyFormat(
8590 "int i = 1;\n"
8591 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8592 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008593 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008594 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008595
8596 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8597 " typename B = very_long_type_name_1,\n"
8598 " typename T_2 = very_long_type_name_2>\n"
8599 "auto foo() {}\n",
8600 Alignment);
8601 verifyFormat("int a, b = 1;\n"
8602 "int c = 2;\n"
8603 "int dd = 3;\n",
8604 Alignment);
8605 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8606 "float b[1][] = {{3.f}};\n",
8607 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008608 verifyFormat("for (int i = 0; i < 1; i++)\n"
8609 " int x = 1;\n",
8610 Alignment);
8611 verifyFormat("for (i = 0; i < 1; i++)\n"
8612 " x = 1;\n"
8613 "y = 1;\n",
8614 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008615}
8616
Daniel Jaspere12597c2015-10-01 10:06:54 +00008617TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8618 FormatStyle Alignment = getLLVMStyle();
8619 Alignment.AlignConsecutiveDeclarations = false;
8620 verifyFormat("float const a = 5;\n"
8621 "int oneTwoThree = 123;",
8622 Alignment);
8623 verifyFormat("int a = 5;\n"
8624 "float const oneTwoThree = 123;",
8625 Alignment);
8626
8627 Alignment.AlignConsecutiveDeclarations = true;
8628 verifyFormat("float const a = 5;\n"
8629 "int oneTwoThree = 123;",
8630 Alignment);
8631 verifyFormat("int a = method();\n"
8632 "float const oneTwoThree = 133;",
8633 Alignment);
8634 verifyFormat("int i = 1, j = 10;\n"
8635 "something = 2000;",
8636 Alignment);
8637 verifyFormat("something = 2000;\n"
8638 "int i = 1, j = 10;\n",
8639 Alignment);
8640 verifyFormat("float something = 2000;\n"
8641 "double another = 911;\n"
8642 "int i = 1, j = 10;\n"
8643 "const int *oneMore = 1;\n"
8644 "unsigned i = 2;",
8645 Alignment);
8646 verifyFormat("float a = 5;\n"
8647 "int one = 1;\n"
8648 "method();\n"
8649 "const double oneTwoThree = 123;\n"
8650 "const unsigned int oneTwo = 12;",
8651 Alignment);
8652 verifyFormat("int oneTwoThree{0}; // comment\n"
8653 "unsigned oneTwo; // comment",
8654 Alignment);
8655 EXPECT_EQ("float const a = 5;\n"
8656 "\n"
8657 "int oneTwoThree = 123;",
8658 format("float const a = 5;\n"
8659 "\n"
8660 "int oneTwoThree= 123;",
8661 Alignment));
8662 EXPECT_EQ("float a = 5;\n"
8663 "int one = 1;\n"
8664 "\n"
8665 "unsigned oneTwoThree = 123;",
8666 format("float a = 5;\n"
8667 "int one = 1;\n"
8668 "\n"
8669 "unsigned oneTwoThree = 123;",
8670 Alignment));
8671 EXPECT_EQ("float a = 5;\n"
8672 "int one = 1;\n"
8673 "\n"
8674 "unsigned oneTwoThree = 123;\n"
8675 "int oneTwo = 12;",
8676 format("float a = 5;\n"
8677 "int one = 1;\n"
8678 "\n"
8679 "unsigned oneTwoThree = 123;\n"
8680 "int oneTwo = 12;",
8681 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008682 // Function prototype alignment
8683 verifyFormat("int a();\n"
8684 "double b();",
8685 Alignment);
8686 verifyFormat("int a(int x);\n"
8687 "double b();",
8688 Alignment);
8689 unsigned OldColumnLimit = Alignment.ColumnLimit;
8690 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8691 // otherwise the function parameters will be re-flowed onto a single line.
8692 Alignment.ColumnLimit = 0;
8693 EXPECT_EQ("int a(int x,\n"
8694 " float y);\n"
8695 "double b(int x,\n"
8696 " double y);",
8697 format("int a(int x,\n"
8698 " float y);\n"
8699 "double b(int x,\n"
8700 " double y);",
8701 Alignment));
8702 // This ensures that function parameters of function declarations are
8703 // correctly indented when their owning functions are indented.
8704 // The failure case here is for 'double y' to not be indented enough.
8705 EXPECT_EQ("double a(int x);\n"
8706 "int b(int y,\n"
8707 " double z);",
8708 format("double a(int x);\n"
8709 "int b(int y,\n"
8710 " double z);",
8711 Alignment));
8712 // Set ColumnLimit low so that we induce wrapping immediately after
8713 // the function name and opening paren.
8714 Alignment.ColumnLimit = 13;
8715 verifyFormat("int function(\n"
8716 " int x,\n"
8717 " bool y);",
8718 Alignment);
8719 Alignment.ColumnLimit = OldColumnLimit;
8720 // Ensure function pointers don't screw up recursive alignment
8721 verifyFormat("int a(int x, void (*fp)(int y));\n"
8722 "double b();",
8723 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008724 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008725 // Ensure recursive alignment is broken by function braces, so that the
8726 // "a = 1" does not align with subsequent assignments inside the function
8727 // body.
8728 verifyFormat("int func(int a = 1) {\n"
8729 " int b = 2;\n"
8730 " int cc = 3;\n"
8731 "}",
8732 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008733 verifyFormat("float something = 2000;\n"
8734 "double another = 911;\n"
8735 "int i = 1, j = 10;\n"
8736 "const int *oneMore = 1;\n"
8737 "unsigned i = 2;",
8738 Alignment);
8739 verifyFormat("int oneTwoThree = {0}; // comment\n"
8740 "unsigned oneTwo = 0; // comment",
8741 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008742 // Make sure that scope is correctly tracked, in the absence of braces
8743 verifyFormat("for (int i = 0; i < n; i++)\n"
8744 " j = i;\n"
8745 "double x = 1;\n",
8746 Alignment);
8747 verifyFormat("if (int i = 0)\n"
8748 " j = i;\n"
8749 "double x = 1;\n",
8750 Alignment);
8751 // Ensure operator[] and operator() are comprehended
8752 verifyFormat("struct test {\n"
8753 " long long int foo();\n"
8754 " int operator[](int a);\n"
8755 " double bar();\n"
8756 "};\n",
8757 Alignment);
8758 verifyFormat("struct test {\n"
8759 " long long int foo();\n"
8760 " int operator()(int a);\n"
8761 " double bar();\n"
8762 "};\n",
8763 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008764 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8765 " int const i = 1;\n"
8766 " int * j = 2;\n"
8767 " int big = 10000;\n"
8768 "\n"
8769 " unsigned oneTwoThree = 123;\n"
8770 " int oneTwo = 12;\n"
8771 " method();\n"
8772 " float k = 2;\n"
8773 " int ll = 10000;\n"
8774 "}",
8775 format("void SomeFunction(int parameter= 0) {\n"
8776 " int const i= 1;\n"
8777 " int *j=2;\n"
8778 " int big = 10000;\n"
8779 "\n"
8780 "unsigned oneTwoThree =123;\n"
8781 "int oneTwo = 12;\n"
8782 " method();\n"
8783 "float k= 2;\n"
8784 "int ll=10000;\n"
8785 "}",
8786 Alignment));
8787 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008788 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8789 verifyFormat("#define A \\\n"
8790 " int aaaa = 12; \\\n"
8791 " float b = 23; \\\n"
8792 " const int ccc = 234; \\\n"
8793 " unsigned dddddddddd = 2345;",
8794 Alignment);
8795 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008796 verifyFormat("#define A \\\n"
8797 " int aaaa = 12; \\\n"
8798 " float b = 23; \\\n"
8799 " const int ccc = 234; \\\n"
8800 " unsigned dddddddddd = 2345;",
8801 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008802 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008803 Alignment.ColumnLimit = 30;
8804 verifyFormat("#define A \\\n"
8805 " int aaaa = 12; \\\n"
8806 " float b = 23; \\\n"
8807 " const int ccc = 234; \\\n"
8808 " int dddddddddd = 2345;",
8809 Alignment);
8810 Alignment.ColumnLimit = 80;
8811 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8812 "k = 4, int l = 5,\n"
8813 " int m = 6) {\n"
8814 " const int j = 10;\n"
8815 " otherThing = 1;\n"
8816 "}",
8817 Alignment);
8818 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8819 " int const i = 1;\n"
8820 " int * j = 2;\n"
8821 " int big = 10000;\n"
8822 "}",
8823 Alignment);
8824 verifyFormat("class C {\n"
8825 "public:\n"
8826 " int i = 1;\n"
8827 " virtual void f() = 0;\n"
8828 "};",
8829 Alignment);
8830 verifyFormat("float i = 1;\n"
8831 "if (SomeType t = getSomething()) {\n"
8832 "}\n"
8833 "const unsigned j = 2;\n"
8834 "int big = 10000;",
8835 Alignment);
8836 verifyFormat("float j = 7;\n"
8837 "for (int k = 0; k < N; ++k) {\n"
8838 "}\n"
8839 "unsigned j = 2;\n"
8840 "int big = 10000;\n"
8841 "}",
8842 Alignment);
8843 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8844 verifyFormat("float i = 1;\n"
8845 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8846 " = someLooooooooooooooooongFunction();\n"
8847 "int j = 2;",
8848 Alignment);
8849 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8850 verifyFormat("int i = 1;\n"
8851 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8852 " someLooooooooooooooooongFunction();\n"
8853 "int j = 2;",
8854 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008855
8856 Alignment.AlignConsecutiveAssignments = true;
8857 verifyFormat("auto lambda = []() {\n"
8858 " auto ii = 0;\n"
8859 " float j = 0;\n"
8860 " return 0;\n"
8861 "};\n"
8862 "int i = 0;\n"
8863 "float i2 = 0;\n"
8864 "auto v = type{\n"
8865 " i = 1, //\n"
8866 " (i = 2), //\n"
8867 " i = 3 //\n"
8868 "};",
8869 Alignment);
8870 Alignment.AlignConsecutiveAssignments = false;
8871
Daniel Jaspere12597c2015-10-01 10:06:54 +00008872 verifyFormat(
8873 "int i = 1;\n"
8874 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8875 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008876 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008877 Alignment);
8878
8879 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8880 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008881 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008882 // happens.
8883 Alignment.AlignConsecutiveAssignments = true;
8884 Alignment.ColumnLimit = 30;
8885 verifyFormat("float ii = 1;\n"
8886 "unsigned j = 2;\n"
8887 "int someVerylongVariable = 1;\n"
8888 "AnotherLongType ll = 123456;\n"
8889 "VeryVeryLongType k = 2;\n"
8890 "int myvar = 1;",
8891 Alignment);
8892 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008893 Alignment.AlignConsecutiveAssignments = false;
8894
8895 verifyFormat(
8896 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8897 " typename LongType, typename B>\n"
8898 "auto foo() {}\n",
8899 Alignment);
8900 verifyFormat("float a, b = 1;\n"
8901 "int c = 2;\n"
8902 "int dd = 3;\n",
8903 Alignment);
8904 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8905 "float b[1][] = {{3.f}};\n",
8906 Alignment);
8907 Alignment.AlignConsecutiveAssignments = true;
8908 verifyFormat("float a, b = 1;\n"
8909 "int c = 2;\n"
8910 "int dd = 3;\n",
8911 Alignment);
8912 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8913 "float b[1][] = {{3.f}};\n",
8914 Alignment);
8915 Alignment.AlignConsecutiveAssignments = false;
8916
8917 Alignment.ColumnLimit = 30;
8918 Alignment.BinPackParameters = false;
8919 verifyFormat("void foo(float a,\n"
8920 " float b,\n"
8921 " int c,\n"
8922 " uint32_t *d) {\n"
8923 " int * e = 0;\n"
8924 " float f = 0;\n"
8925 " double g = 0;\n"
8926 "}\n"
8927 "void bar(ino_t a,\n"
8928 " int b,\n"
8929 " uint32_t *c,\n"
8930 " bool d) {}\n",
8931 Alignment);
8932 Alignment.BinPackParameters = true;
8933 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008934}
8935
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008936TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008937 FormatStyle LinuxBraceStyle = getLLVMStyle();
8938 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008939 verifyFormat("namespace a\n"
8940 "{\n"
8941 "class A\n"
8942 "{\n"
8943 " void f()\n"
8944 " {\n"
8945 " if (true) {\n"
8946 " a();\n"
8947 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008948 " } else {\n"
8949 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008950 " }\n"
8951 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008952 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008953 "};\n"
8954 "struct B {\n"
8955 " int x;\n"
8956 "};\n"
8957 "}\n",
8958 LinuxBraceStyle);
8959 verifyFormat("enum X {\n"
8960 " Y = 0,\n"
8961 "}\n",
8962 LinuxBraceStyle);
8963 verifyFormat("struct S {\n"
8964 " int Type;\n"
8965 " union {\n"
8966 " int x;\n"
8967 " double y;\n"
8968 " } Value;\n"
8969 " class C\n"
8970 " {\n"
8971 " MyFavoriteType Value;\n"
8972 " } Class;\n"
8973 "}\n",
8974 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008975}
8976
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008977TEST_F(FormatTest, MozillaBraceBreaking) {
8978 FormatStyle MozillaBraceStyle = getLLVMStyle();
8979 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008980 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008981 verifyFormat("namespace a {\n"
8982 "class A\n"
8983 "{\n"
8984 " void f()\n"
8985 " {\n"
8986 " if (true) {\n"
8987 " a();\n"
8988 " b();\n"
8989 " }\n"
8990 " }\n"
8991 " void g() { return; }\n"
8992 "};\n"
8993 "enum E\n"
8994 "{\n"
8995 " A,\n"
8996 " // foo\n"
8997 " B,\n"
8998 " C\n"
8999 "};\n"
9000 "struct B\n"
9001 "{\n"
9002 " int x;\n"
9003 "};\n"
9004 "}\n",
9005 MozillaBraceStyle);
9006 verifyFormat("struct S\n"
9007 "{\n"
9008 " int Type;\n"
9009 " union\n"
9010 " {\n"
9011 " int x;\n"
9012 " double y;\n"
9013 " } Value;\n"
9014 " class C\n"
9015 " {\n"
9016 " MyFavoriteType Value;\n"
9017 " } Class;\n"
9018 "}\n",
9019 MozillaBraceStyle);
9020}
9021
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009022TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009023 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9024 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009025 verifyFormat("namespace a {\n"
9026 "class A {\n"
9027 " void f()\n"
9028 " {\n"
9029 " if (true) {\n"
9030 " a();\n"
9031 " b();\n"
9032 " }\n"
9033 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009034 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009035 "};\n"
9036 "struct B {\n"
9037 " int x;\n"
9038 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009039 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009040 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009041
Daniel Jasperd9670872014-08-05 12:06:20 +00009042 verifyFormat("void foo()\n"
9043 "{\n"
9044 " if (a) {\n"
9045 " a();\n"
9046 " }\n"
9047 " else {\n"
9048 " b();\n"
9049 " }\n"
9050 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009051 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009052
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009053 verifyFormat("#ifdef _DEBUG\n"
9054 "int foo(int i = 0)\n"
9055 "#else\n"
9056 "int foo(int i = 5)\n"
9057 "#endif\n"
9058 "{\n"
9059 " return i;\n"
9060 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009061 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009062
9063 verifyFormat("void foo() {}\n"
9064 "void bar()\n"
9065 "#ifdef _DEBUG\n"
9066 "{\n"
9067 " foo();\n"
9068 "}\n"
9069 "#else\n"
9070 "{\n"
9071 "}\n"
9072 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009073 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009074
9075 verifyFormat("void foobar() { int i = 5; }\n"
9076 "#ifdef _DEBUG\n"
9077 "void bar() {}\n"
9078 "#else\n"
9079 "void bar() { foobar(); }\n"
9080 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009081 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009082}
9083
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009084TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009085 FormatStyle AllmanBraceStyle = getLLVMStyle();
9086 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009087 verifyFormat("namespace a\n"
9088 "{\n"
9089 "class A\n"
9090 "{\n"
9091 " void f()\n"
9092 " {\n"
9093 " if (true)\n"
9094 " {\n"
9095 " a();\n"
9096 " b();\n"
9097 " }\n"
9098 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009099 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009100 "};\n"
9101 "struct B\n"
9102 "{\n"
9103 " int x;\n"
9104 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009105 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009106 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009107
9108 verifyFormat("void f()\n"
9109 "{\n"
9110 " if (true)\n"
9111 " {\n"
9112 " a();\n"
9113 " }\n"
9114 " else if (false)\n"
9115 " {\n"
9116 " b();\n"
9117 " }\n"
9118 " else\n"
9119 " {\n"
9120 " c();\n"
9121 " }\n"
9122 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009123 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009124
9125 verifyFormat("void f()\n"
9126 "{\n"
9127 " for (int i = 0; i < 10; ++i)\n"
9128 " {\n"
9129 " a();\n"
9130 " }\n"
9131 " while (false)\n"
9132 " {\n"
9133 " b();\n"
9134 " }\n"
9135 " do\n"
9136 " {\n"
9137 " c();\n"
9138 " } while (false)\n"
9139 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009140 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009141
9142 verifyFormat("void f(int a)\n"
9143 "{\n"
9144 " switch (a)\n"
9145 " {\n"
9146 " case 0:\n"
9147 " break;\n"
9148 " case 1:\n"
9149 " {\n"
9150 " break;\n"
9151 " }\n"
9152 " case 2:\n"
9153 " {\n"
9154 " }\n"
9155 " break;\n"
9156 " default:\n"
9157 " break;\n"
9158 " }\n"
9159 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009160 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009161
9162 verifyFormat("enum X\n"
9163 "{\n"
9164 " Y = 0,\n"
9165 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009166 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009167 verifyFormat("enum X\n"
9168 "{\n"
9169 " Y = 0\n"
9170 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009171 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009172
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009173 verifyFormat("@interface BSApplicationController ()\n"
9174 "{\n"
9175 "@private\n"
9176 " id _extraIvar;\n"
9177 "}\n"
9178 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009179 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009180
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009181 verifyFormat("#ifdef _DEBUG\n"
9182 "int foo(int i = 0)\n"
9183 "#else\n"
9184 "int foo(int i = 5)\n"
9185 "#endif\n"
9186 "{\n"
9187 " return i;\n"
9188 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009189 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009190
9191 verifyFormat("void foo() {}\n"
9192 "void bar()\n"
9193 "#ifdef _DEBUG\n"
9194 "{\n"
9195 " foo();\n"
9196 "}\n"
9197 "#else\n"
9198 "{\n"
9199 "}\n"
9200 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009201 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009202
9203 verifyFormat("void foobar() { int i = 5; }\n"
9204 "#ifdef _DEBUG\n"
9205 "void bar() {}\n"
9206 "#else\n"
9207 "void bar() { foobar(); }\n"
9208 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009209 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009210
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009211 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009212 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009213 " // ...\n"
9214 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009215 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009216 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009217 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009218 " // ...\n"
9219 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009220 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009221 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009222 // .. or dict literals.
9223 verifyFormat("void f()\n"
9224 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009225 " // ...\n"
9226 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9227 "}",
9228 AllmanBraceStyle);
9229 verifyFormat("void f()\n"
9230 "{\n"
9231 " // ...\n"
9232 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009233 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009234 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009235 verifyFormat("int f()\n"
9236 "{ // comment\n"
9237 " return 42;\n"
9238 "}",
9239 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009240
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009241 AllmanBraceStyle.ColumnLimit = 19;
9242 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9243 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009244 verifyFormat("void f()\n"
9245 "{\n"
9246 " int i;\n"
9247 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009248 AllmanBraceStyle);
9249 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009250
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009251 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009252 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9253 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9254 verifyFormat("void f(bool b)\n"
9255 "{\n"
9256 " if (b)\n"
9257 " {\n"
9258 " return;\n"
9259 " }\n"
9260 "}\n",
9261 BreakBeforeBraceShortIfs);
9262 verifyFormat("void f(bool b)\n"
9263 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009264 " if constexpr (b)\n"
9265 " {\n"
9266 " return;\n"
9267 " }\n"
9268 "}\n",
9269 BreakBeforeBraceShortIfs);
9270 verifyFormat("void f(bool b)\n"
9271 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009272 " if (b) return;\n"
9273 "}\n",
9274 BreakBeforeBraceShortIfs);
9275 verifyFormat("void f(bool b)\n"
9276 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009277 " if constexpr (b) return;\n"
9278 "}\n",
9279 BreakBeforeBraceShortIfs);
9280 verifyFormat("void f(bool b)\n"
9281 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009282 " while (b)\n"
9283 " {\n"
9284 " return;\n"
9285 " }\n"
9286 "}\n",
9287 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009288}
9289
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009290TEST_F(FormatTest, GNUBraceBreaking) {
9291 FormatStyle GNUBraceStyle = getLLVMStyle();
9292 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9293 verifyFormat("namespace a\n"
9294 "{\n"
9295 "class A\n"
9296 "{\n"
9297 " void f()\n"
9298 " {\n"
9299 " int a;\n"
9300 " {\n"
9301 " int b;\n"
9302 " }\n"
9303 " if (true)\n"
9304 " {\n"
9305 " a();\n"
9306 " b();\n"
9307 " }\n"
9308 " }\n"
9309 " void g() { return; }\n"
9310 "}\n"
9311 "}",
9312 GNUBraceStyle);
9313
9314 verifyFormat("void f()\n"
9315 "{\n"
9316 " if (true)\n"
9317 " {\n"
9318 " a();\n"
9319 " }\n"
9320 " else if (false)\n"
9321 " {\n"
9322 " b();\n"
9323 " }\n"
9324 " else\n"
9325 " {\n"
9326 " c();\n"
9327 " }\n"
9328 "}\n",
9329 GNUBraceStyle);
9330
9331 verifyFormat("void f()\n"
9332 "{\n"
9333 " for (int i = 0; i < 10; ++i)\n"
9334 " {\n"
9335 " a();\n"
9336 " }\n"
9337 " while (false)\n"
9338 " {\n"
9339 " b();\n"
9340 " }\n"
9341 " do\n"
9342 " {\n"
9343 " c();\n"
9344 " }\n"
9345 " while (false);\n"
9346 "}\n",
9347 GNUBraceStyle);
9348
9349 verifyFormat("void f(int a)\n"
9350 "{\n"
9351 " switch (a)\n"
9352 " {\n"
9353 " case 0:\n"
9354 " break;\n"
9355 " case 1:\n"
9356 " {\n"
9357 " break;\n"
9358 " }\n"
9359 " case 2:\n"
9360 " {\n"
9361 " }\n"
9362 " break;\n"
9363 " default:\n"
9364 " break;\n"
9365 " }\n"
9366 "}\n",
9367 GNUBraceStyle);
9368
9369 verifyFormat("enum X\n"
9370 "{\n"
9371 " Y = 0,\n"
9372 "}\n",
9373 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009374
9375 verifyFormat("@interface BSApplicationController ()\n"
9376 "{\n"
9377 "@private\n"
9378 " id _extraIvar;\n"
9379 "}\n"
9380 "@end\n",
9381 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009382
9383 verifyFormat("#ifdef _DEBUG\n"
9384 "int foo(int i = 0)\n"
9385 "#else\n"
9386 "int foo(int i = 5)\n"
9387 "#endif\n"
9388 "{\n"
9389 " return i;\n"
9390 "}",
9391 GNUBraceStyle);
9392
9393 verifyFormat("void foo() {}\n"
9394 "void bar()\n"
9395 "#ifdef _DEBUG\n"
9396 "{\n"
9397 " foo();\n"
9398 "}\n"
9399 "#else\n"
9400 "{\n"
9401 "}\n"
9402 "#endif",
9403 GNUBraceStyle);
9404
9405 verifyFormat("void foobar() { int i = 5; }\n"
9406 "#ifdef _DEBUG\n"
9407 "void bar() {}\n"
9408 "#else\n"
9409 "void bar() { foobar(); }\n"
9410 "#endif",
9411 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009412}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009413
9414TEST_F(FormatTest, WebKitBraceBreaking) {
9415 FormatStyle WebKitBraceStyle = getLLVMStyle();
9416 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009417 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009418 verifyFormat("namespace a {\n"
9419 "class A {\n"
9420 " void f()\n"
9421 " {\n"
9422 " if (true) {\n"
9423 " a();\n"
9424 " b();\n"
9425 " }\n"
9426 " }\n"
9427 " void g() { return; }\n"
9428 "};\n"
9429 "enum E {\n"
9430 " A,\n"
9431 " // foo\n"
9432 " B,\n"
9433 " C\n"
9434 "};\n"
9435 "struct B {\n"
9436 " int x;\n"
9437 "};\n"
9438 "}\n",
9439 WebKitBraceStyle);
9440 verifyFormat("struct S {\n"
9441 " int Type;\n"
9442 " union {\n"
9443 " int x;\n"
9444 " double y;\n"
9445 " } Value;\n"
9446 " class C {\n"
9447 " MyFavoriteType Value;\n"
9448 " } Class;\n"
9449 "};\n",
9450 WebKitBraceStyle);
9451}
9452
Manuel Klimekd5735502013-08-12 03:51:17 +00009453TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9454 verifyFormat("void f() {\n"
9455 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009456 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009457 " }\n"
9458 "}\n",
9459 getLLVMStyle());
9460}
9461
Daniel Jasper9613c812013-08-07 16:29:23 +00009462TEST_F(FormatTest, UnderstandsPragmas) {
9463 verifyFormat("#pragma omp reduction(| : var)");
9464 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009465
9466 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9467 "(including parentheses).",
9468 format("#pragma mark Any non-hyphenated or hyphenated string "
9469 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009470}
9471
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009472TEST_F(FormatTest, UnderstandPragmaOption) {
9473 verifyFormat("#pragma option -C -A");
9474
9475 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9476}
9477
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009478#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9479 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009480 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9481 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009482
9483TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009484 SmallVector<FormatStyle, 3> Styles;
9485 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009486
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009487 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009488 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9489 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9490 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009491
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009492 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009493 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9494 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9495 EXPECT_ALL_STYLES_EQUAL(Styles);
9496
Nico Weber514ecc82014-02-02 20:50:45 +00009497 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009498 EXPECT_TRUE(
9499 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9500 EXPECT_TRUE(
9501 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9502 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009503
Nico Weber514ecc82014-02-02 20:50:45 +00009504 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009505 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9506 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9507 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009508
9509 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009510 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9511 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9512 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009513
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009514 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009515 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9516 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9517 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009518
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009519 Styles[0] = getGNUStyle();
9520 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9521 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9522 EXPECT_ALL_STYLES_EQUAL(Styles);
9523
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009524 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9525}
9526
9527TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9528 SmallVector<FormatStyle, 8> Styles;
9529 Styles.resize(2);
9530
9531 Styles[0] = getGoogleStyle();
9532 Styles[1] = getLLVMStyle();
9533 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9534 EXPECT_ALL_STYLES_EQUAL(Styles);
9535
9536 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009537 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009538 Styles[1] = getLLVMStyle();
9539 Styles[1].Language = FormatStyle::LK_JavaScript;
9540 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9541
9542 Styles[2] = getLLVMStyle();
9543 Styles[2].Language = FormatStyle::LK_JavaScript;
9544 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9545 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009546 &Styles[2])
9547 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009548
9549 Styles[3] = getLLVMStyle();
9550 Styles[3].Language = FormatStyle::LK_JavaScript;
9551 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9552 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009553 &Styles[3])
9554 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009555
9556 Styles[4] = getLLVMStyle();
9557 Styles[4].Language = FormatStyle::LK_JavaScript;
9558 EXPECT_EQ(0, parseConfiguration("---\n"
9559 "BasedOnStyle: LLVM\n"
9560 "IndentWidth: 123\n"
9561 "---\n"
9562 "BasedOnStyle: Google\n"
9563 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009564 &Styles[4])
9565 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009566 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009567}
9568
Daniel Jasper91881d92014-09-29 08:07:46 +00009569#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009570 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009571 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009572 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009573 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009574 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009575
Daniel Jasper91881d92014-09-29 08:07:46 +00009576#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9577
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009578#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9579 Style.STRUCT.FIELD = false; \
9580 EXPECT_EQ(0, \
9581 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9582 .value()); \
9583 EXPECT_TRUE(Style.STRUCT.FIELD); \
9584 EXPECT_EQ(0, \
9585 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9586 .value()); \
9587 EXPECT_FALSE(Style.STRUCT.FIELD);
9588
9589#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9590 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9591
Daniel Jasper00853002014-09-16 16:22:30 +00009592#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9593 EXPECT_NE(VALUE, Style.FIELD); \
9594 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9595 EXPECT_EQ(VALUE, Style.FIELD)
9596
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009597TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009598 FormatStyle Style = {};
9599 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009600 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009601 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009602 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009603 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009604 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009605 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009606 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009607 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009608 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009609 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009610 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009611 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009612 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009613 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009614 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009615 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009616 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009617 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009618 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009619 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009620 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009621 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009622 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009623 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009624 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009625 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009626 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009627 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009628 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +00009629 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009630 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009631 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009632 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009633 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009634 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009635 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009636 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009637 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009638 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009639
9640 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9641 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9642 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9643 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9644 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9645 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9646 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9647 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9648 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9649 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9650 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +00009651 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
9652 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
9653 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009654}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009655
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009656#undef CHECK_PARSE_BOOL
9657
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009658TEST_F(FormatTest, ParsesConfiguration) {
9659 FormatStyle Style = {};
9660 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009661 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009662 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9663 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009664 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009665 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9666 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009667 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9668 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009669 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9670 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009671 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9672 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9673 PenaltyReturnTypeOnItsOwnLine, 1234u);
9674 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9675 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009676 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009677 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009678 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009679
Daniel Jasper553d4872014-06-17 12:40:34 +00009680 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009681 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9682 FormatStyle::PAS_Left);
9683 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9684 FormatStyle::PAS_Right);
9685 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9686 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009687 // For backward compatibility:
9688 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9689 FormatStyle::PAS_Left);
9690 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9691 FormatStyle::PAS_Right);
9692 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9693 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009694
Alexander Kornienkod6538332013-05-07 15:32:14 +00009695 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009696 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9697 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009698 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9699 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9700 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9701
Daniel Jasperac043c92014-09-15 11:11:00 +00009702 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009703 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9704 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009705 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9706 FormatStyle::BOS_None);
9707 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9708 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009709 // For backward compatibility:
9710 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9711 FormatStyle::BOS_None);
9712 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9713 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009714
Francois Ferranda6b6d512017-05-24 11:36:58 +00009715 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9716 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9717 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9718 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9719 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9720 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9721 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9722 // For backward compatibility:
9723 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9724 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9725
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009726 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9727 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9728 FormatStyle::BAS_Align);
9729 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9730 FormatStyle::BAS_DontAlign);
9731 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9732 FormatStyle::BAS_AlwaysBreak);
9733 // For backward compatibility:
9734 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9735 FormatStyle::BAS_DontAlign);
9736 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9737 FormatStyle::BAS_Align);
9738
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009739 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9740 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9741 FormatStyle::ENAS_DontAlign);
9742 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9743 FormatStyle::ENAS_Left);
9744 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
9745 FormatStyle::ENAS_Right);
9746 // For backward compatibility:
9747 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
9748 FormatStyle::ENAS_Left);
9749 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
9750 FormatStyle::ENAS_Right);
9751
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009752 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009753 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9754 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9755 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009756 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9757 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009758 // For backward compatibility:
9759 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9760 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009761
Daniel Jasperd74cf402014-04-08 12:46:38 +00009762 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009763 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9764 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9765 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9766 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009767 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9768 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009769 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9770 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009771 // For backward compatibility:
9772 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9773 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9774 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9775 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009776
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009777 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9778 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9779 FormatStyle::SBPO_Never);
9780 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9781 FormatStyle::SBPO_Always);
9782 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9783 FormatStyle::SBPO_ControlStatements);
9784 // For backward compatibility:
9785 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9786 FormatStyle::SBPO_Never);
9787 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9788 FormatStyle::SBPO_ControlStatements);
9789
Alexander Kornienkod6538332013-05-07 15:32:14 +00009790 Style.ColumnLimit = 123;
9791 FormatStyle BaseStyle = getLLVMStyle();
9792 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9793 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9794
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009795 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9796 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9797 FormatStyle::BS_Attach);
9798 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9799 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009800 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9801 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009802 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9803 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009804 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9805 FormatStyle::BS_Allman);
9806 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009807 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9808 FormatStyle::BS_WebKit);
9809 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9810 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009811
Zachary Turner448592e2015-12-18 22:20:15 +00009812 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9813 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9814 FormatStyle::RTBS_None);
9815 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9816 FormatStyle::RTBS_All);
9817 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009818 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009819 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9820 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9821 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9822 AlwaysBreakAfterReturnType,
9823 FormatStyle::RTBS_TopLevelDefinitions);
9824
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009825 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9826 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9827 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9828 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9829 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9830 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9831 AlwaysBreakAfterDefinitionReturnType,
9832 FormatStyle::DRTBS_TopLevel);
9833
Daniel Jasper65ee3472013-07-31 23:16:02 +00009834 Style.NamespaceIndentation = FormatStyle::NI_All;
9835 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9836 FormatStyle::NI_None);
9837 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9838 FormatStyle::NI_Inner);
9839 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9840 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009841
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009842 // FIXME: This is required because parsing a configuration simply overwrites
9843 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009844 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009845 std::vector<std::string> BoostForeach;
9846 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009847 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009848 std::vector<std::string> BoostAndQForeach;
9849 BoostAndQForeach.push_back("BOOST_FOREACH");
9850 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009851 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9852 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009853
9854 Style.IncludeCategories.clear();
9855 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9856 {".*", 1}};
9857 CHECK_PARSE("IncludeCategories:\n"
9858 " - Regex: abc/.*\n"
9859 " Priority: 2\n"
9860 " - Regex: .*\n"
9861 " Priority: 1",
9862 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009863 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009864}
9865
9866TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9867 FormatStyle Style = {};
9868 Style.Language = FormatStyle::LK_Cpp;
9869 CHECK_PARSE("Language: Cpp\n"
9870 "IndentWidth: 12",
9871 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009872 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9873 "IndentWidth: 34",
9874 &Style),
9875 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009876 EXPECT_EQ(12u, Style.IndentWidth);
9877 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9878 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9879
9880 Style.Language = FormatStyle::LK_JavaScript;
9881 CHECK_PARSE("Language: JavaScript\n"
9882 "IndentWidth: 12",
9883 IndentWidth, 12u);
9884 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009885 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9886 "IndentWidth: 34",
9887 &Style),
9888 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009889 EXPECT_EQ(23u, Style.IndentWidth);
9890 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9891 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9892
9893 CHECK_PARSE("BasedOnStyle: LLVM\n"
9894 "IndentWidth: 67",
9895 IndentWidth, 67u);
9896
9897 CHECK_PARSE("---\n"
9898 "Language: JavaScript\n"
9899 "IndentWidth: 12\n"
9900 "---\n"
9901 "Language: Cpp\n"
9902 "IndentWidth: 34\n"
9903 "...\n",
9904 IndentWidth, 12u);
9905
9906 Style.Language = FormatStyle::LK_Cpp;
9907 CHECK_PARSE("---\n"
9908 "Language: JavaScript\n"
9909 "IndentWidth: 12\n"
9910 "---\n"
9911 "Language: Cpp\n"
9912 "IndentWidth: 34\n"
9913 "...\n",
9914 IndentWidth, 34u);
9915 CHECK_PARSE("---\n"
9916 "IndentWidth: 78\n"
9917 "---\n"
9918 "Language: JavaScript\n"
9919 "IndentWidth: 56\n"
9920 "...\n",
9921 IndentWidth, 78u);
9922
9923 Style.ColumnLimit = 123;
9924 Style.IndentWidth = 234;
9925 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9926 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009927 EXPECT_FALSE(parseConfiguration("---\n"
9928 "IndentWidth: 456\n"
9929 "BreakBeforeBraces: Allman\n"
9930 "---\n"
9931 "Language: JavaScript\n"
9932 "IndentWidth: 111\n"
9933 "TabWidth: 111\n"
9934 "---\n"
9935 "Language: Cpp\n"
9936 "BreakBeforeBraces: Stroustrup\n"
9937 "TabWidth: 789\n"
9938 "...\n",
9939 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009940 EXPECT_EQ(123u, Style.ColumnLimit);
9941 EXPECT_EQ(456u, Style.IndentWidth);
9942 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9943 EXPECT_EQ(789u, Style.TabWidth);
9944
Rafael Espindola1f243172014-06-12 11:35:17 +00009945 EXPECT_EQ(parseConfiguration("---\n"
9946 "Language: JavaScript\n"
9947 "IndentWidth: 56\n"
9948 "---\n"
9949 "IndentWidth: 78\n"
9950 "...\n",
9951 &Style),
9952 ParseError::Error);
9953 EXPECT_EQ(parseConfiguration("---\n"
9954 "Language: JavaScript\n"
9955 "IndentWidth: 56\n"
9956 "---\n"
9957 "Language: JavaScript\n"
9958 "IndentWidth: 78\n"
9959 "...\n",
9960 &Style),
9961 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009962
9963 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9964}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009965
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009966#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009967
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009968TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9969 FormatStyle Style = {};
9970 Style.Language = FormatStyle::LK_JavaScript;
9971 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009972 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009973 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009974
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009975 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009976 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009977 "BasedOnStyle: Google\n"
9978 "---\n"
9979 "Language: JavaScript\n"
9980 "IndentWidth: 76\n"
9981 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009982 &Style)
9983 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009984 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009985 EXPECT_EQ(76u, Style.IndentWidth);
9986 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9987}
9988
Alexander Kornienkod6538332013-05-07 15:32:14 +00009989TEST_F(FormatTest, ConfigurationRoundTripTest) {
9990 FormatStyle Style = getLLVMStyle();
9991 std::string YAML = configurationAsText(Style);
9992 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009993 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009994 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9995 EXPECT_EQ(Style, ParsedStyle);
9996}
9997
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009998TEST_F(FormatTest, WorksFor8bitEncodings) {
9999 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10000 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10001 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10002 "\"\xef\xee\xf0\xf3...\"",
10003 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10004 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10005 "\xef\xee\xf0\xf3...\"",
10006 getLLVMStyleWithColumns(12)));
10007}
10008
Alexander Kornienko393e3082013-11-13 14:04:17 +000010009TEST_F(FormatTest, HandlesUTF8BOM) {
10010 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10011 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10012 format("\xef\xbb\xbf#include <iostream>"));
10013 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10014 format("\xef\xbb\xbf\n#include <iostream>"));
10015}
10016
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010017// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10018#if !defined(_MSC_VER)
10019
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010020TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10021 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10022 getLLVMStyleWithColumns(35));
10023 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010024 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010025 verifyFormat("// Однажды в студёную зимнюю пору...",
10026 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010027 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010028 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10029 getLLVMStyleWithColumns(39));
10030 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010031 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010032}
10033
10034TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010035 // Non-printable characters' width is currently considered to be the length in
10036 // bytes in UTF8. The characters can be displayed in very different manner
10037 // (zero-width, single width with a substitution glyph, expanded to their code
10038 // (e.g. "<8d>"), so there's no single correct way to handle them.
10039 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010040 "\"\xc2\x8d\";",
10041 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010042 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010043 "\"\xc2\x8d\";",
10044 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010045 EXPECT_EQ("\"Однажды, в \"\n"
10046 "\"студёную \"\n"
10047 "\"зимнюю \"\n"
10048 "\"пору,\"",
10049 format("\"Однажды, в студёную зимнюю пору,\"",
10050 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010051 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010052 "\"一 二 三 \"\n"
10053 "\"四 五六 \"\n"
10054 "\"七 八 九 \"\n"
10055 "\"十\"",
10056 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010057 EXPECT_EQ("\"一\t二 \"\n"
10058 "\"\t三 \"\n"
10059 "\"四 五\t六 \"\n"
10060 "\"\t七 \"\n"
10061 "\"八九十\tqq\"",
10062 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10063 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010064
10065 // UTF8 character in an escape sequence.
10066 EXPECT_EQ("\"aaaaaa\"\n"
10067 "\"\\\xC2\x8D\"",
10068 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010069}
10070
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010071TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10072 EXPECT_EQ("const char *sssss =\n"
10073 " \"一二三四五六七八\\\n"
10074 " 九 十\";",
10075 format("const char *sssss = \"一二三四五六七八\\\n"
10076 " 九 十\";",
10077 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010078}
10079
10080TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010081 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10082 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010083 EXPECT_EQ("// Я из лесу\n"
10084 "// вышел; был\n"
10085 "// сильный\n"
10086 "// мороз.",
10087 format("// Я из лесу вышел; был сильный мороз.",
10088 getLLVMStyleWithColumns(13)));
10089 EXPECT_EQ("// 一二三\n"
10090 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010091 "// 八 九\n"
10092 "// 十",
10093 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010094}
10095
10096TEST_F(FormatTest, SplitsUTF8BlockComments) {
10097 EXPECT_EQ("/* Гляжу,\n"
10098 " * поднимается\n"
10099 " * медленно в\n"
10100 " * гору\n"
10101 " * Лошадка,\n"
10102 " * везущая\n"
10103 " * хворосту\n"
10104 " * воз. */",
10105 format("/* Гляжу, поднимается медленно в гору\n"
10106 " * Лошадка, везущая хворосту воз. */",
10107 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010108 EXPECT_EQ(
10109 "/* 一二三\n"
10110 " * 四五六七\n"
10111 " * 八 九\n"
10112 " * 十 */",
10113 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010114 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10115 " * 𝕓𝕪𝕥𝕖\n"
10116 " * 𝖀𝕿𝕱-𝟠 */",
10117 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010118}
10119
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010120#endif // _MSC_VER
10121
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010122TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10123 FormatStyle Style = getLLVMStyle();
10124
10125 Style.ConstructorInitializerIndentWidth = 4;
10126 verifyFormat(
10127 "SomeClass::Constructor()\n"
10128 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10129 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10130 Style);
10131
10132 Style.ConstructorInitializerIndentWidth = 2;
10133 verifyFormat(
10134 "SomeClass::Constructor()\n"
10135 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10136 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10137 Style);
10138
10139 Style.ConstructorInitializerIndentWidth = 0;
10140 verifyFormat(
10141 "SomeClass::Constructor()\n"
10142 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10143 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10144 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010145 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10146 verifyFormat(
10147 "SomeLongTemplateVariableName<\n"
10148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10149 Style);
10150 verifyFormat(
10151 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10153 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010154}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010155
Daniel Jasper00853002014-09-16 16:22:30 +000010156TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10157 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010158 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010159 Style.ConstructorInitializerIndentWidth = 4;
10160 verifyFormat("SomeClass::Constructor()\n"
10161 " : a(a)\n"
10162 " , b(b)\n"
10163 " , c(c) {}",
10164 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010165 verifyFormat("SomeClass::Constructor()\n"
10166 " : a(a) {}",
10167 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010168
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010169 Style.ColumnLimit = 0;
10170 verifyFormat("SomeClass::Constructor()\n"
10171 " : a(a) {}",
10172 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010173 verifyFormat("SomeClass::Constructor() noexcept\n"
10174 " : a(a) {}",
10175 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010176 verifyFormat("SomeClass::Constructor()\n"
10177 " : a(a)\n"
10178 " , b(b)\n"
10179 " , c(c) {}",
10180 Style);
10181 verifyFormat("SomeClass::Constructor()\n"
10182 " : a(a) {\n"
10183 " foo();\n"
10184 " bar();\n"
10185 "}",
10186 Style);
10187
Daniel Jasperd74cf402014-04-08 12:46:38 +000010188 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010189 verifyFormat("SomeClass::Constructor()\n"
10190 " : a(a)\n"
10191 " , b(b)\n"
10192 " , c(c) {\n}",
10193 Style);
10194 verifyFormat("SomeClass::Constructor()\n"
10195 " : a(a) {\n}",
10196 Style);
10197
10198 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010199 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010200 Style.ConstructorInitializerIndentWidth = 2;
10201 verifyFormat("SomeClass::Constructor()\n"
10202 " : a(a)\n"
10203 " , b(b)\n"
10204 " , c(c) {}",
10205 Style);
10206
10207 Style.ConstructorInitializerIndentWidth = 0;
10208 verifyFormat("SomeClass::Constructor()\n"
10209 ": a(a)\n"
10210 ", b(b)\n"
10211 ", c(c) {}",
10212 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010213
10214 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10215 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010216 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10217 verifyFormat(
10218 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10219 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010220 verifyFormat(
10221 "SomeClass::Constructor()\n"
10222 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10223 Style);
10224 Style.ConstructorInitializerIndentWidth = 4;
10225 Style.ColumnLimit = 60;
10226 verifyFormat("SomeClass::Constructor()\n"
10227 " : aaaaaaaa(aaaaaaaa)\n"
10228 " , aaaaaaaa(aaaaaaaa)\n"
10229 " , aaaaaaaa(aaaaaaaa) {}",
10230 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010231}
10232
Daniel Jasper38efc132014-10-21 07:51:54 +000010233TEST_F(FormatTest, Destructors) {
10234 verifyFormat("void F(int &i) { i.~int(); }");
10235 verifyFormat("void F(int &i) { i->~int(); }");
10236}
10237
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010238TEST_F(FormatTest, FormatsWithWebKitStyle) {
10239 FormatStyle Style = getWebKitStyle();
10240
10241 // Don't indent in outer namespaces.
10242 verifyFormat("namespace outer {\n"
10243 "int i;\n"
10244 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010245 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010246 "} // namespace inner\n"
10247 "} // namespace outer\n"
10248 "namespace other_outer {\n"
10249 "int i;\n"
10250 "}",
10251 Style);
10252
10253 // Don't indent case labels.
10254 verifyFormat("switch (variable) {\n"
10255 "case 1:\n"
10256 "case 2:\n"
10257 " doSomething();\n"
10258 " break;\n"
10259 "default:\n"
10260 " ++variable;\n"
10261 "}",
10262 Style);
10263
10264 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010265 EXPECT_EQ("void f()\n"
10266 "{\n"
10267 " if (aaaaaaaaaaaaaaaa\n"
10268 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10269 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10270 " return;\n"
10271 "}",
10272 format("void f() {\n"
10273 "if (aaaaaaaaaaaaaaaa\n"
10274 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10275 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10276 "return;\n"
10277 "}",
10278 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010279
Daniel Jasper35995672014-04-29 14:05:20 +000010280 // Allow functions on a single line.
10281 verifyFormat("void f() { return; }", Style);
10282
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010283 // Constructor initializers are formatted one per line with the "," on the
10284 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010285 verifyFormat("Constructor()\n"
10286 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10287 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010288 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010289 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10290 "{\n"
10291 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010292 Style);
10293 verifyFormat("SomeClass::Constructor()\n"
10294 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010295 "{\n"
10296 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010297 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010298 EXPECT_EQ("SomeClass::Constructor()\n"
10299 " : a(a)\n"
10300 "{\n"
10301 "}",
10302 format("SomeClass::Constructor():a(a){}", Style));
10303 verifyFormat("SomeClass::Constructor()\n"
10304 " : a(a)\n"
10305 " , b(b)\n"
10306 " , c(c)\n"
10307 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010308 "}",
10309 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010310 verifyFormat("SomeClass::Constructor()\n"
10311 " : a(a)\n"
10312 "{\n"
10313 " foo();\n"
10314 " bar();\n"
10315 "}",
10316 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010317
Daniel Jasper65ee3472013-07-31 23:16:02 +000010318 // Access specifiers should be aligned left.
10319 verifyFormat("class C {\n"
10320 "public:\n"
10321 " int i;\n"
10322 "};",
10323 Style);
10324
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010325 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010326 verifyFormat("int a; // Do not\n"
10327 "double b; // align comments.",
10328 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010329
Daniel Jasper3219e432014-12-02 13:24:51 +000010330 // Do not align operands.
10331 EXPECT_EQ("ASSERT(aaaa\n"
10332 " || bbbb);",
10333 format("ASSERT ( aaaa\n||bbbb);", Style));
10334
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010335 // Accept input's line breaks.
10336 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10337 " || bbbbbbbbbbbbbbb) {\n"
10338 " i++;\n"
10339 "}",
10340 format("if (aaaaaaaaaaaaaaa\n"
10341 "|| bbbbbbbbbbbbbbb) { i++; }",
10342 Style));
10343 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10344 " i++;\n"
10345 "}",
10346 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010347
10348 // Don't automatically break all macro definitions (llvm.org/PR17842).
10349 verifyFormat("#define aNumber 10", Style);
10350 // However, generally keep the line breaks that the user authored.
10351 EXPECT_EQ("#define aNumber \\\n"
10352 " 10",
10353 format("#define aNumber \\\n"
10354 " 10",
10355 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010356
10357 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010358 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10359 " copyItems:YES];",
10360 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10361 "copyItems:YES];",
10362 Style));
10363 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10364 " copyItems:YES];",
10365 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10366 " copyItems:YES];",
10367 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010368 // FIXME: This does not seem right, there should be more indentation before
10369 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010370 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010371 " @\"a\",\n"
10372 " @\"a\"\n"
10373 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010374 " copyItems:YES];",
10375 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10376 " @\"a\",\n"
10377 " @\"a\"\n"
10378 " ]\n"
10379 " copyItems:YES];",
10380 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010381 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010382 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10383 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010384 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10385 " copyItems:YES];",
10386 Style));
10387
10388 verifyFormat("[self.a b:c c:d];", Style);
10389 EXPECT_EQ("[self.a b:c\n"
10390 " c:d];",
10391 format("[self.a b:c\n"
10392 "c:d];",
10393 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010394}
10395
Manuel Klimekffdeb592013-09-03 15:10:01 +000010396TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010397 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10398 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10399 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10400 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10401 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010402 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010403 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010404 verifyFormat("void f() {\n"
10405 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10406 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010407 verifyFormat("void f() {\n"
10408 " other(x.begin(), //\n"
10409 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010410 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010411 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010412 verifyFormat("SomeFunction([]() { // A cool function...\n"
10413 " return 43;\n"
10414 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010415 EXPECT_EQ("SomeFunction([]() {\n"
10416 "#define A a\n"
10417 " return 43;\n"
10418 "});",
10419 format("SomeFunction([](){\n"
10420 "#define A a\n"
10421 "return 43;\n"
10422 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010423 verifyFormat("void f() {\n"
10424 " SomeFunction([](decltype(x), A *a) {});\n"
10425 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010426 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10427 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010428 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10429 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10430 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010431 verifyFormat("Constructor()\n"
10432 " : Field([] { // comment\n"
10433 " int i;\n"
10434 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010435 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10436 " return some_parameter.size();\n"
10437 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010438 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10439 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010440 verifyFormat("int i = aaaaaa ? 1 //\n"
10441 " : [] {\n"
10442 " return 2; //\n"
10443 " }();");
10444 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10445 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10446 " return x == 2; // force break\n"
10447 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010448 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10449 " [=](int iiiiiiiiiiii) {\n"
10450 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10451 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10452 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010453 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010454 verifyFormat("SomeFunction({[&] {\n"
10455 " // comment\n"
10456 " },\n"
10457 " [&] {\n"
10458 " // comment\n"
10459 " }});");
10460 verifyFormat("SomeFunction({[&] {\n"
10461 " // comment\n"
10462 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010463 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10464 " [&]() { return true; },\n"
10465 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010466
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010467 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010468 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010469 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010470 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10471 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010472 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010473 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010474 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10475 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010476 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010477 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10478 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010479 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010480 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010481 verifyFormat(
10482 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10483 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10484 " return aaaaaaaaaaaaaaaaa;\n"
10485 " });",
10486 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010487 verifyFormat("[]() //\n"
10488 " -> int {\n"
10489 " return 1; //\n"
10490 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010491
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010492 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010493 verifyFormat("SomeFunction(\n"
10494 " []() {\n"
10495 " int i = 42;\n"
10496 " return i;\n"
10497 " },\n"
10498 " []() {\n"
10499 " int j = 43;\n"
10500 " return j;\n"
10501 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010502
Daniel Jasperda18fd82014-06-10 06:39:03 +000010503 // More complex introducers.
10504 verifyFormat("return [i, args...] {};");
10505
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010506 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010507 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010508 verifyFormat("double &operator[](int i) { return 0; }\n"
10509 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010510 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010511 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010512 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010513
10514 // Other corner cases.
10515 verifyFormat("void f() {\n"
10516 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010517 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010518 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010519
10520 // Lambdas created through weird macros.
10521 verifyFormat("void f() {\n"
10522 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010523 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010524 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010525
10526 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10527 " doo_dah();\n"
10528 " doo_dah();\n"
10529 " })) {\n"
10530 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010531 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10532 " doo_dah();\n"
10533 " doo_dah();\n"
10534 " })) {\n"
10535 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010536 verifyFormat("auto lambda = []() {\n"
10537 " int a = 2\n"
10538 "#if A\n"
10539 " + 2\n"
10540 "#endif\n"
10541 " ;\n"
10542 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010543
10544 // Lambdas with complex multiline introducers.
10545 verifyFormat(
10546 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10547 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10548 " -> ::std::unordered_set<\n"
10549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10550 " //\n"
10551 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010552}
10553
Manuel Klimek516e0542013-09-04 13:25:30 +000010554TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010555 FormatStyle ShortBlocks = getLLVMStyle();
10556 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10557 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10558 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10559 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10560 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10561 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10562 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010563
Daniel Jasper76284682014-10-22 09:12:44 +000010564 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10565 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10566 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010567
Daniel Jasper76284682014-10-22 09:12:44 +000010568 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010569 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010570 "}];");
10571 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010572 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010573 "}]};");
10574 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010575 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010576 "}];");
10577 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010578 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010579 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010580 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010581 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010582 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010583 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010584 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010585
10586 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010587 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010588 "}];",
10589 getLLVMStyleWithColumns(60));
10590 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010591 " NSString *path = [self sessionFilePath];\n"
10592 " if (path) {\n"
10593 " // ...\n"
10594 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010595 "});");
10596 verifyFormat("[[SessionService sharedService]\n"
10597 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010598 " if (window) {\n"
10599 " [self windowDidLoad:window];\n"
10600 " } else {\n"
10601 " [self errorLoadingWindow];\n"
10602 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010603 " }];");
10604 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010605 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010606 "};\n",
10607 getLLVMStyleWithColumns(40));
10608 verifyFormat("[[SessionService sharedService]\n"
10609 " loadWindowWithCompletionBlock: //\n"
10610 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010611 " if (window) {\n"
10612 " [self windowDidLoad:window];\n"
10613 " } else {\n"
10614 " [self errorLoadingWindow];\n"
10615 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010616 " }];",
10617 getLLVMStyleWithColumns(60));
10618 verifyFormat("[myObject doSomethingWith:arg1\n"
10619 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010620 " // ...\n"
10621 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010622 " }\n"
10623 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010624 " // ...\n"
10625 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010626 " }\n"
10627 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010628 " // ...\n"
10629 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010630 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010631 verifyFormat("[myObject doSomethingWith:arg1\n"
10632 " firstBlock:-1\n"
10633 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010634 " // ...\n"
10635 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010636 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010637
10638 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010639 " @autoreleasepool {\n"
10640 " if (a) {\n"
10641 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010642 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010643 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010644 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010645 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010646 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10647 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010648
10649 FormatStyle FourIndent = getLLVMStyle();
10650 FourIndent.ObjCBlockIndentWidth = 4;
10651 verifyFormat("[operation setCompletionBlock:^{\n"
10652 " [self onOperationDone];\n"
10653 "}];",
10654 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010655}
10656
Daniel Jasper289afc02015-04-23 09:23:17 +000010657TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10658 FormatStyle ZeroColumn = getLLVMStyle();
10659 ZeroColumn.ColumnLimit = 0;
10660
10661 verifyFormat("[[SessionService sharedService] "
10662 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10663 " if (window) {\n"
10664 " [self windowDidLoad:window];\n"
10665 " } else {\n"
10666 " [self errorLoadingWindow];\n"
10667 " }\n"
10668 "}];",
10669 ZeroColumn);
10670 EXPECT_EQ("[[SessionService sharedService]\n"
10671 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10672 " if (window) {\n"
10673 " [self windowDidLoad:window];\n"
10674 " } else {\n"
10675 " [self errorLoadingWindow];\n"
10676 " }\n"
10677 " }];",
10678 format("[[SessionService sharedService]\n"
10679 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10680 " if (window) {\n"
10681 " [self windowDidLoad:window];\n"
10682 " } else {\n"
10683 " [self errorLoadingWindow];\n"
10684 " }\n"
10685 "}];",
10686 ZeroColumn));
10687 verifyFormat("[myObject doSomethingWith:arg1\n"
10688 " firstBlock:^(Foo *a) {\n"
10689 " // ...\n"
10690 " int i;\n"
10691 " }\n"
10692 " secondBlock:^(Bar *b) {\n"
10693 " // ...\n"
10694 " int i;\n"
10695 " }\n"
10696 " thirdBlock:^Foo(Bar *b) {\n"
10697 " // ...\n"
10698 " int i;\n"
10699 " }];",
10700 ZeroColumn);
10701 verifyFormat("f(^{\n"
10702 " @autoreleasepool {\n"
10703 " if (a) {\n"
10704 " g();\n"
10705 " }\n"
10706 " }\n"
10707 "});",
10708 ZeroColumn);
10709 verifyFormat("void (^largeBlock)(void) = ^{\n"
10710 " // ...\n"
10711 "};",
10712 ZeroColumn);
10713
10714 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10715 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010716 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010717 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10718 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10719 " int i;\n"
10720 "};",
10721 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10722}
10723
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010724TEST_F(FormatTest, SupportsCRLF) {
10725 EXPECT_EQ("int a;\r\n"
10726 "int b;\r\n"
10727 "int c;\r\n",
10728 format("int a;\r\n"
10729 " int b;\r\n"
10730 " int c;\r\n",
10731 getLLVMStyle()));
10732 EXPECT_EQ("int a;\r\n"
10733 "int b;\r\n"
10734 "int c;\r\n",
10735 format("int a;\r\n"
10736 " int b;\n"
10737 " int c;\r\n",
10738 getLLVMStyle()));
10739 EXPECT_EQ("int a;\n"
10740 "int b;\n"
10741 "int c;\n",
10742 format("int a;\r\n"
10743 " int b;\n"
10744 " int c;\n",
10745 getLLVMStyle()));
10746 EXPECT_EQ("\"aaaaaaa \"\r\n"
10747 "\"bbbbbbb\";\r\n",
10748 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10749 EXPECT_EQ("#define A \\\r\n"
10750 " b; \\\r\n"
10751 " c; \\\r\n"
10752 " d;\r\n",
10753 format("#define A \\\r\n"
10754 " b; \\\r\n"
10755 " c; d; \r\n",
10756 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010757
10758 EXPECT_EQ("/*\r\n"
10759 "multi line block comments\r\n"
10760 "should not introduce\r\n"
10761 "an extra carriage return\r\n"
10762 "*/\r\n",
10763 format("/*\r\n"
10764 "multi line block comments\r\n"
10765 "should not introduce\r\n"
10766 "an extra carriage return\r\n"
10767 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010768}
10769
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010770TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10771 verifyFormat("MY_CLASS(C) {\n"
10772 " int i;\n"
10773 " int j;\n"
10774 "};");
10775}
10776
Daniel Jasper6633ab82013-10-18 10:38:14 +000010777TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10778 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10779 TwoIndent.ContinuationIndentWidth = 2;
10780
10781 EXPECT_EQ("int i =\n"
10782 " longFunction(\n"
10783 " arg);",
10784 format("int i = longFunction(arg);", TwoIndent));
10785
10786 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10787 SixIndent.ContinuationIndentWidth = 6;
10788
10789 EXPECT_EQ("int i =\n"
10790 " longFunction(\n"
10791 " arg);",
10792 format("int i = longFunction(arg);", SixIndent));
10793}
10794
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010795TEST_F(FormatTest, SpacesInAngles) {
10796 FormatStyle Spaces = getLLVMStyle();
10797 Spaces.SpacesInAngles = true;
10798
10799 verifyFormat("static_cast< int >(arg);", Spaces);
10800 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10801 verifyFormat("f< int, float >();", Spaces);
10802 verifyFormat("template <> g() {}", Spaces);
10803 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010804 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10805 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10806 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010807
10808 Spaces.Standard = FormatStyle::LS_Cpp03;
10809 Spaces.SpacesInAngles = true;
10810 verifyFormat("A< A< int > >();", Spaces);
10811
10812 Spaces.SpacesInAngles = false;
10813 verifyFormat("A<A<int> >();", Spaces);
10814
10815 Spaces.Standard = FormatStyle::LS_Cpp11;
10816 Spaces.SpacesInAngles = true;
10817 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010818
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010819 Spaces.SpacesInAngles = false;
10820 verifyFormat("A<A<int>>();", Spaces);
10821}
10822
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010823TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10824 FormatStyle Style = getLLVMStyle();
10825 Style.SpaceAfterTemplateKeyword = false;
10826 verifyFormat("template<int> void foo();", Style);
10827}
10828
Jacques Pienaarfc275112015-02-18 23:48:37 +000010829TEST_F(FormatTest, TripleAngleBrackets) {
10830 verifyFormat("f<<<1, 1>>>();");
10831 verifyFormat("f<<<1, 1, 1, s>>>();");
10832 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010833 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010834 verifyFormat("f<param><<<1, 1>>>();");
10835 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010836 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010837 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10838 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010839 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10840 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010841}
10842
10843TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010844 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010845 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010846 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10847 "aaallvm::outs() <<");
10848 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10849 "aaaallvm::outs()\n <<");
10850}
10851
Manuel Klimek819788d2014-03-18 11:22:45 +000010852TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10853 std::string code = "#if A\n"
10854 "#if B\n"
10855 "a.\n"
10856 "#endif\n"
10857 " a = 1;\n"
10858 "#else\n"
10859 "#endif\n"
10860 "#if C\n"
10861 "#else\n"
10862 "#endif\n";
10863 EXPECT_EQ(code, format(code));
10864}
10865
Manuel Klimek68b03042014-04-14 09:14:11 +000010866TEST_F(FormatTest, HandleConflictMarkers) {
10867 // Git/SVN conflict markers.
10868 EXPECT_EQ("int a;\n"
10869 "void f() {\n"
10870 " callme(some(parameter1,\n"
10871 "<<<<<<< text by the vcs\n"
10872 " parameter2),\n"
10873 "||||||| text by the vcs\n"
10874 " parameter2),\n"
10875 " parameter3,\n"
10876 "======= text by the vcs\n"
10877 " parameter2, parameter3),\n"
10878 ">>>>>>> text by the vcs\n"
10879 " otherparameter);\n",
10880 format("int a;\n"
10881 "void f() {\n"
10882 " callme(some(parameter1,\n"
10883 "<<<<<<< text by the vcs\n"
10884 " parameter2),\n"
10885 "||||||| text by the vcs\n"
10886 " parameter2),\n"
10887 " parameter3,\n"
10888 "======= text by the vcs\n"
10889 " parameter2,\n"
10890 " parameter3),\n"
10891 ">>>>>>> text by the vcs\n"
10892 " otherparameter);\n"));
10893
10894 // Perforce markers.
10895 EXPECT_EQ("void f() {\n"
10896 " function(\n"
10897 ">>>> text by the vcs\n"
10898 " parameter,\n"
10899 "==== text by the vcs\n"
10900 " parameter,\n"
10901 "==== text by the vcs\n"
10902 " parameter,\n"
10903 "<<<< text by the vcs\n"
10904 " parameter);\n",
10905 format("void f() {\n"
10906 " function(\n"
10907 ">>>> text by the vcs\n"
10908 " parameter,\n"
10909 "==== text by the vcs\n"
10910 " parameter,\n"
10911 "==== text by the vcs\n"
10912 " parameter,\n"
10913 "<<<< text by the vcs\n"
10914 " parameter);\n"));
10915
10916 EXPECT_EQ("<<<<<<<\n"
10917 "|||||||\n"
10918 "=======\n"
10919 ">>>>>>>",
10920 format("<<<<<<<\n"
10921 "|||||||\n"
10922 "=======\n"
10923 ">>>>>>>"));
10924
10925 EXPECT_EQ("<<<<<<<\n"
10926 "|||||||\n"
10927 "int i;\n"
10928 "=======\n"
10929 ">>>>>>>",
10930 format("<<<<<<<\n"
10931 "|||||||\n"
10932 "int i;\n"
10933 "=======\n"
10934 ">>>>>>>"));
10935
10936 // FIXME: Handle parsing of macros around conflict markers correctly:
10937 EXPECT_EQ("#define Macro \\\n"
10938 "<<<<<<<\n"
10939 "Something \\\n"
10940 "|||||||\n"
10941 "Else \\\n"
10942 "=======\n"
10943 "Other \\\n"
10944 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010945 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010946 format("#define Macro \\\n"
10947 "<<<<<<<\n"
10948 " Something \\\n"
10949 "|||||||\n"
10950 " Else \\\n"
10951 "=======\n"
10952 " Other \\\n"
10953 ">>>>>>>\n"
10954 " End\n"
10955 "int i;\n"));
10956}
10957
Daniel Jasper471894432014-08-06 13:40:26 +000010958TEST_F(FormatTest, DisableRegions) {
10959 EXPECT_EQ("int i;\n"
10960 "// clang-format off\n"
10961 " int j;\n"
10962 "// clang-format on\n"
10963 "int k;",
10964 format(" int i;\n"
10965 " // clang-format off\n"
10966 " int j;\n"
10967 " // clang-format on\n"
10968 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010969 EXPECT_EQ("int i;\n"
10970 "/* clang-format off */\n"
10971 " int j;\n"
10972 "/* clang-format on */\n"
10973 "int k;",
10974 format(" int i;\n"
10975 " /* clang-format off */\n"
10976 " int j;\n"
10977 " /* clang-format on */\n"
10978 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010979
10980 // Don't reflow comments within disabled regions.
10981 EXPECT_EQ(
10982 "// clang-format off\n"
10983 "// long long long long long long line\n"
10984 "/* clang-format on */\n"
10985 "/* long long long\n"
10986 " * long long long\n"
10987 " * line */\n"
10988 "int i;\n"
10989 "/* clang-format off */\n"
10990 "/* long long long long long long line */\n",
10991 format("// clang-format off\n"
10992 "// long long long long long long line\n"
10993 "/* clang-format on */\n"
10994 "/* long long long long long long line */\n"
10995 "int i;\n"
10996 "/* clang-format off */\n"
10997 "/* long long long long long long line */\n",
10998 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010999}
11000
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011001TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11002 format("? ) =");
11003 verifyNoCrash("#define a\\\n /**/}");
11004}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011005
Daniel Jasper498f5582015-12-25 08:53:31 +000011006TEST_F(FormatTest, FormatsTableGenCode) {
11007 FormatStyle Style = getLLVMStyle();
11008 Style.Language = FormatStyle::LK_TableGen;
11009 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11010}
11011
Nico Weberb2673a12016-11-10 21:49:25 +000011012TEST_F(FormatTest, ArrayOfTemplates) {
11013 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11014 format("auto a = new unique_ptr<int > [ 10];"));
11015
11016 FormatStyle Spaces = getLLVMStyle();
11017 Spaces.SpacesInSquareBrackets = true;
11018 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11019 format("auto a = new unique_ptr<int > [10];", Spaces));
11020}
11021
11022TEST_F(FormatTest, ArrayAsTemplateType) {
11023 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11024 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11025
11026 FormatStyle Spaces = getLLVMStyle();
11027 Spaces.SpacesInSquareBrackets = true;
11028 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11029 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11030}
11031
Martin Probstc9c51c42017-03-16 10:21:35 +000011032TEST_F(FormatTest, NoSpaceAfterSuper) {
11033 verifyFormat("__super::FooBar();");
11034}
11035
Eric Liu547d8792016-03-24 13:22:42 +000011036TEST(FormatStyle, GetStyleOfFile) {
11037 vfs::InMemoryFileSystem FS;
11038 // Test 1: format file in the same directory.
11039 ASSERT_TRUE(
11040 FS.addFile("/a/.clang-format", 0,
11041 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11042 ASSERT_TRUE(
11043 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011044 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011045 ASSERT_TRUE((bool)Style1);
11046 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011047
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011048 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011049 ASSERT_TRUE(
11050 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011051 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011052 ASSERT_TRUE((bool)Style2);
11053 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011054
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011055 // Test 2.2: no format on 'none' fallback style.
11056 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11057 ASSERT_TRUE((bool)Style2);
11058 ASSERT_EQ(*Style2, getNoStyle());
11059
11060 // Test 2.3: format if config is found with no based style while fallback is
11061 // 'none'.
11062 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11063 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11064 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11065 ASSERT_TRUE((bool)Style2);
11066 ASSERT_EQ(*Style2, getLLVMStyle());
11067
11068 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11069 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11070 ASSERT_TRUE((bool)Style2);
11071 ASSERT_EQ(*Style2, getLLVMStyle());
11072
Eric Liu547d8792016-03-24 13:22:42 +000011073 // Test 3: format file in parent directory.
11074 ASSERT_TRUE(
11075 FS.addFile("/c/.clang-format", 0,
11076 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11077 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11078 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011079 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011080 ASSERT_TRUE((bool)Style3);
11081 ASSERT_EQ(*Style3, getGoogleStyle());
11082
11083 // Test 4: error on invalid fallback style
11084 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11085 ASSERT_FALSE((bool)Style4);
11086 llvm::consumeError(Style4.takeError());
11087
11088 // Test 5: error on invalid yaml on command line
11089 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11090 ASSERT_FALSE((bool)Style5);
11091 llvm::consumeError(Style5.takeError());
11092
11093 // Test 6: error on invalid style
11094 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11095 ASSERT_FALSE((bool)Style6);
11096 llvm::consumeError(Style6.takeError());
11097
11098 // Test 7: found config file, error on parsing it
11099 ASSERT_TRUE(
11100 FS.addFile("/d/.clang-format", 0,
11101 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11102 "InvalidKey: InvalidValue")));
11103 ASSERT_TRUE(
11104 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11105 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11106 ASSERT_FALSE((bool)Style7);
11107 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011108}
11109
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011110TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11111 // Column limit is 20.
11112 std::string Code = "Type *a =\n"
11113 " new Type();\n"
11114 "g(iiiii, 0, jjjjj,\n"
11115 " 0, kkkkk, 0, mm);\n"
11116 "int bad = format ;";
11117 std::string Expected = "auto a = new Type();\n"
11118 "g(iiiii, nullptr,\n"
11119 " jjjjj, nullptr,\n"
11120 " kkkkk, nullptr,\n"
11121 " mm);\n"
11122 "int bad = format ;";
11123 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011124 tooling::Replacements Replaces = toReplacements(
11125 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11126 "auto "),
11127 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11128 "nullptr"),
11129 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11130 "nullptr"),
11131 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11132 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011133
11134 format::FormatStyle Style = format::getLLVMStyle();
11135 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011136 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11137 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11138 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11139 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11140 EXPECT_TRUE(static_cast<bool>(Result));
11141 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011142}
11143
Eric Liubaf58c22016-05-18 13:43:48 +000011144TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11145 std::string Code = "#include \"a.h\"\n"
11146 "#include \"c.h\"\n"
11147 "\n"
11148 "int main() {\n"
11149 " return 0;\n"
11150 "}";
11151 std::string Expected = "#include \"a.h\"\n"
11152 "#include \"b.h\"\n"
11153 "#include \"c.h\"\n"
11154 "\n"
11155 "int main() {\n"
11156 " return 0;\n"
11157 "}";
11158 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011159 tooling::Replacements Replaces = toReplacements(
11160 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11161 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011162
11163 format::FormatStyle Style = format::getLLVMStyle();
11164 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011165 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11166 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11167 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11168 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11169 EXPECT_TRUE(static_cast<bool>(Result));
11170 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011171}
11172
Krasimir Georgievac16a202017-06-23 11:46:03 +000011173TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11174 EXPECT_EQ("using std::cin;\n"
11175 "using std::cout;",
11176 format("using std::cout;\n"
11177 "using std::cin;", getGoogleStyle()));
11178}
11179
Nico Weberdc065182017-04-05 18:10:42 +000011180TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11181 format::FormatStyle Style = format::getLLVMStyle();
11182 Style.Standard = FormatStyle::LS_Cpp03;
11183 // cpp03 recognize this string as identifier u8 and literal character 'a'
11184 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11185}
11186
11187TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11188 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11189 // all modes, including C++11, C++14 and C++17
11190 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11191}
11192
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011193} // end namespace
11194} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011195} // end namespace clang