blob: 9c0c5c653bd16a98c0aeb7f8966ef3bd65830763 [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>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002312
2313 FormatStyle DontAlign = getLLVMStyle();
2314 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2315 DontAlign.MaxEmptyLinesToKeep = 3;
2316 // FIXME: can't use verifyFormat here because the newline before
2317 // "public:" is not inserted the first time it's reformatted
2318 EXPECT_EQ("#define A \\\n"
2319 " class Foo { \\\n"
2320 " void bar(); \\\n"
2321 "\\\n"
2322 "\\\n"
2323 "\\\n"
2324 " public: \\\n"
2325 " void baz(); \\\n"
2326 " };",
2327 format("#define A \\\n"
2328 " class Foo { \\\n"
2329 " void bar(); \\\n"
2330 "\\\n"
2331 "\\\n"
2332 "\\\n"
2333 " public: \\\n"
2334 " void baz(); \\\n"
2335 " };", DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002336}
2337
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002338TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2339 verifyFormat("#define A \\\n"
2340 " int v( \\\n"
2341 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002342 " int i;",
2343 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002344}
2345
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002346TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002347 EXPECT_EQ(
2348 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2349 " \\\n"
2350 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2351 "\n"
2352 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2353 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2354 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2355 "\\\n"
2356 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2357 " \n"
2358 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2359 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002360}
2361
Manuel Klimek52b15152013-01-09 15:25:02 +00002362TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2363 EXPECT_EQ("int\n"
2364 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002365 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002366 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002367 verifyFormat("functionCallTo(\n"
2368 " someOtherFunction(\n"
2369 " withSomeParameters, whichInSequence,\n"
2370 " areLongerThanALine(andAnotherCall,\n"
2371 "#define A B\n"
2372 " withMoreParamters,\n"
2373 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002374 " andMoreParameters),\n"
2375 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002376 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002377 verifyFormat("Foo::Foo()\n"
2378 "#ifdef BAR\n"
2379 " : baz(0)\n"
2380 "#endif\n"
2381 "{\n"
2382 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002383 verifyFormat("void f() {\n"
2384 " if (true)\n"
2385 "#ifdef A\n"
2386 " f(42);\n"
2387 " x();\n"
2388 "#else\n"
2389 " g();\n"
2390 " x();\n"
2391 "#endif\n"
2392 "}");
2393 verifyFormat("void f(param1, param2,\n"
2394 " param3,\n"
2395 "#ifdef A\n"
2396 " param4(param5,\n"
2397 "#ifdef A1\n"
2398 " param6,\n"
2399 "#ifdef A2\n"
2400 " param7),\n"
2401 "#else\n"
2402 " param8),\n"
2403 " param9,\n"
2404 "#endif\n"
2405 " param10,\n"
2406 "#endif\n"
2407 " param11)\n"
2408 "#else\n"
2409 " param12)\n"
2410 "#endif\n"
2411 "{\n"
2412 " x();\n"
2413 "}",
2414 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002415 verifyFormat("#if 1\n"
2416 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002417 verifyFormat("#if 1\n"
2418 "#endif\n"
2419 "#if 1\n"
2420 "#else\n"
2421 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002422 verifyFormat("DEBUG({\n"
2423 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2425 "});\n"
2426 "#if a\n"
2427 "#else\n"
2428 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002429
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002430 verifyIncompleteFormat("void f(\n"
2431 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002432 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002433 "#else\n"
2434 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002435}
2436
Manuel Klimek14bd9172014-01-29 08:49:02 +00002437TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2438 verifyFormat("#endif\n"
2439 "#if B");
2440}
2441
Manuel Klimek88033d72013-10-21 08:11:15 +00002442TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2443 FormatStyle SingleLine = getLLVMStyle();
2444 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002445 verifyFormat("#if 0\n"
2446 "#elif 1\n"
2447 "#endif\n"
2448 "void foo() {\n"
2449 " if (test) foo2();\n"
2450 "}",
2451 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002452}
2453
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002454TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002455 verifyFormat("functionCall({ int i; });");
2456 verifyFormat("functionCall({\n"
2457 " int i;\n"
2458 " int j;\n"
2459 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002460 verifyFormat("functionCall(\n"
2461 " {\n"
2462 " int i;\n"
2463 " int j;\n"
2464 " },\n"
2465 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002466 verifyFormat("functionA(functionB({\n"
2467 " int i;\n"
2468 " int j;\n"
2469 " }),\n"
2470 " aaaa, bbbb, cccc);");
2471 verifyFormat("functionCall(\n"
2472 " {\n"
2473 " int i;\n"
2474 " int j;\n"
2475 " },\n"
2476 " aaaa, bbbb, // comment\n"
2477 " cccc);");
2478 verifyFormat("functionA(functionB({\n"
2479 " int i;\n"
2480 " int j;\n"
2481 " }),\n"
2482 " aaaa, bbbb, // comment\n"
2483 " cccc);");
2484 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2485 verifyFormat("functionCall(aaaa, bbbb, {\n"
2486 " int i;\n"
2487 " int j;\n"
2488 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002489 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002490 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002491 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002492 " int i; // break\n"
2493 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2495 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002496 verifyFormat("DEBUG({\n"
2497 " if (a)\n"
2498 " f();\n"
2499 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002500}
2501
2502TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002503 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002504 "int i;",
2505 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002506}
2507
2508TEST_F(FormatTest, LayoutNestedBlocks) {
2509 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2510 " struct s {\n"
2511 " int i;\n"
2512 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002513 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002514 " for (int i = 0; i < 10; ++i)\n"
2515 " return;\n"
2516 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002517 verifyFormat("call(parameter, {\n"
2518 " something();\n"
2519 " // Comment using all columns.\n"
2520 " somethingelse();\n"
2521 "});",
2522 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002523 verifyFormat("DEBUG( //\n"
2524 " { f(); }, a);");
2525 verifyFormat("DEBUG( //\n"
2526 " {\n"
2527 " f(); //\n"
2528 " },\n"
2529 " a);");
2530
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002531 EXPECT_EQ("call(parameter, {\n"
2532 " something();\n"
2533 " // Comment too\n"
2534 " // looooooooooong.\n"
2535 " somethingElse();\n"
2536 "});",
2537 format("call(parameter, {\n"
2538 " something();\n"
2539 " // Comment too looooooooooong.\n"
2540 " somethingElse();\n"
2541 "});",
2542 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002543 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002544 EXPECT_EQ("DEBUG({ // comment\n"
2545 " int i;\n"
2546 "});",
2547 format("DEBUG({ // comment\n"
2548 "int i;\n"
2549 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002550 EXPECT_EQ("DEBUG({\n"
2551 " int i;\n"
2552 "\n"
2553 " // comment\n"
2554 " int j;\n"
2555 "});",
2556 format("DEBUG({\n"
2557 " int i;\n"
2558 "\n"
2559 " // comment\n"
2560 " int j;\n"
2561 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002562
2563 verifyFormat("DEBUG({\n"
2564 " if (a)\n"
2565 " return;\n"
2566 "});");
2567 verifyGoogleFormat("DEBUG({\n"
2568 " if (a) return;\n"
2569 "});");
2570 FormatStyle Style = getGoogleStyle();
2571 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002572 verifyFormat("Debug(aaaaa,\n"
2573 " {\n"
2574 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2575 " },\n"
2576 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002577 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002578
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002579 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2580
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002581 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002582}
2583
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002584TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2585 EXPECT_EQ("#define MACRO() \\\n"
2586 " Debug(aaa, /* force line break */ \\\n"
2587 " { \\\n"
2588 " int i; \\\n"
2589 " int j; \\\n"
2590 " })",
2591 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2592 " { int i; int j; })",
2593 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002594
2595 EXPECT_EQ("#define A \\\n"
2596 " [] { \\\n"
2597 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2598 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2599 " }",
2600 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2601 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2602 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002603}
2604
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002605TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2606 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002607 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002608 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002609}
2610
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002611TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2612 FormatStyle Style = getLLVMStyle();
2613 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2614 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2615 verifyFormat("FOO_BEGIN\n"
2616 " FOO_ENTRY\n"
2617 "FOO_END", Style);
2618 verifyFormat("FOO_BEGIN\n"
2619 " NESTED_FOO_BEGIN\n"
2620 " NESTED_FOO_ENTRY\n"
2621 " NESTED_FOO_END\n"
2622 "FOO_END", Style);
2623 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2624 " int x;\n"
2625 " x = 1;\n"
2626 "FOO_END(Baz)", Style);
2627}
2628
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002629//===----------------------------------------------------------------------===//
2630// Line break tests.
2631//===----------------------------------------------------------------------===//
2632
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002633TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002634 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002635 "void f() {\n"
2636 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2637 " parameter, parameter, parameter)),\n"
2638 " SecondLongCall(parameter));\n"
2639 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002640 verifyFormat(
2641 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2642 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2644 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2645 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002646 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2647 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2648 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2649 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002650 verifyFormat(
2651 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2652 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2654 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002655 verifyFormat("int a = bbbb && ccc &&\n"
2656 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002657 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002658 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002659}
2660
Daniel Jasperd69fc772013-05-08 14:12:04 +00002661TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2662 verifyFormat(
2663 "bool aaaaaaa =\n"
2664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2665 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002666 verifyFormat(
2667 "bool aaaaaaa =\n"
2668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2669 " bbbbbbbb();");
2670
Daniel Jasperd69fc772013-05-08 14:12:04 +00002671 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2673 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002674 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2676 " ccccccccc == ddddddddddd;");
2677 verifyFormat(
2678 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2680 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002681
2682 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2683 " aaaaaa) &&\n"
2684 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002685 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2686 " aaaaaa) >>\n"
2687 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002688 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002689 " SourceMgr.getSpellingColumnNumber(\n"
2690 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2691 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002692
Daniel Jasper68d888c2013-06-03 08:42:05 +00002693 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2694 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2695 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00002696 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2697 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
2698 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002699 verifyFormat("b = a &&\n"
2700 " // Comment\n"
2701 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002702
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002703 // If the LHS of a comparison is not a binary expression itself, the
2704 // additional linebreak confuses many people.
2705 verifyFormat(
2706 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2708 "}");
2709 verifyFormat(
2710 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2712 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002713 verifyFormat(
2714 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2716 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002717 // Even explicit parentheses stress the precedence enough to make the
2718 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002719 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2721 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002722 // This cases is borderline, but with the indentation it is still readable.
2723 verifyFormat(
2724 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2725 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2727 "}",
2728 getLLVMStyleWithColumns(75));
2729
2730 // If the LHS is a binary expression, we should still use the additional break
2731 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002732 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2734 " 5) {\n"
2735 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002736
Daniel Jasper571f1af2013-05-14 20:39:56 +00002737 FormatStyle OnePerLine = getLLVMStyle();
2738 OnePerLine.BinPackParameters = false;
2739 verifyFormat(
2740 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2743 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002744
2745 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2746 " .aaa(aaaaaaaaaaaaa) *\n"
2747 " aaaaaaa +\n"
2748 " aaaaaaa;",
2749 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002750}
2751
Daniel Jasper6bee6822013-04-08 20:33:42 +00002752TEST_F(FormatTest, ExpressionIndentation) {
2753 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2757 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2758 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2761 " ccccccccccccccccccccccccccccccccccccccccc;");
2762 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2765 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2766 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2769 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2770 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2773 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002774 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002775 "} else if (aaaaa && bbbbb > // break\n"
2776 " ccccc) {\n"
2777 "}");
2778 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002779 "} else if (aaaaa &&\n"
2780 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002781 " ccccc &&\n"
2782 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002783 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002784
2785 // Presence of a trailing comment used to change indentation of b.
2786 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2787 " b;\n"
2788 "return aaaaaaaaaaaaaaaaaaa +\n"
2789 " b; //",
2790 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002791}
2792
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002793TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2794 // Not sure what the best system is here. Like this, the LHS can be found
2795 // immediately above an operator (everything with the same or a higher
2796 // indent). The RHS is aligned right of the operator and so compasses
2797 // everything until something with the same indent as the operator is found.
2798 // FIXME: Is this a good system?
2799 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002800 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002801 verifyFormat(
2802 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002803 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2804 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2805 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2806 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2807 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002808 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002809 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2810 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002811 Style);
2812 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002813 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2814 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002815 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2816 Style);
2817 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002818 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2819 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002820 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2821 Style);
2822 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2823 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002824 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2825 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002826 Style);
2827 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002828 "} else if (aaaaa\n"
2829 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002830 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002831 "}",
2832 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002833 verifyFormat("return (a)\n"
2834 " // comment\n"
2835 " + b;",
2836 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002837 verifyFormat(
2838 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2839 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2840 " + cc;",
2841 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002842
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002843 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2844 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2845 Style);
2846
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002847 // Forced by comments.
2848 verifyFormat(
2849 "unsigned ContentSize =\n"
2850 " sizeof(int16_t) // DWARF ARange version number\n"
2851 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2852 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2853 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002854
2855 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2856 " == boost::fusion::at_c<1>(iiii).second;",
2857 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002858
2859 Style.ColumnLimit = 60;
2860 verifyFormat("zzzzzzzzzz\n"
2861 " = bbbbbbbbbbbbbbbbb\n"
2862 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2863 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002864}
2865
Daniel Jasperb1270392017-02-01 23:27:37 +00002866TEST_F(FormatTest, EnforcedOperatorWraps) {
2867 // Here we'd like to wrap after the || operators, but a comment is forcing an
2868 // earlier wrap.
2869 verifyFormat("bool x = aaaaa //\n"
2870 " || bbbbb\n"
2871 " //\n"
2872 " || cccc;");
2873}
2874
Daniel Jasper3219e432014-12-02 13:24:51 +00002875TEST_F(FormatTest, NoOperandAlignment) {
2876 FormatStyle Style = getLLVMStyle();
2877 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002878 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2879 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2881 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002882 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002883 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2884 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2885 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2886 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2887 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2888 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2889 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2890 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2891 " > ccccccccccccccccccccccccccccccccccccccccc;",
2892 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002893
2894 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2895 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2896 " + cc;",
2897 Style);
2898 verifyFormat("int a = aa\n"
2899 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002900 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002901 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002902
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002903 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002904 verifyFormat("return (a > b\n"
2905 " // comment1\n"
2906 " // comment2\n"
2907 " || c);",
2908 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002909}
2910
Daniel Jasperac043c92014-09-15 11:11:00 +00002911TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2912 FormatStyle Style = getLLVMStyle();
2913 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2914 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002916 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2917 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002918}
2919
Daniel Jasper988e7e42017-05-08 15:07:52 +00002920TEST_F(FormatTest, AllowBinPackingInsideArguments) {
2921 FormatStyle Style = getLLVMStyle();
2922 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2923 Style.BinPackArguments = false;
2924 Style.ColumnLimit = 40;
2925 verifyFormat("void test() {\n"
2926 " someFunction(\n"
2927 " this + argument + is + quite\n"
2928 " + long + so + it + gets + wrapped\n"
2929 " + but + remains + bin - packed);\n"
2930 "}",
2931 Style);
2932 verifyFormat("void test() {\n"
2933 " someFunction(arg1,\n"
2934 " this + argument + is\n"
2935 " + quite + long + so\n"
2936 " + it + gets + wrapped\n"
2937 " + but + remains + bin\n"
2938 " - packed,\n"
2939 " arg3);\n"
2940 "}",
2941 Style);
2942 verifyFormat("void test() {\n"
2943 " someFunction(\n"
2944 " arg1,\n"
2945 " this + argument + has\n"
2946 " + anotherFunc(nested,\n"
2947 " calls + whose\n"
2948 " + arguments\n"
2949 " + are + also\n"
2950 " + wrapped,\n"
2951 " in + addition)\n"
2952 " + to + being + bin - packed,\n"
2953 " arg3);\n"
2954 "}",
2955 Style);
2956
2957 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
2958 verifyFormat("void test() {\n"
2959 " someFunction(\n"
2960 " arg1,\n"
2961 " this + argument + has +\n"
2962 " anotherFunc(nested,\n"
2963 " calls + whose +\n"
2964 " arguments +\n"
2965 " are + also +\n"
2966 " wrapped,\n"
2967 " in + addition) +\n"
2968 " to + being + bin - packed,\n"
2969 " arg3);\n"
2970 "}",
2971 Style);
2972}
2973
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002974TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002975 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002976 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2977 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002978 verifyFormat("Constructor()\n"
2979 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002980 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002981 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002982 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002983 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002984
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002985 verifyFormat("template <typename T>\n"
2986 "Constructor() : Initializer(FitsOnTheLine) {}",
2987 getLLVMStyleWithColumns(45));
2988
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002989 verifyFormat(
2990 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002991 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002992
2993 verifyFormat(
2994 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002995 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002996 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002997 verifyFormat(
2998 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002999 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003000 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003001 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3002 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3003 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003004
3005 verifyFormat("Constructor()\n"
3006 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3007 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3008 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003009 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003010
Daniel Jasper65585ed2013-01-28 13:31:35 +00003011 verifyFormat("Constructor()\n"
3012 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003014
Daniel Jasper62e68172013-02-25 15:59:54 +00003015 verifyFormat("Constructor(int Parameter = 0)\n"
3016 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3017 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003018 verifyFormat("Constructor()\n"
3019 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3020 "}",
3021 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003022 verifyFormat("Constructor()\n"
3023 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3024 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003025
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003026 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003027 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003028 verifyFormat("Constructor()\n"
3029 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3030 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3031 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003032
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003033 FormatStyle OnePerLine = getLLVMStyle();
3034 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003035 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003036 verifyFormat("SomeClass::Constructor()\n"
3037 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3038 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003039 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003040 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003041 verifyFormat("SomeClass::Constructor()\n"
3042 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3043 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003044 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003045 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003046 verifyFormat("MyClass::MyClass(int var)\n"
3047 " : some_var_(var), // 4 space indent\n"
3048 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003049 "}",
3050 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003051 verifyFormat("Constructor()\n"
3052 " : aaaaa(aaaaaa),\n"
3053 " aaaaa(aaaaaa),\n"
3054 " aaaaa(aaaaaa),\n"
3055 " aaaaa(aaaaaa),\n"
3056 " aaaaa(aaaaaa) {}",
3057 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003058 verifyFormat("Constructor()\n"
3059 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3060 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3061 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003062 OnePerLine.BinPackParameters = false;
3063 verifyFormat(
3064 "Constructor()\n"
3065 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3066 " aaaaaaaaaaa().aaa(),\n"
3067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3068 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003069 OnePerLine.ColumnLimit = 60;
3070 verifyFormat("Constructor()\n"
3071 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3072 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3073 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003074
3075 EXPECT_EQ("Constructor()\n"
3076 " : // Comment forcing unwanted break.\n"
3077 " aaaa(aaaa) {}",
3078 format("Constructor() :\n"
3079 " // Comment forcing unwanted break.\n"
3080 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003081}
3082
Francois Ferranda6b6d512017-05-24 11:36:58 +00003083TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3084 FormatStyle Style = getLLVMStyle();
3085 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3086
3087 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3088 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3089 getStyleWithColumns(Style, 45));
3090 verifyFormat("Constructor() :\n"
3091 " Initializer(FitsOnTheLine) {}",
3092 getStyleWithColumns(Style, 44));
3093 verifyFormat("Constructor() :\n"
3094 " Initializer(FitsOnTheLine) {}",
3095 getStyleWithColumns(Style, 43));
3096
3097 verifyFormat("template <typename T>\n"
3098 "Constructor() : Initializer(FitsOnTheLine) {}",
3099 getStyleWithColumns(Style, 50));
3100
3101 verifyFormat(
3102 "SomeClass::Constructor() :\n"
3103 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3104 Style);
3105
3106 verifyFormat(
3107 "SomeClass::Constructor() :\n"
3108 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3109 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3110 Style);
3111 verifyFormat(
3112 "SomeClass::Constructor() :\n"
3113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3114 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3115 Style);
3116 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3117 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3118 " aaaaaaaaaa(aaaaaa) {}",
3119 Style);
3120
3121 verifyFormat("Constructor() :\n"
3122 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3124 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3126 Style);
3127
3128 verifyFormat("Constructor() :\n"
3129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3131 Style);
3132
3133 verifyFormat("Constructor(int Parameter = 0) :\n"
3134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3135 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3136 Style);
3137 verifyFormat("Constructor() :\n"
3138 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3139 "}",
3140 getStyleWithColumns(Style, 60));
3141 verifyFormat("Constructor() :\n"
3142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3143 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3144 Style);
3145
3146 // Here a line could be saved by splitting the second initializer onto two
3147 // lines, but that is not desirable.
3148 verifyFormat("Constructor() :\n"
3149 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3150 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3151 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3152 Style);
3153
3154 FormatStyle OnePerLine = Style;
3155 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3156 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3157 verifyFormat("SomeClass::Constructor() :\n"
3158 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3159 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3160 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3161 OnePerLine);
3162 verifyFormat("SomeClass::Constructor() :\n"
3163 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3164 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3165 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3166 OnePerLine);
3167 verifyFormat("MyClass::MyClass(int var) :\n"
3168 " some_var_(var), // 4 space indent\n"
3169 " some_other_var_(var + 1) { // lined up\n"
3170 "}",
3171 OnePerLine);
3172 verifyFormat("Constructor() :\n"
3173 " aaaaa(aaaaaa),\n"
3174 " aaaaa(aaaaaa),\n"
3175 " aaaaa(aaaaaa),\n"
3176 " aaaaa(aaaaaa),\n"
3177 " aaaaa(aaaaaa) {}",
3178 OnePerLine);
3179 verifyFormat("Constructor() :\n"
3180 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3181 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3182 OnePerLine);
3183 OnePerLine.BinPackParameters = false;
3184 verifyFormat(
3185 "Constructor() :\n"
3186 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3187 " aaaaaaaaaaa().aaa(),\n"
3188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3189 OnePerLine);
3190 OnePerLine.ColumnLimit = 60;
3191 verifyFormat("Constructor() :\n"
3192 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3193 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3194 OnePerLine);
3195
3196 EXPECT_EQ("Constructor() :\n"
3197 " // Comment forcing unwanted break.\n"
3198 " aaaa(aaaa) {}",
3199 format("Constructor() :\n"
3200 " // Comment forcing unwanted break.\n"
3201 " aaaa(aaaa) {}",
3202 Style));
3203
3204 Style.ColumnLimit = 0;
3205 verifyFormat("SomeClass::Constructor() :\n"
3206 " a(a) {}",
3207 Style);
3208 verifyFormat("SomeClass::Constructor() noexcept :\n"
3209 " a(a) {}",
3210 Style);
3211 verifyFormat("SomeClass::Constructor() :\n"
3212 " a(a), b(b), c(c) {}",
3213 Style);
3214 verifyFormat("SomeClass::Constructor() :\n"
3215 " a(a) {\n"
3216 " foo();\n"
3217 " bar();\n"
3218 "}",
3219 Style);
3220
3221 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3222 verifyFormat("SomeClass::Constructor() :\n"
3223 " a(a), b(b), c(c) {\n"
3224 "}",
3225 Style);
3226 verifyFormat("SomeClass::Constructor() :\n"
3227 " a(a) {\n"
3228 "}",
3229 Style);
3230
3231 Style.ColumnLimit = 80;
3232 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3233 Style.ConstructorInitializerIndentWidth = 2;
3234 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3235 Style);
3236 verifyFormat("SomeClass::Constructor() :\n"
3237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3238 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3239 Style);
3240}
3241
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003242TEST_F(FormatTest, MemoizationTests) {
3243 // This breaks if the memoization lookup does not take \c Indent and
3244 // \c LastSpace into account.
3245 verifyFormat(
3246 "extern CFRunLoopTimerRef\n"
3247 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3248 " CFTimeInterval interval, CFOptionFlags flags,\n"
3249 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003250 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003251
3252 // Deep nesting somewhat works around our memoization.
3253 verifyFormat(
3254 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3255 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3256 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3257 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3258 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3259 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003260 verifyFormat(
3261 "aaaaa(\n"
3262 " aaaaa,\n"
3263 " aaaaa(\n"
3264 " aaaaa,\n"
3265 " aaaaa(\n"
3266 " aaaaa,\n"
3267 " aaaaa(\n"
3268 " aaaaa,\n"
3269 " aaaaa(\n"
3270 " aaaaa,\n"
3271 " aaaaa(\n"
3272 " aaaaa,\n"
3273 " aaaaa(\n"
3274 " aaaaa,\n"
3275 " aaaaa(\n"
3276 " aaaaa,\n"
3277 " aaaaa(\n"
3278 " aaaaa,\n"
3279 " aaaaa(\n"
3280 " aaaaa,\n"
3281 " aaaaa(\n"
3282 " aaaaa,\n"
3283 " aaaaa(\n"
3284 " aaaaa,\n"
3285 " aaaaa))))))))))));",
3286 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003287 verifyFormat(
3288 "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"
3289 " a),\n"
3290 " a),\n"
3291 " a),\n"
3292 " a),\n"
3293 " a),\n"
3294 " a),\n"
3295 " a),\n"
3296 " a),\n"
3297 " a),\n"
3298 " a),\n"
3299 " a),\n"
3300 " a),\n"
3301 " a),\n"
3302 " a),\n"
3303 " a),\n"
3304 " a),\n"
3305 " a)",
3306 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003307
3308 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003309 FormatStyle OnePerLine = getLLVMStyle();
3310 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003311 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003312 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003313 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003314 for (unsigned i = 0, e = 80; i != e; ++i) {
3315 input += " a,\n";
3316 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003317 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003318 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003319}
3320
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003321TEST_F(FormatTest, BreaksAsHighAsPossible) {
3322 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003323 "void f() {\n"
3324 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3325 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3326 " f();\n"
3327 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003328 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003329 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003330}
3331
Daniel Jasper6728fc12013-04-11 14:29:13 +00003332TEST_F(FormatTest, BreaksFunctionDeclarations) {
3333 // Principially, we break function declarations in a certain order:
3334 // 1) break amongst arguments.
3335 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3336 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003337 verifyFormat("template <class TemplateIt>\n"
3338 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3339 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003340
3341 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003342 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003343 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003344 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003345 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003346
3347 // 3) break after (.
3348 verifyFormat(
3349 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003350 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3351 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003352
3353 // 4) break before after nested name specifiers.
3354 verifyFormat(
3355 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003356 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3357 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003358 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003359
3360 // However, there are exceptions, if a sufficient amount of lines can be
3361 // saved.
3362 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3363 // more adjusting.
3364 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3365 " Cccccccccccccc cccccccccc,\n"
3366 " Cccccccccccccc cccccccccc,\n"
3367 " Cccccccccccccc cccccccccc,\n"
3368 " Cccccccccccccc cccccccccc);");
3369 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003370 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003371 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3372 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3373 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003374 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003375 verifyFormat(
3376 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3377 " Cccccccccccccc cccccccccc,\n"
3378 " Cccccccccccccc cccccccccc,\n"
3379 " Cccccccccccccc cccccccccc,\n"
3380 " Cccccccccccccc cccccccccc,\n"
3381 " Cccccccccccccc cccccccccc,\n"
3382 " Cccccccccccccc cccccccccc);");
3383 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3384 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3385 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3386 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3387 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003388
3389 // Break after multi-line parameters.
3390 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3393 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003394 verifyFormat("void SomeLoooooooooooongFunction(\n"
3395 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3396 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3397 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003398
3399 // Treat overloaded operators like other functions.
3400 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3401 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003402 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3403 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003404 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3405 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3406 verifyGoogleFormat(
3407 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3408 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003409 verifyGoogleFormat(
3410 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3411 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003412 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3413 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3415 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003416 verifyGoogleFormat(
3417 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3418 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3419 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003420 verifyGoogleFormat(
3421 "template <typename T>\n"
3422 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3423 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3424 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003425
3426 FormatStyle Style = getLLVMStyle();
3427 Style.PointerAlignment = FormatStyle::PAS_Left;
3428 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3429 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3430 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003431 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3433 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003434}
3435
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003436TEST_F(FormatTest, TrailingReturnType) {
3437 verifyFormat("auto foo() -> int;\n");
3438 verifyFormat("struct S {\n"
3439 " auto bar() const -> int;\n"
3440 "};");
3441 verifyFormat("template <size_t Order, typename T>\n"
3442 "auto load_img(const std::string &filename)\n"
3443 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003444 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3445 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003446 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003447 verifyFormat("template <typename T>\n"
3448 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3449 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003450
3451 // Not trailing return types.
3452 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003453}
3454
Daniel Jasper5be31f72013-05-21 09:16:31 +00003455TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003456 // Avoid breaking before trailing 'const' or other trailing annotations, if
3457 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003458 FormatStyle Style = getGoogleStyle();
3459 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003460 verifyFormat("void someLongFunction(\n"
3461 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003462 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003463 verifyFormat("LoooooongReturnType\n"
3464 "someLoooooooongFunction() const {}",
3465 getLLVMStyleWithColumns(47));
3466 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3467 " const {}",
3468 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003469 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3470 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3471 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3472 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3473 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3474 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003475 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3476 " aaaaaaaaaaa aaaaa) const override;");
3477 verifyGoogleFormat(
3478 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3479 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003480
Daniel Jasper5550de62014-02-17 07:57:46 +00003481 // Even if the first parameter has to be wrapped.
3482 verifyFormat("void someLongFunction(\n"
3483 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003484 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003485 verifyFormat("void someLongFunction(\n"
3486 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003487 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003488 verifyFormat("void someLongFunction(\n"
3489 " int someLongParameter) override {}",
3490 Style);
3491 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003492 " int someLongParameter) OVERRIDE {}",
3493 Style);
3494 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003495 " int someLongParameter) final {}",
3496 Style);
3497 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003498 " int someLongParameter) FINAL {}",
3499 Style);
3500 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003501 " int parameter) const override {}",
3502 Style);
3503
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003504 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3505 verifyFormat("void someLongFunction(\n"
3506 " int someLongParameter) const\n"
3507 "{\n"
3508 "}",
3509 Style);
3510
Daniel Jasper5550de62014-02-17 07:57:46 +00003511 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003512 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3513 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3514 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003515
3516 // Breaking before function-like trailing annotations is fine to keep them
3517 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003518 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3519 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3520 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3521 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3522 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3523 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003524 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3525 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003526 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003527
3528 verifyFormat(
3529 "void aaaaaaaaaaaaaaaaaa()\n"
3530 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3531 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3532 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3533 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003534 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003535 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003536 " GUARDED_BY(aaaaaaaaaaaa);");
3537 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003538 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003539 " GUARDED_BY(aaaaaaaaaaaa);");
3540 verifyGoogleFormat(
3541 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3542 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003543 verifyGoogleFormat(
3544 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3545 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003546}
3547
Daniel Jasperf090f032015-05-18 09:47:22 +00003548TEST_F(FormatTest, FunctionAnnotations) {
3549 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003550 "int OldFunction(const string &parameter) {}");
3551 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003552 "string OldFunction(const string &parameter) {}");
3553 verifyFormat("template <typename T>\n"
3554 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3555 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003556
3557 // Not function annotations.
3558 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003560 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3561 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003562 verifyFormat("MACRO(abc).function() // wrap\n"
3563 " << abc;");
3564 verifyFormat("MACRO(abc)->function() // wrap\n"
3565 " << abc;");
3566 verifyFormat("MACRO(abc)::function() // wrap\n"
3567 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003568}
3569
Daniel Jasperf7935112012-12-03 18:12:45 +00003570TEST_F(FormatTest, BreaksDesireably) {
3571 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3572 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003573 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003574 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3576 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003577
3578 verifyFormat(
3579 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003581
3582 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003585
3586 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003587 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3588 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003590 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3591 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003592
3593 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3594 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3595
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003596 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003597 "void f() {\n"
3598 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3599 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3600 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003601 verifyFormat(
3602 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3604 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003605 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3607 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003608 "aaaaaa(aaa,\n"
3609 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3611 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003612 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003615
Daniel Jasper739b85f2015-06-29 10:42:59 +00003616 // Indent consistently independent of call expression and unary operator.
3617 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3618 " dddddddddddddddddddddddddddddd));");
3619 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3620 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003621 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003622 " dddddddddddddddddddddddddddddd));");
3623
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003624 // This test case breaks on an incorrect memoization, i.e. an optimization not
3625 // taking into account the StopAt value.
3626 verifyFormat(
3627 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003628 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3629 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3630 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003631
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003632 verifyFormat("{\n {\n {\n"
3633 " Annotation.SpaceRequiredBefore =\n"
3634 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3635 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3636 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003637
3638 // Break on an outer level if there was a break on an inner level.
3639 EXPECT_EQ("f(g(h(a, // comment\n"
3640 " b, c),\n"
3641 " d, e),\n"
3642 " x, y);",
3643 format("f(g(h(a, // comment\n"
3644 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003645
3646 // Prefer breaking similar line breaks.
3647 verifyFormat(
3648 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3649 " NSTrackingMouseEnteredAndExited |\n"
3650 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003651}
3652
Daniel Jasper18210d72014-10-09 09:52:05 +00003653TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3654 FormatStyle NoBinPacking = getGoogleStyle();
3655 NoBinPacking.BinPackParameters = false;
3656 NoBinPacking.BinPackArguments = true;
3657 verifyFormat("void f() {\n"
3658 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3659 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3660 "}",
3661 NoBinPacking);
3662 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3663 " int aaaaaaaaaaaaaaaaaaaa,\n"
3664 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3665 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003666
Daniel Jasper00693b082016-01-09 15:56:47 +00003667 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3668 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3669 " vector<int> bbbbbbbbbbbbbbb);",
3670 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003671 // FIXME: This behavior difference is probably not wanted. However, currently
3672 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3673 // template arguments from BreakBeforeParameter being set because of the
3674 // one-per-line formatting.
3675 verifyFormat(
3676 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3677 " aaaaaaaaaa> aaaaaaaaaa);",
3678 NoBinPacking);
3679 verifyFormat(
3680 "void fffffffffff(\n"
3681 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3682 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003683}
3684
Daniel Jasper9278eb92013-01-16 14:59:02 +00003685TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003686 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003687 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003688 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003689 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3690 " aaaaaaaaaaaaaaaaaaaa,\n"
3691 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3692 NoBinPacking);
3693 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3694 " aaaaaaaaaaaaa,\n"
3695 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3696 NoBinPacking);
3697 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003698 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3699 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3701 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3703 NoBinPacking);
3704 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3705 " .aaaaaaaaaaaaaaaaaa();",
3706 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003707 verifyFormat("void f() {\n"
3708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3709 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3710 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003711 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003712
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003713 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003714 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3715 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003716 " aaaaaaaaaaaa);",
3717 NoBinPacking);
3718 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003719 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3720 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003721 " test);",
3722 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003723
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003724 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3725 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003726 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3727 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003728 NoBinPacking);
3729 verifyFormat("a(\"a\"\n"
3730 " \"a\",\n"
3731 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003732
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003733 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003734 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003735 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003737 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003738 verifyFormat(
3739 "void f() {\n"
3740 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3741 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003742 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003743 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003744 verifyFormat(
3745 "template <class SomeType, class SomeOtherType>\n"
3746 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3747 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003748}
3749
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003750TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3751 FormatStyle Style = getLLVMStyleWithColumns(15);
3752 Style.ExperimentalAutoDetectBinPacking = true;
3753 EXPECT_EQ("aaa(aaaa,\n"
3754 " aaaa,\n"
3755 " aaaa);\n"
3756 "aaa(aaaa,\n"
3757 " aaaa,\n"
3758 " aaaa);",
3759 format("aaa(aaaa,\n" // one-per-line
3760 " aaaa,\n"
3761 " aaaa );\n"
3762 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3763 Style));
3764 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3765 " aaaa);\n"
3766 "aaa(aaaa, aaaa,\n"
3767 " aaaa);",
3768 format("aaa(aaaa, aaaa,\n" // bin-packed
3769 " aaaa );\n"
3770 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3771 Style));
3772}
3773
Daniel Jasper04468962013-01-18 10:56:38 +00003774TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003775 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3776 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3777 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3778 " .StartsWith(\".init\", ORDER_INIT)\n"
3779 " .StartsWith(\".fini\", ORDER_FINI)\n"
3780 " .StartsWith(\".hash\", ORDER_HASH)\n"
3781 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003782
Daniel Jaspereb50c672013-02-15 20:33:06 +00003783 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003784 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003785 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003786 "aaaaaaa->aaaaaaa\n"
3787 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003789 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003790 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003791 "aaaaaaa->aaaaaaa\n"
3792 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3793 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3794 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003795 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003796 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003797 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003798 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3799 " aaaaaa->aaaaaaaaaaaa()\n"
3800 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003802 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003803 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003804 "void f() {\n"
3805 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003806 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003807 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003808 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003809 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003810 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003811 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003812 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003813 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003814 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003815 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003816 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003817
3818 verifyFormat(
3819 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3820 verifyFormat("aaaaaaaaaaaaaaa()\n"
3821 " .aaaaaaaaaaaaaaa()\n"
3822 " .aaaaaaaaaaaaaaa()\n"
3823 " .aaaaaaaaaaaaaaa()\n"
3824 " .aaaaaaaaaaaaaaa();");
3825 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3826 " .aaaaaaaaaaaaaaa()\n"
3827 " .aaaaaaaaaaaaaaa()\n"
3828 " .aaaaaaaaaaaaaaa();");
3829 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3830 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3831 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003832 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3833 " ->aaaaaaaaaaaaaae(0)\n"
3834 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003835
Daniel Jasper775954b2015-04-24 10:08:09 +00003836 // Don't linewrap after very short segments.
3837 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3838 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3839 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3840 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3841 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3842 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3843 verifyFormat("aaa()\n"
3844 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3845 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3846 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3847
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003848 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3849 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3850 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3851 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3852 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003854
Daniel Jaspera41aa532014-09-19 08:01:25 +00003855 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003856 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3857 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003858
3859 // Prefer not to create "hanging" indents.
3860 verifyFormat(
3861 "return !soooooooooooooome_map\n"
3862 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3863 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003864 verifyFormat(
3865 "return aaaaaaaaaaaaaaaa\n"
3866 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3867 " .aaaa(aaaaaaaaaaaaaa);");
3868 // No hanging indent here.
3869 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3871 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003873 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3874 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3875 getLLVMStyleWithColumns(60));
3876 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3877 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3878 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3879 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003880 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3882 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003883}
3884
Daniel Jasperde5c2072012-12-24 00:13:23 +00003885TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3886 verifyFormat(
3887 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003888 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003889 verifyFormat(
3890 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3891 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3892
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003893 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003894 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003895 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3896 " ccccccccccccccccccccccccc) {\n}");
3897
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003898 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003899 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003900 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3901 " ccccccccccccccccccccccccc) {\n}");
3902
Daniel Jasperde5c2072012-12-24 00:13:23 +00003903 verifyFormat(
3904 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003905 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003906 verifyFormat(
3907 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3908 " ccccccccccccccccccccccccc) {\n}");
3909
Daniel Jasper400adc62013-02-08 15:28:42 +00003910 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3911 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3912 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3913 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003914 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3915 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3916 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3917 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3918
Daniel Jasper400adc62013-02-08 15:28:42 +00003919 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3920 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3921 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003922 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3923 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3924 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003925}
3926
Daniel Jasper43b65482013-01-23 12:27:43 +00003927TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003928 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003929 "unsigned Cost =\n"
3930 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3931 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003932 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003933 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3934 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003935
3936 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003937 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3938 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003939 verifyFormat("unsigned OriginalStartColumn =\n"
3940 " SourceMgr.getSpellingColumnNumber(\n"
3941 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3942 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003943}
3944
Francois Ferrand9976efa2017-05-22 08:28:17 +00003945TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
3946 FormatStyle Style = getLLVMStyle();
3947 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3948 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
3949 Style);
3950
3951 Style.PenaltyBreakAssignment = 20;
3952 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3953 " cccccccccccccccccccccccccc;",
3954 Style);
3955}
3956
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003957TEST_F(FormatTest, AlignsAfterAssignments) {
3958 verifyFormat(
3959 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003960 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003961 verifyFormat(
3962 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003963 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003964 verifyFormat(
3965 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003966 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003967 verifyFormat(
3968 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003969 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003970 verifyFormat(
3971 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3972 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3973 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003974}
3975
3976TEST_F(FormatTest, AlignsAfterReturn) {
3977 verifyFormat(
3978 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3979 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3980 verifyFormat(
3981 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3982 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003983 verifyFormat(
3984 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003985 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003986 verifyFormat(
3987 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003988 " aaaaaaaaaaaaaaaaaaaaaa());");
3989 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3991 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003994 verifyFormat("return\n"
3995 " // true if code is one of a or b.\n"
3996 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003997}
3998
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003999TEST_F(FormatTest, AlignsAfterOpenBracket) {
4000 verifyFormat(
4001 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4002 " aaaaaaaaa aaaaaaa) {}");
4003 verifyFormat(
4004 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4005 " aaaaaaaaaaa aaaaaaaaa);");
4006 verifyFormat(
4007 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4008 " aaaaaaaaaaaaaaaaaaaaa));");
4009 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004010 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004011 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4012 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4013 Style);
4014 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4015 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4016 Style);
4017 verifyFormat("SomeLongVariableName->someFunction(\n"
4018 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4019 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004020 verifyFormat(
4021 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4022 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4023 Style);
4024 verifyFormat(
4025 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4026 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4027 Style);
4028 verifyFormat(
4029 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4030 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4031 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004032
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004033 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4034 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4035 " b));",
4036 Style);
4037
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004038 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4039 Style.BinPackArguments = false;
4040 Style.BinPackParameters = false;
4041 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4042 " aaaaaaaaaaa aaaaaaaa,\n"
4043 " aaaaaaaaa aaaaaaa,\n"
4044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4045 Style);
4046 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4047 " aaaaaaaaaaa aaaaaaaaa,\n"
4048 " aaaaaaaaaaa aaaaaaaaa,\n"
4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4050 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004051 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4052 " aaaaaaaaaaaaaaa,\n"
4053 " aaaaaaaaaaaaaaaaaaaaa,\n"
4054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004055 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004056 verifyFormat(
4057 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4058 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4059 Style);
4060 verifyFormat(
4061 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4062 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4063 Style);
4064 verifyFormat(
4065 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4066 " aaaaaaaaaaaaaaaaaaaaa(\n"
4067 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4068 " aaaaaaaaaaaaaaaa);",
4069 Style);
4070 verifyFormat(
4071 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4072 " aaaaaaaaaaaaaaaaaaaaa(\n"
4073 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4074 " aaaaaaaaaaaaaaaa);",
4075 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004076}
4077
Daniel Jasper3219e432014-12-02 13:24:51 +00004078TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4079 FormatStyle Style = getLLVMStyleWithColumns(40);
4080 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4081 " bbbbbbbbbbbbbbbbbbbbbb);",
4082 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004083 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004084 Style.AlignOperands = false;
4085 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4086 " bbbbbbbbbbbbbbbbbbbbbb);",
4087 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004088 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004089 Style.AlignOperands = true;
4090 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4091 " bbbbbbbbbbbbbbbbbbbbbb);",
4092 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004093 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004094 Style.AlignOperands = false;
4095 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4096 " bbbbbbbbbbbbbbbbbbbbbb);",
4097 Style);
4098}
4099
Daniel Jasper399d24b2013-01-09 07:06:56 +00004100TEST_F(FormatTest, BreaksConditionalExpressions) {
4101 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004102 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4103 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4104 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4105 verifyFormat(
4106 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004107 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4108 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004109 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004110 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4111 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4112 verifyFormat(
4113 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004114 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4115 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004116 verifyFormat(
4117 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4118 " : aaaaaaaaaaaaa);");
4119 verifyFormat(
4120 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004121 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004122 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4123 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004124 verifyFormat(
4125 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4126 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4127 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004128 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4129 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4131 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4133 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4135 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4137 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4139 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004140 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4142 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4144 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004145 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4146 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4147 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004148 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4150 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4151 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004152 verifyFormat(
4153 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4154 " ? aaaaaaaaaaaaaaa\n"
4155 " : aaaaaaaaaaaaaaa;");
4156 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004157 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004158 " ? b\n"
4159 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004160 verifyFormat("return aaaa == bbbb\n"
4161 " // comment\n"
4162 " ? aaaa\n"
4163 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004164 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004165 " format(TheLine.First,\n"
4166 " IndentForLevel[TheLine.Level] >= 0\n"
4167 " ? IndentForLevel[TheLine.Level]\n"
4168 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004169 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004170 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004171 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4172 " ? aaaaaaaaaaaaaaa\n"
4173 " : bbbbbbbbbbbbbbb //\n"
4174 " ? ccccccccccccccc\n"
4175 " : ddddddddddddddd;");
4176 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4177 " ? aaaaaaaaaaaaaaa\n"
4178 " : (bbbbbbbbbbbbbbb //\n"
4179 " ? ccccccccccccccc\n"
4180 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004181 verifyFormat(
4182 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4183 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4184 " aaaaaaaaaaaaaaaaaaaaa +\n"
4185 " aaaaaaaaaaaaaaaaaaaaa\n"
4186 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004187 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004188 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4189 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4190 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004191
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004192 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004193 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004194 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004195 "void f() {\n"
4196 " g(aaa,\n"
4197 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4199 " ? aaaaaaaaaaaaaaa\n"
4200 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004201 "}",
4202 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004203 verifyFormat(
4204 "void f() {\n"
4205 " g(aaa,\n"
4206 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4208 " ?: aaaaaaaaaaaaaaa);\n"
4209 "}",
4210 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004211
4212 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4213 " // comment.\n"
4214 " ccccccccccccccccccccccccccccccccccccccc\n"
4215 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4216 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004217
4218 // Assignments in conditional expressions. Apparently not uncommon :-(.
4219 verifyFormat("return a != b\n"
4220 " // comment\n"
4221 " ? a = b\n"
4222 " : a = b;");
4223 verifyFormat("return a != b\n"
4224 " // comment\n"
4225 " ? a = a != b\n"
4226 " // comment\n"
4227 " ? a = b\n"
4228 " : a\n"
4229 " : a;\n");
4230 verifyFormat("return a != b\n"
4231 " // comment\n"
4232 " ? a\n"
4233 " : a = a != b\n"
4234 " // comment\n"
4235 " ? a = b\n"
4236 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004237}
4238
Daniel Jasper165b29e2013-11-08 00:57:11 +00004239TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4240 FormatStyle Style = getLLVMStyle();
4241 Style.BreakBeforeTernaryOperators = false;
4242 Style.ColumnLimit = 70;
4243 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004244 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4247 Style);
4248 verifyFormat(
4249 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004250 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004252 Style);
4253 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004254 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4256 Style);
4257 verifyFormat(
4258 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004259 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004261 Style);
4262 verifyFormat(
4263 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4264 " aaaaaaaaaaaaa);",
4265 Style);
4266 verifyFormat(
4267 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4268 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4270 " aaaaaaaaaaaaa);",
4271 Style);
4272 verifyFormat(
4273 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4274 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4275 " aaaaaaaaaaaaa);",
4276 Style);
4277 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4282 Style);
4283 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4289 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4290 Style);
4291 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4295 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4296 Style);
4297 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4298 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4299 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4300 Style);
4301 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4305 Style);
4306 verifyFormat(
4307 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4308 " aaaaaaaaaaaaaaa :\n"
4309 " aaaaaaaaaaaaaaa;",
4310 Style);
4311 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4312 " aaaaaaaaa ?\n"
4313 " b :\n"
4314 " c);",
4315 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004316 verifyFormat("unsigned Indent =\n"
4317 " format(TheLine.First,\n"
4318 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4319 " IndentForLevel[TheLine.Level] :\n"
4320 " TheLine * 2,\n"
4321 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4322 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004323 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4324 " aaaaaaaaaaaaaaa :\n"
4325 " bbbbbbbbbbbbbbb ? //\n"
4326 " ccccccccccccccc :\n"
4327 " ddddddddddddddd;",
4328 Style);
4329 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4330 " aaaaaaaaaaaaaaa :\n"
4331 " (bbbbbbbbbbbbbbb ? //\n"
4332 " ccccccccccccccc :\n"
4333 " ddddddddddddddd);",
4334 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004335 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4336 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4337 " ccccccccccccccccccccccccccc;",
4338 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004339 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4340 " aaaaa :\n"
4341 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4342 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004343}
4344
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004345TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4346 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4347 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4348 verifyFormat("bool a = true, b = false;");
4349
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004350 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004351 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004352 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004353 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004354 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004355 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004356 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004357 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004358 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4359 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4360 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4361 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4362 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4363 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004364
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004365 FormatStyle Style = getGoogleStyle();
4366 Style.PointerAlignment = FormatStyle::PAS_Left;
4367 Style.DerivePointerAlignment = false;
4368 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4369 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4370 " *b = bbbbbbbbbbbbbbbbbbb;",
4371 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004372 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4373 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4374 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004375 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004376 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004377}
4378
Nico Weber4a5030c2013-01-12 01:28:06 +00004379TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4380 verifyFormat("arr[foo ? bar : baz];");
4381 verifyFormat("f()[foo ? bar : baz];");
4382 verifyFormat("(a + b)[foo ? bar : baz];");
4383 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4384}
4385
Daniel Jasperf7935112012-12-03 18:12:45 +00004386TEST_F(FormatTest, AlignsStringLiterals) {
4387 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4388 " \"short literal\");");
4389 verifyFormat(
4390 "looooooooooooooooooooooooongFunction(\n"
4391 " \"short literal\"\n"
4392 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004393 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4394 " \" string literals\",\n"
4395 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004396 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4397 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004398 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004399 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004400 getLLVMStyleWithColumns(28)));
4401 EXPECT_EQ(
4402 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4403 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4404 " \"aaaaaaaaaaaaaaaa\";",
4405 format("aaaaaa ="
4406 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4407 "aaaaaaaaaaaaaaaaaaaaa\" "
4408 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004409 verifyFormat("a = a + \"a\"\n"
4410 " \"a\"\n"
4411 " \"a\";");
4412 verifyFormat("f(\"a\", \"b\"\n"
4413 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004414
4415 verifyFormat(
4416 "#define LL_FORMAT \"ll\"\n"
4417 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4418 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004419
4420 verifyFormat("#define A(X) \\\n"
4421 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4422 " \"ccccc\"",
4423 getLLVMStyleWithColumns(23));
4424 verifyFormat("#define A \"def\"\n"
4425 "f(\"abc\" A \"ghi\"\n"
4426 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004427
4428 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004429 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004430 verifyFormat("#define A(X) \\\n"
4431 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4432 " L\"ccccc\"",
4433 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004434
4435 verifyFormat("f(@\"a\"\n"
4436 " @\"b\");");
4437 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004438 " @\"b\"\n"
4439 " @\"c\";");
4440 verifyFormat("NSString s = @\"a\"\n"
4441 " \"b\"\n"
4442 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004443}
4444
Zachary Turner448592e2015-12-18 22:20:15 +00004445TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004446 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004447 // No declarations or definitions should be moved to own line.
4448 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4449 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004450 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004451 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004452 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004453 "int f() { return 1; }\n"
4454 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004455 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004456
4457 // All declarations and definitions should have the return type moved to its
4458 // own
4459 // line.
4460 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4461 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004462 " int\n"
4463 " f() {\n"
4464 " return 1;\n"
4465 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004466 " int\n"
4467 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004468 "};\n"
4469 "int\n"
4470 "f() {\n"
4471 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004472 "}\n"
4473 "int\n"
4474 "g();\n",
4475 Style);
4476
4477 // Top-level definitions, and no kinds of declarations should have the
4478 // return type moved to its own line.
4479 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4480 verifyFormat("class B {\n"
4481 " int f() { return 1; }\n"
4482 " int g();\n"
4483 "};\n"
4484 "int\n"
4485 "f() {\n"
4486 " return 1;\n"
4487 "}\n"
4488 "int g();\n",
4489 Style);
4490
4491 // Top-level definitions and declarations should have the return type moved
4492 // to its own line.
4493 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4494 verifyFormat("class C {\n"
4495 " int f() { return 1; }\n"
4496 " int g();\n"
4497 "};\n"
4498 "int\n"
4499 "f() {\n"
4500 " return 1;\n"
4501 "}\n"
4502 "int\n"
4503 "g();\n",
4504 Style);
4505
4506 // All definitions should have the return type moved to its own line, but no
4507 // kinds of declarations.
4508 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4509 verifyFormat("class D {\n"
4510 " int\n"
4511 " f() {\n"
4512 " return 1;\n"
4513 " }\n"
4514 " int g();\n"
4515 "};\n"
4516 "int\n"
4517 "f() {\n"
4518 " return 1;\n"
4519 "}\n"
4520 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004521 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004522 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004523 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004524 " return \"\";\n"
4525 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004526 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004527 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004528 verifyFormat("template <class T>\n"
4529 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004530 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004531 " return NULL;\n"
4532 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004533 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004534 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004535 verifyFormat("class C {\n"
4536 " int\n"
4537 " operator+() {\n"
4538 " return 1;\n"
4539 " }\n"
4540 " int\n"
4541 " operator()() {\n"
4542 " return 1;\n"
4543 " }\n"
4544 "};\n",
4545 Style);
4546 verifyFormat("void\n"
4547 "A::operator()() {}\n"
4548 "void\n"
4549 "A::operator>>() {}\n"
4550 "void\n"
4551 "A::operator+() {}\n",
4552 Style);
4553 verifyFormat("void *operator new(std::size_t s);", // No break here.
4554 Style);
4555 verifyFormat("void *\n"
4556 "operator new(std::size_t s) {}",
4557 Style);
4558 verifyFormat("void *\n"
4559 "operator delete[](void *ptr) {}",
4560 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004561 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004562 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004563 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004564 "{\n"
4565 " return \"\";\n"
4566 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004567 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004568 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004569 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004570 "T *\n" // Problem here: no line break
4571 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004572 "{\n"
4573 " return NULL;\n"
4574 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004575 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004576 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004577}
4578
Alexander Kornienko58611712013-07-04 12:02:44 +00004579TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4580 FormatStyle NoBreak = getLLVMStyle();
4581 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4582 FormatStyle Break = getLLVMStyle();
4583 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004584 verifyFormat("aaaa = \"bbbb\"\n"
4585 " \"cccc\";",
4586 NoBreak);
4587 verifyFormat("aaaa =\n"
4588 " \"bbbb\"\n"
4589 " \"cccc\";",
4590 Break);
4591 verifyFormat("aaaa(\"bbbb\"\n"
4592 " \"cccc\");",
4593 NoBreak);
4594 verifyFormat("aaaa(\n"
4595 " \"bbbb\"\n"
4596 " \"cccc\");",
4597 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004598 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4599 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004600 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004601 verifyFormat("aaaa(qqq,\n"
4602 " \"bbbb\"\n"
4603 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004604 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004605 verifyFormat("aaaa(qqq,\n"
4606 " L\"bbbb\"\n"
4607 " L\"cccc\");",
4608 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004609 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4610 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004611 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004612 verifyFormat("string s = someFunction(\n"
4613 " \"abc\"\n"
4614 " \"abc\");",
4615 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004616
Daniel Jasper3251fff2014-06-10 06:27:23 +00004617 // As we break before unary operators, breaking right after them is bad.
4618 verifyFormat("string foo = abc ? \"x\"\n"
4619 " \"blah blah blah blah blah blah\"\n"
4620 " : \"y\";",
4621 Break);
4622
Daniel Jasperc834c702013-07-17 15:38:19 +00004623 // Don't break if there is no column gain.
4624 verifyFormat("f(\"aaaa\"\n"
4625 " \"bbbb\");",
4626 Break);
4627
4628 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004629 EXPECT_EQ("x = \"a\\\n"
4630 "b\\\n"
4631 "c\";",
4632 format("x = \"a\\\n"
4633 "b\\\n"
4634 "c\";",
4635 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004636 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004637 " \"a\\\n"
4638 "b\\\n"
4639 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004640 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004641 "b\\\n"
4642 "c\";",
4643 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004644
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004645 EXPECT_EQ("NSString *const kString =\n"
4646 " @\"aaaa\"\n"
4647 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004648 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004649 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004650 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004651
4652 Break.ColumnLimit = 0;
4653 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004654}
4655
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004656TEST_F(FormatTest, AlignsPipes) {
4657 verifyFormat(
4658 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4659 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4660 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4661 verifyFormat(
4662 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4663 " << aaaaaaaaaaaaaaaaaaaa;");
4664 verifyFormat(
4665 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4666 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4667 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004668 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4669 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4670 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004671 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4672 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4673 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4674 verifyFormat(
4675 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4676 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4677 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004678 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4681 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004682 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4683 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004684 verifyFormat(
4685 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004687 verifyFormat(
4688 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4689 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004690
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004691 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4692 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004693 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4695 " aaaaaaaaaaaaaaaaaaaaa)\n"
4696 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004697 verifyFormat("LOG_IF(aaa == //\n"
4698 " bbb)\n"
4699 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004700
Daniel Jasper467ddb12013-08-12 12:58:05 +00004701 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004702 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4703 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004704 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4705 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4706 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004707 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4708 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004709 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4710 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4712 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4713 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4715 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004716
Daniel Jasperc238c872013-04-02 14:33:13 +00004717 verifyFormat(
4718 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4719 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004720
4721 // Incomplete string literal.
4722 EXPECT_EQ("llvm::errs() << \"\n"
4723 " << a;",
4724 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004725
4726 verifyFormat("void f() {\n"
4727 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4728 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4729 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004730
4731 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004732 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4733 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4734 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004735
4736 // Handle '\n'.
4737 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4738 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4739 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4740 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4741 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4742 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4743 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004744}
4745
Daniel Jasper7209bb92016-12-13 11:16:42 +00004746TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4747 verifyFormat("return out << \"somepacket = {\\n\"\n"
4748 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4749 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4750 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4751 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4752 " << \"}\";");
4753
4754 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4755 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4756 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4757 verifyFormat(
4758 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4759 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4760 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4761 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4762 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4763 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4764 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4765 verifyFormat(
4766 "void f() {\n"
4767 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4768 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4769 "}");
4770
4771 // Breaking before the first "<<" is generally not desirable.
4772 verifyFormat(
4773 "llvm::errs()\n"
4774 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4775 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4776 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4777 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4778 getLLVMStyleWithColumns(70));
4779 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4780 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4781 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4782 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4783 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4784 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4785 getLLVMStyleWithColumns(70));
4786
4787 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4788 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4789 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4790 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4791 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4792 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004793 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4794 " (aaaa + aaaa);",
4795 getLLVMStyleWithColumns(40));
4796 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4797 " (aaaaaaa + aaaaa));",
4798 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004799 verifyFormat(
4800 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4801 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4802 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004803}
4804
Daniel Jasperf7935112012-12-03 18:12:45 +00004805TEST_F(FormatTest, UnderstandsEquals) {
4806 verifyFormat(
4807 "aaaaaaaaaaaaaaaaa =\n"
4808 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4809 verifyFormat(
4810 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004812 verifyFormat(
4813 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004814 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004815 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4817 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004818
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004819 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4820 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004821}
4822
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004823TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004824 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4825 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004826
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004827 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4828 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004829
4830 verifyFormat(
4831 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4832 " Parameter2);");
4833
4834 verifyFormat(
4835 "ShortObject->shortFunction(\n"
4836 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4837 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4838
4839 verifyFormat("loooooooooooooongFunction(\n"
4840 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4841
4842 verifyFormat(
4843 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4844 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4845
Daniel Jasper687af3b2013-02-14 14:26:07 +00004846 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4847 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004848 verifyFormat("void f() {\n"
4849 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4850 " .Times(2)\n"
4851 " .WillRepeatedly(Return(SomeValue));\n"
4852 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004853 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4854 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004855 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4857 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004858 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004859 verifyFormat("void f() {\n"
4860 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4861 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4862 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004863 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4865 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4866 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4867 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004868 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4869 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4870 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4871 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4872 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004873
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004874 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004875 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004876 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004877 verifyFormat(
4878 "aaaaaaaaaaa->aaaaaaaaa(\n"
4879 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4880 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004881
4882 verifyFormat(
4883 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004885 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4886 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4887 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4888 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004889
Daniel Jasper9b334242013-03-15 14:57:30 +00004890 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4892 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004893
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004894 FormatStyle NoBinPacking = getLLVMStyle();
4895 NoBinPacking.BinPackParameters = false;
4896 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4897 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4898 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4899 " aaaaaaaaaaaaaaaaaaa,\n"
4900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4901 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004902
4903 // If there is a subsequent call, change to hanging indentation.
4904 verifyFormat(
4905 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4906 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4907 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4908 verifyFormat(
4909 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4910 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004911 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4913 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4914 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4916 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004917}
4918
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004919TEST_F(FormatTest, WrapsTemplateDeclarations) {
4920 verifyFormat("template <typename T>\n"
4921 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004922 verifyFormat("template <typename T>\n"
4923 "// T should be one of {A, B}.\n"
4924 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004925 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004926 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004927 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004928 verifyFormat("template <typename T>\n"
4929 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4930 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004931 verifyFormat(
4932 "template <typename T>\n"
4933 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4934 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004935 verifyFormat(
4936 "template <typename T>\n"
4937 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4938 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004940 verifyFormat("template <typename T>\n"
4941 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004942 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004943 verifyFormat(
4944 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4945 " typename T4 = char>\n"
4946 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004947 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4948 " template <typename> class cccccccccccccccccccccc,\n"
4949 " typename ddddddddddddd>\n"
4950 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004951 verifyFormat(
4952 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4953 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004954
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004955 verifyFormat("void f() {\n"
4956 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4957 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4958 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004959
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004960 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004961 verifyFormat("template <typename T> void f();");
4962 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004963 verifyFormat(
4964 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4965 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4967 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4970 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4971 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004972 EXPECT_EQ("static_cast<A< //\n"
4973 " B> *>(\n"
4974 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00004975 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00004976 format("static_cast<A<//\n"
4977 " B>*>(\n"
4978 "\n"
4979 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004980 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4981 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004982
4983 FormatStyle AlwaysBreak = getLLVMStyle();
4984 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4985 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4986 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4987 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4988 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4989 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4990 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4991 verifyFormat("template <template <typename> class Fooooooo,\n"
4992 " template <typename> class Baaaaaaar>\n"
4993 "struct C {};",
4994 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004995 verifyFormat("template <typename T> // T can be A, B or C.\n"
4996 "struct C {};",
4997 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004998 verifyFormat("template <enum E> class A {\n"
4999 "public:\n"
5000 " E *f();\n"
5001 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005002}
5003
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005004TEST_F(FormatTest, WrapsTemplateParameters) {
5005 FormatStyle Style = getLLVMStyle();
5006 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5007 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5008 verifyFormat(
5009 "template <typename... a> struct q {};\n"
5010 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5011 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5012 " y;",
5013 Style);
5014 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5015 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5016 verifyFormat(
5017 "template <typename... a> struct r {};\n"
5018 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5019 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5020 " y;",
5021 Style);
5022 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5023 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5024 verifyFormat(
5025 "template <typename... a> struct s {};\n"
5026 "extern s<\n"
5027 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5028 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5029 " y;",
5030 Style);
5031 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5032 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5033 verifyFormat(
5034 "template <typename... a> struct t {};\n"
5035 "extern t<\n"
5036 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5037 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5038 " y;",
5039 Style);
5040}
5041
Daniel Jasper45797022013-01-25 10:57:27 +00005042TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5043 verifyFormat(
5044 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5046 verifyFormat(
5047 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5050
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005051 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005052 verifyFormat(
5053 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005056
Daniel Jasper45797022013-01-25 10:57:27 +00005057 verifyFormat(
5058 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005059 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005060
5061 // Breaking at nested name specifiers is generally not desirable.
5062 verifyFormat(
5063 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5064 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005065
5066 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005067 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005070 " aaaaaaaaaaaaaaaaaaaaa);",
5071 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005072
5073 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5075 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005076}
5077
Daniel Jasperf7935112012-12-03 18:12:45 +00005078TEST_F(FormatTest, UnderstandsTemplateParameters) {
5079 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005080 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005081 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5082 verifyFormat("bool x = a < 1 || 2 > a;");
5083 verifyFormat("bool x = 5 < f<int>();");
5084 verifyFormat("bool x = f<int>() > 5;");
5085 verifyFormat("bool x = 5 < a<int>::x;");
5086 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5087 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5088
5089 verifyGoogleFormat("A<A<int>> a;");
5090 verifyGoogleFormat("A<A<A<int>>> a;");
5091 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005092 verifyGoogleFormat("A<A<int> > a;");
5093 verifyGoogleFormat("A<A<A<int> > > a;");
5094 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005095 verifyGoogleFormat("A<::A<int>> a;");
5096 verifyGoogleFormat("A<::A> a;");
5097 verifyGoogleFormat("A< ::A> a;");
5098 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005099 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5100 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005101 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5102 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005103 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5104 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005105
Nico Weber7533b4d2014-09-24 17:17:32 +00005106 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5107
Daniel Jasperf7935112012-12-03 18:12:45 +00005108 verifyFormat("test >> a >> b;");
5109 verifyFormat("test << a >> b;");
5110
5111 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005112 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005113 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005114 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5115 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005116 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005117 verifyFormat("f(a.operator()<A>());");
5118 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5119 " .template operator()<A>());",
5120 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005121
5122 // Not template parameters.
5123 verifyFormat("return a < b && c > d;");
5124 verifyFormat("void f() {\n"
5125 " while (a < b && c > d) {\n"
5126 " }\n"
5127 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005128 verifyFormat("template <typename... Types>\n"
5129 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005130
5131 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5133 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005134 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005135 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005136 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005137}
5138
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005139TEST_F(FormatTest, BitshiftOperatorWidth) {
5140 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5141 " bar */",
5142 format("int a=1<<2; /* foo\n"
5143 " bar */"));
5144
5145 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5146 " bar */",
5147 format("int b =256>>1 ; /* foo\n"
5148 " bar */"));
5149}
5150
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005151TEST_F(FormatTest, UnderstandsBinaryOperators) {
5152 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005153 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005154}
5155
5156TEST_F(FormatTest, UnderstandsPointersToMembers) {
5157 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005158 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005159 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005160 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005161 verifyFormat("void f() {\n"
5162 " (a->*f)();\n"
5163 " a->*x;\n"
5164 " (a.*f)();\n"
5165 " ((*a).*f)();\n"
5166 " a.*x;\n"
5167 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005168 verifyFormat("void f() {\n"
5169 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5170 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5171 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005172 verifyFormat(
5173 "(aaaaaaaaaa->*bbbbbbb)(\n"
5174 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005175 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005176 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005177 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005178}
5179
Daniel Jasper8dd40472012-12-21 09:41:31 +00005180TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005181 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005182 verifyFormat("f(-1, -2, -3);");
5183 verifyFormat("a[-1] = 5;");
5184 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005185 verifyFormat("if (i == -1) {\n}");
5186 verifyFormat("if (i != -1) {\n}");
5187 verifyFormat("if (i > -1) {\n}");
5188 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005189 verifyFormat("++(a->f());");
5190 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005191 verifyFormat("(a->f())++;");
5192 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005193 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005194
5195 verifyFormat("a-- > b;");
5196 verifyFormat("b ? -a : c;");
5197 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005198 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005199 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005200 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005201
5202 verifyFormat("return -1;");
5203 verifyFormat("switch (a) {\n"
5204 "case -1:\n"
5205 " break;\n"
5206 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005207 verifyFormat("#define X -1");
5208 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005209
Chandler Carruthf8b72662014-03-02 12:37:31 +00005210 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5211 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005212
5213 verifyFormat("int a = /* confusing comment */ -1;");
5214 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5215 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005216}
5217
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005218TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005219 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005220 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005221 "}");
5222 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005223 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005224 verifyFormat("*aaa = aaaaaaa( // break\n"
5225 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005226}
5227
Daniel Jasper8863ada2013-08-26 08:10:17 +00005228TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005229 verifyFormat("bool operator<();");
5230 verifyFormat("bool operator>();");
5231 verifyFormat("bool operator=();");
5232 verifyFormat("bool operator==();");
5233 verifyFormat("bool operator!=();");
5234 verifyFormat("int operator+();");
5235 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005236 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005237 verifyFormat("bool operator();");
5238 verifyFormat("bool operator()();");
5239 verifyFormat("bool operator[]();");
5240 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005241 verifyFormat("operator int();");
5242 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005243 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005244 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005245 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005246 verifyFormat("void *operator new(std::size_t size);");
5247 verifyFormat("void *operator new[](std::size_t size);");
5248 verifyFormat("void operator delete(void *ptr);");
5249 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005250 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5251 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005252 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005253 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005254
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005255 verifyFormat(
5256 "ostream &operator<<(ostream &OutputStream,\n"
5257 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005258 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5259 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5260 " return left.group < right.group;\n"
5261 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005262 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005263 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005264
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005265 verifyGoogleFormat("operator void*();");
5266 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005267 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005268
5269 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005270 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5271 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005272}
5273
Daniel Jasper1c220482015-02-25 10:30:06 +00005274TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005275 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5276 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5277 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5278 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5279 verifyFormat("Deleted &operator=(const Deleted &) &;");
5280 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5281 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5282 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5283 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5284 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5285 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005286 verifyFormat("void Fn(T const &) const &;");
5287 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005288 verifyFormat("template <typename T>\n"
5289 "void F(T) && = delete;",
5290 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005291
Daniel Jasperaf642c62015-08-25 13:40:51 +00005292 FormatStyle AlignLeft = getLLVMStyle();
5293 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005294 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005295 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5296 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5297 AlignLeft);
5298 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5299 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005300 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5301 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5302 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5303 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005304 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5305 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005306
5307 FormatStyle Spaces = getLLVMStyle();
5308 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005309 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5310 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5311 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5312 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005313
5314 Spaces.SpacesInCStyleCastParentheses = false;
5315 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005316 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5317 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5318 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5319 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005320}
5321
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005322TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005323 verifyFormat("void f() {\n"
5324 " A *a = new A;\n"
5325 " A *a = new (placement) A;\n"
5326 " delete a;\n"
5327 " delete (A *)a;\n"
5328 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005329 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5330 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005331 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5332 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5333 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005334 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005335}
5336
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005337TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005338 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005339 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005340 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005341 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005342 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005343 verifyIndependentOfContext("int a = b * 10;");
5344 verifyIndependentOfContext("int a = 10 * b;");
5345 verifyIndependentOfContext("int a = b * c;");
5346 verifyIndependentOfContext("int a += b * c;");
5347 verifyIndependentOfContext("int a -= b * c;");
5348 verifyIndependentOfContext("int a *= b * c;");
5349 verifyIndependentOfContext("int a /= b * c;");
5350 verifyIndependentOfContext("int a = *b;");
5351 verifyIndependentOfContext("int a = *b * c;");
5352 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005353 verifyIndependentOfContext("int a = b * (10);");
5354 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005355 verifyIndependentOfContext("return 10 * b;");
5356 verifyIndependentOfContext("return *b * *c;");
5357 verifyIndependentOfContext("return a & ~b;");
5358 verifyIndependentOfContext("f(b ? *c : *d);");
5359 verifyIndependentOfContext("int a = b ? *c : *d;");
5360 verifyIndependentOfContext("*b = a;");
5361 verifyIndependentOfContext("a * ~b;");
5362 verifyIndependentOfContext("a * !b;");
5363 verifyIndependentOfContext("a * +b;");
5364 verifyIndependentOfContext("a * -b;");
5365 verifyIndependentOfContext("a * ++b;");
5366 verifyIndependentOfContext("a * --b;");
5367 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005368 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005369 verifyIndependentOfContext("f() * b;");
5370 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005371 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005372 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005373 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005374 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005375 verifyIndependentOfContext("return sizeof(int **);");
5376 verifyIndependentOfContext("return sizeof(int ******);");
5377 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005378 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005379 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005380 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005381 verifyGoogleFormat("return sizeof(int**);");
5382 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5383 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005384 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005385 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005386 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005387 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005388 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005389 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005390 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005391 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005392 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005393 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005394 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005395 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005396 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005397 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005398 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005399 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005400 verifyFormat("void f(const MyOverride &override);");
5401 verifyFormat("void f(const MyFinal &final);");
5402 verifyIndependentOfContext("bool a = f() && override.f();");
5403 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005404
Daniel Jasper5b49f472013-01-23 12:10:53 +00005405 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005406
Daniel Jasper5b49f472013-01-23 12:10:53 +00005407 verifyIndependentOfContext("A<int *> a;");
5408 verifyIndependentOfContext("A<int **> a;");
5409 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005410 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005411 verifyIndependentOfContext(
5412 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005413 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005414 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005415 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005416 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005417 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005418
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005419 verifyFormat(
5420 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5422
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005423 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005424 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005425 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005426 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005427 verifyGoogleFormat("A<int*> a;");
5428 verifyGoogleFormat("A<int**> a;");
5429 verifyGoogleFormat("A<int*, int*> a;");
5430 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005431 verifyGoogleFormat("f(b ? *c : *d);");
5432 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005433 verifyGoogleFormat("Type* t = **x;");
5434 verifyGoogleFormat("Type* t = *++*x;");
5435 verifyGoogleFormat("*++*x;");
5436 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5437 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005438 verifyGoogleFormat(
5439 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005440 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005441 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5442 verifyGoogleFormat("template <typename T>\n"
5443 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005444
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005445 FormatStyle Left = getLLVMStyle();
5446 Left.PointerAlignment = FormatStyle::PAS_Left;
5447 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005448 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005449 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005450 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005451 verifyFormat("delete *x;", Left);
5452 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5453 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5454 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005455
Daniel Jasper5b49f472013-01-23 12:10:53 +00005456 verifyIndependentOfContext("a = *(x + y);");
5457 verifyIndependentOfContext("a = &(x + y);");
5458 verifyIndependentOfContext("*(x + y).call();");
5459 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005460 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005461
Daniel Jasper5b49f472013-01-23 12:10:53 +00005462 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005463 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005464 "int *MyValues = {\n"
5465 " *A, // Operator detection might be confused by the '{'\n"
5466 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005467 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005468
Daniel Jasper5b49f472013-01-23 12:10:53 +00005469 verifyIndependentOfContext("if (int *a = &b)");
5470 verifyIndependentOfContext("if (int &a = *b)");
5471 verifyIndependentOfContext("if (a & b[i])");
5472 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5473 verifyIndependentOfContext("if (*b[i])");
5474 verifyIndependentOfContext("if (int *a = (&b))");
5475 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005476 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005477 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005478 verifyFormat("void f() {\n"
5479 " for (const int &v : Values) {\n"
5480 " }\n"
5481 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005482 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5483 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005484 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005485
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005486 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005487 verifyFormat("#define MACRO \\\n"
5488 " int *i = a * b; \\\n"
5489 " void f(a *b);",
5490 getLLVMStyleWithColumns(19));
5491
Daniel Jasper97b89482013-03-13 07:49:51 +00005492 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005493 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005494 verifyIndependentOfContext("T **t = new T *;");
5495 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005496 verifyGoogleFormat("A = new SomeType*[Length]();");
5497 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005498 verifyGoogleFormat("T** t = new T*;");
5499 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005500
Daniel Jaspera65e8872014-03-25 10:52:45 +00005501 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5502 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005503 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005504 "typename t::if<x && y>::type f() {}");
5505 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005506 verifyFormat("vector<int *> v;");
5507 verifyFormat("vector<int *const> v;");
5508 verifyFormat("vector<int *const **const *> v;");
5509 verifyFormat("vector<int *volatile> v;");
5510 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005511 verifyFormat("foo<b && false>();");
5512 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005513 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005514 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005515 "template <class T, class = typename std::enable_if<\n"
5516 " std::is_integral<T>::value &&\n"
5517 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5518 "void F();",
5519 getLLVMStyleWithColumns(70));
5520 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005521 "template <class T,\n"
5522 " class = typename std::enable_if<\n"
5523 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005524 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5525 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005526 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005527 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005528 verifyFormat(
5529 "template <class T,\n"
5530 " class = typename ::std::enable_if<\n"
5531 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5532 "void F();",
5533 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005534
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005535 verifyIndependentOfContext("MACRO(int *i);");
5536 verifyIndependentOfContext("MACRO(auto *a);");
5537 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005538 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005539 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005540 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005541 // FIXME: Is there a way to make this work?
5542 // verifyIndependentOfContext("MACRO(A *a);");
5543
Daniel Jasper32ccb032014-06-23 07:36:18 +00005544 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005545 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005546
Daniel Jasper866468a2014-04-14 13:15:29 +00005547 EXPECT_EQ("#define OP(x) \\\n"
5548 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5549 " return s << a.DebugString(); \\\n"
5550 " }",
5551 format("#define OP(x) \\\n"
5552 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5553 " return s << a.DebugString(); \\\n"
5554 " }",
5555 getLLVMStyleWithColumns(50)));
5556
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005557 // FIXME: We cannot handle this case yet; we might be able to figure out that
5558 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005559 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005560
5561 FormatStyle PointerMiddle = getLLVMStyle();
5562 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5563 verifyFormat("delete *x;", PointerMiddle);
5564 verifyFormat("int * x;", PointerMiddle);
5565 verifyFormat("template <int * y> f() {}", PointerMiddle);
5566 verifyFormat("int * f(int * a) {}", PointerMiddle);
5567 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5568 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5569 verifyFormat("A<int *> a;", PointerMiddle);
5570 verifyFormat("A<int **> a;", PointerMiddle);
5571 verifyFormat("A<int *, int *> a;", PointerMiddle);
5572 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005573 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5574 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005575 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005576
5577 // Member function reference qualifiers aren't binary operators.
5578 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005579 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005580 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005581 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005582 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005583 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005584}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005585
Daniel Jasperee6d6502013-07-17 20:25:02 +00005586TEST_F(FormatTest, UnderstandsAttributes) {
5587 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005588 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5589 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005590 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005591 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005592 verifyFormat("__attribute__((nodebug)) void\n"
5593 "foo() {}\n",
5594 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005595}
5596
Daniel Jasper10cd5812013-05-06 06:35:44 +00005597TEST_F(FormatTest, UnderstandsEllipsis) {
5598 verifyFormat("int printf(const char *fmt, ...);");
5599 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005600 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5601
5602 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005603 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005604 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005605}
5606
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005607TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005608 EXPECT_EQ("int *a;\n"
5609 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005610 "int *a;",
5611 format("int *a;\n"
5612 "int* a;\n"
5613 "int *a;",
5614 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005615 EXPECT_EQ("int* a;\n"
5616 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005617 "int* a;",
5618 format("int* a;\n"
5619 "int* a;\n"
5620 "int *a;",
5621 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005622 EXPECT_EQ("int *a;\n"
5623 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005624 "int *a;",
5625 format("int *a;\n"
5626 "int * a;\n"
5627 "int * a;",
5628 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005629 EXPECT_EQ("auto x = [] {\n"
5630 " int *a;\n"
5631 " int *a;\n"
5632 " int *a;\n"
5633 "};",
5634 format("auto x=[]{int *a;\n"
5635 "int * a;\n"
5636 "int * a;};",
5637 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005638}
5639
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005640TEST_F(FormatTest, UnderstandsRvalueReferences) {
5641 verifyFormat("int f(int &&a) {}");
5642 verifyFormat("int f(int a, char &&b) {}");
5643 verifyFormat("void f() { int &&a = b; }");
5644 verifyGoogleFormat("int f(int a, char&& b) {}");
5645 verifyGoogleFormat("void f() { int&& a = b; }");
5646
Daniel Jasper1eff9082013-05-27 16:36:33 +00005647 verifyIndependentOfContext("A<int &&> a;");
5648 verifyIndependentOfContext("A<int &&, int &&> a;");
5649 verifyGoogleFormat("A<int&&> a;");
5650 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005651
5652 // Not rvalue references:
5653 verifyFormat("template <bool B, bool C> class A {\n"
5654 " static_assert(B && C, \"Something is wrong\");\n"
5655 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005656 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5657 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005658 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005659}
5660
Manuel Klimekc1237a82013-01-23 14:08:21 +00005661TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5662 verifyFormat("void f() {\n"
5663 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005664 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005665 "}",
5666 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005667}
5668
Daniel Jasperef906a92013-01-13 08:01:36 +00005669TEST_F(FormatTest, FormatsCasts) {
5670 verifyFormat("Type *A = static_cast<Type *>(P);");
5671 verifyFormat("Type *A = (Type *)P;");
5672 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5673 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005674 verifyFormat("int a = (int)2.0f;");
5675 verifyFormat("x[(int32)y];");
5676 verifyFormat("x = (int32)y;");
5677 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5678 verifyFormat("int a = (int)*b;");
5679 verifyFormat("int a = (int)2.0f;");
5680 verifyFormat("int a = (int)~0;");
5681 verifyFormat("int a = (int)++a;");
5682 verifyFormat("int a = (int)sizeof(int);");
5683 verifyFormat("int a = (int)+2;");
5684 verifyFormat("my_int a = (my_int)2.0f;");
5685 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005686 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005687 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005688 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005689 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005690 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005691
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005692 verifyFormat("void f() { my_int a = (my_int)*b; }");
5693 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5694 verifyFormat("my_int a = (my_int)~0;");
5695 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005696 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005697 verifyFormat("my_int a = (my_int)1;");
5698 verifyFormat("my_int a = (my_int *)1;");
5699 verifyFormat("my_int a = (const my_int)-1;");
5700 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005701 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005702 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005703 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005704 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005705
5706 // FIXME: single value wrapped with paren will be treated as cast.
5707 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005708
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005709 verifyFormat("{ (void)F; }");
5710
Daniel Jasper998cabc2013-07-18 14:46:07 +00005711 // Don't break after a cast's
5712 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5713 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5714 " bbbbbbbbbbbbbbbbbbbbbb);");
5715
Daniel Jasperef906a92013-01-13 08:01:36 +00005716 // These are not casts.
5717 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005718 verifyFormat("f(foo)->b;");
5719 verifyFormat("f(foo).b;");
5720 verifyFormat("f(foo)(b);");
5721 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005722 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005723 verifyFormat("(*funptr)(foo)[4];");
5724 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005725 verifyFormat("void f(int *);");
5726 verifyFormat("void f(int *) = 0;");
5727 verifyFormat("void f(SmallVector<int>) {}");
5728 verifyFormat("void f(SmallVector<int>);");
5729 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005730 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005731 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005732 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005733 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5734 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005735 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005736
Daniel Jasperba0bda92013-02-23 08:07:18 +00005737 // These are not casts, but at some point were confused with casts.
5738 verifyFormat("virtual void foo(int *) override;");
5739 verifyFormat("virtual void foo(char &) const;");
5740 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005741 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005742 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005743 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005744 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005745
5746 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5747 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005748 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005749 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005750 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5751 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5752 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005753}
5754
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005755TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005756 verifyFormat("A<bool()> a;");
5757 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005758 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005759 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005760 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005761 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005762 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005763 verifyFormat("template <class CallbackClass>\n"
5764 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005765
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005766 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5767 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005768 verifyGoogleFormat(
5769 "template <class CallbackClass>\n"
5770 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005771
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005772 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005773 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005774 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005775 verifyFormat("some_var = function(*some_pointer_var)[0];");
5776 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005777 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005778 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005779 verifyFormat("std::function<\n"
5780 " LooooooooooongTemplatedType<\n"
5781 " SomeType>*(\n"
5782 " LooooooooooooooooongType type)>\n"
5783 " function;",
5784 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005785}
5786
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005787TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5788 verifyFormat("A (*foo_)[6];");
5789 verifyFormat("vector<int> (*foo_)[6];");
5790}
5791
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005792TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5793 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5794 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5795 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5796 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005797 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5798 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005799
5800 // Different ways of ()-initializiation.
5801 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5802 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5803 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5804 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5805 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5806 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005807 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5808 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005809
5810 // Lambdas should not confuse the variable declaration heuristic.
5811 verifyFormat("LooooooooooooooooongType\n"
5812 " variable(nullptr, [](A *a) {});",
5813 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005814}
5815
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005816TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005817 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005818 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005819 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005821 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005822 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005823 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5824 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005825 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5826 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005827 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5828 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005829 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5830 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005831 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5832 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005833 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5834 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5835 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5836 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005837 FormatStyle Indented = getLLVMStyle();
5838 Indented.IndentWrappedFunctionNames = true;
5839 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5840 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5841 Indented);
5842 verifyFormat(
5843 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5844 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5845 Indented);
5846 verifyFormat(
5847 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5848 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5849 Indented);
5850 verifyFormat(
5851 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5852 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5853 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005854
5855 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005856 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5857 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5858 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005859
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005860 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005861 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005862 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005863 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5864 " SourceLocation L, IdentifierIn *II,\n"
5865 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005866 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005867 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005868 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005869 " const SomeType<string, SomeOtherTemplateParameter>\n"
5870 " &ReallyReallyLongParameterName,\n"
5871 " const SomeType<string, SomeOtherTemplateParameter>\n"
5872 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005873 verifyFormat("template <typename A>\n"
5874 "SomeLoooooooooooooooooooooongType<\n"
5875 " typename some_namespace::SomeOtherType<A>::Type>\n"
5876 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005877
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005878 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005879 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5880 " aaaaaaaaaaaaaaaaaaaaaaa;");
5881 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005882 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5883 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005884 verifyGoogleFormat(
5885 "some_namespace::LongReturnType\n"
5886 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005887 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005888
5889 verifyGoogleFormat("template <typename T>\n"
5890 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005891 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005892 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5893 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005894
5895 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005896 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5897 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005898 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5899 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5900 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5901 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5902 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005905
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005906 verifyFormat("template <typename T> // Templates on own line.\n"
5907 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005908 "MyFunction(int a);",
5909 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005910}
5911
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005912TEST_F(FormatTest, FormatsArrays) {
5913 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5914 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005915 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5916 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005917 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5918 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005919 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5920 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5921 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5922 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5923 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5924 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5925 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5926 verifyFormat(
5927 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5928 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5929 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005930 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5931 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005932
5933 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005935 verifyFormat(
5936 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5937 " .aaaaaaa[0]\n"
5938 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005939 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005940
5941 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005942
5943 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5944 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005945}
5946
Daniel Jaspere9de2602012-12-06 09:56:08 +00005947TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5948 verifyFormat("(a)->b();");
5949 verifyFormat("--a;");
5950}
5951
Daniel Jasper8b529712012-12-04 13:02:32 +00005952TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005953 verifyFormat("#include <string>\n"
5954 "#include <a/b/c.h>\n"
5955 "#include \"a/b/string\"\n"
5956 "#include \"string.h\"\n"
5957 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005958 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005959 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005960 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005961 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005962 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005963 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5964 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005965 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5966 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005967
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005968 verifyFormat("#import <string>");
5969 verifyFormat("#import <a/b/c.h>");
5970 verifyFormat("#import \"a/b/string\"");
5971 verifyFormat("#import \"string.h\"");
5972 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005973 verifyFormat("#if __has_include(<strstream>)\n"
5974 "#include <strstream>\n"
5975 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005976
Daniel Jasper343643b2014-08-13 08:29:18 +00005977 verifyFormat("#define MY_IMPORT <a/b>");
5978
Nico Weber21088802017-02-10 19:36:52 +00005979 verifyFormat("#if __has_include(<a/b>)");
5980 verifyFormat("#if __has_include_next(<a/b>)");
5981 verifyFormat("#define F __has_include(<a/b>)");
5982 verifyFormat("#define F __has_include_next(<a/b>)");
5983
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005984 // Protocol buffer definition or missing "#".
5985 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5986 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005987
5988 FormatStyle Style = getLLVMStyle();
5989 Style.AlwaysBreakBeforeMultilineStrings = true;
5990 Style.ColumnLimit = 0;
5991 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005992
5993 // But 'import' might also be a regular C++ namespace.
5994 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005996}
5997
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005998//===----------------------------------------------------------------------===//
5999// Error recovery tests.
6000//===----------------------------------------------------------------------===//
6001
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006002TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006003 FormatStyle NoBinPacking = getLLVMStyle();
6004 NoBinPacking.BinPackParameters = false;
6005 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6006 " double *min_x,\n"
6007 " double *max_x,\n"
6008 " double *min_y,\n"
6009 " double *max_y,\n"
6010 " double *min_z,\n"
6011 " double *max_z, ) {}",
6012 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006013}
6014
Daniel Jasper83a54d22013-01-10 09:26:47 +00006015TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006016 verifyFormat("void f() { return; }\n42");
6017 verifyFormat("void f() {\n"
6018 " if (0)\n"
6019 " return;\n"
6020 "}\n"
6021 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006022 verifyFormat("void f() { return }\n42");
6023 verifyFormat("void f() {\n"
6024 " if (0)\n"
6025 " return\n"
6026 "}\n"
6027 "42");
6028}
6029
6030TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6031 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6032 EXPECT_EQ("void f() {\n"
6033 " if (a)\n"
6034 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006035 "}",
6036 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006037 EXPECT_EQ("namespace N {\n"
6038 "void f()\n"
6039 "}",
6040 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006041 EXPECT_EQ("namespace N {\n"
6042 "void f() {}\n"
6043 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006044 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006045 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006046}
6047
Daniel Jasper2df93312013-01-09 10:16:05 +00006048TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6049 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006050 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006051 " b;",
6052 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006053 verifyFormat("function(\n"
6054 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006055 " LoooooooooooongArgument);\n",
6056 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006057}
6058
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006059TEST_F(FormatTest, IncorrectAccessSpecifier) {
6060 verifyFormat("public:");
6061 verifyFormat("class A {\n"
6062 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006063 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006064 "};");
6065 verifyFormat("public\n"
6066 "int qwerty;");
6067 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006068 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006069 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006070 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006071 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006072 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006073}
Daniel Jasperf7935112012-12-03 18:12:45 +00006074
Daniel Jasper291f9362013-03-20 15:58:10 +00006075TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6076 verifyFormat("{");
6077 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006078 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006079}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006080
6081TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006082 verifyFormat("do {\n}");
6083 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006084 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006085 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006086 "wheeee(fun);");
6087 verifyFormat("do {\n"
6088 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006089 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006090}
6091
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006092TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006093 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006094 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006095 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006096 verifyFormat("while {\n foo;\n foo();\n}");
6097 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006098}
6099
Daniel Jasperc0880a92013-01-04 18:52:56 +00006100TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006101 verifyIncompleteFormat("namespace {\n"
6102 "class Foo { Foo (\n"
6103 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006104 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006105}
6106
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006107TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006108 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006109 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6110 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006111 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006112
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006113 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006114 " {\n"
6115 " breakme(\n"
6116 " qwe);\n"
6117 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006118 format("{\n"
6119 " {\n"
6120 " breakme(qwe);\n"
6121 "}\n",
6122 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006123}
6124
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006125TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006126 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006127 " avariable,\n"
6128 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006129 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006130}
6131
Manuel Klimek762dd182013-01-21 10:07:49 +00006132TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006133 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006134}
6135
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006136TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006137 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006138 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006139 " 1,\n"
6140 " 2,\n"
6141 " 3,\n"
6142 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006143 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006144 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6145 verifyFormat("f({1, 2});");
6146 verifyFormat("auto v = Foo{-1};");
6147 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6148 verifyFormat("Class::Class : member{1, 2, 3} {}");
6149 verifyFormat("new vector<int>{1, 2, 3};");
6150 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006151 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006152 verifyFormat("return {arg1, arg2};");
6153 verifyFormat("return {arg1, SomeType{parameter}};");
6154 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6155 verifyFormat("new T{arg1, arg2};");
6156 verifyFormat("f(MyMap[{composite, key}]);");
6157 verifyFormat("class Class {\n"
6158 " T member = {arg1, arg2};\n"
6159 "};");
6160 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006161 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6162 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006163 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6164 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006165
Daniel Jasper438059e2014-05-22 12:11:13 +00006166 verifyFormat("int foo(int i) { return fo1{}(i); }");
6167 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006168 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006169 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006170 verifyFormat("Node n{1, Node{1000}, //\n"
6171 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006172 verifyFormat("Aaaa aaaaaaa{\n"
6173 " {\n"
6174 " aaaa,\n"
6175 " },\n"
6176 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006177 verifyFormat("class C : public D {\n"
6178 " SomeClass SC{2};\n"
6179 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006180 verifyFormat("class C : public A {\n"
6181 " class D : public B {\n"
6182 " void f() { int i{2}; }\n"
6183 " };\n"
6184 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006185 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006186
Francois Ferrandd2130f52017-06-30 20:00:02 +00006187 // Binpacking only if there is no trailing comma
6188 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6189 " cccccccccc, dddddddddd};",
6190 getLLVMStyleWithColumns(50));
6191 verifyFormat("const Aaaaaa aaaaa = {\n"
6192 " aaaaaaaaaaa,\n"
6193 " bbbbbbbbbbb,\n"
6194 " ccccccccccc,\n"
6195 " ddddddddddd,\n"
6196 "};", getLLVMStyleWithColumns(50));
6197
Daniel Jaspere4ada022016-12-13 10:05:03 +00006198 // Cases where distinguising braced lists and blocks is hard.
6199 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6200 verifyFormat("void f() {\n"
6201 " return; // comment\n"
6202 "}\n"
6203 "SomeType t;");
6204 verifyFormat("void f() {\n"
6205 " if (a) {\n"
6206 " f();\n"
6207 " }\n"
6208 "}\n"
6209 "SomeType t;");
6210
Daniel Jasper08434342015-05-26 07:26:26 +00006211 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006212 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006213 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006214 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6215 " bbbbb,\n"
6216 " ccccc,\n"
6217 " ddddd,\n"
6218 " eeeee,\n"
6219 " ffffff,\n"
6220 " ggggg,\n"
6221 " hhhhhh,\n"
6222 " iiiiii,\n"
6223 " jjjjjj,\n"
6224 " kkkkkk};",
6225 NoBinPacking);
6226 verifyFormat("const Aaaaaa aaaaa = {\n"
6227 " aaaaa,\n"
6228 " bbbbb,\n"
6229 " ccccc,\n"
6230 " ddddd,\n"
6231 " eeeee,\n"
6232 " ffffff,\n"
6233 " ggggg,\n"
6234 " hhhhhh,\n"
6235 " iiiiii,\n"
6236 " jjjjjj,\n"
6237 " kkkkkk,\n"
6238 "};",
6239 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006240 verifyFormat(
6241 "const Aaaaaa aaaaa = {\n"
6242 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6243 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6244 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6245 "};",
6246 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006247
Chandler Carruthf8b72662014-03-02 12:37:31 +00006248 // FIXME: The alignment of these trailing comments might be bad. Then again,
6249 // this might be utterly useless in real code.
6250 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006251 " : some_value{ //\n"
6252 " aaaaaaa, //\n"
6253 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006254
Chandler Carruthf8b72662014-03-02 12:37:31 +00006255 // In braced lists, the first comment is always assumed to belong to the
6256 // first element. Thus, it can be moved to the next or previous line as
6257 // appropriate.
6258 EXPECT_EQ("function({// First element:\n"
6259 " 1,\n"
6260 " // Second element:\n"
6261 " 2});",
6262 format("function({\n"
6263 " // First element:\n"
6264 " 1,\n"
6265 " // Second element:\n"
6266 " 2});"));
6267 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6268 " // First element:\n"
6269 " 1,\n"
6270 " // Second element:\n"
6271 " 2};",
6272 format("std::vector<int> MyNumbers{// First element:\n"
6273 " 1,\n"
6274 " // Second element:\n"
6275 " 2};",
6276 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006277 // A trailing comma should still lead to an enforced line break and no
6278 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006279 EXPECT_EQ("vector<int> SomeVector = {\n"
6280 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006281 " 1,\n"
6282 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006283 "};",
6284 format("vector<int> SomeVector = { // aaa\n"
6285 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006286
Chandler Carruthf8b72662014-03-02 12:37:31 +00006287 FormatStyle ExtraSpaces = getLLVMStyle();
6288 ExtraSpaces.Cpp11BracedListStyle = false;
6289 ExtraSpaces.ColumnLimit = 75;
6290 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6291 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6292 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6293 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6294 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6295 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6296 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6297 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6298 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6299 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6300 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6301 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6302 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6303 verifyFormat("class Class {\n"
6304 " T member = { arg1, arg2 };\n"
6305 "};",
6306 ExtraSpaces);
6307 verifyFormat(
6308 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6309 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6310 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6311 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6312 ExtraSpaces);
6313 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006314 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006315 ExtraSpaces);
6316 verifyFormat(
6317 "someFunction(OtherParam,\n"
6318 " BracedList{ // comment 1 (Forcing interesting break)\n"
6319 " param1, param2,\n"
6320 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006321 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006322 ExtraSpaces);
6323 verifyFormat(
6324 "std::this_thread::sleep_for(\n"
6325 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6326 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006327 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006328 " aaaaaaa,\n"
6329 " aaaaaaaaaa,\n"
6330 " aaaaa,\n"
6331 " aaaaaaaaaaaaaaa,\n"
6332 " aaa,\n"
6333 " aaaaaaaaaa,\n"
6334 " a,\n"
6335 " aaaaaaaaaaaaaaaaaaaaa,\n"
6336 " aaaaaaaaaaaa,\n"
6337 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6338 " aaaaaaa,\n"
6339 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006340 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006341 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6342 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006343}
6344
Daniel Jasper33b909c2013-10-25 14:29:37 +00006345TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006346 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6347 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6348 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6349 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6350 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6351 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006352 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006353 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006354 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006355 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6356 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006357 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006358 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6359 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6360 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6361 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6362 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6363 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6364 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006365 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006366 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6367 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006368 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6369 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6370 " // Separating comment.\n"
6371 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6372 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6373 " // Leading comment\n"
6374 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6375 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006376 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6377 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006378 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006379 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6380 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006381 getLLVMStyleWithColumns(38));
6382 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006383 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6384 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006385 verifyFormat(
6386 "static unsigned SomeValues[10][3] = {\n"
6387 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6388 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6389 verifyFormat("static auto fields = new vector<string>{\n"
6390 " \"aaaaaaaaaaaaa\",\n"
6391 " \"aaaaaaaaaaaaa\",\n"
6392 " \"aaaaaaaaaaaa\",\n"
6393 " \"aaaaaaaaaaaaaa\",\n"
6394 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6395 " \"aaaaaaaaaaaa\",\n"
6396 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6397 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006398 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6399 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6400 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6401 " 3, cccccccccccccccccccccc};",
6402 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006403
6404 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006405 verifyFormat("vector<int> x = {\n"
6406 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6407 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006408 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006409 verifyFormat("vector<int> x = {\n"
6410 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006411 "};",
6412 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006413 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6414 " 1, 1, 1, 1,\n"
6415 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006416 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006417
Daniel Jasper60c27072015-05-13 08:16:00 +00006418 // Trailing comment in the first line.
6419 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6420 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6421 " 111111111, 222222222, 3333333333, 444444444, //\n"
6422 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006423 // Trailing comment in the last line.
6424 verifyFormat("int aaaaa[] = {\n"
6425 " 1, 2, 3, // comment\n"
6426 " 4, 5, 6 // comment\n"
6427 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006428
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006429 // With nested lists, we should either format one item per line or all nested
6430 // lists one on line.
6431 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006432 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6433 " {aaaaaaaaaaaaaaaaaaa},\n"
6434 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6435 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006436 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006437 verifyFormat(
6438 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006439 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6440 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6441 " {aaa, aaa},\n"
6442 " {aaa, aaa},\n"
6443 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6444 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6445 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006446
6447 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006448 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006449 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006450
6451 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006452
Daniel Jaspereb65e912015-12-21 18:31:15 +00006453 // No braced initializer here.
6454 verifyFormat("void f() {\n"
6455 " struct Dummy {};\n"
6456 " f(v);\n"
6457 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006458
6459 // Long lists should be formatted in columns even if they are nested.
6460 verifyFormat(
6461 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6462 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6463 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6464 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6465 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6466 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006467
6468 // Allow "single-column" layout even if that violates the column limit. There
6469 // isn't going to be a better way.
6470 verifyFormat("std::vector<int> a = {\n"
6471 " aaaaaaaa,\n"
6472 " aaaaaaaa,\n"
6473 " aaaaaaaa,\n"
6474 " aaaaaaaa,\n"
6475 " aaaaaaaaaa,\n"
6476 " aaaaaaaa,\n"
6477 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6478 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006479 verifyFormat("vector<int> aaaa = {\n"
6480 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6481 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6482 " aaaaaa.aaaaaaa,\n"
6483 " aaaaaa.aaaaaaa,\n"
6484 " aaaaaa.aaaaaaa,\n"
6485 " aaaaaa.aaaaaaa,\n"
6486 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006487
6488 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006489 verifyFormat("someFunction(Param, {List1, List2,\n"
6490 " List3});",
6491 getLLVMStyleWithColumns(35));
6492 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006493 " {List1, List2,\n"
6494 " List3});",
6495 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006496 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6497 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006498}
6499
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006500TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006501 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006502 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006503
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006504 verifyFormat("void f() { return 42; }");
6505 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006506 " return 42;\n"
6507 "}",
6508 DoNotMerge);
6509 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006510 " // Comment\n"
6511 "}");
6512 verifyFormat("{\n"
6513 "#error {\n"
6514 " int a;\n"
6515 "}");
6516 verifyFormat("{\n"
6517 " int a;\n"
6518 "#error {\n"
6519 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006520 verifyFormat("void f() {} // comment");
6521 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006522 verifyFormat("void f() {\n"
6523 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006524 DoNotMerge);
6525 verifyFormat("void f() {\n"
6526 " int a;\n"
6527 "} // comment",
6528 DoNotMerge);
6529 verifyFormat("void f() {\n"
6530 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006531 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006532
6533 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6534 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6535
6536 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6537 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006538 verifyFormat("class C {\n"
6539 " C()\n"
6540 " : iiiiiiii(nullptr),\n"
6541 " kkkkkkk(nullptr),\n"
6542 " mmmmmmm(nullptr),\n"
6543 " nnnnnnn(nullptr) {}\n"
6544 "};",
6545 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006546
6547 FormatStyle NoColumnLimit = getLLVMStyle();
6548 NoColumnLimit.ColumnLimit = 0;
6549 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6550 EXPECT_EQ("class C {\n"
6551 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006552 "};",
6553 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006554 EXPECT_EQ("A()\n"
6555 " : b(0) {\n"
6556 "}",
6557 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6558
6559 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006560 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6561 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006562 EXPECT_EQ("A()\n"
6563 " : b(0) {\n"
6564 "}",
6565 format("A():b(0){}", DoNotMergeNoColumnLimit));
6566 EXPECT_EQ("A()\n"
6567 " : b(0) {\n"
6568 "}",
6569 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006570
6571 verifyFormat("#define A \\\n"
6572 " void f() { \\\n"
6573 " int i; \\\n"
6574 " }",
6575 getLLVMStyleWithColumns(20));
6576 verifyFormat("#define A \\\n"
6577 " void f() { int i; }",
6578 getLLVMStyleWithColumns(21));
6579 verifyFormat("#define A \\\n"
6580 " void f() { \\\n"
6581 " int i; \\\n"
6582 " } \\\n"
6583 " int j;",
6584 getLLVMStyleWithColumns(22));
6585 verifyFormat("#define A \\\n"
6586 " void f() { int i; } \\\n"
6587 " int j;",
6588 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006589}
6590
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006591TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6592 FormatStyle MergeEmptyOnly = getLLVMStyle();
6593 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6594 verifyFormat("class C {\n"
6595 " int f() {}\n"
6596 "};",
6597 MergeEmptyOnly);
6598 verifyFormat("class C {\n"
6599 " int f() {\n"
6600 " return 42;\n"
6601 " }\n"
6602 "};",
6603 MergeEmptyOnly);
6604 verifyFormat("int f() {}", MergeEmptyOnly);
6605 verifyFormat("int f() {\n"
6606 " return 42;\n"
6607 "}",
6608 MergeEmptyOnly);
6609
6610 // Also verify behavior when BraceWrapping.AfterFunction = true
6611 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6612 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6613 verifyFormat("int f() {}", MergeEmptyOnly);
6614 verifyFormat("class C {\n"
6615 " int f() {}\n"
6616 "};",
6617 MergeEmptyOnly);
6618}
6619
Daniel Jasperd74cf402014-04-08 12:46:38 +00006620TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6621 FormatStyle MergeInlineOnly = getLLVMStyle();
6622 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6623 verifyFormat("class C {\n"
6624 " int f() { return 42; }\n"
6625 "};",
6626 MergeInlineOnly);
6627 verifyFormat("int f() {\n"
6628 " return 42;\n"
6629 "}",
6630 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006631
6632 // SFS_Inline implies SFS_Empty
6633 verifyFormat("class C {\n"
6634 " int f() {}\n"
6635 "};",
6636 MergeInlineOnly);
6637 verifyFormat("int f() {}", MergeInlineOnly);
6638
6639 // Also verify behavior when BraceWrapping.AfterFunction = true
6640 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6641 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6642 verifyFormat("class C {\n"
6643 " int f() { return 42; }\n"
6644 "};",
6645 MergeInlineOnly);
6646 verifyFormat("int f()\n"
6647 "{\n"
6648 " return 42;\n"
6649 "}",
6650 MergeInlineOnly);
6651
6652 // SFS_Inline implies SFS_Empty
6653 verifyFormat("int f() {}", MergeInlineOnly);
6654 verifyFormat("class C {\n"
6655 " int f() {}\n"
6656 "};",
6657 MergeInlineOnly);
6658}
6659
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00006660TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6661 FormatStyle MergeInlineOnly = getLLVMStyle();
6662 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6663 FormatStyle::SFS_InlineOnly;
6664 verifyFormat("class C {\n"
6665 " int f() { return 42; }\n"
6666 "};",
6667 MergeInlineOnly);
6668 verifyFormat("int f() {\n"
6669 " return 42;\n"
6670 "}",
6671 MergeInlineOnly);
6672
6673 // SFS_InlineOnly does not imply SFS_Empty
6674 verifyFormat("class C {\n"
6675 " int f() {}\n"
6676 "};",
6677 MergeInlineOnly);
6678 verifyFormat("int f() {\n"
6679 "}",
6680 MergeInlineOnly);
6681
6682 // Also verify behavior when BraceWrapping.AfterFunction = true
6683 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6684 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6685 verifyFormat("class C {\n"
6686 " int f() { return 42; }\n"
6687 "};",
6688 MergeInlineOnly);
6689 verifyFormat("int f()\n"
6690 "{\n"
6691 " return 42;\n"
6692 "}",
6693 MergeInlineOnly);
6694
6695 // SFS_InlineOnly does not imply SFS_Empty
6696 verifyFormat("int f()\n"
6697 "{\n"
6698 "}",
6699 MergeInlineOnly);
6700 verifyFormat("class C {\n"
6701 " int f() {}\n"
6702 "};",
6703 MergeInlineOnly);
6704}
6705
Francois Ferrandad722562017-06-30 20:25:55 +00006706TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006707 FormatStyle Style = getLLVMStyle();
6708 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6709 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6710 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00006711 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006712 Style.ColumnLimit = 40;
6713
6714 verifyFormat("int f()\n"
6715 "{}",
6716 Style);
6717 verifyFormat("int f()\n"
6718 "{\n"
6719 " return 42;\n"
6720 "}",
6721 Style);
6722 verifyFormat("int f()\n"
6723 "{\n"
6724 " // some comment\n"
6725 "}",
6726 Style);
6727
6728 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6729 verifyFormat("int f() {}", Style);
6730 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6731 "{}",
6732 Style);
6733 verifyFormat("int f()\n"
6734 "{\n"
6735 " return 0;\n"
6736 "}",
6737 Style);
6738
6739 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6740 verifyFormat("class Foo {\n"
6741 " int f() {}\n"
6742 "};\n",
6743 Style);
6744 verifyFormat("class Foo {\n"
6745 " int f() { return 0; }\n"
6746 "};\n",
6747 Style);
6748 verifyFormat("class Foo {\n"
6749 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6750 " {}\n"
6751 "};\n",
6752 Style);
6753 verifyFormat("class Foo {\n"
6754 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6755 " {\n"
6756 " return 0;\n"
6757 " }\n"
6758 "};\n",
6759 Style);
6760
6761 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6762 verifyFormat("int f() {}", Style);
6763 verifyFormat("int f() { return 0; }", Style);
6764 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6765 "{}",
6766 Style);
6767 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6768 "{\n"
6769 " return 0;\n"
6770 "}",
6771 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006772}
6773
Francois Ferrandad722562017-06-30 20:25:55 +00006774TEST_F(FormatTest, SplitEmptyClass) {
6775 FormatStyle Style = getLLVMStyle();
6776 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6777 Style.BraceWrapping.AfterClass = true;
6778 Style.BraceWrapping.SplitEmptyRecord = false;
6779
6780 verifyFormat("class Foo\n"
6781 "{};",
6782 Style);
6783 verifyFormat("/* something */ class Foo\n"
6784 "{};",
6785 Style);
6786 verifyFormat("template <typename X> class Foo\n"
6787 "{};",
6788 Style);
6789 verifyFormat("class Foo\n"
6790 "{\n"
6791 " Foo();\n"
6792 "};",
6793 Style);
6794 verifyFormat("typedef class Foo\n"
6795 "{\n"
6796 "} Foo_t;",
6797 Style);
6798}
6799
6800TEST_F(FormatTest, SplitEmptyStruct) {
6801 FormatStyle Style = getLLVMStyle();
6802 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6803 Style.BraceWrapping.AfterStruct = true;
6804 Style.BraceWrapping.SplitEmptyRecord = false;
6805
6806 verifyFormat("struct Foo\n"
6807 "{};",
6808 Style);
6809 verifyFormat("/* something */ struct Foo\n"
6810 "{};",
6811 Style);
6812 verifyFormat("template <typename X> struct Foo\n"
6813 "{};",
6814 Style);
6815 verifyFormat("struct Foo\n"
6816 "{\n"
6817 " Foo();\n"
6818 "};",
6819 Style);
6820 verifyFormat("typedef struct Foo\n"
6821 "{\n"
6822 "} Foo_t;",
6823 Style);
6824 //typedef struct Bar {} Bar_t;
6825}
6826
6827TEST_F(FormatTest, SplitEmptyUnion) {
6828 FormatStyle Style = getLLVMStyle();
6829 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6830 Style.BraceWrapping.AfterUnion = true;
6831 Style.BraceWrapping.SplitEmptyRecord = false;
6832
6833 verifyFormat("union Foo\n"
6834 "{};",
6835 Style);
6836 verifyFormat("/* something */ union Foo\n"
6837 "{};",
6838 Style);
6839 verifyFormat("union Foo\n"
6840 "{\n"
6841 " A,\n"
6842 "};",
6843 Style);
6844 verifyFormat("typedef union Foo\n"
6845 "{\n"
6846 "} Foo_t;",
6847 Style);
6848}
6849
6850TEST_F(FormatTest, SplitEmptyNamespace) {
6851 FormatStyle Style = getLLVMStyle();
6852 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6853 Style.BraceWrapping.AfterNamespace = true;
6854 Style.BraceWrapping.SplitEmptyNamespace = false;
6855
6856 verifyFormat("namespace Foo\n"
6857 "{};",
6858 Style);
6859 verifyFormat("/* something */ namespace Foo\n"
6860 "{};",
6861 Style);
6862 verifyFormat("inline namespace Foo\n"
6863 "{};",
6864 Style);
6865 verifyFormat("namespace Foo\n"
6866 "{\n"
6867 "void Bar();\n"
6868 "};",
6869 Style);
6870}
6871
6872TEST_F(FormatTest, NeverMergeShortRecords) {
6873 FormatStyle Style = getLLVMStyle();
6874
6875 verifyFormat("class Foo {\n"
6876 " Foo();\n"
6877 "};",
6878 Style);
6879 verifyFormat("typedef class Foo {\n"
6880 " Foo();\n"
6881 "} Foo_t;",
6882 Style);
6883 verifyFormat("struct Foo {\n"
6884 " Foo();\n"
6885 "};",
6886 Style);
6887 verifyFormat("typedef struct Foo {\n"
6888 " Foo();\n"
6889 "} Foo_t;",
6890 Style);
6891 verifyFormat("union Foo {\n"
6892 " A,\n"
6893 "};",
6894 Style);
6895 verifyFormat("typedef union Foo {\n"
6896 " A,\n"
6897 "} Foo_t;",
6898 Style);
6899 verifyFormat("namespace Foo {\n"
6900 "void Bar();\n"
6901 "};",
6902 Style);
6903
6904 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6905 Style.BraceWrapping.AfterClass = true;
6906 Style.BraceWrapping.AfterStruct = true;
6907 Style.BraceWrapping.AfterUnion = true;
6908 Style.BraceWrapping.AfterNamespace = true;
6909 verifyFormat("class Foo\n"
6910 "{\n"
6911 " Foo();\n"
6912 "};",
6913 Style);
6914 verifyFormat("typedef class Foo\n"
6915 "{\n"
6916 " Foo();\n"
6917 "} Foo_t;",
6918 Style);
6919 verifyFormat("struct Foo\n"
6920 "{\n"
6921 " Foo();\n"
6922 "};",
6923 Style);
6924 verifyFormat("typedef struct Foo\n"
6925 "{\n"
6926 " Foo();\n"
6927 "} Foo_t;",
6928 Style);
6929 verifyFormat("union Foo\n"
6930 "{\n"
6931 " A,\n"
6932 "};",
6933 Style);
6934 verifyFormat("typedef union Foo\n"
6935 "{\n"
6936 " A,\n"
6937 "} Foo_t;",
6938 Style);
6939 verifyFormat("namespace Foo\n"
6940 "{\n"
6941 "void Bar();\n"
6942 "};",
6943 Style);
6944}
6945
Manuel Klimeke01bab52013-01-15 13:38:33 +00006946TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6947 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006948 verifyFormat("struct foo a = {bar};\nint n;");
6949 verifyFormat("class foo a = {bar};\nint n;");
6950 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006951
6952 // Elaborate types inside function definitions.
6953 verifyFormat("struct foo f() {}\nint n;");
6954 verifyFormat("class foo f() {}\nint n;");
6955 verifyFormat("union foo f() {}\nint n;");
6956
6957 // Templates.
6958 verifyFormat("template <class X> void f() {}\nint n;");
6959 verifyFormat("template <struct X> void f() {}\nint n;");
6960 verifyFormat("template <union X> void f() {}\nint n;");
6961
6962 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006963 verifyFormat("struct {\n} n;");
6964 verifyFormat(
6965 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006966 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006967 verifyFormat("class MACRO Z {\n} n;");
6968 verifyFormat("class MACRO(X) Z {\n} n;");
6969 verifyFormat("class __attribute__(X) Z {\n} n;");
6970 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006971 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006972 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006973 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6974 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006975
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006976 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006977 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006978
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006979 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006980 verifyFormat(
6981 "template <typename F>\n"
6982 "Matcher(const Matcher<F> &Other,\n"
6983 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6984 " !is_same<F, T>::value>::type * = 0)\n"
6985 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6986
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006987 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006988 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006989 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006990
6991 // FIXME:
6992 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006993 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006994
Manuel Klimeke01bab52013-01-15 13:38:33 +00006995 // Elaborate types where incorrectly parsing the structural element would
6996 // break the indent.
6997 verifyFormat("if (true)\n"
6998 " class X x;\n"
6999 "else\n"
7000 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007001
7002 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007003 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007004}
7005
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007006TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007007 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7008 format("#error Leave all white!!!!! space* alone!\n"));
7009 EXPECT_EQ(
7010 "#warning Leave all white!!!!! space* alone!\n",
7011 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007012 EXPECT_EQ("#error 1", format(" # error 1"));
7013 EXPECT_EQ("#warning 1", format(" # warning 1"));
7014}
7015
Daniel Jasper4431aa92013-04-23 13:54:04 +00007016TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007017 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007018 verifyFormat("#if (AAAA && BBBB)");
7019 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007020 // FIXME: Come up with a better indentation for #elif.
7021 verifyFormat(
7022 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7023 " defined(BBBBBBBB)\n"
7024 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7025 " defined(BBBBBBBB)\n"
7026 "#endif",
7027 getLLVMStyleWithColumns(65));
7028}
7029
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007030TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7031 FormatStyle AllowsMergedIf = getGoogleStyle();
7032 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7033 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7034 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007035 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7036 EXPECT_EQ("if (true) return 42;",
7037 format("if (true)\nreturn 42;", AllowsMergedIf));
7038 FormatStyle ShortMergedIf = AllowsMergedIf;
7039 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007040 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007041 " if (true) return 42;",
7042 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007043 verifyFormat("#define A \\\n"
7044 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007045 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007046 "#define B",
7047 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007048 verifyFormat("#define A \\\n"
7049 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007050 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007051 "g();",
7052 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007053 verifyFormat("{\n"
7054 "#ifdef A\n"
7055 " // Comment\n"
7056 " if (true) continue;\n"
7057 "#endif\n"
7058 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007059 " if (true) continue;\n"
7060 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007061 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007062 ShortMergedIf.ColumnLimit = 33;
7063 verifyFormat("#define A \\\n"
7064 " if constexpr (true) return 42;",
7065 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007066 ShortMergedIf.ColumnLimit = 29;
7067 verifyFormat("#define A \\\n"
7068 " if (aaaaaaaaaa) return 1; \\\n"
7069 " return 2;",
7070 ShortMergedIf);
7071 ShortMergedIf.ColumnLimit = 28;
7072 verifyFormat("#define A \\\n"
7073 " if (aaaaaaaaaa) \\\n"
7074 " return 1; \\\n"
7075 " return 2;",
7076 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007077 verifyFormat("#define A \\\n"
7078 " if constexpr (aaaaaaa) \\\n"
7079 " return 1; \\\n"
7080 " return 2;",
7081 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007082}
7083
Manuel Klimekd33516e2013-01-23 10:09:28 +00007084TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007085 verifyFormat("void f(int *a);");
7086 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007087 verifyFormat("class A {\n void f(int *a);\n};");
7088 verifyFormat("class A {\n int *a;\n};");
7089 verifyFormat("namespace a {\n"
7090 "namespace b {\n"
7091 "class A {\n"
7092 " void f() {}\n"
7093 " int *a;\n"
7094 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007095 "} // namespace b\n"
7096 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007097}
7098
Manuel Klimekd33516e2013-01-23 10:09:28 +00007099TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7100 verifyFormat("while");
7101 verifyFormat("operator");
7102}
7103
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007104TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7105 // This code would be painfully slow to format if we didn't skip it.
7106 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
7107 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7108 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7109 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7110 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7111 "A(1, 1)\n"
7112 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7113 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7114 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7115 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7116 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7117 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7118 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7119 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7120 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7121 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7122 // Deeply nested part is untouched, rest is formatted.
7123 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7124 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007125 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007126}
7127
Nico Weber7e6a7a12013-01-08 17:56:31 +00007128//===----------------------------------------------------------------------===//
7129// Objective-C tests.
7130//===----------------------------------------------------------------------===//
7131
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007132TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7133 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7134 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7135 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007136 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007137 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7138 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7139 format("-(NSInteger)Method3:(id)anObject;"));
7140 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7141 format("-(NSInteger)Method4:(id)anObject;"));
7142 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7143 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7144 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7145 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007146 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7147 "forAllCells:(BOOL)flag;",
7148 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7149 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007150
7151 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007152 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7153 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007154 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7155 " inRange:(NSRange)range\n"
7156 " outRange:(NSRange)out_range\n"
7157 " outRange1:(NSRange)out_range1\n"
7158 " outRange2:(NSRange)out_range2\n"
7159 " outRange3:(NSRange)out_range3\n"
7160 " outRange4:(NSRange)out_range4\n"
7161 " outRange5:(NSRange)out_range5\n"
7162 " outRange6:(NSRange)out_range6\n"
7163 " outRange7:(NSRange)out_range7\n"
7164 " outRange8:(NSRange)out_range8\n"
7165 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007166
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007167 // When the function name has to be wrapped.
7168 FormatStyle Style = getLLVMStyle();
7169 Style.IndentWrappedFunctionNames = false;
7170 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7171 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7172 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7173 "}",
7174 Style);
7175 Style.IndentWrappedFunctionNames = true;
7176 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7177 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7178 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7179 "}",
7180 Style);
7181
Nico Weberd6f962f2013-01-10 20:18:33 +00007182 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007183 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007184 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7185 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007186 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007187
Daniel Jasper37194282013-05-28 08:33:00 +00007188 verifyFormat("- (int (*)())foo:(int (*)())f;");
7189 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007190
7191 // If there's no return type (very rare in practice!), LLVM and Google style
7192 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007193 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007194 verifyFormat("- foo:(int)f;");
7195 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007196}
7197
Nico Weber0588b502013-02-07 00:19:29 +00007198
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007199TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007200 EXPECT_EQ("\"some text \"\n"
7201 "\"other\";",
7202 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007203 EXPECT_EQ("\"some text \"\n"
7204 "\"other\";",
7205 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007206 EXPECT_EQ(
7207 "#define A \\\n"
7208 " \"some \" \\\n"
7209 " \"text \" \\\n"
7210 " \"other\";",
7211 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7212 EXPECT_EQ(
7213 "#define A \\\n"
7214 " \"so \" \\\n"
7215 " \"text \" \\\n"
7216 " \"other\";",
7217 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7218
7219 EXPECT_EQ("\"some text\"",
7220 format("\"some text\"", getLLVMStyleWithColumns(1)));
7221 EXPECT_EQ("\"some text\"",
7222 format("\"some text\"", getLLVMStyleWithColumns(11)));
7223 EXPECT_EQ("\"some \"\n"
7224 "\"text\"",
7225 format("\"some text\"", getLLVMStyleWithColumns(10)));
7226 EXPECT_EQ("\"some \"\n"
7227 "\"text\"",
7228 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007229 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007230 "\" tex\"\n"
7231 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007232 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007233 EXPECT_EQ("\"some\"\n"
7234 "\" tex\"\n"
7235 "\" and\"",
7236 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7237 EXPECT_EQ("\"some\"\n"
7238 "\"/tex\"\n"
7239 "\"/and\"",
7240 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007241
7242 EXPECT_EQ("variable =\n"
7243 " \"long string \"\n"
7244 " \"literal\";",
7245 format("variable = \"long string literal\";",
7246 getLLVMStyleWithColumns(20)));
7247
7248 EXPECT_EQ("variable = f(\n"
7249 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007250 " \"literal\",\n"
7251 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007252 " loooooooooooooooooooong);",
7253 format("variable = f(\"long string literal\", short, "
7254 "loooooooooooooooooooong);",
7255 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007256
Daniel Jaspera44991332015-04-29 13:06:49 +00007257 EXPECT_EQ(
7258 "f(g(\"long string \"\n"
7259 " \"literal\"),\n"
7260 " b);",
7261 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007262 EXPECT_EQ("f(g(\"long string \"\n"
7263 " \"literal\",\n"
7264 " a),\n"
7265 " b);",
7266 format("f(g(\"long string literal\", a), b);",
7267 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007268 EXPECT_EQ(
7269 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007270 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007271 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7272 EXPECT_EQ("f(\"one two three four five six \"\n"
7273 " \"seven\".split(\n"
7274 " really_looooong_variable));",
7275 format("f(\"one two three four five six seven\"."
7276 "split(really_looooong_variable));",
7277 getLLVMStyleWithColumns(33)));
7278
7279 EXPECT_EQ("f(\"some \"\n"
7280 " \"text\",\n"
7281 " other);",
7282 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007283
7284 // Only break as a last resort.
7285 verifyFormat(
7286 "aaaaaaaaaaaaaaaaaaaa(\n"
7287 " aaaaaaaaaaaaaaaaaaaa,\n"
7288 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007289
Daniel Jaspera44991332015-04-29 13:06:49 +00007290 EXPECT_EQ("\"splitmea\"\n"
7291 "\"trandomp\"\n"
7292 "\"oint\"",
7293 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007294
Daniel Jaspera44991332015-04-29 13:06:49 +00007295 EXPECT_EQ("\"split/\"\n"
7296 "\"pathat/\"\n"
7297 "\"slashes\"",
7298 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007299
Daniel Jaspera44991332015-04-29 13:06:49 +00007300 EXPECT_EQ("\"split/\"\n"
7301 "\"pathat/\"\n"
7302 "\"slashes\"",
7303 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007304 EXPECT_EQ("\"split at \"\n"
7305 "\"spaces/at/\"\n"
7306 "\"slashes.at.any$\"\n"
7307 "\"non-alphanumeric%\"\n"
7308 "\"1111111111characte\"\n"
7309 "\"rs\"",
7310 format("\"split at "
7311 "spaces/at/"
7312 "slashes.at."
7313 "any$non-"
7314 "alphanumeric%"
7315 "1111111111characte"
7316 "rs\"",
7317 getLLVMStyleWithColumns(20)));
7318
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007319 // Verify that splitting the strings understands
7320 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007321 EXPECT_EQ(
7322 "aaaaaaaaaaaa(\n"
7323 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7324 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7325 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7326 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7327 "aaaaaaaaaaaaaaaaaaaaaa\");",
7328 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007329 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7330 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7331 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7332 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7333 "aaaaaaaaaaaaaaaaaaaaaa\";",
7334 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007335 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7336 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7337 format("llvm::outs() << "
7338 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7339 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007340 EXPECT_EQ("ffff(\n"
7341 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7342 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7343 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7344 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7345 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007346
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007347 FormatStyle Style = getLLVMStyleWithColumns(12);
7348 Style.BreakStringLiterals = false;
7349 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7350
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007351 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007352 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007353 EXPECT_EQ("#define A \\\n"
7354 " \"some \" \\\n"
7355 " \"text \" \\\n"
7356 " \"other\";",
7357 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007358}
7359
Manuel Klimek9e321992015-07-28 15:50:24 +00007360TEST_F(FormatTest, FullyRemoveEmptyLines) {
7361 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7362 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7363 EXPECT_EQ("int i = a(b());",
7364 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7365}
7366
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007367TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7368 EXPECT_EQ(
7369 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7370 "(\n"
7371 " \"x\t\");",
7372 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7373 "aaaaaaa("
7374 "\"x\t\");"));
7375}
7376
Daniel Jasper174b0122014-01-09 14:18:12 +00007377TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007378 EXPECT_EQ(
7379 "u8\"utf8 string \"\n"
7380 "u8\"literal\";",
7381 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7382 EXPECT_EQ(
7383 "u\"utf16 string \"\n"
7384 "u\"literal\";",
7385 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7386 EXPECT_EQ(
7387 "U\"utf32 string \"\n"
7388 "U\"literal\";",
7389 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7390 EXPECT_EQ("L\"wide string \"\n"
7391 "L\"literal\";",
7392 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007393 EXPECT_EQ("@\"NSString \"\n"
7394 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007395 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007396 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007397
7398 // This input makes clang-format try to split the incomplete unicode escape
7399 // sequence, which used to lead to a crasher.
7400 verifyNoCrash(
7401 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7402 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007403}
7404
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007405TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7406 FormatStyle Style = getGoogleStyleWithColumns(15);
7407 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7408 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7409 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7410 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7411 EXPECT_EQ("u8R\"x(raw literal)x\";",
7412 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007413}
7414
7415TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7416 FormatStyle Style = getLLVMStyleWithColumns(20);
7417 EXPECT_EQ(
7418 "_T(\"aaaaaaaaaaaaaa\")\n"
7419 "_T(\"aaaaaaaaaaaaaa\")\n"
7420 "_T(\"aaaaaaaaaaaa\")",
7421 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007422 EXPECT_EQ("f(x,\n"
7423 " _T(\"aaaaaaaaaaaa\")\n"
7424 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007425 " z);",
7426 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7427
7428 // FIXME: Handle embedded spaces in one iteration.
7429 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7430 // "_T(\"aaaaaaaaaaaaa\")\n"
7431 // "_T(\"aaaaaaaaaaaaa\")\n"
7432 // "_T(\"a\")",
7433 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7434 // getLLVMStyleWithColumns(20)));
7435 EXPECT_EQ(
7436 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7437 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007438 EXPECT_EQ("f(\n"
7439 "#if !TEST\n"
7440 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7441 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007442 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007443 format("f(\n"
7444 "#if !TEST\n"
7445 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7446 "#endif\n"
7447 ");"));
7448 EXPECT_EQ("f(\n"
7449 "\n"
7450 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7451 format("f(\n"
7452 "\n"
7453 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007454}
7455
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007456TEST_F(FormatTest, BreaksStringLiteralOperands) {
7457 // In a function call with two operands, the second can be broken with no line
7458 // break before it.
7459 EXPECT_EQ("func(a, \"long long \"\n"
7460 " \"long long\");",
7461 format("func(a, \"long long long long\");",
7462 getLLVMStyleWithColumns(24)));
7463 // In a function call with three operands, the second must be broken with a
7464 // line break before it.
7465 EXPECT_EQ("func(a,\n"
7466 " \"long long long \"\n"
7467 " \"long\",\n"
7468 " c);",
7469 format("func(a, \"long long long long\", c);",
7470 getLLVMStyleWithColumns(24)));
7471 // In a function call with three operands, the third must be broken with a
7472 // line break before it.
7473 EXPECT_EQ("func(a, b,\n"
7474 " \"long long long \"\n"
7475 " \"long\");",
7476 format("func(a, b, \"long long long long\");",
7477 getLLVMStyleWithColumns(24)));
7478 // In a function call with three operands, both the second and the third must
7479 // be broken with a line break before them.
7480 EXPECT_EQ("func(a,\n"
7481 " \"long long long \"\n"
7482 " \"long\",\n"
7483 " \"long long long \"\n"
7484 " \"long\");",
7485 format("func(a, \"long long long long\", \"long long long long\");",
7486 getLLVMStyleWithColumns(24)));
7487 // In a chain of << with two operands, the second can be broken with no line
7488 // break before it.
7489 EXPECT_EQ("a << \"line line \"\n"
7490 " \"line\";",
7491 format("a << \"line line line\";",
7492 getLLVMStyleWithColumns(20)));
7493 // In a chain of << with three operands, the second can be broken with no line
7494 // break before it.
7495 EXPECT_EQ("abcde << \"line \"\n"
7496 " \"line line\"\n"
7497 " << c;",
7498 format("abcde << \"line line line\" << c;",
7499 getLLVMStyleWithColumns(20)));
7500 // In a chain of << with three operands, the third must be broken with a line
7501 // break before it.
7502 EXPECT_EQ("a << b\n"
7503 " << \"line line \"\n"
7504 " \"line\";",
7505 format("a << b << \"line line line\";",
7506 getLLVMStyleWithColumns(20)));
7507 // In a chain of << with three operands, the second can be broken with no line
7508 // break before it and the third must be broken with a line break before it.
7509 EXPECT_EQ("abcd << \"line line \"\n"
7510 " \"line\"\n"
7511 " << \"line line \"\n"
7512 " \"line\";",
7513 format("abcd << \"line line line\" << \"line line line\";",
7514 getLLVMStyleWithColumns(20)));
7515 // In a chain of binary operators with two operands, the second can be broken
7516 // with no line break before it.
7517 EXPECT_EQ("abcd + \"line line \"\n"
7518 " \"line line\";",
7519 format("abcd + \"line line line line\";",
7520 getLLVMStyleWithColumns(20)));
7521 // In a chain of binary operators with three operands, the second must be
7522 // broken with a line break before it.
7523 EXPECT_EQ("abcd +\n"
7524 " \"line line \"\n"
7525 " \"line line\" +\n"
7526 " e;",
7527 format("abcd + \"line line line line\" + e;",
7528 getLLVMStyleWithColumns(20)));
7529 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7530 // the first must be broken with a line break before it.
7531 FormatStyle Style = getLLVMStyleWithColumns(25);
7532 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7533 EXPECT_EQ("someFunction(\n"
7534 " \"long long long \"\n"
7535 " \"long\",\n"
7536 " a);",
7537 format("someFunction(\"long long long long\", a);", Style));
7538}
7539
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007540TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007541 EXPECT_EQ(
7542 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7545 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7548}
7549
7550TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7551 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007552 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007553 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7554 "multiline raw string literal xxxxxxxxxxxxxx\n"
7555 ")x\",\n"
7556 " a),\n"
7557 " b);",
7558 format("fffffffffff(g(R\"x(\n"
7559 "multiline raw string literal xxxxxxxxxxxxxx\n"
7560 ")x\", a), b);",
7561 getGoogleStyleWithColumns(20)));
7562 EXPECT_EQ("fffffffffff(\n"
7563 " g(R\"x(qqq\n"
7564 "multiline raw string literal xxxxxxxxxxxxxx\n"
7565 ")x\",\n"
7566 " a),\n"
7567 " b);",
7568 format("fffffffffff(g(R\"x(qqq\n"
7569 "multiline raw string literal xxxxxxxxxxxxxx\n"
7570 ")x\", a), b);",
7571 getGoogleStyleWithColumns(20)));
7572
7573 EXPECT_EQ("fffffffffff(R\"x(\n"
7574 "multiline raw string literal xxxxxxxxxxxxxx\n"
7575 ")x\");",
7576 format("fffffffffff(R\"x(\n"
7577 "multiline raw string literal xxxxxxxxxxxxxx\n"
7578 ")x\");",
7579 getGoogleStyleWithColumns(20)));
7580 EXPECT_EQ("fffffffffff(R\"x(\n"
7581 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007582 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007583 format("fffffffffff(R\"x(\n"
7584 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007585 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007586 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007587 EXPECT_EQ("fffffffffff(\n"
7588 " R\"x(\n"
7589 "multiline raw string literal xxxxxxxxxxxxxx\n"
7590 ")x\" +\n"
7591 " bbbbbb);",
7592 format("fffffffffff(\n"
7593 " R\"x(\n"
7594 "multiline raw string literal xxxxxxxxxxxxxx\n"
7595 ")x\" + bbbbbb);",
7596 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007597}
7598
Alexander Kornienkobe633902013-06-14 11:46:10 +00007599TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007600 verifyFormat("string a = \"unterminated;");
7601 EXPECT_EQ("function(\"unterminated,\n"
7602 " OtherParameter);",
7603 format("function( \"unterminated,\n"
7604 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007605}
7606
7607TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007608 FormatStyle Style = getLLVMStyle();
7609 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007610 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007611 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007612}
7613
Daniel Jaspera44991332015-04-29 13:06:49 +00007614TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007615
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007616TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7617 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7618 " \"ddeeefff\");",
7619 format("someFunction(\"aaabbbcccdddeeefff\");",
7620 getLLVMStyleWithColumns(25)));
7621 EXPECT_EQ("someFunction1234567890(\n"
7622 " \"aaabbbcccdddeeefff\");",
7623 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7624 getLLVMStyleWithColumns(26)));
7625 EXPECT_EQ("someFunction1234567890(\n"
7626 " \"aaabbbcccdddeeeff\"\n"
7627 " \"f\");",
7628 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7629 getLLVMStyleWithColumns(25)));
7630 EXPECT_EQ("someFunction1234567890(\n"
7631 " \"aaabbbcccdddeeeff\"\n"
7632 " \"f\");",
7633 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7634 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007635 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7636 " \"ddde \"\n"
7637 " \"efff\");",
7638 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007639 getLLVMStyleWithColumns(25)));
7640 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7641 " \"ddeeefff\");",
7642 format("someFunction(\"aaabbbccc ddeeefff\");",
7643 getLLVMStyleWithColumns(25)));
7644 EXPECT_EQ("someFunction1234567890(\n"
7645 " \"aaabb \"\n"
7646 " \"cccdddeeefff\");",
7647 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7648 getLLVMStyleWithColumns(25)));
7649 EXPECT_EQ("#define A \\\n"
7650 " string s = \\\n"
7651 " \"123456789\" \\\n"
7652 " \"0\"; \\\n"
7653 " int i;",
7654 format("#define A string s = \"1234567890\"; int i;",
7655 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007656 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7657 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7658 " \"dddeeeff\"\n"
7659 " \"f\");",
7660 format("someFunction(\"aaabbbcc dddeeefff\");",
7661 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007662}
7663
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007664TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007665 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7666 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007667 EXPECT_EQ("\"test\"\n"
7668 "\"\\n\"",
7669 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7670 EXPECT_EQ("\"tes\\\\\"\n"
7671 "\"n\"",
7672 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7673 EXPECT_EQ("\"\\\\\\\\\"\n"
7674 "\"\\n\"",
7675 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007676 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007677 EXPECT_EQ("\"\\uff01\"\n"
7678 "\"test\"",
7679 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7680 EXPECT_EQ("\"\\Uff01ff02\"",
7681 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7682 EXPECT_EQ("\"\\x000000000001\"\n"
7683 "\"next\"",
7684 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7685 EXPECT_EQ("\"\\x000000000001next\"",
7686 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7687 EXPECT_EQ("\"\\x000000000001\"",
7688 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7689 EXPECT_EQ("\"test\"\n"
7690 "\"\\000000\"\n"
7691 "\"000001\"",
7692 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7693 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007694 "\"00000000\"\n"
7695 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007696 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007697}
7698
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007699TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7700 verifyFormat("void f() {\n"
7701 " return g() {}\n"
7702 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007703 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007704 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007705 "}");
7706}
7707
Manuel Klimek421147e2014-01-24 09:25:23 +00007708TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7709 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007710 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007711}
7712
Manuel Klimek13b97d82013-05-13 08:42:42 +00007713TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7714 verifyFormat("class X {\n"
7715 " void f() {\n"
7716 " }\n"
7717 "};",
7718 getLLVMStyleWithColumns(12));
7719}
7720
7721TEST_F(FormatTest, ConfigurableIndentWidth) {
7722 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7723 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007724 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007725 verifyFormat("void f() {\n"
7726 " someFunction();\n"
7727 " if (true) {\n"
7728 " f();\n"
7729 " }\n"
7730 "}",
7731 EightIndent);
7732 verifyFormat("class X {\n"
7733 " void f() {\n"
7734 " }\n"
7735 "};",
7736 EightIndent);
7737 verifyFormat("int x[] = {\n"
7738 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007739 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007740 EightIndent);
7741}
7742
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007743TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007744 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007745 "f();",
7746 getLLVMStyleWithColumns(8));
7747}
7748
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007749TEST_F(FormatTest, ConfigurableUseOfTab) {
7750 FormatStyle Tab = getLLVMStyleWithColumns(42);
7751 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007752 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007753 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007754
7755 EXPECT_EQ("if (aaaaaaaa && // q\n"
7756 " bb)\t\t// w\n"
7757 "\t;",
7758 format("if (aaaaaaaa &&// q\n"
7759 "bb)// w\n"
7760 ";",
7761 Tab));
7762 EXPECT_EQ("if (aaa && bbb) // w\n"
7763 "\t;",
7764 format("if(aaa&&bbb)// w\n"
7765 ";",
7766 Tab));
7767
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007768 verifyFormat("class X {\n"
7769 "\tvoid f() {\n"
7770 "\t\tsomeFunction(parameter1,\n"
7771 "\t\t\t parameter2);\n"
7772 "\t}\n"
7773 "};",
7774 Tab);
7775 verifyFormat("#define A \\\n"
7776 "\tvoid f() { \\\n"
7777 "\t\tsomeFunction( \\\n"
7778 "\t\t parameter1, \\\n"
7779 "\t\t parameter2); \\\n"
7780 "\t}",
7781 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007782
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007783 Tab.TabWidth = 4;
7784 Tab.IndentWidth = 8;
7785 verifyFormat("class TabWidth4Indent8 {\n"
7786 "\t\tvoid f() {\n"
7787 "\t\t\t\tsomeFunction(parameter1,\n"
7788 "\t\t\t\t\t\t\t parameter2);\n"
7789 "\t\t}\n"
7790 "};",
7791 Tab);
7792
7793 Tab.TabWidth = 4;
7794 Tab.IndentWidth = 4;
7795 verifyFormat("class TabWidth4Indent4 {\n"
7796 "\tvoid f() {\n"
7797 "\t\tsomeFunction(parameter1,\n"
7798 "\t\t\t\t\t parameter2);\n"
7799 "\t}\n"
7800 "};",
7801 Tab);
7802
7803 Tab.TabWidth = 8;
7804 Tab.IndentWidth = 4;
7805 verifyFormat("class TabWidth8Indent4 {\n"
7806 " void f() {\n"
7807 "\tsomeFunction(parameter1,\n"
7808 "\t\t parameter2);\n"
7809 " }\n"
7810 "};",
7811 Tab);
7812
Alexander Kornienko39856b72013-09-10 09:38:25 +00007813 Tab.TabWidth = 8;
7814 Tab.IndentWidth = 8;
7815 EXPECT_EQ("/*\n"
7816 "\t a\t\tcomment\n"
7817 "\t in multiple lines\n"
7818 " */",
7819 format(" /*\t \t \n"
7820 " \t \t a\t\tcomment\t \t\n"
7821 " \t \t in multiple lines\t\n"
7822 " \t */",
7823 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007824
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007825 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007826 verifyFormat("{\n"
7827 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7828 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7829 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7830 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7831 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7832 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007833 "};",
7834 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007835 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007836 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007837 "\ta2,\n"
7838 "\ta3\n"
7839 "};",
7840 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007841 EXPECT_EQ("if (aaaaaaaa && // q\n"
7842 " bb) // w\n"
7843 "\t;",
7844 format("if (aaaaaaaa &&// q\n"
7845 "bb)// w\n"
7846 ";",
7847 Tab));
7848 verifyFormat("class X {\n"
7849 "\tvoid f() {\n"
7850 "\t\tsomeFunction(parameter1,\n"
7851 "\t\t parameter2);\n"
7852 "\t}\n"
7853 "};",
7854 Tab);
7855 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007856 "\tQ(\n"
7857 "\t {\n"
7858 "\t\t int a;\n"
7859 "\t\t someFunction(aaaaaaaa,\n"
7860 "\t\t bbbbbbb);\n"
7861 "\t },\n"
7862 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007863 "}",
7864 Tab);
7865 EXPECT_EQ("{\n"
7866 "\t/* aaaa\n"
7867 "\t bbbb */\n"
7868 "}",
7869 format("{\n"
7870 "/* aaaa\n"
7871 " bbbb */\n"
7872 "}",
7873 Tab));
7874 EXPECT_EQ("{\n"
7875 "\t/*\n"
7876 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7877 "\t bbbbbbbbbbbbb\n"
7878 "\t*/\n"
7879 "}",
7880 format("{\n"
7881 "/*\n"
7882 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7883 "*/\n"
7884 "}",
7885 Tab));
7886 EXPECT_EQ("{\n"
7887 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7888 "\t// bbbbbbbbbbbbb\n"
7889 "}",
7890 format("{\n"
7891 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7892 "}",
7893 Tab));
7894 EXPECT_EQ("{\n"
7895 "\t/*\n"
7896 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7897 "\t bbbbbbbbbbbbb\n"
7898 "\t*/\n"
7899 "}",
7900 format("{\n"
7901 "\t/*\n"
7902 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7903 "\t*/\n"
7904 "}",
7905 Tab));
7906 EXPECT_EQ("{\n"
7907 "\t/*\n"
7908 "\n"
7909 "\t*/\n"
7910 "}",
7911 format("{\n"
7912 "\t/*\n"
7913 "\n"
7914 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007915 "}",
7916 Tab));
7917 EXPECT_EQ("{\n"
7918 "\t/*\n"
7919 " asdf\n"
7920 "\t*/\n"
7921 "}",
7922 format("{\n"
7923 "\t/*\n"
7924 " asdf\n"
7925 "\t*/\n"
7926 "}",
7927 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007928
7929 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007930 EXPECT_EQ("/*\n"
7931 " a\t\tcomment\n"
7932 " in multiple lines\n"
7933 " */",
7934 format(" /*\t \t \n"
7935 " \t \t a\t\tcomment\t \t\n"
7936 " \t \t in multiple lines\t\n"
7937 " \t */",
7938 Tab));
7939 EXPECT_EQ("/* some\n"
7940 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007941 format(" \t \t /* some\n"
7942 " \t \t comment */",
7943 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007944 EXPECT_EQ("int a; /* some\n"
7945 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007946 format(" \t \t int a; /* some\n"
7947 " \t \t comment */",
7948 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007949
Alexander Kornienko39856b72013-09-10 09:38:25 +00007950 EXPECT_EQ("int a; /* some\n"
7951 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007952 format(" \t \t int\ta; /* some\n"
7953 " \t \t comment */",
7954 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007955 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7956 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007957 format(" \t \t f(\"\t\t\"); /* some\n"
7958 " \t \t comment */",
7959 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007960 EXPECT_EQ("{\n"
7961 " /*\n"
7962 " * Comment\n"
7963 " */\n"
7964 " int i;\n"
7965 "}",
7966 format("{\n"
7967 "\t/*\n"
7968 "\t * Comment\n"
7969 "\t */\n"
7970 "\t int i;\n"
7971 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007972
7973 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7974 Tab.TabWidth = 8;
7975 Tab.IndentWidth = 8;
7976 EXPECT_EQ("if (aaaaaaaa && // q\n"
7977 " bb) // w\n"
7978 "\t;",
7979 format("if (aaaaaaaa &&// q\n"
7980 "bb)// w\n"
7981 ";",
7982 Tab));
7983 EXPECT_EQ("if (aaa && bbb) // w\n"
7984 "\t;",
7985 format("if(aaa&&bbb)// w\n"
7986 ";",
7987 Tab));
7988 verifyFormat("class X {\n"
7989 "\tvoid f() {\n"
7990 "\t\tsomeFunction(parameter1,\n"
7991 "\t\t\t parameter2);\n"
7992 "\t}\n"
7993 "};",
7994 Tab);
7995 verifyFormat("#define A \\\n"
7996 "\tvoid f() { \\\n"
7997 "\t\tsomeFunction( \\\n"
7998 "\t\t parameter1, \\\n"
7999 "\t\t parameter2); \\\n"
8000 "\t}",
8001 Tab);
8002 Tab.TabWidth = 4;
8003 Tab.IndentWidth = 8;
8004 verifyFormat("class TabWidth4Indent8 {\n"
8005 "\t\tvoid f() {\n"
8006 "\t\t\t\tsomeFunction(parameter1,\n"
8007 "\t\t\t\t\t\t\t parameter2);\n"
8008 "\t\t}\n"
8009 "};",
8010 Tab);
8011 Tab.TabWidth = 4;
8012 Tab.IndentWidth = 4;
8013 verifyFormat("class TabWidth4Indent4 {\n"
8014 "\tvoid f() {\n"
8015 "\t\tsomeFunction(parameter1,\n"
8016 "\t\t\t\t\t parameter2);\n"
8017 "\t}\n"
8018 "};",
8019 Tab);
8020 Tab.TabWidth = 8;
8021 Tab.IndentWidth = 4;
8022 verifyFormat("class TabWidth8Indent4 {\n"
8023 " void f() {\n"
8024 "\tsomeFunction(parameter1,\n"
8025 "\t\t parameter2);\n"
8026 " }\n"
8027 "};",
8028 Tab);
8029 Tab.TabWidth = 8;
8030 Tab.IndentWidth = 8;
8031 EXPECT_EQ("/*\n"
8032 "\t a\t\tcomment\n"
8033 "\t in multiple lines\n"
8034 " */",
8035 format(" /*\t \t \n"
8036 " \t \t a\t\tcomment\t \t\n"
8037 " \t \t in multiple lines\t\n"
8038 " \t */",
8039 Tab));
8040 verifyFormat("{\n"
8041 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8042 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8043 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8044 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8045 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8046 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8047 "};",
8048 Tab);
8049 verifyFormat("enum AA {\n"
8050 "\ta1, // Force multiple lines\n"
8051 "\ta2,\n"
8052 "\ta3\n"
8053 "};",
8054 Tab);
8055 EXPECT_EQ("if (aaaaaaaa && // q\n"
8056 " bb) // w\n"
8057 "\t;",
8058 format("if (aaaaaaaa &&// q\n"
8059 "bb)// w\n"
8060 ";",
8061 Tab));
8062 verifyFormat("class X {\n"
8063 "\tvoid f() {\n"
8064 "\t\tsomeFunction(parameter1,\n"
8065 "\t\t\t parameter2);\n"
8066 "\t}\n"
8067 "};",
8068 Tab);
8069 verifyFormat("{\n"
8070 "\tQ(\n"
8071 "\t {\n"
8072 "\t\t int a;\n"
8073 "\t\t someFunction(aaaaaaaa,\n"
8074 "\t\t\t\t bbbbbbb);\n"
8075 "\t },\n"
8076 "\t p);\n"
8077 "}",
8078 Tab);
8079 EXPECT_EQ("{\n"
8080 "\t/* aaaa\n"
8081 "\t bbbb */\n"
8082 "}",
8083 format("{\n"
8084 "/* aaaa\n"
8085 " bbbb */\n"
8086 "}",
8087 Tab));
8088 EXPECT_EQ("{\n"
8089 "\t/*\n"
8090 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8091 "\t bbbbbbbbbbbbb\n"
8092 "\t*/\n"
8093 "}",
8094 format("{\n"
8095 "/*\n"
8096 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8097 "*/\n"
8098 "}",
8099 Tab));
8100 EXPECT_EQ("{\n"
8101 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8102 "\t// bbbbbbbbbbbbb\n"
8103 "}",
8104 format("{\n"
8105 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8106 "}",
8107 Tab));
8108 EXPECT_EQ("{\n"
8109 "\t/*\n"
8110 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8111 "\t bbbbbbbbbbbbb\n"
8112 "\t*/\n"
8113 "}",
8114 format("{\n"
8115 "\t/*\n"
8116 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8117 "\t*/\n"
8118 "}",
8119 Tab));
8120 EXPECT_EQ("{\n"
8121 "\t/*\n"
8122 "\n"
8123 "\t*/\n"
8124 "}",
8125 format("{\n"
8126 "\t/*\n"
8127 "\n"
8128 "\t*/\n"
8129 "}",
8130 Tab));
8131 EXPECT_EQ("{\n"
8132 "\t/*\n"
8133 " asdf\n"
8134 "\t*/\n"
8135 "}",
8136 format("{\n"
8137 "\t/*\n"
8138 " asdf\n"
8139 "\t*/\n"
8140 "}",
8141 Tab));
8142 EXPECT_EQ("/*\n"
8143 "\t a\t\tcomment\n"
8144 "\t in multiple lines\n"
8145 " */",
8146 format(" /*\t \t \n"
8147 " \t \t a\t\tcomment\t \t\n"
8148 " \t \t in multiple lines\t\n"
8149 " \t */",
8150 Tab));
8151 EXPECT_EQ("/* some\n"
8152 " comment */",
8153 format(" \t \t /* some\n"
8154 " \t \t comment */",
8155 Tab));
8156 EXPECT_EQ("int a; /* some\n"
8157 " comment */",
8158 format(" \t \t int a; /* some\n"
8159 " \t \t comment */",
8160 Tab));
8161 EXPECT_EQ("int a; /* some\n"
8162 "comment */",
8163 format(" \t \t int\ta; /* some\n"
8164 " \t \t comment */",
8165 Tab));
8166 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8167 " comment */",
8168 format(" \t \t f(\"\t\t\"); /* some\n"
8169 " \t \t comment */",
8170 Tab));
8171 EXPECT_EQ("{\n"
8172 " /*\n"
8173 " * Comment\n"
8174 " */\n"
8175 " int i;\n"
8176 "}",
8177 format("{\n"
8178 "\t/*\n"
8179 "\t * Comment\n"
8180 "\t */\n"
8181 "\t int i;\n"
8182 "}"));
8183 Tab.AlignConsecutiveAssignments = true;
8184 Tab.AlignConsecutiveDeclarations = true;
8185 Tab.TabWidth = 4;
8186 Tab.IndentWidth = 4;
8187 verifyFormat("class Assign {\n"
8188 "\tvoid f() {\n"
8189 "\t\tint x = 123;\n"
8190 "\t\tint random = 4;\n"
8191 "\t\tstd::string alphabet =\n"
8192 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8193 "\t}\n"
8194 "};",
8195 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008196}
8197
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008198TEST_F(FormatTest, CalculatesOriginalColumn) {
8199 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8200 "q\"; /* some\n"
8201 " comment */",
8202 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8203 "q\"; /* some\n"
8204 " comment */",
8205 getLLVMStyle()));
8206 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8207 "/* some\n"
8208 " comment */",
8209 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8210 " /* some\n"
8211 " comment */",
8212 getLLVMStyle()));
8213 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8214 "qqq\n"
8215 "/* some\n"
8216 " comment */",
8217 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8218 "qqq\n"
8219 " /* some\n"
8220 " comment */",
8221 getLLVMStyle()));
8222 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8223 "wwww; /* some\n"
8224 " comment */",
8225 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8226 "wwww; /* some\n"
8227 " comment */",
8228 getLLVMStyle()));
8229}
8230
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008231TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008232 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008233 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008234
8235 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008236 " continue;",
8237 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008238 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008239 " continue;",
8240 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008241 verifyFormat("if(true)\n"
8242 " f();\n"
8243 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008244 " f();",
8245 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008246 verifyFormat("do {\n"
8247 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008248 "} while(something());",
8249 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008250 verifyFormat("switch(x) {\n"
8251 "default:\n"
8252 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008253 "}",
8254 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008255 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008256 verifyFormat("size_t x = sizeof(x);", NoSpace);
8257 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8258 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8259 verifyFormat("alignas(128) char a[128];", NoSpace);
8260 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8261 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8262 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008263 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008264 verifyFormat("T A::operator()();", NoSpace);
8265 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008266
8267 FormatStyle Space = getLLVMStyle();
8268 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8269
8270 verifyFormat("int f ();", Space);
8271 verifyFormat("void f (int a, T b) {\n"
8272 " while (true)\n"
8273 " continue;\n"
8274 "}",
8275 Space);
8276 verifyFormat("if (true)\n"
8277 " f ();\n"
8278 "else if (true)\n"
8279 " f ();",
8280 Space);
8281 verifyFormat("do {\n"
8282 " do_something ();\n"
8283 "} while (something ());",
8284 Space);
8285 verifyFormat("switch (x) {\n"
8286 "default:\n"
8287 " break;\n"
8288 "}",
8289 Space);
8290 verifyFormat("A::A () : a (1) {}", Space);
8291 verifyFormat("void f () __attribute__ ((asdf));", Space);
8292 verifyFormat("*(&a + 1);\n"
8293 "&((&a)[1]);\n"
8294 "a[(b + c) * d];\n"
8295 "(((a + 1) * 2) + 3) * 4;",
8296 Space);
8297 verifyFormat("#define A(x) x", Space);
8298 verifyFormat("#define A (x) x", Space);
8299 verifyFormat("#if defined(x)\n"
8300 "#endif",
8301 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008302 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008303 verifyFormat("size_t x = sizeof (x);", Space);
8304 verifyFormat("auto f (int x) -> decltype (x);", Space);
8305 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8306 verifyFormat("alignas (128) char a[128];", Space);
8307 verifyFormat("size_t x = alignof (MyType);", Space);
8308 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8309 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008310 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008311 verifyFormat("T A::operator() ();", Space);
8312 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008313}
8314
8315TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8316 FormatStyle Spaces = getLLVMStyle();
8317
8318 Spaces.SpacesInParentheses = true;
8319 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008320 verifyFormat("call();", Spaces);
8321 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008322 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8323 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008324 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008325 " continue;",
8326 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008327 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008328 " continue;",
8329 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008330 verifyFormat("if ( true )\n"
8331 " f();\n"
8332 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008333 " f();",
8334 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008335 verifyFormat("do {\n"
8336 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008337 "} while ( something() );",
8338 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008339 verifyFormat("switch ( x ) {\n"
8340 "default:\n"
8341 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008342 "}",
8343 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008344
8345 Spaces.SpacesInParentheses = false;
8346 Spaces.SpacesInCStyleCastParentheses = true;
8347 verifyFormat("Type *A = ( Type * )P;", Spaces);
8348 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8349 verifyFormat("x = ( int32 )y;", Spaces);
8350 verifyFormat("int a = ( int )(2.0f);", Spaces);
8351 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8352 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8353 verifyFormat("#define x (( int )-1)", Spaces);
8354
Daniel Jasper92e09822015-03-18 12:59:19 +00008355 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008356 Spaces.SpacesInParentheses = false;
8357 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008358 Spaces.SpacesInCStyleCastParentheses = true;
8359 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008360 verifyFormat("call( );", Spaces);
8361 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008362 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008363 " continue;",
8364 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008365 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008366 " continue;",
8367 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008368 verifyFormat("if (true)\n"
8369 " f( );\n"
8370 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008371 " f( );",
8372 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008373 verifyFormat("do {\n"
8374 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008375 "} while (something( ));",
8376 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008377 verifyFormat("switch (x) {\n"
8378 "default:\n"
8379 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008380 "}",
8381 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008382
Daniel Jasper92e09822015-03-18 12:59:19 +00008383 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008384 Spaces.SpaceAfterCStyleCast = true;
8385 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008386 verifyFormat("call( );", Spaces);
8387 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008388 verifyFormat("while (( bool ) 1)\n"
8389 " continue;",
8390 Spaces);
8391 verifyFormat("for (;;)\n"
8392 " continue;",
8393 Spaces);
8394 verifyFormat("if (true)\n"
8395 " f( );\n"
8396 "else if (true)\n"
8397 " f( );",
8398 Spaces);
8399 verifyFormat("do {\n"
8400 " do_something(( int ) i);\n"
8401 "} while (something( ));",
8402 Spaces);
8403 verifyFormat("switch (x) {\n"
8404 "default:\n"
8405 " break;\n"
8406 "}",
8407 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008408
8409 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008410 Spaces.SpacesInCStyleCastParentheses = false;
8411 Spaces.SpaceAfterCStyleCast = true;
8412 verifyFormat("while ((bool) 1)\n"
8413 " continue;",
8414 Spaces);
8415 verifyFormat("do {\n"
8416 " do_something((int) i);\n"
8417 "} while (something( ));",
8418 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008419}
8420
Daniel Jasperad981f82014-08-26 11:41:14 +00008421TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8422 verifyFormat("int a[5];");
8423 verifyFormat("a[3] += 42;");
8424
8425 FormatStyle Spaces = getLLVMStyle();
8426 Spaces.SpacesInSquareBrackets = true;
8427 // Lambdas unchanged.
8428 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8429 verifyFormat("return [i, args...] {};", Spaces);
8430
8431 // Not lambdas.
8432 verifyFormat("int a[ 5 ];", Spaces);
8433 verifyFormat("a[ 3 ] += 42;", Spaces);
8434 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8435 verifyFormat("double &operator[](int i) { return 0; }\n"
8436 "int i;",
8437 Spaces);
8438 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8439 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8440 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8441}
8442
Daniel Jasperd94bff32013-09-25 15:15:02 +00008443TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8444 verifyFormat("int a = 5;");
8445 verifyFormat("a += 42;");
8446 verifyFormat("a or_eq 8;");
8447
8448 FormatStyle Spaces = getLLVMStyle();
8449 Spaces.SpaceBeforeAssignmentOperators = false;
8450 verifyFormat("int a= 5;", Spaces);
8451 verifyFormat("a+= 42;", Spaces);
8452 verifyFormat("a or_eq 8;", Spaces);
8453}
8454
Daniel Jaspera44991332015-04-29 13:06:49 +00008455TEST_F(FormatTest, AlignConsecutiveAssignments) {
8456 FormatStyle Alignment = getLLVMStyle();
8457 Alignment.AlignConsecutiveAssignments = false;
8458 verifyFormat("int a = 5;\n"
8459 "int oneTwoThree = 123;",
8460 Alignment);
8461 verifyFormat("int a = 5;\n"
8462 "int oneTwoThree = 123;",
8463 Alignment);
8464
8465 Alignment.AlignConsecutiveAssignments = true;
8466 verifyFormat("int a = 5;\n"
8467 "int oneTwoThree = 123;",
8468 Alignment);
8469 verifyFormat("int a = method();\n"
8470 "int oneTwoThree = 133;",
8471 Alignment);
8472 verifyFormat("a &= 5;\n"
8473 "bcd *= 5;\n"
8474 "ghtyf += 5;\n"
8475 "dvfvdb -= 5;\n"
8476 "a /= 5;\n"
8477 "vdsvsv %= 5;\n"
8478 "sfdbddfbdfbb ^= 5;\n"
8479 "dvsdsv |= 5;\n"
8480 "int dsvvdvsdvvv = 123;",
8481 Alignment);
8482 verifyFormat("int i = 1, j = 10;\n"
8483 "something = 2000;",
8484 Alignment);
8485 verifyFormat("something = 2000;\n"
8486 "int i = 1, j = 10;\n",
8487 Alignment);
8488 verifyFormat("something = 2000;\n"
8489 "another = 911;\n"
8490 "int i = 1, j = 10;\n"
8491 "oneMore = 1;\n"
8492 "i = 2;",
8493 Alignment);
8494 verifyFormat("int a = 5;\n"
8495 "int one = 1;\n"
8496 "method();\n"
8497 "int oneTwoThree = 123;\n"
8498 "int oneTwo = 12;",
8499 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008500 verifyFormat("int oneTwoThree = 123;\n"
8501 "int oneTwo = 12;\n"
8502 "method();\n",
8503 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008504 verifyFormat("int oneTwoThree = 123; // comment\n"
8505 "int oneTwo = 12; // comment",
8506 Alignment);
8507 EXPECT_EQ("int a = 5;\n"
8508 "\n"
8509 "int oneTwoThree = 123;",
8510 format("int a = 5;\n"
8511 "\n"
8512 "int oneTwoThree= 123;",
8513 Alignment));
8514 EXPECT_EQ("int a = 5;\n"
8515 "int one = 1;\n"
8516 "\n"
8517 "int oneTwoThree = 123;",
8518 format("int a = 5;\n"
8519 "int one = 1;\n"
8520 "\n"
8521 "int oneTwoThree = 123;",
8522 Alignment));
8523 EXPECT_EQ("int a = 5;\n"
8524 "int one = 1;\n"
8525 "\n"
8526 "int oneTwoThree = 123;\n"
8527 "int oneTwo = 12;",
8528 format("int a = 5;\n"
8529 "int one = 1;\n"
8530 "\n"
8531 "int oneTwoThree = 123;\n"
8532 "int oneTwo = 12;",
8533 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008534 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8535 verifyFormat("#define A \\\n"
8536 " int aaaa = 12; \\\n"
8537 " int b = 23; \\\n"
8538 " int ccc = 234; \\\n"
8539 " int dddddddddd = 2345;",
8540 Alignment);
8541 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008542 verifyFormat("#define A \\\n"
8543 " int aaaa = 12; \\\n"
8544 " int b = 23; \\\n"
8545 " int ccc = 234; \\\n"
8546 " int dddddddddd = 2345;",
8547 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008548 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008549 verifyFormat("#define A "
8550 " \\\n"
8551 " int aaaa = 12; "
8552 " \\\n"
8553 " int b = 23; "
8554 " \\\n"
8555 " int ccc = 234; "
8556 " \\\n"
8557 " int dddddddddd = 2345;",
8558 Alignment);
8559 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8560 "k = 4, int l = 5,\n"
8561 " int m = 6) {\n"
8562 " int j = 10;\n"
8563 " otherThing = 1;\n"
8564 "}",
8565 Alignment);
8566 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8567 " int i = 1;\n"
8568 " int j = 2;\n"
8569 " int big = 10000;\n"
8570 "}",
8571 Alignment);
8572 verifyFormat("class C {\n"
8573 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008574 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008575 " virtual void f() = 0;\n"
8576 "};",
8577 Alignment);
8578 verifyFormat("int i = 1;\n"
8579 "if (SomeType t = getSomething()) {\n"
8580 "}\n"
8581 "int j = 2;\n"
8582 "int big = 10000;",
8583 Alignment);
8584 verifyFormat("int j = 7;\n"
8585 "for (int k = 0; k < N; ++k) {\n"
8586 "}\n"
8587 "int j = 2;\n"
8588 "int big = 10000;\n"
8589 "}",
8590 Alignment);
8591 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8592 verifyFormat("int i = 1;\n"
8593 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8594 " = someLooooooooooooooooongFunction();\n"
8595 "int j = 2;",
8596 Alignment);
8597 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8598 verifyFormat("int i = 1;\n"
8599 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8600 " someLooooooooooooooooongFunction();\n"
8601 "int j = 2;",
8602 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008603
8604 verifyFormat("auto lambda = []() {\n"
8605 " auto i = 0;\n"
8606 " return 0;\n"
8607 "};\n"
8608 "int i = 0;\n"
8609 "auto v = type{\n"
8610 " i = 1, //\n"
8611 " (i = 2), //\n"
8612 " i = 3 //\n"
8613 "};",
8614 Alignment);
8615
Daniel Jaspera44991332015-04-29 13:06:49 +00008616 verifyFormat(
8617 "int i = 1;\n"
8618 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8619 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008620 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008621 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008622
8623 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8624 " typename B = very_long_type_name_1,\n"
8625 " typename T_2 = very_long_type_name_2>\n"
8626 "auto foo() {}\n",
8627 Alignment);
8628 verifyFormat("int a, b = 1;\n"
8629 "int c = 2;\n"
8630 "int dd = 3;\n",
8631 Alignment);
8632 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8633 "float b[1][] = {{3.f}};\n",
8634 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008635 verifyFormat("for (int i = 0; i < 1; i++)\n"
8636 " int x = 1;\n",
8637 Alignment);
8638 verifyFormat("for (i = 0; i < 1; i++)\n"
8639 " x = 1;\n"
8640 "y = 1;\n",
8641 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008642}
8643
Daniel Jaspere12597c2015-10-01 10:06:54 +00008644TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8645 FormatStyle Alignment = getLLVMStyle();
8646 Alignment.AlignConsecutiveDeclarations = false;
8647 verifyFormat("float const a = 5;\n"
8648 "int oneTwoThree = 123;",
8649 Alignment);
8650 verifyFormat("int a = 5;\n"
8651 "float const oneTwoThree = 123;",
8652 Alignment);
8653
8654 Alignment.AlignConsecutiveDeclarations = true;
8655 verifyFormat("float const a = 5;\n"
8656 "int oneTwoThree = 123;",
8657 Alignment);
8658 verifyFormat("int a = method();\n"
8659 "float const oneTwoThree = 133;",
8660 Alignment);
8661 verifyFormat("int i = 1, j = 10;\n"
8662 "something = 2000;",
8663 Alignment);
8664 verifyFormat("something = 2000;\n"
8665 "int i = 1, j = 10;\n",
8666 Alignment);
8667 verifyFormat("float something = 2000;\n"
8668 "double another = 911;\n"
8669 "int i = 1, j = 10;\n"
8670 "const int *oneMore = 1;\n"
8671 "unsigned i = 2;",
8672 Alignment);
8673 verifyFormat("float a = 5;\n"
8674 "int one = 1;\n"
8675 "method();\n"
8676 "const double oneTwoThree = 123;\n"
8677 "const unsigned int oneTwo = 12;",
8678 Alignment);
8679 verifyFormat("int oneTwoThree{0}; // comment\n"
8680 "unsigned oneTwo; // comment",
8681 Alignment);
8682 EXPECT_EQ("float const a = 5;\n"
8683 "\n"
8684 "int oneTwoThree = 123;",
8685 format("float const a = 5;\n"
8686 "\n"
8687 "int oneTwoThree= 123;",
8688 Alignment));
8689 EXPECT_EQ("float a = 5;\n"
8690 "int one = 1;\n"
8691 "\n"
8692 "unsigned oneTwoThree = 123;",
8693 format("float a = 5;\n"
8694 "int one = 1;\n"
8695 "\n"
8696 "unsigned oneTwoThree = 123;",
8697 Alignment));
8698 EXPECT_EQ("float a = 5;\n"
8699 "int one = 1;\n"
8700 "\n"
8701 "unsigned oneTwoThree = 123;\n"
8702 "int oneTwo = 12;",
8703 format("float a = 5;\n"
8704 "int one = 1;\n"
8705 "\n"
8706 "unsigned oneTwoThree = 123;\n"
8707 "int oneTwo = 12;",
8708 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008709 // Function prototype alignment
8710 verifyFormat("int a();\n"
8711 "double b();",
8712 Alignment);
8713 verifyFormat("int a(int x);\n"
8714 "double b();",
8715 Alignment);
8716 unsigned OldColumnLimit = Alignment.ColumnLimit;
8717 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8718 // otherwise the function parameters will be re-flowed onto a single line.
8719 Alignment.ColumnLimit = 0;
8720 EXPECT_EQ("int a(int x,\n"
8721 " float y);\n"
8722 "double b(int x,\n"
8723 " double y);",
8724 format("int a(int x,\n"
8725 " float y);\n"
8726 "double b(int x,\n"
8727 " double y);",
8728 Alignment));
8729 // This ensures that function parameters of function declarations are
8730 // correctly indented when their owning functions are indented.
8731 // The failure case here is for 'double y' to not be indented enough.
8732 EXPECT_EQ("double a(int x);\n"
8733 "int b(int y,\n"
8734 " double z);",
8735 format("double a(int x);\n"
8736 "int b(int y,\n"
8737 " double z);",
8738 Alignment));
8739 // Set ColumnLimit low so that we induce wrapping immediately after
8740 // the function name and opening paren.
8741 Alignment.ColumnLimit = 13;
8742 verifyFormat("int function(\n"
8743 " int x,\n"
8744 " bool y);",
8745 Alignment);
8746 Alignment.ColumnLimit = OldColumnLimit;
8747 // Ensure function pointers don't screw up recursive alignment
8748 verifyFormat("int a(int x, void (*fp)(int y));\n"
8749 "double b();",
8750 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008751 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008752 // Ensure recursive alignment is broken by function braces, so that the
8753 // "a = 1" does not align with subsequent assignments inside the function
8754 // body.
8755 verifyFormat("int func(int a = 1) {\n"
8756 " int b = 2;\n"
8757 " int cc = 3;\n"
8758 "}",
8759 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008760 verifyFormat("float something = 2000;\n"
8761 "double another = 911;\n"
8762 "int i = 1, j = 10;\n"
8763 "const int *oneMore = 1;\n"
8764 "unsigned i = 2;",
8765 Alignment);
8766 verifyFormat("int oneTwoThree = {0}; // comment\n"
8767 "unsigned oneTwo = 0; // comment",
8768 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008769 // Make sure that scope is correctly tracked, in the absence of braces
8770 verifyFormat("for (int i = 0; i < n; i++)\n"
8771 " j = i;\n"
8772 "double x = 1;\n",
8773 Alignment);
8774 verifyFormat("if (int i = 0)\n"
8775 " j = i;\n"
8776 "double x = 1;\n",
8777 Alignment);
8778 // Ensure operator[] and operator() are comprehended
8779 verifyFormat("struct test {\n"
8780 " long long int foo();\n"
8781 " int operator[](int a);\n"
8782 " double bar();\n"
8783 "};\n",
8784 Alignment);
8785 verifyFormat("struct test {\n"
8786 " long long int foo();\n"
8787 " int operator()(int a);\n"
8788 " double bar();\n"
8789 "};\n",
8790 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008791 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8792 " int const i = 1;\n"
8793 " int * j = 2;\n"
8794 " int big = 10000;\n"
8795 "\n"
8796 " unsigned oneTwoThree = 123;\n"
8797 " int oneTwo = 12;\n"
8798 " method();\n"
8799 " float k = 2;\n"
8800 " int ll = 10000;\n"
8801 "}",
8802 format("void SomeFunction(int parameter= 0) {\n"
8803 " int const i= 1;\n"
8804 " int *j=2;\n"
8805 " int big = 10000;\n"
8806 "\n"
8807 "unsigned oneTwoThree =123;\n"
8808 "int oneTwo = 12;\n"
8809 " method();\n"
8810 "float k= 2;\n"
8811 "int ll=10000;\n"
8812 "}",
8813 Alignment));
8814 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008815 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8816 verifyFormat("#define A \\\n"
8817 " int aaaa = 12; \\\n"
8818 " float b = 23; \\\n"
8819 " const int ccc = 234; \\\n"
8820 " unsigned dddddddddd = 2345;",
8821 Alignment);
8822 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008823 verifyFormat("#define A \\\n"
8824 " int aaaa = 12; \\\n"
8825 " float b = 23; \\\n"
8826 " const int ccc = 234; \\\n"
8827 " unsigned dddddddddd = 2345;",
8828 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008829 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008830 Alignment.ColumnLimit = 30;
8831 verifyFormat("#define A \\\n"
8832 " int aaaa = 12; \\\n"
8833 " float b = 23; \\\n"
8834 " const int ccc = 234; \\\n"
8835 " int dddddddddd = 2345;",
8836 Alignment);
8837 Alignment.ColumnLimit = 80;
8838 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8839 "k = 4, int l = 5,\n"
8840 " int m = 6) {\n"
8841 " const int j = 10;\n"
8842 " otherThing = 1;\n"
8843 "}",
8844 Alignment);
8845 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8846 " int const i = 1;\n"
8847 " int * j = 2;\n"
8848 " int big = 10000;\n"
8849 "}",
8850 Alignment);
8851 verifyFormat("class C {\n"
8852 "public:\n"
8853 " int i = 1;\n"
8854 " virtual void f() = 0;\n"
8855 "};",
8856 Alignment);
8857 verifyFormat("float i = 1;\n"
8858 "if (SomeType t = getSomething()) {\n"
8859 "}\n"
8860 "const unsigned j = 2;\n"
8861 "int big = 10000;",
8862 Alignment);
8863 verifyFormat("float j = 7;\n"
8864 "for (int k = 0; k < N; ++k) {\n"
8865 "}\n"
8866 "unsigned j = 2;\n"
8867 "int big = 10000;\n"
8868 "}",
8869 Alignment);
8870 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8871 verifyFormat("float i = 1;\n"
8872 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8873 " = someLooooooooooooooooongFunction();\n"
8874 "int j = 2;",
8875 Alignment);
8876 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8877 verifyFormat("int i = 1;\n"
8878 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8879 " someLooooooooooooooooongFunction();\n"
8880 "int j = 2;",
8881 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008882
8883 Alignment.AlignConsecutiveAssignments = true;
8884 verifyFormat("auto lambda = []() {\n"
8885 " auto ii = 0;\n"
8886 " float j = 0;\n"
8887 " return 0;\n"
8888 "};\n"
8889 "int i = 0;\n"
8890 "float i2 = 0;\n"
8891 "auto v = type{\n"
8892 " i = 1, //\n"
8893 " (i = 2), //\n"
8894 " i = 3 //\n"
8895 "};",
8896 Alignment);
8897 Alignment.AlignConsecutiveAssignments = false;
8898
Daniel Jaspere12597c2015-10-01 10:06:54 +00008899 verifyFormat(
8900 "int i = 1;\n"
8901 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8902 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008903 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00008904 Alignment);
8905
8906 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8907 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008908 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00008909 // happens.
8910 Alignment.AlignConsecutiveAssignments = true;
8911 Alignment.ColumnLimit = 30;
8912 verifyFormat("float ii = 1;\n"
8913 "unsigned j = 2;\n"
8914 "int someVerylongVariable = 1;\n"
8915 "AnotherLongType ll = 123456;\n"
8916 "VeryVeryLongType k = 2;\n"
8917 "int myvar = 1;",
8918 Alignment);
8919 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008920 Alignment.AlignConsecutiveAssignments = false;
8921
8922 verifyFormat(
8923 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8924 " typename LongType, typename B>\n"
8925 "auto foo() {}\n",
8926 Alignment);
8927 verifyFormat("float a, b = 1;\n"
8928 "int c = 2;\n"
8929 "int dd = 3;\n",
8930 Alignment);
8931 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8932 "float b[1][] = {{3.f}};\n",
8933 Alignment);
8934 Alignment.AlignConsecutiveAssignments = true;
8935 verifyFormat("float a, b = 1;\n"
8936 "int c = 2;\n"
8937 "int dd = 3;\n",
8938 Alignment);
8939 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8940 "float b[1][] = {{3.f}};\n",
8941 Alignment);
8942 Alignment.AlignConsecutiveAssignments = false;
8943
8944 Alignment.ColumnLimit = 30;
8945 Alignment.BinPackParameters = false;
8946 verifyFormat("void foo(float a,\n"
8947 " float b,\n"
8948 " int c,\n"
8949 " uint32_t *d) {\n"
8950 " int * e = 0;\n"
8951 " float f = 0;\n"
8952 " double g = 0;\n"
8953 "}\n"
8954 "void bar(ino_t a,\n"
8955 " int b,\n"
8956 " uint32_t *c,\n"
8957 " bool d) {}\n",
8958 Alignment);
8959 Alignment.BinPackParameters = true;
8960 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008961}
8962
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008963TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008964 FormatStyle LinuxBraceStyle = getLLVMStyle();
8965 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008966 verifyFormat("namespace a\n"
8967 "{\n"
8968 "class A\n"
8969 "{\n"
8970 " void f()\n"
8971 " {\n"
8972 " if (true) {\n"
8973 " a();\n"
8974 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008975 " } else {\n"
8976 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008977 " }\n"
8978 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008979 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008980 "};\n"
8981 "struct B {\n"
8982 " int x;\n"
8983 "};\n"
8984 "}\n",
8985 LinuxBraceStyle);
8986 verifyFormat("enum X {\n"
8987 " Y = 0,\n"
8988 "}\n",
8989 LinuxBraceStyle);
8990 verifyFormat("struct S {\n"
8991 " int Type;\n"
8992 " union {\n"
8993 " int x;\n"
8994 " double y;\n"
8995 " } Value;\n"
8996 " class C\n"
8997 " {\n"
8998 " MyFavoriteType Value;\n"
8999 " } Class;\n"
9000 "}\n",
9001 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009002}
9003
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009004TEST_F(FormatTest, MozillaBraceBreaking) {
9005 FormatStyle MozillaBraceStyle = getLLVMStyle();
9006 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009007 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009008 verifyFormat("namespace a {\n"
9009 "class A\n"
9010 "{\n"
9011 " void f()\n"
9012 " {\n"
9013 " if (true) {\n"
9014 " a();\n"
9015 " b();\n"
9016 " }\n"
9017 " }\n"
9018 " void g() { return; }\n"
9019 "};\n"
9020 "enum E\n"
9021 "{\n"
9022 " A,\n"
9023 " // foo\n"
9024 " B,\n"
9025 " C\n"
9026 "};\n"
9027 "struct B\n"
9028 "{\n"
9029 " int x;\n"
9030 "};\n"
9031 "}\n",
9032 MozillaBraceStyle);
9033 verifyFormat("struct S\n"
9034 "{\n"
9035 " int Type;\n"
9036 " union\n"
9037 " {\n"
9038 " int x;\n"
9039 " double y;\n"
9040 " } Value;\n"
9041 " class C\n"
9042 " {\n"
9043 " MyFavoriteType Value;\n"
9044 " } Class;\n"
9045 "}\n",
9046 MozillaBraceStyle);
9047}
9048
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009049TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009050 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9051 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009052 verifyFormat("namespace a {\n"
9053 "class A {\n"
9054 " void f()\n"
9055 " {\n"
9056 " if (true) {\n"
9057 " a();\n"
9058 " b();\n"
9059 " }\n"
9060 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009061 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009062 "};\n"
9063 "struct B {\n"
9064 " int x;\n"
9065 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009066 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009067 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009068
Daniel Jasperd9670872014-08-05 12:06:20 +00009069 verifyFormat("void foo()\n"
9070 "{\n"
9071 " if (a) {\n"
9072 " a();\n"
9073 " }\n"
9074 " else {\n"
9075 " b();\n"
9076 " }\n"
9077 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009078 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009079
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009080 verifyFormat("#ifdef _DEBUG\n"
9081 "int foo(int i = 0)\n"
9082 "#else\n"
9083 "int foo(int i = 5)\n"
9084 "#endif\n"
9085 "{\n"
9086 " return i;\n"
9087 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009088 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009089
9090 verifyFormat("void foo() {}\n"
9091 "void bar()\n"
9092 "#ifdef _DEBUG\n"
9093 "{\n"
9094 " foo();\n"
9095 "}\n"
9096 "#else\n"
9097 "{\n"
9098 "}\n"
9099 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009100 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009101
9102 verifyFormat("void foobar() { int i = 5; }\n"
9103 "#ifdef _DEBUG\n"
9104 "void bar() {}\n"
9105 "#else\n"
9106 "void bar() { foobar(); }\n"
9107 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009108 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009109}
9110
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009111TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009112 FormatStyle AllmanBraceStyle = getLLVMStyle();
9113 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009114 verifyFormat("namespace a\n"
9115 "{\n"
9116 "class A\n"
9117 "{\n"
9118 " void f()\n"
9119 " {\n"
9120 " if (true)\n"
9121 " {\n"
9122 " a();\n"
9123 " b();\n"
9124 " }\n"
9125 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009126 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009127 "};\n"
9128 "struct B\n"
9129 "{\n"
9130 " int x;\n"
9131 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009132 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009133 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009134
9135 verifyFormat("void f()\n"
9136 "{\n"
9137 " if (true)\n"
9138 " {\n"
9139 " a();\n"
9140 " }\n"
9141 " else if (false)\n"
9142 " {\n"
9143 " b();\n"
9144 " }\n"
9145 " else\n"
9146 " {\n"
9147 " c();\n"
9148 " }\n"
9149 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009150 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009151
9152 verifyFormat("void f()\n"
9153 "{\n"
9154 " for (int i = 0; i < 10; ++i)\n"
9155 " {\n"
9156 " a();\n"
9157 " }\n"
9158 " while (false)\n"
9159 " {\n"
9160 " b();\n"
9161 " }\n"
9162 " do\n"
9163 " {\n"
9164 " c();\n"
9165 " } while (false)\n"
9166 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009167 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009168
9169 verifyFormat("void f(int a)\n"
9170 "{\n"
9171 " switch (a)\n"
9172 " {\n"
9173 " case 0:\n"
9174 " break;\n"
9175 " case 1:\n"
9176 " {\n"
9177 " break;\n"
9178 " }\n"
9179 " case 2:\n"
9180 " {\n"
9181 " }\n"
9182 " break;\n"
9183 " default:\n"
9184 " break;\n"
9185 " }\n"
9186 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009187 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009188
9189 verifyFormat("enum X\n"
9190 "{\n"
9191 " Y = 0,\n"
9192 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009193 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009194 verifyFormat("enum X\n"
9195 "{\n"
9196 " Y = 0\n"
9197 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009198 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009199
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009200 verifyFormat("@interface BSApplicationController ()\n"
9201 "{\n"
9202 "@private\n"
9203 " id _extraIvar;\n"
9204 "}\n"
9205 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009206 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009207
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009208 verifyFormat("#ifdef _DEBUG\n"
9209 "int foo(int i = 0)\n"
9210 "#else\n"
9211 "int foo(int i = 5)\n"
9212 "#endif\n"
9213 "{\n"
9214 " return i;\n"
9215 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009216 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009217
9218 verifyFormat("void foo() {}\n"
9219 "void bar()\n"
9220 "#ifdef _DEBUG\n"
9221 "{\n"
9222 " foo();\n"
9223 "}\n"
9224 "#else\n"
9225 "{\n"
9226 "}\n"
9227 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009228 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009229
9230 verifyFormat("void foobar() { int i = 5; }\n"
9231 "#ifdef _DEBUG\n"
9232 "void bar() {}\n"
9233 "#else\n"
9234 "void bar() { foobar(); }\n"
9235 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009236 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009237
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009238 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009239 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009240 " // ...\n"
9241 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009242 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009243 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009244 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009245 " // ...\n"
9246 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009247 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009248 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009249 // .. or dict literals.
9250 verifyFormat("void f()\n"
9251 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009252 " // ...\n"
9253 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9254 "}",
9255 AllmanBraceStyle);
9256 verifyFormat("void f()\n"
9257 "{\n"
9258 " // ...\n"
9259 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009260 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009261 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009262 verifyFormat("int f()\n"
9263 "{ // comment\n"
9264 " return 42;\n"
9265 "}",
9266 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009267
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009268 AllmanBraceStyle.ColumnLimit = 19;
9269 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9270 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009271 verifyFormat("void f()\n"
9272 "{\n"
9273 " int i;\n"
9274 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009275 AllmanBraceStyle);
9276 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009277
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009278 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009279 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9280 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9281 verifyFormat("void f(bool b)\n"
9282 "{\n"
9283 " if (b)\n"
9284 " {\n"
9285 " return;\n"
9286 " }\n"
9287 "}\n",
9288 BreakBeforeBraceShortIfs);
9289 verifyFormat("void f(bool b)\n"
9290 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009291 " if constexpr (b)\n"
9292 " {\n"
9293 " return;\n"
9294 " }\n"
9295 "}\n",
9296 BreakBeforeBraceShortIfs);
9297 verifyFormat("void f(bool b)\n"
9298 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009299 " if (b) return;\n"
9300 "}\n",
9301 BreakBeforeBraceShortIfs);
9302 verifyFormat("void f(bool b)\n"
9303 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009304 " if constexpr (b) return;\n"
9305 "}\n",
9306 BreakBeforeBraceShortIfs);
9307 verifyFormat("void f(bool b)\n"
9308 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009309 " while (b)\n"
9310 " {\n"
9311 " return;\n"
9312 " }\n"
9313 "}\n",
9314 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009315}
9316
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009317TEST_F(FormatTest, GNUBraceBreaking) {
9318 FormatStyle GNUBraceStyle = getLLVMStyle();
9319 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9320 verifyFormat("namespace a\n"
9321 "{\n"
9322 "class A\n"
9323 "{\n"
9324 " void f()\n"
9325 " {\n"
9326 " int a;\n"
9327 " {\n"
9328 " int b;\n"
9329 " }\n"
9330 " if (true)\n"
9331 " {\n"
9332 " a();\n"
9333 " b();\n"
9334 " }\n"
9335 " }\n"
9336 " void g() { return; }\n"
9337 "}\n"
9338 "}",
9339 GNUBraceStyle);
9340
9341 verifyFormat("void f()\n"
9342 "{\n"
9343 " if (true)\n"
9344 " {\n"
9345 " a();\n"
9346 " }\n"
9347 " else if (false)\n"
9348 " {\n"
9349 " b();\n"
9350 " }\n"
9351 " else\n"
9352 " {\n"
9353 " c();\n"
9354 " }\n"
9355 "}\n",
9356 GNUBraceStyle);
9357
9358 verifyFormat("void f()\n"
9359 "{\n"
9360 " for (int i = 0; i < 10; ++i)\n"
9361 " {\n"
9362 " a();\n"
9363 " }\n"
9364 " while (false)\n"
9365 " {\n"
9366 " b();\n"
9367 " }\n"
9368 " do\n"
9369 " {\n"
9370 " c();\n"
9371 " }\n"
9372 " while (false);\n"
9373 "}\n",
9374 GNUBraceStyle);
9375
9376 verifyFormat("void f(int a)\n"
9377 "{\n"
9378 " switch (a)\n"
9379 " {\n"
9380 " case 0:\n"
9381 " break;\n"
9382 " case 1:\n"
9383 " {\n"
9384 " break;\n"
9385 " }\n"
9386 " case 2:\n"
9387 " {\n"
9388 " }\n"
9389 " break;\n"
9390 " default:\n"
9391 " break;\n"
9392 " }\n"
9393 "}\n",
9394 GNUBraceStyle);
9395
9396 verifyFormat("enum X\n"
9397 "{\n"
9398 " Y = 0,\n"
9399 "}\n",
9400 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009401
9402 verifyFormat("@interface BSApplicationController ()\n"
9403 "{\n"
9404 "@private\n"
9405 " id _extraIvar;\n"
9406 "}\n"
9407 "@end\n",
9408 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009409
9410 verifyFormat("#ifdef _DEBUG\n"
9411 "int foo(int i = 0)\n"
9412 "#else\n"
9413 "int foo(int i = 5)\n"
9414 "#endif\n"
9415 "{\n"
9416 " return i;\n"
9417 "}",
9418 GNUBraceStyle);
9419
9420 verifyFormat("void foo() {}\n"
9421 "void bar()\n"
9422 "#ifdef _DEBUG\n"
9423 "{\n"
9424 " foo();\n"
9425 "}\n"
9426 "#else\n"
9427 "{\n"
9428 "}\n"
9429 "#endif",
9430 GNUBraceStyle);
9431
9432 verifyFormat("void foobar() { int i = 5; }\n"
9433 "#ifdef _DEBUG\n"
9434 "void bar() {}\n"
9435 "#else\n"
9436 "void bar() { foobar(); }\n"
9437 "#endif",
9438 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009439}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009440
9441TEST_F(FormatTest, WebKitBraceBreaking) {
9442 FormatStyle WebKitBraceStyle = getLLVMStyle();
9443 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009444 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009445 verifyFormat("namespace a {\n"
9446 "class A {\n"
9447 " void f()\n"
9448 " {\n"
9449 " if (true) {\n"
9450 " a();\n"
9451 " b();\n"
9452 " }\n"
9453 " }\n"
9454 " void g() { return; }\n"
9455 "};\n"
9456 "enum E {\n"
9457 " A,\n"
9458 " // foo\n"
9459 " B,\n"
9460 " C\n"
9461 "};\n"
9462 "struct B {\n"
9463 " int x;\n"
9464 "};\n"
9465 "}\n",
9466 WebKitBraceStyle);
9467 verifyFormat("struct S {\n"
9468 " int Type;\n"
9469 " union {\n"
9470 " int x;\n"
9471 " double y;\n"
9472 " } Value;\n"
9473 " class C {\n"
9474 " MyFavoriteType Value;\n"
9475 " } Class;\n"
9476 "};\n",
9477 WebKitBraceStyle);
9478}
9479
Manuel Klimekd5735502013-08-12 03:51:17 +00009480TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9481 verifyFormat("void f() {\n"
9482 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009483 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009484 " }\n"
9485 "}\n",
9486 getLLVMStyle());
9487}
9488
Daniel Jasper9613c812013-08-07 16:29:23 +00009489TEST_F(FormatTest, UnderstandsPragmas) {
9490 verifyFormat("#pragma omp reduction(| : var)");
9491 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009492
9493 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9494 "(including parentheses).",
9495 format("#pragma mark Any non-hyphenated or hyphenated string "
9496 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009497}
9498
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009499TEST_F(FormatTest, UnderstandPragmaOption) {
9500 verifyFormat("#pragma option -C -A");
9501
9502 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9503}
9504
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009505#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9506 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009507 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9508 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009509
9510TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009511 SmallVector<FormatStyle, 3> Styles;
9512 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009513
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009514 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009515 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9516 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9517 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009518
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009519 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009520 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9521 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9522 EXPECT_ALL_STYLES_EQUAL(Styles);
9523
Nico Weber514ecc82014-02-02 20:50:45 +00009524 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009525 EXPECT_TRUE(
9526 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9527 EXPECT_TRUE(
9528 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9529 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009530
Nico Weber514ecc82014-02-02 20:50:45 +00009531 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009532 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9533 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9534 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009535
9536 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009537 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9538 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9539 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009540
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009541 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009542 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9543 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9544 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009545
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009546 Styles[0] = getGNUStyle();
9547 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9548 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9549 EXPECT_ALL_STYLES_EQUAL(Styles);
9550
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009551 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9552}
9553
9554TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9555 SmallVector<FormatStyle, 8> Styles;
9556 Styles.resize(2);
9557
9558 Styles[0] = getGoogleStyle();
9559 Styles[1] = getLLVMStyle();
9560 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9561 EXPECT_ALL_STYLES_EQUAL(Styles);
9562
9563 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009564 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009565 Styles[1] = getLLVMStyle();
9566 Styles[1].Language = FormatStyle::LK_JavaScript;
9567 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9568
9569 Styles[2] = getLLVMStyle();
9570 Styles[2].Language = FormatStyle::LK_JavaScript;
9571 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9572 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009573 &Styles[2])
9574 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009575
9576 Styles[3] = getLLVMStyle();
9577 Styles[3].Language = FormatStyle::LK_JavaScript;
9578 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9579 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009580 &Styles[3])
9581 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009582
9583 Styles[4] = getLLVMStyle();
9584 Styles[4].Language = FormatStyle::LK_JavaScript;
9585 EXPECT_EQ(0, parseConfiguration("---\n"
9586 "BasedOnStyle: LLVM\n"
9587 "IndentWidth: 123\n"
9588 "---\n"
9589 "BasedOnStyle: Google\n"
9590 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009591 &Styles[4])
9592 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009593 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009594}
9595
Daniel Jasper91881d92014-09-29 08:07:46 +00009596#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009597 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009598 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009599 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009600 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009601 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009602
Daniel Jasper91881d92014-09-29 08:07:46 +00009603#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9604
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009605#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9606 Style.STRUCT.FIELD = false; \
9607 EXPECT_EQ(0, \
9608 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9609 .value()); \
9610 EXPECT_TRUE(Style.STRUCT.FIELD); \
9611 EXPECT_EQ(0, \
9612 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9613 .value()); \
9614 EXPECT_FALSE(Style.STRUCT.FIELD);
9615
9616#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9617 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9618
Daniel Jasper00853002014-09-16 16:22:30 +00009619#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9620 EXPECT_NE(VALUE, Style.FIELD); \
9621 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9622 EXPECT_EQ(VALUE, Style.FIELD)
9623
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009624TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009625 FormatStyle Style = {};
9626 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009627 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009628 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009629 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009630 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009631 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009632 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009633 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009634 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009635 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009636 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009637 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009638 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009639 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009640 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009641 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009642 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009643 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009644 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009645 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009646 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009647 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009648 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009649 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009650 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009651 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009652 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009653 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009654 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009655 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +00009656 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009657 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009658 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009659 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009660 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009661 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009662 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009663 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009664 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009665 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009666
9667 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9668 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9669 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9670 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9671 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9672 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9673 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9674 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9675 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9676 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9677 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +00009678 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
9679 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
9680 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009681}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009682
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009683#undef CHECK_PARSE_BOOL
9684
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009685TEST_F(FormatTest, ParsesConfiguration) {
9686 FormatStyle Style = {};
9687 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009688 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009689 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9690 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009691 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009692 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9693 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009694 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9695 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009696 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9697 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009698 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9699 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9700 PenaltyReturnTypeOnItsOwnLine, 1234u);
9701 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9702 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009703 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009704 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009705 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009706
Daniel Jasper553d4872014-06-17 12:40:34 +00009707 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009708 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9709 FormatStyle::PAS_Left);
9710 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9711 FormatStyle::PAS_Right);
9712 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9713 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009714 // For backward compatibility:
9715 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9716 FormatStyle::PAS_Left);
9717 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9718 FormatStyle::PAS_Right);
9719 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9720 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009721
Alexander Kornienkod6538332013-05-07 15:32:14 +00009722 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009723 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9724 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009725 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9726 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9727 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9728
Daniel Jasperac043c92014-09-15 11:11:00 +00009729 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009730 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9731 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009732 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9733 FormatStyle::BOS_None);
9734 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9735 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009736 // For backward compatibility:
9737 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9738 FormatStyle::BOS_None);
9739 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9740 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009741
Francois Ferranda6b6d512017-05-24 11:36:58 +00009742 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9743 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9744 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9745 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9746 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9747 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9748 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9749 // For backward compatibility:
9750 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9751 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9752
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009753 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9754 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9755 FormatStyle::BAS_Align);
9756 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9757 FormatStyle::BAS_DontAlign);
9758 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9759 FormatStyle::BAS_AlwaysBreak);
9760 // For backward compatibility:
9761 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9762 FormatStyle::BAS_DontAlign);
9763 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9764 FormatStyle::BAS_Align);
9765
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009766 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9767 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9768 FormatStyle::ENAS_DontAlign);
9769 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9770 FormatStyle::ENAS_Left);
9771 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
9772 FormatStyle::ENAS_Right);
9773 // For backward compatibility:
9774 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
9775 FormatStyle::ENAS_Left);
9776 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
9777 FormatStyle::ENAS_Right);
9778
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009779 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009780 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9781 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9782 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009783 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9784 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009785 // For backward compatibility:
9786 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9787 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009788
Daniel Jasperd74cf402014-04-08 12:46:38 +00009789 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009790 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9791 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9792 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9793 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009794 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9795 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009796 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9797 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009798 // For backward compatibility:
9799 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9800 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9801 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9802 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009803
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009804 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9805 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9806 FormatStyle::SBPO_Never);
9807 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9808 FormatStyle::SBPO_Always);
9809 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9810 FormatStyle::SBPO_ControlStatements);
9811 // For backward compatibility:
9812 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9813 FormatStyle::SBPO_Never);
9814 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9815 FormatStyle::SBPO_ControlStatements);
9816
Alexander Kornienkod6538332013-05-07 15:32:14 +00009817 Style.ColumnLimit = 123;
9818 FormatStyle BaseStyle = getLLVMStyle();
9819 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9820 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9821
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009822 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9823 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9824 FormatStyle::BS_Attach);
9825 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9826 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009827 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9828 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009829 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9830 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009831 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9832 FormatStyle::BS_Allman);
9833 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009834 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9835 FormatStyle::BS_WebKit);
9836 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9837 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009838
Zachary Turner448592e2015-12-18 22:20:15 +00009839 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9840 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9841 FormatStyle::RTBS_None);
9842 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9843 FormatStyle::RTBS_All);
9844 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009845 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009846 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9847 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9848 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9849 AlwaysBreakAfterReturnType,
9850 FormatStyle::RTBS_TopLevelDefinitions);
9851
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009852 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9853 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9854 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9855 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9856 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9857 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9858 AlwaysBreakAfterDefinitionReturnType,
9859 FormatStyle::DRTBS_TopLevel);
9860
Daniel Jasper65ee3472013-07-31 23:16:02 +00009861 Style.NamespaceIndentation = FormatStyle::NI_All;
9862 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9863 FormatStyle::NI_None);
9864 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9865 FormatStyle::NI_Inner);
9866 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9867 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009868
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009869 // FIXME: This is required because parsing a configuration simply overwrites
9870 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009871 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009872 std::vector<std::string> BoostForeach;
9873 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009874 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009875 std::vector<std::string> BoostAndQForeach;
9876 BoostAndQForeach.push_back("BOOST_FOREACH");
9877 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009878 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9879 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009880
9881 Style.IncludeCategories.clear();
9882 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9883 {".*", 1}};
9884 CHECK_PARSE("IncludeCategories:\n"
9885 " - Regex: abc/.*\n"
9886 " Priority: 2\n"
9887 " - Regex: .*\n"
9888 " Priority: 1",
9889 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009890 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009891}
9892
9893TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9894 FormatStyle Style = {};
9895 Style.Language = FormatStyle::LK_Cpp;
9896 CHECK_PARSE("Language: Cpp\n"
9897 "IndentWidth: 12",
9898 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009899 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9900 "IndentWidth: 34",
9901 &Style),
9902 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009903 EXPECT_EQ(12u, Style.IndentWidth);
9904 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9905 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9906
9907 Style.Language = FormatStyle::LK_JavaScript;
9908 CHECK_PARSE("Language: JavaScript\n"
9909 "IndentWidth: 12",
9910 IndentWidth, 12u);
9911 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009912 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9913 "IndentWidth: 34",
9914 &Style),
9915 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009916 EXPECT_EQ(23u, Style.IndentWidth);
9917 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9918 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9919
9920 CHECK_PARSE("BasedOnStyle: LLVM\n"
9921 "IndentWidth: 67",
9922 IndentWidth, 67u);
9923
9924 CHECK_PARSE("---\n"
9925 "Language: JavaScript\n"
9926 "IndentWidth: 12\n"
9927 "---\n"
9928 "Language: Cpp\n"
9929 "IndentWidth: 34\n"
9930 "...\n",
9931 IndentWidth, 12u);
9932
9933 Style.Language = FormatStyle::LK_Cpp;
9934 CHECK_PARSE("---\n"
9935 "Language: JavaScript\n"
9936 "IndentWidth: 12\n"
9937 "---\n"
9938 "Language: Cpp\n"
9939 "IndentWidth: 34\n"
9940 "...\n",
9941 IndentWidth, 34u);
9942 CHECK_PARSE("---\n"
9943 "IndentWidth: 78\n"
9944 "---\n"
9945 "Language: JavaScript\n"
9946 "IndentWidth: 56\n"
9947 "...\n",
9948 IndentWidth, 78u);
9949
9950 Style.ColumnLimit = 123;
9951 Style.IndentWidth = 234;
9952 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9953 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009954 EXPECT_FALSE(parseConfiguration("---\n"
9955 "IndentWidth: 456\n"
9956 "BreakBeforeBraces: Allman\n"
9957 "---\n"
9958 "Language: JavaScript\n"
9959 "IndentWidth: 111\n"
9960 "TabWidth: 111\n"
9961 "---\n"
9962 "Language: Cpp\n"
9963 "BreakBeforeBraces: Stroustrup\n"
9964 "TabWidth: 789\n"
9965 "...\n",
9966 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009967 EXPECT_EQ(123u, Style.ColumnLimit);
9968 EXPECT_EQ(456u, Style.IndentWidth);
9969 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9970 EXPECT_EQ(789u, Style.TabWidth);
9971
Rafael Espindola1f243172014-06-12 11:35:17 +00009972 EXPECT_EQ(parseConfiguration("---\n"
9973 "Language: JavaScript\n"
9974 "IndentWidth: 56\n"
9975 "---\n"
9976 "IndentWidth: 78\n"
9977 "...\n",
9978 &Style),
9979 ParseError::Error);
9980 EXPECT_EQ(parseConfiguration("---\n"
9981 "Language: JavaScript\n"
9982 "IndentWidth: 56\n"
9983 "---\n"
9984 "Language: JavaScript\n"
9985 "IndentWidth: 78\n"
9986 "...\n",
9987 &Style),
9988 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009989
9990 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9991}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009992
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009993#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009994
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009995TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9996 FormatStyle Style = {};
9997 Style.Language = FormatStyle::LK_JavaScript;
9998 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009999 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010000 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010001
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010002 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010003 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010004 "BasedOnStyle: Google\n"
10005 "---\n"
10006 "Language: JavaScript\n"
10007 "IndentWidth: 76\n"
10008 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010009 &Style)
10010 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010011 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010012 EXPECT_EQ(76u, Style.IndentWidth);
10013 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10014}
10015
Alexander Kornienkod6538332013-05-07 15:32:14 +000010016TEST_F(FormatTest, ConfigurationRoundTripTest) {
10017 FormatStyle Style = getLLVMStyle();
10018 std::string YAML = configurationAsText(Style);
10019 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010020 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010021 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10022 EXPECT_EQ(Style, ParsedStyle);
10023}
10024
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010025TEST_F(FormatTest, WorksFor8bitEncodings) {
10026 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10027 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10028 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10029 "\"\xef\xee\xf0\xf3...\"",
10030 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10031 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10032 "\xef\xee\xf0\xf3...\"",
10033 getLLVMStyleWithColumns(12)));
10034}
10035
Alexander Kornienko393e3082013-11-13 14:04:17 +000010036TEST_F(FormatTest, HandlesUTF8BOM) {
10037 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10038 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10039 format("\xef\xbb\xbf#include <iostream>"));
10040 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10041 format("\xef\xbb\xbf\n#include <iostream>"));
10042}
10043
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010044// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10045#if !defined(_MSC_VER)
10046
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010047TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10048 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10049 getLLVMStyleWithColumns(35));
10050 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010051 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010052 verifyFormat("// Однажды в студёную зимнюю пору...",
10053 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010054 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010055 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10056 getLLVMStyleWithColumns(39));
10057 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010058 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010059}
10060
10061TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010062 // Non-printable characters' width is currently considered to be the length in
10063 // bytes in UTF8. The characters can be displayed in very different manner
10064 // (zero-width, single width with a substitution glyph, expanded to their code
10065 // (e.g. "<8d>"), so there's no single correct way to handle them.
10066 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010067 "\"\xc2\x8d\";",
10068 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010069 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010070 "\"\xc2\x8d\";",
10071 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010072 EXPECT_EQ("\"Однажды, в \"\n"
10073 "\"студёную \"\n"
10074 "\"зимнюю \"\n"
10075 "\"пору,\"",
10076 format("\"Однажды, в студёную зимнюю пору,\"",
10077 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010078 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010079 "\"一 二 三 \"\n"
10080 "\"四 五六 \"\n"
10081 "\"七 八 九 \"\n"
10082 "\"十\"",
10083 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010084 EXPECT_EQ("\"一\t二 \"\n"
10085 "\"\t三 \"\n"
10086 "\"四 五\t六 \"\n"
10087 "\"\t七 \"\n"
10088 "\"八九十\tqq\"",
10089 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10090 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010091
10092 // UTF8 character in an escape sequence.
10093 EXPECT_EQ("\"aaaaaa\"\n"
10094 "\"\\\xC2\x8D\"",
10095 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010096}
10097
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010098TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10099 EXPECT_EQ("const char *sssss =\n"
10100 " \"一二三四五六七八\\\n"
10101 " 九 十\";",
10102 format("const char *sssss = \"一二三四五六七八\\\n"
10103 " 九 十\";",
10104 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010105}
10106
10107TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010108 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10109 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010110 EXPECT_EQ("// Я из лесу\n"
10111 "// вышел; был\n"
10112 "// сильный\n"
10113 "// мороз.",
10114 format("// Я из лесу вышел; был сильный мороз.",
10115 getLLVMStyleWithColumns(13)));
10116 EXPECT_EQ("// 一二三\n"
10117 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010118 "// 八 九\n"
10119 "// 十",
10120 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010121}
10122
10123TEST_F(FormatTest, SplitsUTF8BlockComments) {
10124 EXPECT_EQ("/* Гляжу,\n"
10125 " * поднимается\n"
10126 " * медленно в\n"
10127 " * гору\n"
10128 " * Лошадка,\n"
10129 " * везущая\n"
10130 " * хворосту\n"
10131 " * воз. */",
10132 format("/* Гляжу, поднимается медленно в гору\n"
10133 " * Лошадка, везущая хворосту воз. */",
10134 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010135 EXPECT_EQ(
10136 "/* 一二三\n"
10137 " * 四五六七\n"
10138 " * 八 九\n"
10139 " * 十 */",
10140 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010141 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10142 " * 𝕓𝕪𝕥𝕖\n"
10143 " * 𝖀𝕿𝕱-𝟠 */",
10144 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010145}
10146
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010147#endif // _MSC_VER
10148
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010149TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10150 FormatStyle Style = getLLVMStyle();
10151
10152 Style.ConstructorInitializerIndentWidth = 4;
10153 verifyFormat(
10154 "SomeClass::Constructor()\n"
10155 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10156 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10157 Style);
10158
10159 Style.ConstructorInitializerIndentWidth = 2;
10160 verifyFormat(
10161 "SomeClass::Constructor()\n"
10162 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10163 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10164 Style);
10165
10166 Style.ConstructorInitializerIndentWidth = 0;
10167 verifyFormat(
10168 "SomeClass::Constructor()\n"
10169 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10170 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10171 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010172 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10173 verifyFormat(
10174 "SomeLongTemplateVariableName<\n"
10175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10176 Style);
10177 verifyFormat(
10178 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10180 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010181}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010182
Daniel Jasper00853002014-09-16 16:22:30 +000010183TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10184 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010185 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010186 Style.ConstructorInitializerIndentWidth = 4;
10187 verifyFormat("SomeClass::Constructor()\n"
10188 " : a(a)\n"
10189 " , b(b)\n"
10190 " , c(c) {}",
10191 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010192 verifyFormat("SomeClass::Constructor()\n"
10193 " : a(a) {}",
10194 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010195
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010196 Style.ColumnLimit = 0;
10197 verifyFormat("SomeClass::Constructor()\n"
10198 " : a(a) {}",
10199 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010200 verifyFormat("SomeClass::Constructor() noexcept\n"
10201 " : a(a) {}",
10202 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010203 verifyFormat("SomeClass::Constructor()\n"
10204 " : a(a)\n"
10205 " , b(b)\n"
10206 " , c(c) {}",
10207 Style);
10208 verifyFormat("SomeClass::Constructor()\n"
10209 " : a(a) {\n"
10210 " foo();\n"
10211 " bar();\n"
10212 "}",
10213 Style);
10214
Daniel Jasperd74cf402014-04-08 12:46:38 +000010215 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010216 verifyFormat("SomeClass::Constructor()\n"
10217 " : a(a)\n"
10218 " , b(b)\n"
10219 " , c(c) {\n}",
10220 Style);
10221 verifyFormat("SomeClass::Constructor()\n"
10222 " : a(a) {\n}",
10223 Style);
10224
10225 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010226 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010227 Style.ConstructorInitializerIndentWidth = 2;
10228 verifyFormat("SomeClass::Constructor()\n"
10229 " : a(a)\n"
10230 " , b(b)\n"
10231 " , c(c) {}",
10232 Style);
10233
10234 Style.ConstructorInitializerIndentWidth = 0;
10235 verifyFormat("SomeClass::Constructor()\n"
10236 ": a(a)\n"
10237 ", b(b)\n"
10238 ", c(c) {}",
10239 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010240
10241 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10242 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010243 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10244 verifyFormat(
10245 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10246 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010247 verifyFormat(
10248 "SomeClass::Constructor()\n"
10249 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10250 Style);
10251 Style.ConstructorInitializerIndentWidth = 4;
10252 Style.ColumnLimit = 60;
10253 verifyFormat("SomeClass::Constructor()\n"
10254 " : aaaaaaaa(aaaaaaaa)\n"
10255 " , aaaaaaaa(aaaaaaaa)\n"
10256 " , aaaaaaaa(aaaaaaaa) {}",
10257 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010258}
10259
Daniel Jasper38efc132014-10-21 07:51:54 +000010260TEST_F(FormatTest, Destructors) {
10261 verifyFormat("void F(int &i) { i.~int(); }");
10262 verifyFormat("void F(int &i) { i->~int(); }");
10263}
10264
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010265TEST_F(FormatTest, FormatsWithWebKitStyle) {
10266 FormatStyle Style = getWebKitStyle();
10267
10268 // Don't indent in outer namespaces.
10269 verifyFormat("namespace outer {\n"
10270 "int i;\n"
10271 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010272 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010273 "} // namespace inner\n"
10274 "} // namespace outer\n"
10275 "namespace other_outer {\n"
10276 "int i;\n"
10277 "}",
10278 Style);
10279
10280 // Don't indent case labels.
10281 verifyFormat("switch (variable) {\n"
10282 "case 1:\n"
10283 "case 2:\n"
10284 " doSomething();\n"
10285 " break;\n"
10286 "default:\n"
10287 " ++variable;\n"
10288 "}",
10289 Style);
10290
10291 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010292 EXPECT_EQ("void f()\n"
10293 "{\n"
10294 " if (aaaaaaaaaaaaaaaa\n"
10295 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10296 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10297 " return;\n"
10298 "}",
10299 format("void f() {\n"
10300 "if (aaaaaaaaaaaaaaaa\n"
10301 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10302 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10303 "return;\n"
10304 "}",
10305 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010306
Daniel Jasper35995672014-04-29 14:05:20 +000010307 // Allow functions on a single line.
10308 verifyFormat("void f() { return; }", Style);
10309
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010310 // Constructor initializers are formatted one per line with the "," on the
10311 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010312 verifyFormat("Constructor()\n"
10313 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10314 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010315 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010316 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10317 "{\n"
10318 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010319 Style);
10320 verifyFormat("SomeClass::Constructor()\n"
10321 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010322 "{\n"
10323 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010324 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010325 EXPECT_EQ("SomeClass::Constructor()\n"
10326 " : a(a)\n"
10327 "{\n"
10328 "}",
10329 format("SomeClass::Constructor():a(a){}", Style));
10330 verifyFormat("SomeClass::Constructor()\n"
10331 " : a(a)\n"
10332 " , b(b)\n"
10333 " , c(c)\n"
10334 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010335 "}",
10336 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010337 verifyFormat("SomeClass::Constructor()\n"
10338 " : a(a)\n"
10339 "{\n"
10340 " foo();\n"
10341 " bar();\n"
10342 "}",
10343 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010344
Daniel Jasper65ee3472013-07-31 23:16:02 +000010345 // Access specifiers should be aligned left.
10346 verifyFormat("class C {\n"
10347 "public:\n"
10348 " int i;\n"
10349 "};",
10350 Style);
10351
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010352 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010353 verifyFormat("int a; // Do not\n"
10354 "double b; // align comments.",
10355 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010356
Daniel Jasper3219e432014-12-02 13:24:51 +000010357 // Do not align operands.
10358 EXPECT_EQ("ASSERT(aaaa\n"
10359 " || bbbb);",
10360 format("ASSERT ( aaaa\n||bbbb);", Style));
10361
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010362 // Accept input's line breaks.
10363 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10364 " || bbbbbbbbbbbbbbb) {\n"
10365 " i++;\n"
10366 "}",
10367 format("if (aaaaaaaaaaaaaaa\n"
10368 "|| bbbbbbbbbbbbbbb) { i++; }",
10369 Style));
10370 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10371 " i++;\n"
10372 "}",
10373 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010374
10375 // Don't automatically break all macro definitions (llvm.org/PR17842).
10376 verifyFormat("#define aNumber 10", Style);
10377 // However, generally keep the line breaks that the user authored.
10378 EXPECT_EQ("#define aNumber \\\n"
10379 " 10",
10380 format("#define aNumber \\\n"
10381 " 10",
10382 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010383
10384 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010385 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10386 " copyItems:YES];",
10387 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10388 "copyItems:YES];",
10389 Style));
10390 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10391 " copyItems:YES];",
10392 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10393 " copyItems:YES];",
10394 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010395 // FIXME: This does not seem right, there should be more indentation before
10396 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010397 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010398 " @\"a\",\n"
10399 " @\"a\"\n"
10400 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010401 " copyItems:YES];",
10402 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10403 " @\"a\",\n"
10404 " @\"a\"\n"
10405 " ]\n"
10406 " copyItems:YES];",
10407 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010408 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010409 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10410 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010411 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10412 " copyItems:YES];",
10413 Style));
10414
10415 verifyFormat("[self.a b:c c:d];", Style);
10416 EXPECT_EQ("[self.a b:c\n"
10417 " c:d];",
10418 format("[self.a b:c\n"
10419 "c:d];",
10420 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010421}
10422
Manuel Klimekffdeb592013-09-03 15:10:01 +000010423TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010424 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10425 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10426 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10427 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10428 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010429 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010430 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010431 verifyFormat("void f() {\n"
10432 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10433 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010434 verifyFormat("void f() {\n"
10435 " other(x.begin(), //\n"
10436 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010437 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010438 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010439 verifyFormat("SomeFunction([]() { // A cool function...\n"
10440 " return 43;\n"
10441 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010442 EXPECT_EQ("SomeFunction([]() {\n"
10443 "#define A a\n"
10444 " return 43;\n"
10445 "});",
10446 format("SomeFunction([](){\n"
10447 "#define A a\n"
10448 "return 43;\n"
10449 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010450 verifyFormat("void f() {\n"
10451 " SomeFunction([](decltype(x), A *a) {});\n"
10452 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010453 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10454 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010455 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10456 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10457 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010458 verifyFormat("Constructor()\n"
10459 " : Field([] { // comment\n"
10460 " int i;\n"
10461 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010462 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10463 " return some_parameter.size();\n"
10464 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010465 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10466 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010467 verifyFormat("int i = aaaaaa ? 1 //\n"
10468 " : [] {\n"
10469 " return 2; //\n"
10470 " }();");
10471 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10472 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10473 " return x == 2; // force break\n"
10474 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010475 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10476 " [=](int iiiiiiiiiiii) {\n"
10477 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10478 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10479 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010480 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010481 verifyFormat("SomeFunction({[&] {\n"
10482 " // comment\n"
10483 " },\n"
10484 " [&] {\n"
10485 " // comment\n"
10486 " }});");
10487 verifyFormat("SomeFunction({[&] {\n"
10488 " // comment\n"
10489 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010490 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10491 " [&]() { return true; },\n"
10492 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010493
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010494 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010495 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010496 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010497 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10498 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010499 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010500 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010501 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10502 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010503 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010504 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10505 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010506 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010507 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010508 verifyFormat(
10509 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10510 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10511 " return aaaaaaaaaaaaaaaaa;\n"
10512 " });",
10513 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010514 verifyFormat("[]() //\n"
10515 " -> int {\n"
10516 " return 1; //\n"
10517 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010518
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010519 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010520 verifyFormat("SomeFunction(\n"
10521 " []() {\n"
10522 " int i = 42;\n"
10523 " return i;\n"
10524 " },\n"
10525 " []() {\n"
10526 " int j = 43;\n"
10527 " return j;\n"
10528 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010529
Daniel Jasperda18fd82014-06-10 06:39:03 +000010530 // More complex introducers.
10531 verifyFormat("return [i, args...] {};");
10532
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010533 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010534 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010535 verifyFormat("double &operator[](int i) { return 0; }\n"
10536 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010537 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010538 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010539 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010540
10541 // Other corner cases.
10542 verifyFormat("void f() {\n"
10543 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010544 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010545 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010546
10547 // Lambdas created through weird macros.
10548 verifyFormat("void f() {\n"
10549 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010550 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010551 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010552
10553 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10554 " doo_dah();\n"
10555 " doo_dah();\n"
10556 " })) {\n"
10557 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010558 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10559 " doo_dah();\n"
10560 " doo_dah();\n"
10561 " })) {\n"
10562 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010563 verifyFormat("auto lambda = []() {\n"
10564 " int a = 2\n"
10565 "#if A\n"
10566 " + 2\n"
10567 "#endif\n"
10568 " ;\n"
10569 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010570
10571 // Lambdas with complex multiline introducers.
10572 verifyFormat(
10573 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10574 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10575 " -> ::std::unordered_set<\n"
10576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10577 " //\n"
10578 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010579}
10580
Manuel Klimek516e0542013-09-04 13:25:30 +000010581TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010582 FormatStyle ShortBlocks = getLLVMStyle();
10583 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10584 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10585 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10586 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10587 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10588 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10589 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010590
Daniel Jasper76284682014-10-22 09:12:44 +000010591 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10592 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10593 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010594
Daniel Jasper76284682014-10-22 09:12:44 +000010595 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010596 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010597 "}];");
10598 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010599 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010600 "}]};");
10601 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010602 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010603 "}];");
10604 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010605 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010606 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010607 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010608 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010609 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010610 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010611 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010612
10613 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010614 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010615 "}];",
10616 getLLVMStyleWithColumns(60));
10617 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010618 " NSString *path = [self sessionFilePath];\n"
10619 " if (path) {\n"
10620 " // ...\n"
10621 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010622 "});");
10623 verifyFormat("[[SessionService sharedService]\n"
10624 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010625 " if (window) {\n"
10626 " [self windowDidLoad:window];\n"
10627 " } else {\n"
10628 " [self errorLoadingWindow];\n"
10629 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010630 " }];");
10631 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010632 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010633 "};\n",
10634 getLLVMStyleWithColumns(40));
10635 verifyFormat("[[SessionService sharedService]\n"
10636 " loadWindowWithCompletionBlock: //\n"
10637 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010638 " if (window) {\n"
10639 " [self windowDidLoad:window];\n"
10640 " } else {\n"
10641 " [self errorLoadingWindow];\n"
10642 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010643 " }];",
10644 getLLVMStyleWithColumns(60));
10645 verifyFormat("[myObject doSomethingWith:arg1\n"
10646 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010647 " // ...\n"
10648 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010649 " }\n"
10650 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010651 " // ...\n"
10652 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010653 " }\n"
10654 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010655 " // ...\n"
10656 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010657 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010658 verifyFormat("[myObject doSomethingWith:arg1\n"
10659 " firstBlock:-1\n"
10660 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010661 " // ...\n"
10662 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010663 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010664
10665 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010666 " @autoreleasepool {\n"
10667 " if (a) {\n"
10668 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010669 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010670 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010671 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010672 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010673 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10674 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010675
10676 FormatStyle FourIndent = getLLVMStyle();
10677 FourIndent.ObjCBlockIndentWidth = 4;
10678 verifyFormat("[operation setCompletionBlock:^{\n"
10679 " [self onOperationDone];\n"
10680 "}];",
10681 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010682}
10683
Daniel Jasper289afc02015-04-23 09:23:17 +000010684TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10685 FormatStyle ZeroColumn = getLLVMStyle();
10686 ZeroColumn.ColumnLimit = 0;
10687
10688 verifyFormat("[[SessionService sharedService] "
10689 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10690 " if (window) {\n"
10691 " [self windowDidLoad:window];\n"
10692 " } else {\n"
10693 " [self errorLoadingWindow];\n"
10694 " }\n"
10695 "}];",
10696 ZeroColumn);
10697 EXPECT_EQ("[[SessionService sharedService]\n"
10698 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10699 " if (window) {\n"
10700 " [self windowDidLoad:window];\n"
10701 " } else {\n"
10702 " [self errorLoadingWindow];\n"
10703 " }\n"
10704 " }];",
10705 format("[[SessionService sharedService]\n"
10706 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10707 " if (window) {\n"
10708 " [self windowDidLoad:window];\n"
10709 " } else {\n"
10710 " [self errorLoadingWindow];\n"
10711 " }\n"
10712 "}];",
10713 ZeroColumn));
10714 verifyFormat("[myObject doSomethingWith:arg1\n"
10715 " firstBlock:^(Foo *a) {\n"
10716 " // ...\n"
10717 " int i;\n"
10718 " }\n"
10719 " secondBlock:^(Bar *b) {\n"
10720 " // ...\n"
10721 " int i;\n"
10722 " }\n"
10723 " thirdBlock:^Foo(Bar *b) {\n"
10724 " // ...\n"
10725 " int i;\n"
10726 " }];",
10727 ZeroColumn);
10728 verifyFormat("f(^{\n"
10729 " @autoreleasepool {\n"
10730 " if (a) {\n"
10731 " g();\n"
10732 " }\n"
10733 " }\n"
10734 "});",
10735 ZeroColumn);
10736 verifyFormat("void (^largeBlock)(void) = ^{\n"
10737 " // ...\n"
10738 "};",
10739 ZeroColumn);
10740
10741 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10742 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010743 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010744 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10745 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10746 " int i;\n"
10747 "};",
10748 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10749}
10750
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010751TEST_F(FormatTest, SupportsCRLF) {
10752 EXPECT_EQ("int a;\r\n"
10753 "int b;\r\n"
10754 "int c;\r\n",
10755 format("int a;\r\n"
10756 " int b;\r\n"
10757 " int c;\r\n",
10758 getLLVMStyle()));
10759 EXPECT_EQ("int a;\r\n"
10760 "int b;\r\n"
10761 "int c;\r\n",
10762 format("int a;\r\n"
10763 " int b;\n"
10764 " int c;\r\n",
10765 getLLVMStyle()));
10766 EXPECT_EQ("int a;\n"
10767 "int b;\n"
10768 "int c;\n",
10769 format("int a;\r\n"
10770 " int b;\n"
10771 " int c;\n",
10772 getLLVMStyle()));
10773 EXPECT_EQ("\"aaaaaaa \"\r\n"
10774 "\"bbbbbbb\";\r\n",
10775 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10776 EXPECT_EQ("#define A \\\r\n"
10777 " b; \\\r\n"
10778 " c; \\\r\n"
10779 " d;\r\n",
10780 format("#define A \\\r\n"
10781 " b; \\\r\n"
10782 " c; d; \r\n",
10783 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010784
10785 EXPECT_EQ("/*\r\n"
10786 "multi line block comments\r\n"
10787 "should not introduce\r\n"
10788 "an extra carriage return\r\n"
10789 "*/\r\n",
10790 format("/*\r\n"
10791 "multi line block comments\r\n"
10792 "should not introduce\r\n"
10793 "an extra carriage return\r\n"
10794 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010795}
10796
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010797TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10798 verifyFormat("MY_CLASS(C) {\n"
10799 " int i;\n"
10800 " int j;\n"
10801 "};");
10802}
10803
Daniel Jasper6633ab82013-10-18 10:38:14 +000010804TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10805 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10806 TwoIndent.ContinuationIndentWidth = 2;
10807
10808 EXPECT_EQ("int i =\n"
10809 " longFunction(\n"
10810 " arg);",
10811 format("int i = longFunction(arg);", TwoIndent));
10812
10813 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10814 SixIndent.ContinuationIndentWidth = 6;
10815
10816 EXPECT_EQ("int i =\n"
10817 " longFunction(\n"
10818 " arg);",
10819 format("int i = longFunction(arg);", SixIndent));
10820}
10821
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010822TEST_F(FormatTest, SpacesInAngles) {
10823 FormatStyle Spaces = getLLVMStyle();
10824 Spaces.SpacesInAngles = true;
10825
10826 verifyFormat("static_cast< int >(arg);", Spaces);
10827 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10828 verifyFormat("f< int, float >();", Spaces);
10829 verifyFormat("template <> g() {}", Spaces);
10830 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010831 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10832 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10833 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010834
10835 Spaces.Standard = FormatStyle::LS_Cpp03;
10836 Spaces.SpacesInAngles = true;
10837 verifyFormat("A< A< int > >();", Spaces);
10838
10839 Spaces.SpacesInAngles = false;
10840 verifyFormat("A<A<int> >();", Spaces);
10841
10842 Spaces.Standard = FormatStyle::LS_Cpp11;
10843 Spaces.SpacesInAngles = true;
10844 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010845
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010846 Spaces.SpacesInAngles = false;
10847 verifyFormat("A<A<int>>();", Spaces);
10848}
10849
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010850TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10851 FormatStyle Style = getLLVMStyle();
10852 Style.SpaceAfterTemplateKeyword = false;
10853 verifyFormat("template<int> void foo();", Style);
10854}
10855
Jacques Pienaarfc275112015-02-18 23:48:37 +000010856TEST_F(FormatTest, TripleAngleBrackets) {
10857 verifyFormat("f<<<1, 1>>>();");
10858 verifyFormat("f<<<1, 1, 1, s>>>();");
10859 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010860 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010861 verifyFormat("f<param><<<1, 1>>>();");
10862 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010863 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10865 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010866 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10867 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010868}
10869
10870TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010871 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010872 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010873 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10874 "aaallvm::outs() <<");
10875 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10876 "aaaallvm::outs()\n <<");
10877}
10878
Manuel Klimek819788d2014-03-18 11:22:45 +000010879TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10880 std::string code = "#if A\n"
10881 "#if B\n"
10882 "a.\n"
10883 "#endif\n"
10884 " a = 1;\n"
10885 "#else\n"
10886 "#endif\n"
10887 "#if C\n"
10888 "#else\n"
10889 "#endif\n";
10890 EXPECT_EQ(code, format(code));
10891}
10892
Manuel Klimek68b03042014-04-14 09:14:11 +000010893TEST_F(FormatTest, HandleConflictMarkers) {
10894 // Git/SVN conflict markers.
10895 EXPECT_EQ("int a;\n"
10896 "void f() {\n"
10897 " callme(some(parameter1,\n"
10898 "<<<<<<< text by the vcs\n"
10899 " parameter2),\n"
10900 "||||||| text by the vcs\n"
10901 " parameter2),\n"
10902 " parameter3,\n"
10903 "======= text by the vcs\n"
10904 " parameter2, parameter3),\n"
10905 ">>>>>>> text by the vcs\n"
10906 " otherparameter);\n",
10907 format("int a;\n"
10908 "void f() {\n"
10909 " callme(some(parameter1,\n"
10910 "<<<<<<< text by the vcs\n"
10911 " parameter2),\n"
10912 "||||||| text by the vcs\n"
10913 " parameter2),\n"
10914 " parameter3,\n"
10915 "======= text by the vcs\n"
10916 " parameter2,\n"
10917 " parameter3),\n"
10918 ">>>>>>> text by the vcs\n"
10919 " otherparameter);\n"));
10920
10921 // Perforce markers.
10922 EXPECT_EQ("void f() {\n"
10923 " function(\n"
10924 ">>>> text by the vcs\n"
10925 " parameter,\n"
10926 "==== text by the vcs\n"
10927 " parameter,\n"
10928 "==== text by the vcs\n"
10929 " parameter,\n"
10930 "<<<< text by the vcs\n"
10931 " parameter);\n",
10932 format("void f() {\n"
10933 " function(\n"
10934 ">>>> text by the vcs\n"
10935 " parameter,\n"
10936 "==== text by the vcs\n"
10937 " parameter,\n"
10938 "==== text by the vcs\n"
10939 " parameter,\n"
10940 "<<<< text by the vcs\n"
10941 " parameter);\n"));
10942
10943 EXPECT_EQ("<<<<<<<\n"
10944 "|||||||\n"
10945 "=======\n"
10946 ">>>>>>>",
10947 format("<<<<<<<\n"
10948 "|||||||\n"
10949 "=======\n"
10950 ">>>>>>>"));
10951
10952 EXPECT_EQ("<<<<<<<\n"
10953 "|||||||\n"
10954 "int i;\n"
10955 "=======\n"
10956 ">>>>>>>",
10957 format("<<<<<<<\n"
10958 "|||||||\n"
10959 "int i;\n"
10960 "=======\n"
10961 ">>>>>>>"));
10962
10963 // FIXME: Handle parsing of macros around conflict markers correctly:
10964 EXPECT_EQ("#define Macro \\\n"
10965 "<<<<<<<\n"
10966 "Something \\\n"
10967 "|||||||\n"
10968 "Else \\\n"
10969 "=======\n"
10970 "Other \\\n"
10971 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010972 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010973 format("#define Macro \\\n"
10974 "<<<<<<<\n"
10975 " Something \\\n"
10976 "|||||||\n"
10977 " Else \\\n"
10978 "=======\n"
10979 " Other \\\n"
10980 ">>>>>>>\n"
10981 " End\n"
10982 "int i;\n"));
10983}
10984
Daniel Jasper471894432014-08-06 13:40:26 +000010985TEST_F(FormatTest, DisableRegions) {
10986 EXPECT_EQ("int i;\n"
10987 "// clang-format off\n"
10988 " int j;\n"
10989 "// clang-format on\n"
10990 "int k;",
10991 format(" int i;\n"
10992 " // clang-format off\n"
10993 " int j;\n"
10994 " // clang-format on\n"
10995 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010996 EXPECT_EQ("int i;\n"
10997 "/* clang-format off */\n"
10998 " int j;\n"
10999 "/* clang-format on */\n"
11000 "int k;",
11001 format(" int i;\n"
11002 " /* clang-format off */\n"
11003 " int j;\n"
11004 " /* clang-format on */\n"
11005 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011006
11007 // Don't reflow comments within disabled regions.
11008 EXPECT_EQ(
11009 "// clang-format off\n"
11010 "// long long long long long long line\n"
11011 "/* clang-format on */\n"
11012 "/* long long long\n"
11013 " * long long long\n"
11014 " * line */\n"
11015 "int i;\n"
11016 "/* clang-format off */\n"
11017 "/* long long long long long long line */\n",
11018 format("// clang-format off\n"
11019 "// long long long long long long line\n"
11020 "/* clang-format on */\n"
11021 "/* long long long long long long line */\n"
11022 "int i;\n"
11023 "/* clang-format off */\n"
11024 "/* long long long long long long line */\n",
11025 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011026}
11027
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011028TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11029 format("? ) =");
11030 verifyNoCrash("#define a\\\n /**/}");
11031}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011032
Daniel Jasper498f5582015-12-25 08:53:31 +000011033TEST_F(FormatTest, FormatsTableGenCode) {
11034 FormatStyle Style = getLLVMStyle();
11035 Style.Language = FormatStyle::LK_TableGen;
11036 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11037}
11038
Nico Weberb2673a12016-11-10 21:49:25 +000011039TEST_F(FormatTest, ArrayOfTemplates) {
11040 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11041 format("auto a = new unique_ptr<int > [ 10];"));
11042
11043 FormatStyle Spaces = getLLVMStyle();
11044 Spaces.SpacesInSquareBrackets = true;
11045 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11046 format("auto a = new unique_ptr<int > [10];", Spaces));
11047}
11048
11049TEST_F(FormatTest, ArrayAsTemplateType) {
11050 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11051 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11052
11053 FormatStyle Spaces = getLLVMStyle();
11054 Spaces.SpacesInSquareBrackets = true;
11055 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11056 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11057}
11058
Martin Probstc9c51c42017-03-16 10:21:35 +000011059TEST_F(FormatTest, NoSpaceAfterSuper) {
11060 verifyFormat("__super::FooBar();");
11061}
11062
Eric Liu547d8792016-03-24 13:22:42 +000011063TEST(FormatStyle, GetStyleOfFile) {
11064 vfs::InMemoryFileSystem FS;
11065 // Test 1: format file in the same directory.
11066 ASSERT_TRUE(
11067 FS.addFile("/a/.clang-format", 0,
11068 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11069 ASSERT_TRUE(
11070 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011071 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011072 ASSERT_TRUE((bool)Style1);
11073 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011074
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011075 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011076 ASSERT_TRUE(
11077 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011078 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011079 ASSERT_TRUE((bool)Style2);
11080 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011081
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011082 // Test 2.2: no format on 'none' fallback style.
11083 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11084 ASSERT_TRUE((bool)Style2);
11085 ASSERT_EQ(*Style2, getNoStyle());
11086
11087 // Test 2.3: format if config is found with no based style while fallback is
11088 // 'none'.
11089 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11090 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11091 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11092 ASSERT_TRUE((bool)Style2);
11093 ASSERT_EQ(*Style2, getLLVMStyle());
11094
11095 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11096 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11097 ASSERT_TRUE((bool)Style2);
11098 ASSERT_EQ(*Style2, getLLVMStyle());
11099
Eric Liu547d8792016-03-24 13:22:42 +000011100 // Test 3: format file in parent directory.
11101 ASSERT_TRUE(
11102 FS.addFile("/c/.clang-format", 0,
11103 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11104 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11105 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011106 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011107 ASSERT_TRUE((bool)Style3);
11108 ASSERT_EQ(*Style3, getGoogleStyle());
11109
11110 // Test 4: error on invalid fallback style
11111 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11112 ASSERT_FALSE((bool)Style4);
11113 llvm::consumeError(Style4.takeError());
11114
11115 // Test 5: error on invalid yaml on command line
11116 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11117 ASSERT_FALSE((bool)Style5);
11118 llvm::consumeError(Style5.takeError());
11119
11120 // Test 6: error on invalid style
11121 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11122 ASSERT_FALSE((bool)Style6);
11123 llvm::consumeError(Style6.takeError());
11124
11125 // Test 7: found config file, error on parsing it
11126 ASSERT_TRUE(
11127 FS.addFile("/d/.clang-format", 0,
11128 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11129 "InvalidKey: InvalidValue")));
11130 ASSERT_TRUE(
11131 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11132 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11133 ASSERT_FALSE((bool)Style7);
11134 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011135}
11136
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011137TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11138 // Column limit is 20.
11139 std::string Code = "Type *a =\n"
11140 " new Type();\n"
11141 "g(iiiii, 0, jjjjj,\n"
11142 " 0, kkkkk, 0, mm);\n"
11143 "int bad = format ;";
11144 std::string Expected = "auto a = new Type();\n"
11145 "g(iiiii, nullptr,\n"
11146 " jjjjj, nullptr,\n"
11147 " kkkkk, nullptr,\n"
11148 " mm);\n"
11149 "int bad = format ;";
11150 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011151 tooling::Replacements Replaces = toReplacements(
11152 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11153 "auto "),
11154 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11155 "nullptr"),
11156 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11157 "nullptr"),
11158 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11159 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011160
11161 format::FormatStyle Style = format::getLLVMStyle();
11162 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011163 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11164 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11165 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11166 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11167 EXPECT_TRUE(static_cast<bool>(Result));
11168 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011169}
11170
Eric Liubaf58c22016-05-18 13:43:48 +000011171TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11172 std::string Code = "#include \"a.h\"\n"
11173 "#include \"c.h\"\n"
11174 "\n"
11175 "int main() {\n"
11176 " return 0;\n"
11177 "}";
11178 std::string Expected = "#include \"a.h\"\n"
11179 "#include \"b.h\"\n"
11180 "#include \"c.h\"\n"
11181 "\n"
11182 "int main() {\n"
11183 " return 0;\n"
11184 "}";
11185 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011186 tooling::Replacements Replaces = toReplacements(
11187 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11188 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011189
11190 format::FormatStyle Style = format::getLLVMStyle();
11191 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011192 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11193 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11194 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11195 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11196 EXPECT_TRUE(static_cast<bool>(Result));
11197 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011198}
11199
Krasimir Georgievac16a202017-06-23 11:46:03 +000011200TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11201 EXPECT_EQ("using std::cin;\n"
11202 "using std::cout;",
11203 format("using std::cout;\n"
11204 "using std::cin;", getGoogleStyle()));
11205}
11206
Nico Weberdc065182017-04-05 18:10:42 +000011207TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11208 format::FormatStyle Style = format::getLLVMStyle();
11209 Style.Standard = FormatStyle::LS_Cpp03;
11210 // cpp03 recognize this string as identifier u8 and literal character 'a'
11211 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11212}
11213
11214TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11215 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11216 // all modes, including C++11, C++14 and C++17
11217 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11218}
11219
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011220} // end namespace
11221} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011222} // end namespace clang