blob: 7fbf01dc129b62320fbcfbc56ce6285c168fdeab [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();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000442 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000443 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
444
445 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
446 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
447
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000448 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
449 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
450 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
451
Daniel Jasper17605d32014-05-14 09:33:35 +0000452 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000453 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000454 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
455 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
456 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000457 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000458 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
459 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000460 verifyFormat("if (true) {\n"
461 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
462 "}",
463 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000464 verifyFormat("if (true) { //\n"
465 " f();\n"
466 "}",
467 AllowSimpleBracedStatements);
468 verifyFormat("if (true) {\n"
469 " f();\n"
470 " f();\n"
471 "}",
472 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000473 verifyFormat("if (true) {\n"
474 " f();\n"
475 "} else {\n"
476 " f();\n"
477 "}",
478 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000479
Daniel Jasperf92659e2017-06-19 07:45:41 +0000480 verifyFormat("struct A2 {\n"
481 " int X;\n"
482 "};",
483 AllowSimpleBracedStatements);
484 verifyFormat("typedef struct A2 {\n"
485 " int X;\n"
486 "} A2_t;",
487 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000488 verifyFormat("template <int> struct A2 {\n"
489 " struct B {};\n"
490 "};",
491 AllowSimpleBracedStatements);
492
Daniel Jasper17605d32014-05-14 09:33:35 +0000493 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000494 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000495 verifyFormat("if (true) {\n"
496 " f();\n"
497 "}",
498 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000499 verifyFormat("if (true) {\n"
500 " f();\n"
501 "} else {\n"
502 " f();\n"
503 "}",
504 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000505
506 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000507 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000508 verifyFormat("while (true) {\n"
509 " f();\n"
510 "}",
511 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000512 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000513 verifyFormat("for (;;) {\n"
514 " f();\n"
515 "}",
516 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000517
518 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
519 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
520 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
521
522 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
523 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
524 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
525 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
526 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
527 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
528 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
529 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
530 verifyFormat("if (true)\n"
531 "{\n"
532 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
533 "}",
534 AllowSimpleBracedStatements);
535 verifyFormat("if (true)\n"
536 "{ //\n"
537 " f();\n"
538 "}",
539 AllowSimpleBracedStatements);
540 verifyFormat("if (true)\n"
541 "{\n"
542 " f();\n"
543 " f();\n"
544 "}",
545 AllowSimpleBracedStatements);
546 verifyFormat("if (true)\n"
547 "{\n"
548 " f();\n"
549 "} else\n"
550 "{\n"
551 " f();\n"
552 "}",
553 AllowSimpleBracedStatements);
554
555 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
556 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
557 verifyFormat("if (true)\n"
558 "{\n"
559 " f();\n"
560 "}",
561 AllowSimpleBracedStatements);
562 verifyFormat("if (true)\n"
563 "{\n"
564 " f();\n"
565 "} else\n"
566 "{\n"
567 " f();\n"
568 "}",
569 AllowSimpleBracedStatements);
570
571 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
572 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
573 verifyFormat("while (true)\n"
574 "{\n"
575 " f();\n"
576 "}",
577 AllowSimpleBracedStatements);
578 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
579 verifyFormat("for (;;)\n"
580 "{\n"
581 " f();\n"
582 "}",
583 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000584}
585
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000586TEST_F(FormatTest, ParseIfElse) {
587 verifyFormat("if (true)\n"
588 " if (true)\n"
589 " if (true)\n"
590 " f();\n"
591 " else\n"
592 " g();\n"
593 " else\n"
594 " h();\n"
595 "else\n"
596 " i();");
597 verifyFormat("if (true)\n"
598 " if (true)\n"
599 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000600 " if (true)\n"
601 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000602 " } else {\n"
603 " g();\n"
604 " }\n"
605 " else\n"
606 " h();\n"
607 "else {\n"
608 " i();\n"
609 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000610 verifyFormat("if (true)\n"
611 " if constexpr (true)\n"
612 " if (true) {\n"
613 " if constexpr (true)\n"
614 " f();\n"
615 " } else {\n"
616 " g();\n"
617 " }\n"
618 " else\n"
619 " h();\n"
620 "else {\n"
621 " i();\n"
622 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000623 verifyFormat("void f() {\n"
624 " if (a) {\n"
625 " } else {\n"
626 " }\n"
627 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628}
629
630TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000631 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000632 verifyFormat("if (a)\n"
633 " f();\n"
634 "else if (b)\n"
635 " g();\n"
636 "else\n"
637 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000638 verifyFormat("if constexpr (a)\n"
639 " f();\n"
640 "else if constexpr (b)\n"
641 " g();\n"
642 "else\n"
643 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000644 verifyFormat("if (a) {\n"
645 " f();\n"
646 "}\n"
647 "// or else ..\n"
648 "else {\n"
649 " g()\n"
650 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000651
652 verifyFormat("if (a) {\n"
653 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
655 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000656 verifyFormat("if (a) {\n"
657 "} else if (\n"
658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
659 "}",
660 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000661 verifyFormat("if (a) {\n"
662 "} else if constexpr (\n"
663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
664 "}",
665 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000666}
667
Daniel Jasperf7935112012-12-03 18:12:45 +0000668TEST_F(FormatTest, FormatsForLoop) {
669 verifyFormat(
670 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000671 " ++VeryVeryLongLoopVariable)\n"
672 " ;");
673 verifyFormat("for (;;)\n"
674 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000675 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000676 verifyFormat("for (;;) {\n"
677 " f();\n"
678 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000679 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000680
681 verifyFormat(
682 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
683 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000684 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000685
686 verifyFormat(
687 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000688 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000689 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
690 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000691 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000692 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
693 " I = FD->getDeclsInPrototypeScope().begin(),\n"
694 " E = FD->getDeclsInPrototypeScope().end();\n"
695 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000696 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
697 " I = Container.begin(),\n"
698 " E = Container.end();\n"
699 " I != E; ++I) {\n}",
700 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000701
Daniel Jasper48c62f92013-01-28 17:30:17 +0000702 verifyFormat(
703 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000707 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000708 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
709 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
710 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000711 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
712 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
713 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000714 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
715 " aaaaaaaaaa);\n"
716 " iter; ++iter) {\n"
717 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000718 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
720 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
721 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000722
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000723 FormatStyle NoBinPacking = getLLVMStyle();
724 NoBinPacking.BinPackParameters = false;
725 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
726 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
727 " aaaaaaaaaaaaaaaa,\n"
728 " aaaaaaaaaaaaaaaa,\n"
729 " aaaaaaaaaaaaaaaa);\n"
730 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
731 "}",
732 NoBinPacking);
733 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000734 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
735 " E = UnwrappedLines.end();\n"
736 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000737 " ++I) {\n}",
738 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000739
740 FormatStyle AlignLeft = getLLVMStyle();
741 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
742 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000743}
744
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000745TEST_F(FormatTest, RangeBasedForLoops) {
746 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
748 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
749 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000750 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000752 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
753 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000754}
755
Daniel Jaspere1e43192014-04-01 12:55:11 +0000756TEST_F(FormatTest, ForEachLoops) {
757 verifyFormat("void f() {\n"
758 " foreach (Item *item, itemlist) {}\n"
759 " Q_FOREACH (Item *item, itemlist) {}\n"
760 " BOOST_FOREACH (Item *item, itemlist) {}\n"
761 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
762 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000763
764 // As function-like macros.
765 verifyFormat("#define foreach(x, y)\n"
766 "#define Q_FOREACH(x, y)\n"
767 "#define BOOST_FOREACH(x, y)\n"
768 "#define UNKNOWN_FOREACH(x, y)\n");
769
770 // Not as function-like macros.
771 verifyFormat("#define foreach (x, y)\n"
772 "#define Q_FOREACH (x, y)\n"
773 "#define BOOST_FOREACH (x, y)\n"
774 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000775}
776
Daniel Jasperf7935112012-12-03 18:12:45 +0000777TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000778 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000779 verifyFormat("while (true)\n"
780 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000781 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000782 verifyFormat("while () {\n"
783 " f();\n"
784 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000785}
786
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000787TEST_F(FormatTest, FormatsDoWhile) {
788 verifyFormat("do {\n"
789 " do_something();\n"
790 "} while (something());");
791 verifyFormat("do\n"
792 " do_something();\n"
793 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000794}
795
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000796TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000797 verifyFormat("switch (x) {\n"
798 "case 1:\n"
799 " f();\n"
800 " break;\n"
801 "case kFoo:\n"
802 "case ns::kBar:\n"
803 "case kBaz:\n"
804 " break;\n"
805 "default:\n"
806 " g();\n"
807 " break;\n"
808 "}");
809 verifyFormat("switch (x) {\n"
810 "case 1: {\n"
811 " f();\n"
812 " break;\n"
813 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000814 "case 2: {\n"
815 " break;\n"
816 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000817 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000818 verifyFormat("switch (x) {\n"
819 "case 1: {\n"
820 " f();\n"
821 " {\n"
822 " g();\n"
823 " h();\n"
824 " }\n"
825 " break;\n"
826 "}\n"
827 "}");
828 verifyFormat("switch (x) {\n"
829 "case 1: {\n"
830 " f();\n"
831 " if (foo) {\n"
832 " g();\n"
833 " h();\n"
834 " }\n"
835 " break;\n"
836 "}\n"
837 "}");
838 verifyFormat("switch (x) {\n"
839 "case 1: {\n"
840 " f();\n"
841 " g();\n"
842 "} break;\n"
843 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000844 verifyFormat("switch (test)\n"
845 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000846 verifyFormat("switch (x) {\n"
847 "default: {\n"
848 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000849 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000850 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000851 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000852 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000853 "// if 1, do f()\n"
854 "case 1:\n"
855 " f();\n"
856 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000857 verifyFormat("switch (x) {\n"
858 "case 1:\n"
859 " // Do amazing stuff\n"
860 " {\n"
861 " f();\n"
862 " g();\n"
863 " }\n"
864 " break;\n"
865 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000866 verifyFormat("#define A \\\n"
867 " switch (x) { \\\n"
868 " case a: \\\n"
869 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000870 " }",
871 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000872 verifyFormat("#define OPERATION_CASE(name) \\\n"
873 " case OP_name: \\\n"
874 " return operations::Operation##name\n",
875 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000876 verifyFormat("switch (x) {\n"
877 "case 1:;\n"
878 "default:;\n"
879 " int i;\n"
880 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000881
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000882 verifyGoogleFormat("switch (x) {\n"
883 " case 1:\n"
884 " f();\n"
885 " break;\n"
886 " case kFoo:\n"
887 " case ns::kBar:\n"
888 " case kBaz:\n"
889 " break;\n"
890 " default:\n"
891 " g();\n"
892 " break;\n"
893 "}");
894 verifyGoogleFormat("switch (x) {\n"
895 " case 1: {\n"
896 " f();\n"
897 " break;\n"
898 " }\n"
899 "}");
900 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000901 " ;");
902
903 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
904 " case OP_name: \\\n"
905 " return operations::Operation##name\n");
906 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
907 " // Get the correction operation class.\n"
908 " switch (OpCode) {\n"
909 " CASE(Add);\n"
910 " CASE(Subtract);\n"
911 " default:\n"
912 " return operations::Unknown;\n"
913 " }\n"
914 "#undef OPERATION_CASE\n"
915 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000916 verifyFormat("DEBUG({\n"
917 " switch (x) {\n"
918 " case A:\n"
919 " f();\n"
920 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000921 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000922 " case B:\n"
923 " g();\n"
924 " break;\n"
925 " }\n"
926 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000927 EXPECT_EQ("DEBUG({\n"
928 " switch (x) {\n"
929 " case A:\n"
930 " f();\n"
931 " break;\n"
932 " // On B:\n"
933 " case B:\n"
934 " g();\n"
935 " break;\n"
936 " }\n"
937 "});",
938 format("DEBUG({\n"
939 " switch (x) {\n"
940 " case A:\n"
941 " f();\n"
942 " break;\n"
943 " // On B:\n"
944 " case B:\n"
945 " g();\n"
946 " break;\n"
947 " }\n"
948 "});",
949 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000950 verifyFormat("switch (a) {\n"
951 "case (b):\n"
952 " return;\n"
953 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000954
955 verifyFormat("switch (a) {\n"
956 "case some_namespace::\n"
957 " some_constant:\n"
958 " return;\n"
959 "}",
960 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000961}
962
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000963TEST_F(FormatTest, CaseRanges) {
964 verifyFormat("switch (x) {\n"
965 "case 'A' ... 'Z':\n"
966 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000967 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000968 " break;\n"
969 "}");
970}
971
Daniel Jasperb87899b2014-09-10 13:11:45 +0000972TEST_F(FormatTest, ShortCaseLabels) {
973 FormatStyle Style = getLLVMStyle();
974 Style.AllowShortCaseLabelsOnASingleLine = true;
975 verifyFormat("switch (a) {\n"
976 "case 1: x = 1; break;\n"
977 "case 2: return;\n"
978 "case 3:\n"
979 "case 4:\n"
980 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000981 "case 6: // comment\n"
982 " return;\n"
983 "case 7:\n"
984 " // comment\n"
985 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000986 "case 8:\n"
987 " x = 8; // comment\n"
988 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000989 "default: y = 1; break;\n"
990 "}",
991 Style);
992 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +0000993 "case 0: return; // comment\n"
994 "case 1: break; // comment\n"
995 "case 2: return;\n"
996 "// comment\n"
997 "case 3: return;\n"
998 "// comment 1\n"
999 "// comment 2\n"
1000 "// comment 3\n"
1001 "case 4: break; /* comment */\n"
1002 "case 5:\n"
1003 " // comment\n"
1004 " break;\n"
1005 "case 6: /* comment */ x = 1; break;\n"
1006 "case 7: x = /* comment */ 1; break;\n"
1007 "case 8:\n"
1008 " x = 1; /* comment */\n"
1009 " break;\n"
1010 "case 9:\n"
1011 " break; // comment line 1\n"
1012 " // comment line 2\n"
1013 "}",
1014 Style);
1015 EXPECT_EQ("switch (a) {\n"
1016 "case 1:\n"
1017 " x = 8;\n"
1018 " // fall through\n"
1019 "case 2: x = 8;\n"
1020 "// comment\n"
1021 "case 3:\n"
1022 " return; /* comment line 1\n"
1023 " * comment line 2 */\n"
1024 "case 4: i = 8;\n"
1025 "// something else\n"
1026 "#if FOO\n"
1027 "case 5: break;\n"
1028 "#endif\n"
1029 "}",
1030 format("switch (a) {\n"
1031 "case 1: x = 8;\n"
1032 " // fall through\n"
1033 "case 2:\n"
1034 " x = 8;\n"
1035 "// comment\n"
1036 "case 3:\n"
1037 " return; /* comment line 1\n"
1038 " * comment line 2 */\n"
1039 "case 4:\n"
1040 " i = 8;\n"
1041 "// something else\n"
1042 "#if FOO\n"
1043 "case 5: break;\n"
1044 "#endif\n"
1045 "}",
1046 Style));
1047 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1048 " return; // long long long long long long long long long long long long comment\n"
1049 " // line\n" "}",
1050 format("switch (a) {\n"
1051 "case 0: return; // long long long long long long long long long long long long comment line\n"
1052 "}",
1053 Style));
1054 EXPECT_EQ("switch (a) {\n"
1055 "case 0:\n"
1056 " return; /* long long long long long long long long long long long long comment\n"
1057 " line */\n"
1058 "}",
1059 format("switch (a) {\n"
1060 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1061 "}",
1062 Style));
1063 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001064 "#if FOO\n"
1065 "case 0: return 0;\n"
1066 "#endif\n"
1067 "}",
1068 Style);
1069 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001070 "case 1: {\n"
1071 "}\n"
1072 "case 2: {\n"
1073 " return;\n"
1074 "}\n"
1075 "case 3: {\n"
1076 " x = 1;\n"
1077 " return;\n"
1078 "}\n"
1079 "case 4:\n"
1080 " if (x)\n"
1081 " return;\n"
1082 "}",
1083 Style);
1084 Style.ColumnLimit = 21;
1085 verifyFormat("switch (a) {\n"
1086 "case 1: x = 1; break;\n"
1087 "case 2: return;\n"
1088 "case 3:\n"
1089 "case 4:\n"
1090 "case 5: return;\n"
1091 "default:\n"
1092 " y = 1;\n"
1093 " break;\n"
1094 "}",
1095 Style);
1096}
1097
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001098TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001099 verifyFormat("void f() {\n"
1100 " some_code();\n"
1101 "test_label:\n"
1102 " some_other_code();\n"
1103 " {\n"
1104 " some_more_code();\n"
1105 " another_label:\n"
1106 " some_more_code();\n"
1107 " }\n"
1108 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001109 verifyFormat("{\n"
1110 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001111 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001112 " some_other_code();\n"
1113 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001114 verifyFormat("{\n"
1115 " some_code();\n"
1116 "test_label:;\n"
1117 " int i = 0;\n"
1118 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001119}
1120
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001121//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001122// Tests for classes, namespaces, etc.
1123//===----------------------------------------------------------------------===//
1124
1125TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001126 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001127}
1128
1129TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1130 verifyFormat("class A {\n"
1131 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001132 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001133 "protected:\n"
1134 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001135 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001136 "};");
1137 verifyGoogleFormat("class A {\n"
1138 " public:\n"
1139 " protected:\n"
1140 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001141 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001142 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001143 verifyFormat("class A {\n"
1144 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001145 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001146 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001147 " void f2() {}\n"
1148 "protected slots:\n"
1149 " void f3() {}\n"
1150 "protected Q_SLOTS:\n"
1151 " void f4() {}\n"
1152 "private slots:\n"
1153 " void f5() {}\n"
1154 "private Q_SLOTS:\n"
1155 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001156 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001157 " void g1();\n"
1158 "Q_SIGNALS:\n"
1159 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001160 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001161
1162 // Don't interpret 'signals' the wrong way.
1163 verifyFormat("signals.set();");
1164 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001165 verifyFormat("{\n"
1166 " signals.set(); // This needs indentation.\n"
1167 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001168 verifyFormat("void f() {\n"
1169 "label:\n"
1170 " signals.baz();\n"
1171 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001172}
1173
Alexander Kornienkofd433362013-03-27 17:08:02 +00001174TEST_F(FormatTest, SeparatesLogicalBlocks) {
1175 EXPECT_EQ("class A {\n"
1176 "public:\n"
1177 " void f();\n"
1178 "\n"
1179 "private:\n"
1180 " void g() {}\n"
1181 " // test\n"
1182 "protected:\n"
1183 " int h;\n"
1184 "};",
1185 format("class A {\n"
1186 "public:\n"
1187 "void f();\n"
1188 "private:\n"
1189 "void g() {}\n"
1190 "// test\n"
1191 "protected:\n"
1192 "int h;\n"
1193 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001194 EXPECT_EQ("class A {\n"
1195 "protected:\n"
1196 "public:\n"
1197 " void f();\n"
1198 "};",
1199 format("class A {\n"
1200 "protected:\n"
1201 "\n"
1202 "public:\n"
1203 "\n"
1204 " void f();\n"
1205 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001206
1207 // Even ensure proper spacing inside macros.
1208 EXPECT_EQ("#define B \\\n"
1209 " class A { \\\n"
1210 " protected: \\\n"
1211 " public: \\\n"
1212 " void f(); \\\n"
1213 " };",
1214 format("#define B \\\n"
1215 " class A { \\\n"
1216 " protected: \\\n"
1217 " \\\n"
1218 " public: \\\n"
1219 " \\\n"
1220 " void f(); \\\n"
1221 " };",
1222 getGoogleStyle()));
1223 // But don't remove empty lines after macros ending in access specifiers.
1224 EXPECT_EQ("#define A private:\n"
1225 "\n"
1226 "int i;",
1227 format("#define A private:\n"
1228 "\n"
1229 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001230}
1231
Daniel Jasper83193602013-04-05 17:22:09 +00001232TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001233 verifyFormat("class A : public B {};");
1234 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001235
1236 verifyFormat(
1237 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001238 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001239 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1240 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001241 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001242 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001243 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001244 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1245 " public C,\n"
1246 " public D,\n"
1247 " public E,\n"
1248 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001249 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001250
1251 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001252 " ReallyReallyLongClassName {\n"
1253 " int i;\n"
1254 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001255 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001256 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1257 " aaaaaaaaaaaaaaaa> {};");
1258 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1259 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1260 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001261 verifyFormat("template <class R, class C>\n"
1262 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1263 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001264 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001265}
1266
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001267TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1268 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1269 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1270
1271 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1272 verifyFormat("class MyClass\n"
1273 " : public X\n"
1274 " , public Y {};",
1275 StyleWithInheritanceBreak);
1276}
1277
Manuel Klimek28cacc72013-01-07 18:10:23 +00001278TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001279 verifyFormat("class A {\n} a, b;");
1280 verifyFormat("struct A {\n} a, b;");
1281 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001282}
1283
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001284TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001285 verifyFormat("enum {\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 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001293 verifyGoogleFormat("enum {\n"
1294 " Zero,\n"
1295 " One = 1,\n"
1296 " Two = One + 1,\n"
1297 " Three = (One + Two),\n"
1298 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1299 " Five = (One, Two, Three, Four, 5)\n"
1300 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001301 verifyFormat("enum Enum {};");
1302 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001303 verifyFormat("enum X E {} d;");
1304 verifyFormat("enum __attribute__((...)) E {} d;");
1305 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001306 verifyFormat("enum {\n"
1307 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001308 "};",
1309 getLLVMStyleWithColumns(30));
1310
1311 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001312 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001313
1314 EXPECT_EQ("enum KeepEmptyLines {\n"
1315 " ONE,\n"
1316 "\n"
1317 " TWO,\n"
1318 "\n"
1319 " THREE\n"
1320 "}",
1321 format("enum KeepEmptyLines {\n"
1322 " ONE,\n"
1323 "\n"
1324 " TWO,\n"
1325 "\n"
1326 "\n"
1327 " THREE\n"
1328 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001329 verifyFormat("enum E { // comment\n"
1330 " ONE,\n"
1331 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001332 "};\n"
1333 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001334 // Not enums.
1335 verifyFormat("enum X f() {\n"
1336 " a();\n"
1337 " return 42;\n"
1338 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001339 verifyFormat("enum X Type::f() {\n"
1340 " a();\n"
1341 " return 42;\n"
1342 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001343 verifyFormat("enum ::X f() {\n"
1344 " a();\n"
1345 " return 42;\n"
1346 "}");
1347 verifyFormat("enum ns::X f() {\n"
1348 " a();\n"
1349 " return 42;\n"
1350 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001351}
1352
Daniel Jasperb7150872013-08-30 10:10:19 +00001353TEST_F(FormatTest, FormatsEnumsWithErrors) {
1354 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001355 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001356 " Two = 1;\n"
1357 "};");
1358 verifyFormat("namespace n {\n"
1359 "enum Type {\n"
1360 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001361 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001362 " int i;\n"
1363 "}\n"
1364 "void g() {}");
1365}
1366
Daniel Jasper2b41a822013-08-20 12:42:50 +00001367TEST_F(FormatTest, FormatsEnumStruct) {
1368 verifyFormat("enum struct {\n"
1369 " Zero,\n"
1370 " One = 1,\n"
1371 " Two = One + 1,\n"
1372 " Three = (One + Two),\n"
1373 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1374 " Five = (One, Two, Three, Four, 5)\n"
1375 "};");
1376 verifyFormat("enum struct Enum {};");
1377 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001378 verifyFormat("enum struct X E {} d;");
1379 verifyFormat("enum struct __attribute__((...)) E {} d;");
1380 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001381 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1382}
1383
1384TEST_F(FormatTest, FormatsEnumClass) {
1385 verifyFormat("enum class {\n"
1386 " Zero,\n"
1387 " One = 1,\n"
1388 " Two = One + 1,\n"
1389 " Three = (One + Two),\n"
1390 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1391 " Five = (One, Two, Three, Four, 5)\n"
1392 "};");
1393 verifyFormat("enum class Enum {};");
1394 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001395 verifyFormat("enum class X E {} d;");
1396 verifyFormat("enum class __attribute__((...)) E {} d;");
1397 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001398 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1399}
1400
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001401TEST_F(FormatTest, FormatsEnumTypes) {
1402 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001403 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001404 " B\n"
1405 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001406 verifyFormat("enum X : int { A, B };");
1407 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001408}
1409
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001410TEST_F(FormatTest, FormatsTypedefEnum) {
1411 FormatStyle Style = getLLVMStyle();
1412 Style.ColumnLimit = 40;
1413 verifyFormat("typedef enum {} EmptyEnum;");
1414 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1415 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001416 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001417 " ONE = 1,\n"
1418 " TWO = 2,\n"
1419 " THREE = 3\n"
1420 "} LongEnum;",
1421 Style);
1422 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1423 Style.BraceWrapping.AfterEnum = true;
1424 verifyFormat("typedef enum {} EmptyEnum;");
1425 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1426 verifyFormat("typedef enum\n"
1427 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001428 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001429 " ONE = 1,\n"
1430 " TWO = 2,\n"
1431 " THREE = 3\n"
1432 "} LongEnum;",
1433 Style);
1434}
1435
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001436TEST_F(FormatTest, FormatsNSEnums) {
1437 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1438 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1439 " // Information about someDecentlyLongValue.\n"
1440 " someDecentlyLongValue,\n"
1441 " // Information about anotherDecentlyLongValue.\n"
1442 " anotherDecentlyLongValue,\n"
1443 " // Information about aThirdDecentlyLongValue.\n"
1444 " aThirdDecentlyLongValue\n"
1445 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001446 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1447 " a = 1,\n"
1448 " b = 2,\n"
1449 " c = 3,\n"
1450 "};");
1451 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1452 " a = 1,\n"
1453 " b = 2,\n"
1454 " c = 3,\n"
1455 "};");
1456 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1457 " a = 1,\n"
1458 " b = 2,\n"
1459 " c = 3,\n"
1460 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001461}
1462
Nico Weber7769a902013-01-14 05:49:49 +00001463TEST_F(FormatTest, FormatsBitfields) {
1464 verifyFormat("struct Bitfields {\n"
1465 " unsigned sClass : 8;\n"
1466 " unsigned ValueKind : 2;\n"
1467 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001468 verifyFormat("struct A {\n"
1469 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1470 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1471 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001472 verifyFormat("struct MyStruct {\n"
1473 " uchar data;\n"
1474 " uchar : 8;\n"
1475 " uchar : 8;\n"
1476 " uchar other;\n"
1477 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001478}
1479
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001480TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001481 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1482 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1483
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001484 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001485 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001486 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001487 "}",
1488 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001489 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001490 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001491 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001492 "}",
1493 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001494 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001495 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001496 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001497 "}",
1498 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001499 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001500 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001501 "void f() { f(); }",
1502 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001503
1504 // This code is more common than we thought; if we
1505 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001506 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001507 verifyFormat("namespace {};",
1508 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001509 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001510 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001511 "};",
1512 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001513
1514 verifyFormat("namespace {\n"
1515 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001516 "} // namespace",
1517 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001518 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1519 "#define HEADER_GUARD\n"
1520 "namespace my_namespace {\n"
1521 "int i;\n"
1522 "} // my_namespace\n"
1523 "#endif // HEADER_GUARD",
1524 format("#ifndef HEADER_GUARD\n"
1525 " #define HEADER_GUARD\n"
1526 " namespace my_namespace {\n"
1527 "int i;\n"
1528 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001529 "#endif // HEADER_GUARD",
1530 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001531
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001532 EXPECT_EQ("namespace A::B {\n"
1533 "class C {};\n"
1534 "}",
1535 format("namespace A::B {\n"
1536 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001537 "}",
1538 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001539
Daniel Jasper65ee3472013-07-31 23:16:02 +00001540 FormatStyle Style = getLLVMStyle();
1541 Style.NamespaceIndentation = FormatStyle::NI_All;
1542 EXPECT_EQ("namespace out {\n"
1543 " int i;\n"
1544 " namespace in {\n"
1545 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001546 " } // namespace in\n"
1547 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001548 format("namespace out {\n"
1549 "int i;\n"
1550 "namespace in {\n"
1551 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001552 "} // namespace in\n"
1553 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001554 Style));
1555
1556 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1557 EXPECT_EQ("namespace out {\n"
1558 "int i;\n"
1559 "namespace in {\n"
1560 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001561 "} // namespace in\n"
1562 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001563 format("namespace out {\n"
1564 "int i;\n"
1565 "namespace in {\n"
1566 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001567 "} // namespace in\n"
1568 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001569 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001570}
1571
Francois Ferrande56a8292017-06-14 12:29:47 +00001572TEST_F(FormatTest, FormatsCompactNamespaces) {
1573 FormatStyle Style = getLLVMStyle();
1574 Style.CompactNamespaces = true;
1575
1576 verifyFormat("namespace A { namespace B {\n"
1577 "}} // namespace A::B",
1578 Style);
1579
1580 EXPECT_EQ("namespace out { namespace in {\n"
1581 "}} // namespace out::in",
1582 format("namespace out {\n"
1583 "namespace in {\n"
1584 "} // namespace in\n"
1585 "} // namespace out",
1586 Style));
1587
1588 // Only namespaces which have both consecutive opening and end get compacted
1589 EXPECT_EQ("namespace out {\n"
1590 "namespace in1 {\n"
1591 "} // namespace in1\n"
1592 "namespace in2 {\n"
1593 "} // namespace in2\n"
1594 "} // namespace out",
1595 format("namespace out {\n"
1596 "namespace in1 {\n"
1597 "} // namespace in1\n"
1598 "namespace in2 {\n"
1599 "} // namespace in2\n"
1600 "} // namespace out",
1601 Style));
1602
1603 EXPECT_EQ("namespace out {\n"
1604 "int i;\n"
1605 "namespace in {\n"
1606 "int j;\n"
1607 "} // namespace in\n"
1608 "int k;\n"
1609 "} // namespace out",
1610 format("namespace out { int i;\n"
1611 "namespace in { int j; } // namespace in\n"
1612 "int k; } // namespace out",
1613 Style));
1614
1615 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1616 "}}} // namespace A::B::C\n",
1617 format("namespace A { namespace B {\n"
1618 "namespace C {\n"
1619 "}} // namespace B::C\n"
1620 "} // namespace A\n",
1621 Style));
1622
1623 Style.ColumnLimit = 40;
1624 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1625 "namespace bbbbbbbbbb {\n"
1626 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1627 format("namespace aaaaaaaaaa {\n"
1628 "namespace bbbbbbbbbb {\n"
1629 "} // namespace bbbbbbbbbb\n"
1630 "} // namespace aaaaaaaaaa",
1631 Style));
1632
1633 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1634 "namespace cccccc {\n"
1635 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1636 format("namespace aaaaaa {\n"
1637 "namespace bbbbbb {\n"
1638 "namespace cccccc {\n"
1639 "} // namespace cccccc\n"
1640 "} // namespace bbbbbb\n"
1641 "} // namespace aaaaaa",
1642 Style));
1643 Style.ColumnLimit = 80;
1644
1645 // Extra semicolon after 'inner' closing brace prevents merging
1646 EXPECT_EQ("namespace out { namespace in {\n"
1647 "}; } // namespace out::in",
1648 format("namespace out {\n"
1649 "namespace in {\n"
1650 "}; // namespace in\n"
1651 "} // namespace out",
1652 Style));
1653
1654 // Extra semicolon after 'outer' closing brace is conserved
1655 EXPECT_EQ("namespace out { namespace in {\n"
1656 "}}; // namespace out::in",
1657 format("namespace out {\n"
1658 "namespace in {\n"
1659 "} // namespace in\n"
1660 "}; // namespace out",
1661 Style));
1662
1663 Style.NamespaceIndentation = FormatStyle::NI_All;
1664 EXPECT_EQ("namespace out { namespace in {\n"
1665 " int i;\n"
1666 "}} // namespace out::in",
1667 format("namespace out {\n"
1668 "namespace in {\n"
1669 "int i;\n"
1670 "} // namespace in\n"
1671 "} // namespace out",
1672 Style));
1673 EXPECT_EQ("namespace out { namespace mid {\n"
1674 " namespace in {\n"
1675 " int j;\n"
1676 " } // namespace in\n"
1677 " int k;\n"
1678 "}} // namespace out::mid",
1679 format("namespace out { namespace mid {\n"
1680 "namespace in { int j; } // namespace in\n"
1681 "int k; }} // namespace out::mid",
1682 Style));
1683
1684 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1685 EXPECT_EQ("namespace out { namespace in {\n"
1686 " int i;\n"
1687 "}} // namespace out::in",
1688 format("namespace out {\n"
1689 "namespace in {\n"
1690 "int i;\n"
1691 "} // namespace in\n"
1692 "} // namespace out",
1693 Style));
1694 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1695 " int i;\n"
1696 "}}} // namespace out::mid::in",
1697 format("namespace out {\n"
1698 "namespace mid {\n"
1699 "namespace in {\n"
1700 "int i;\n"
1701 "} // namespace in\n"
1702 "} // namespace mid\n"
1703 "} // namespace out",
1704 Style));
1705}
1706
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001707TEST_F(FormatTest, FormatsExternC) {
1708 verifyFormat("extern \"C\" {\nint a;");
1709 verifyFormat("extern \"C\" {}");
1710 verifyFormat("extern \"C\" {\n"
1711 "int foo();\n"
1712 "}");
1713 verifyFormat("extern \"C\" int foo() {}");
1714 verifyFormat("extern \"C\" int foo();");
1715 verifyFormat("extern \"C\" int foo() {\n"
1716 " int i = 42;\n"
1717 " return i;\n"
1718 "}");
1719
1720 FormatStyle Style = getLLVMStyle();
1721 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1722 Style.BraceWrapping.AfterFunction = true;
1723 verifyFormat("extern \"C\" int foo() {}", Style);
1724 verifyFormat("extern \"C\" int foo();", Style);
1725 verifyFormat("extern \"C\" int foo()\n"
1726 "{\n"
1727 " int i = 42;\n"
1728 " return i;\n"
1729 "}",
1730 Style);
1731
1732 Style.BraceWrapping.AfterExternBlock = true;
1733 Style.BraceWrapping.SplitEmptyRecord = false;
1734 verifyFormat("extern \"C\"\n"
1735 "{}",
1736 Style);
1737 verifyFormat("extern \"C\"\n"
1738 "{\n"
1739 " int foo();\n"
1740 "}",
1741 Style);
1742}
Manuel Klimekae610d12013-01-21 14:32:05 +00001743
Daniel Jasper40aacf42013-03-14 13:45:21 +00001744TEST_F(FormatTest, FormatsInlineASM) {
1745 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001746 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001747 verifyFormat(
1748 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1749 " \"cpuid\\n\\t\"\n"
1750 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001751 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001752 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001753 EXPECT_EQ(
1754 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001755 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001756 " mov edx,[that] // vtable in edx\n"
1757 " mov eax,methodIndex\n"
1758 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001759 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001760 "}",
1761 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1762 " __asm {\n"
1763 " mov edx,[that] // vtable in edx\n"
1764 " mov eax,methodIndex\n"
1765 " call [edx][eax*4] // stdcall\n"
1766 " }\n"
1767 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001768 EXPECT_EQ("_asm {\n"
1769 " xor eax, eax;\n"
1770 " cpuid;\n"
1771 "}",
1772 format("_asm {\n"
1773 " xor eax, eax;\n"
1774 " cpuid;\n"
1775 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001776 verifyFormat("void function() {\n"
1777 " // comment\n"
1778 " asm(\"\");\n"
1779 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001780 EXPECT_EQ("__asm {\n"
1781 "}\n"
1782 "int i;",
1783 format("__asm {\n"
1784 "}\n"
1785 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001786}
1787
Nico Weberd5650bd2013-01-07 16:36:17 +00001788TEST_F(FormatTest, FormatTryCatch) {
1789 verifyFormat("try {\n"
1790 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001791 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001792 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001793 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001794 " exit(42);\n"
1795 "}");
1796
1797 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001798 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001799 " return 5;\n"
1800 "}");
1801 verifyFormat("class A {\n"
1802 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001803 " A() try : a(0) {\n"
1804 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001805 " throw;\n"
1806 " }\n"
1807 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001808
1809 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001810 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001811}
1812
Nico Weberfac23712015-02-04 15:26:27 +00001813TEST_F(FormatTest, FormatSEHTryCatch) {
1814 verifyFormat("__try {\n"
1815 " int a = b * c;\n"
1816 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1817 " // Do nothing.\n"
1818 "}");
1819
1820 verifyFormat("__try {\n"
1821 " int a = b * c;\n"
1822 "} __finally {\n"
1823 " // Do nothing.\n"
1824 "}");
1825
1826 verifyFormat("DEBUG({\n"
1827 " __try {\n"
1828 " } __finally {\n"
1829 " }\n"
1830 "});\n");
1831}
1832
Daniel Jasper04a71a42014-05-08 11:58:24 +00001833TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1834 verifyFormat("try {\n"
1835 " f();\n"
1836 "} catch {\n"
1837 " g();\n"
1838 "}");
1839 verifyFormat("try {\n"
1840 " f();\n"
1841 "} catch (A a) MACRO(x) {\n"
1842 " g();\n"
1843 "} catch (B b) MACRO(x) {\n"
1844 " g();\n"
1845 "}");
1846}
1847
1848TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1849 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001850 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1851 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001852 Style.BreakBeforeBraces = BraceStyle;
1853 verifyFormat("try {\n"
1854 " // something\n"
1855 "} catch (...) {\n"
1856 " // something\n"
1857 "}",
1858 Style);
1859 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001860 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1861 verifyFormat("try {\n"
1862 " // something\n"
1863 "}\n"
1864 "catch (...) {\n"
1865 " // something\n"
1866 "}",
1867 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001868 verifyFormat("__try {\n"
1869 " // something\n"
1870 "}\n"
1871 "__finally {\n"
1872 " // something\n"
1873 "}",
1874 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001875 verifyFormat("@try {\n"
1876 " // something\n"
1877 "}\n"
1878 "@finally {\n"
1879 " // something\n"
1880 "}",
1881 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001882 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1883 verifyFormat("try\n"
1884 "{\n"
1885 " // something\n"
1886 "}\n"
1887 "catch (...)\n"
1888 "{\n"
1889 " // something\n"
1890 "}",
1891 Style);
1892 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1893 verifyFormat("try\n"
1894 " {\n"
1895 " // something\n"
1896 " }\n"
1897 "catch (...)\n"
1898 " {\n"
1899 " // something\n"
1900 " }",
1901 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001902 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1903 Style.BraceWrapping.BeforeCatch = true;
1904 verifyFormat("try {\n"
1905 " // something\n"
1906 "}\n"
1907 "catch (...) {\n"
1908 " // something\n"
1909 "}",
1910 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001911}
1912
Daniel Jaspere25509f2012-12-17 11:29:41 +00001913TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001914 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001915
Daniel Jaspera44991332015-04-29 13:06:49 +00001916 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1917 " 100000000, "
1918 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001919
Daniel Jasper473c62c2013-05-17 09:35:01 +00001920 // Here, everything other than the "}" would fit on a line.
1921 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001922 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001923 EXPECT_EQ("S s = {a,\n"
1924 "\n"
1925 " b};",
1926 format("S s = {\n"
1927 " a,\n"
1928 "\n"
1929 " b\n"
1930 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001931
1932 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1933 // line. However, the formatting looks a bit off and this probably doesn't
1934 // happen often in practice.
1935 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001936 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001937 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001938}
1939
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001940TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001941 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1942 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1943 " .bbbbbbbbbb = 2,\n"
1944 " .cccccccccc = 3,\n"
1945 " .dddddddddd = 4,\n"
1946 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001947 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001948 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1949 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1950 " .ccccccccccccccccccccccccccc = 3,\n"
1951 " .ddddddddddddddddddddddddddd = 4,\n"
1952 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001953
1954 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001955
1956 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1957 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1958 " [2] = bbbbbbbbbb,\n"
1959 " [3] = cccccccccc,\n"
1960 " [4] = dddddddddd,\n"
1961 " [5] = eeeeeeeeee};");
1962 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1963 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1964 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1965 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1966 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1967 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001968}
1969
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001970TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001971 verifyFormat("static A x = {{{}}};\n");
1972 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1973 " {init1, init2, init3, init4}}};",
1974 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001975
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001976 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001977 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1978 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1979 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1980 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001981 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001982 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1983 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1984 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001985 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1986 " {rect.fRight - rect.fLeft, rect.fBottom - "
1987 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001988
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001989 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001990 "SomeArrayOfSomeType a = {\n"
1991 " {{1, 2, 3},\n"
1992 " {1, 2, 3},\n"
1993 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1994 " 333333333333333333333333333333},\n"
1995 " {1, 2, 3},\n"
1996 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001997 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001998 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001999 " {{1, 2, 3}},\n"
2000 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002001 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2002 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002003 " {{1, 2, 3}},\n"
2004 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002005
Daniel Jaspera44991332015-04-29 13:06:49 +00002006 verifyFormat("struct {\n"
2007 " unsigned bit;\n"
2008 " const char *const name;\n"
2009 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2010 " {kOsWin, \"Windows\"},\n"
2011 " {kOsLinux, \"Linux\"},\n"
2012 " {kOsCrOS, \"Chrome OS\"}};");
2013 verifyFormat("struct {\n"
2014 " unsigned bit;\n"
2015 " const char *const name;\n"
2016 "} kBitsToOs[] = {\n"
2017 " {kOsMac, \"Mac\"},\n"
2018 " {kOsWin, \"Windows\"},\n"
2019 " {kOsLinux, \"Linux\"},\n"
2020 " {kOsCrOS, \"Chrome OS\"},\n"
2021 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002022}
2023
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002024TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2025 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2026 " \\\n"
2027 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2028}
2029
Daniel Jasperda16db32013-01-07 10:48:50 +00002030TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002031 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2032 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002033
2034 // Do break defaulted and deleted functions.
2035 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2036 " default;",
2037 getLLVMStyleWithColumns(40));
2038 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2039 " delete;",
2040 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002041}
2042
2043TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2044 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2045 getLLVMStyleWithColumns(40));
2046 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2047 getLLVMStyleWithColumns(40));
2048 EXPECT_EQ("#define Q \\\n"
2049 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2050 " \"aaaaaaaa.cpp\"",
2051 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2052 getLLVMStyleWithColumns(40)));
2053}
2054
2055TEST_F(FormatTest, UnderstandsLinePPDirective) {
2056 EXPECT_EQ("# 123 \"A string literal\"",
2057 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002058}
2059
Manuel Klimek591b5802013-01-31 15:58:48 +00002060TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002061 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002062 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002063}
2064
2065TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2066 EXPECT_EQ("#line 42 \"test\"\n",
2067 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002068 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2069 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002070}
2071
2072TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2073 EXPECT_EQ("#line 42 \"test\"",
2074 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002075 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002076}
2077
Daniel Jasper877615c2013-10-11 19:45:02 +00002078TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2079 verifyFormat("#define A \\x20");
2080 verifyFormat("#define A \\ x20");
2081 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2082 verifyFormat("#define A ''");
2083 verifyFormat("#define A ''qqq");
2084 verifyFormat("#define A `qqq");
2085 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002086 EXPECT_EQ("const char *c = STRINGIFY(\n"
2087 "\\na : b);",
2088 format("const char * c = STRINGIFY(\n"
2089 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002090
2091 verifyFormat("a\r\\");
2092 verifyFormat("a\v\\");
2093 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002094}
2095
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002096TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002097 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2098 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002099 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002100 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002101 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002102
2103 verifyFormat("#define A A\n#define A A");
2104 verifyFormat("#define A(X) A\n#define A A");
2105
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002106 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2107 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002108}
2109
2110TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002111 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002112 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002113 "#define A( \\\n"
2114 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002115 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002116 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002117 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002118 " #include \"a.h\"\n"
2119 "#define A(A,\\\n"
2120 " B)\n"
2121 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002122 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002123 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002124}
2125
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002126TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002127
2128TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2129 EXPECT_EQ("#define A \\\n"
2130 " c; \\\n"
2131 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002132 "f;",
2133 format("#define A c; e;\n"
2134 "f;",
2135 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002136}
2137
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002138TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002139
Manuel Klimek1abf7892013-01-04 23:34:14 +00002140TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002141 EXPECT_EQ("int x,\n"
2142 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002143 " y;",
2144 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002145}
2146
Manuel Klimek09e07972013-01-05 21:34:55 +00002147TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002148 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002149 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002150 verifyFormat("#define A \\\n"
2151 " { \\\n"
2152 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002153 " }",
2154 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002155
2156 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002157 " void function##X()",
2158 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002159
2160 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002161 " void a##b##c()",
2162 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002163
Daniel Jasper39825ea2013-01-14 15:40:57 +00002164 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002165}
2166
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002167TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002168 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2169 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002170}
2171
Manuel Klimek0c137952013-02-11 12:33:24 +00002172TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2173 EXPECT_EQ("#define A b;", format("#define A \\\n"
2174 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002175 " b;",
2176 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002177 EXPECT_EQ("#define A \\\n"
2178 " \\\n"
2179 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002180 " b;",
2181 format("#define A \\\n"
2182 " \\\n"
2183 " a; \\\n"
2184 " b;",
2185 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002186 EXPECT_EQ("#define A \\\n"
2187 " a; \\\n"
2188 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002189 " b;",
2190 format("#define A \\\n"
2191 " a; \\\n"
2192 " \\\n"
2193 " b;",
2194 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002195}
2196
Daniel Jasper00475962013-02-19 17:14:38 +00002197TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002198 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002199 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002200 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002201 " case 2\n",
2202 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002203 verifyFormat("#define MACRO(a) \\\n"
2204 " if (a) \\\n"
2205 " f(); \\\n"
2206 " else \\\n"
2207 " g()",
2208 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002209 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002210 verifyIncompleteFormat("#define STR(x) #x\n"
2211 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002212 verifyFormat("#pragma omp threadprivate( \\\n"
2213 " y)), // expected-warning",
2214 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002215 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002216 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002217 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002218 "#define b \\\n"
2219 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002220 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002221 "a",
2222 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002223 verifyFormat("#define A \\\n"
2224 " { \\\n"
2225 " {\n"
2226 "#define B \\\n"
2227 " } \\\n"
2228 " }",
2229 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002230 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002231 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002232 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002233 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002234}
2235
Daniel Jasper40e19212013-05-29 13:16:10 +00002236TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2237 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2238 EXPECT_EQ("class A : public QObject {\n"
2239 " Q_OBJECT\n"
2240 "\n"
2241 " A() {}\n"
2242 "};",
2243 format("class A : public QObject {\n"
2244 " Q_OBJECT\n"
2245 "\n"
2246 " A() {\n}\n"
2247 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002248 EXPECT_EQ("MACRO\n"
2249 "/*static*/ int i;",
2250 format("MACRO\n"
2251 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002252 EXPECT_EQ("SOME_MACRO\n"
2253 "namespace {\n"
2254 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002255 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002256 format("SOME_MACRO\n"
2257 " namespace {\n"
2258 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002259 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002260 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002261 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2262 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002263 // Only if everything is upper case.
2264 EXPECT_EQ("class A : public QObject {\n"
2265 " Q_Object A() {}\n"
2266 "};",
2267 format("class A : public QObject {\n"
2268 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002269 " A() {\n}\n"
2270 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002271
2272 // Only if the next line can actually start an unwrapped line.
2273 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2274 format("SOME_WEIRD_LOG_MACRO\n"
2275 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002276
2277 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002278 "(n, buffers))\n",
2279 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002280}
2281
Alexander Kornienkode644272013-04-08 22:16:06 +00002282TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2283 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2284 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2285 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002286 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002287 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2288 "int *createScopDetectionPass() { return 0; }",
2289 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2290 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2291 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2292 " class X {};\n"
2293 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2294 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002295 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2296 // braces, so that inner block is indented one level more.
2297 EXPECT_EQ("int q() {\n"
2298 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2299 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2300 " IPC_END_MESSAGE_MAP()\n"
2301 "}",
2302 format("int q() {\n"
2303 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2304 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2305 " IPC_END_MESSAGE_MAP()\n"
2306 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002307
Daniel Jasper352dae12014-01-03 11:50:46 +00002308 // Same inside macros.
2309 EXPECT_EQ("#define LIST(L) \\\n"
2310 " L(A) \\\n"
2311 " L(B) \\\n"
2312 " L(C)",
2313 format("#define LIST(L) \\\n"
2314 " L(A) \\\n"
2315 " L(B) \\\n"
2316 " L(C)",
2317 getGoogleStyle()));
2318
Daniel Jasper545c6522013-09-17 09:26:07 +00002319 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002320 EXPECT_EQ("int q() {\n"
2321 " f(x);\n"
2322 " f(x) {}\n"
2323 " f(x)->g();\n"
2324 " f(x)->*g();\n"
2325 " f(x).g();\n"
2326 " f(x) = x;\n"
2327 " f(x) += x;\n"
2328 " f(x) -= x;\n"
2329 " f(x) *= x;\n"
2330 " f(x) /= x;\n"
2331 " f(x) %= x;\n"
2332 " f(x) &= x;\n"
2333 " f(x) |= x;\n"
2334 " f(x) ^= x;\n"
2335 " f(x) >>= x;\n"
2336 " f(x) <<= x;\n"
2337 " f(x)[y].z();\n"
2338 " LOG(INFO) << x;\n"
2339 " ifstream(x) >> x;\n"
2340 "}\n",
2341 format("int q() {\n"
2342 " f(x)\n;\n"
2343 " f(x)\n {}\n"
2344 " f(x)\n->g();\n"
2345 " f(x)\n->*g();\n"
2346 " f(x)\n.g();\n"
2347 " f(x)\n = x;\n"
2348 " f(x)\n += x;\n"
2349 " f(x)\n -= x;\n"
2350 " f(x)\n *= x;\n"
2351 " f(x)\n /= x;\n"
2352 " f(x)\n %= x;\n"
2353 " f(x)\n &= x;\n"
2354 " f(x)\n |= x;\n"
2355 " f(x)\n ^= x;\n"
2356 " f(x)\n >>= x;\n"
2357 " f(x)\n <<= x;\n"
2358 " f(x)\n[y].z();\n"
2359 " LOG(INFO)\n << x;\n"
2360 " ifstream(x)\n >> x;\n"
2361 "}\n"));
2362 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002363 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002364 " if (1) {\n"
2365 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002366 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002367 " while (1) {\n"
2368 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002369 " F(x)\n"
2370 " G(x);\n"
2371 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002372 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002373 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002374 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002375 " }\n"
2376 "}\n",
2377 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002378 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002379 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002380 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002381 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002382 "F(x)\n"
2383 "G(x);\n"
2384 "F(x)\n"
2385 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002386 "}\n"));
2387 EXPECT_EQ("class A {\n"
2388 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002389 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002390 " A(X x)\n" // FIXME: function-level try blocks are broken.
2391 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002392 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002393 " }\n"
2394 "};",
2395 format("class A {\n"
2396 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002397 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002398 " A(X x)\n"
2399 " try : t(0) {} catch (...) {}\n"
2400 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002401 EXPECT_EQ("class SomeClass {\n"
2402 "public:\n"
2403 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2404 "};",
2405 format("class SomeClass {\n"
2406 "public:\n"
2407 " SomeClass()\n"
2408 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2409 "};"));
2410 EXPECT_EQ("class SomeClass {\n"
2411 "public:\n"
2412 " SomeClass()\n"
2413 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2414 "};",
2415 format("class SomeClass {\n"
2416 "public:\n"
2417 " SomeClass()\n"
2418 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2419 "};",
2420 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002421
2422 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002423}
2424
Manuel Klimek4fe43002013-05-22 12:51:29 +00002425TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2426 verifyFormat("#define A \\\n"
2427 " f({ \\\n"
2428 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002429 " });",
2430 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002431}
2432
Krasimir Georgievad47c902017-08-30 14:34:57 +00002433TEST_F(FormatTest, IndentPreprocessorDirectives) {
2434 FormatStyle Style = getLLVMStyle();
2435 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2436 Style.ColumnLimit = 40;
2437 verifyFormat("#ifdef _WIN32\n"
2438 "#define A 0\n"
2439 "#ifdef VAR2\n"
2440 "#define B 1\n"
2441 "#include <someheader.h>\n"
2442 "#define MACRO \\\n"
2443 " some_very_long_func_aaaaaaaaaa();\n"
2444 "#endif\n"
2445 "#else\n"
2446 "#define A 1\n"
2447 "#endif",
2448 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002449 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2450 verifyFormat("#ifdef _WIN32\n"
2451 "# define A 0\n"
2452 "# ifdef VAR2\n"
2453 "# define B 1\n"
2454 "# include <someheader.h>\n"
2455 "# define MACRO \\\n"
2456 " some_very_long_func_aaaaaaaaaa();\n"
2457 "# endif\n"
2458 "#else\n"
2459 "# define A 1\n"
2460 "#endif",
2461 Style);
2462 verifyFormat("#if A\n"
2463 "# define MACRO \\\n"
2464 " void a(int x) { \\\n"
2465 " b(); \\\n"
2466 " c(); \\\n"
2467 " d(); \\\n"
2468 " e(); \\\n"
2469 " f(); \\\n"
2470 " }\n"
2471 "#endif",
2472 Style);
2473 // Comments before include guard.
2474 verifyFormat("// file comment\n"
2475 "// file comment\n"
2476 "#ifndef HEADER_H\n"
2477 "#define HEADER_H\n"
2478 "code();\n"
2479 "#endif",
2480 Style);
2481 // Test with include guards.
2482 // EXPECT_EQ is used because verifyFormat() calls messUp() which incorrectly
2483 // merges lines.
2484 verifyFormat("#ifndef HEADER_H\n"
2485 "#define HEADER_H\n"
2486 "code();\n"
2487 "#endif",
2488 Style);
2489 // Include guards must have a #define with the same variable immediately
2490 // after #ifndef.
2491 verifyFormat("#ifndef NOT_GUARD\n"
2492 "# define FOO\n"
2493 "code();\n"
2494 "#endif",
2495 Style);
2496
2497 // Include guards must cover the entire file.
2498 verifyFormat("code();\n"
2499 "code();\n"
2500 "#ifndef NOT_GUARD\n"
2501 "# define NOT_GUARD\n"
2502 "code();\n"
2503 "#endif",
2504 Style);
2505 verifyFormat("#ifndef NOT_GUARD\n"
2506 "# define NOT_GUARD\n"
2507 "code();\n"
2508 "#endif\n"
2509 "code();",
2510 Style);
2511 // Test with trailing blank lines.
2512 verifyFormat("#ifndef HEADER_H\n"
2513 "#define HEADER_H\n"
2514 "code();\n"
2515 "#endif\n",
2516 Style);
2517 // Include guards don't have #else.
2518 verifyFormat("#ifndef NOT_GUARD\n"
2519 "# define NOT_GUARD\n"
2520 "code();\n"
2521 "#else\n"
2522 "#endif",
2523 Style);
2524 verifyFormat("#ifndef NOT_GUARD\n"
2525 "# define NOT_GUARD\n"
2526 "code();\n"
2527 "#elif FOO\n"
2528 "#endif",
2529 Style);
2530 // FIXME: This doesn't handle the case where there's code between the
2531 // #ifndef and #define but all other conditions hold. This is because when
2532 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2533 // previous code line yet, so we can't detect it.
2534 EXPECT_EQ("#ifndef NOT_GUARD\n"
2535 "code();\n"
2536 "#define NOT_GUARD\n"
2537 "code();\n"
2538 "#endif",
2539 format("#ifndef NOT_GUARD\n"
2540 "code();\n"
2541 "# define NOT_GUARD\n"
2542 "code();\n"
2543 "#endif",
2544 Style));
2545 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2546 // be outside an include guard. Examples are #pragma once and
2547 // #pragma GCC diagnostic, or anything else that does not change the meaning
2548 // of the file if it's included multiple times.
2549 EXPECT_EQ("#ifdef WIN32\n"
2550 "# pragma once\n"
2551 "#endif\n"
2552 "#ifndef HEADER_H\n"
2553 "# define HEADER_H\n"
2554 "code();\n"
2555 "#endif",
2556 format("#ifdef WIN32\n"
2557 "# pragma once\n"
2558 "#endif\n"
2559 "#ifndef HEADER_H\n"
2560 "#define HEADER_H\n"
2561 "code();\n"
2562 "#endif",
2563 Style));
2564 // FIXME: This does not detect when there is a single non-preprocessor line
2565 // in front of an include-guard-like structure where other conditions hold
2566 // because ScopedLineState hides the line.
2567 EXPECT_EQ("code();\n"
2568 "#ifndef HEADER_H\n"
2569 "#define HEADER_H\n"
2570 "code();\n"
2571 "#endif",
2572 format("code();\n"
2573 "#ifndef HEADER_H\n"
2574 "# define HEADER_H\n"
2575 "code();\n"
2576 "#endif",
2577 Style));
2578 // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
2579 // preprocessor indentation.
2580 EXPECT_EQ("#if 1\n"
2581 " // comment\n"
2582 "# define A 0\n"
2583 "// comment\n"
2584 "# define B 0\n"
2585 "#endif",
2586 format("#if 1\n"
2587 "// comment\n"
2588 "# define A 0\n"
2589 " // comment\n"
2590 "# define B 0\n"
2591 "#endif",
2592 Style));
2593 // Test with tabs.
2594 Style.UseTab = FormatStyle::UT_Always;
2595 Style.IndentWidth = 8;
2596 Style.TabWidth = 8;
2597 verifyFormat("#ifdef _WIN32\n"
2598 "#\tdefine A 0\n"
2599 "#\tifdef VAR2\n"
2600 "#\t\tdefine B 1\n"
2601 "#\t\tinclude <someheader.h>\n"
2602 "#\t\tdefine MACRO \\\n"
2603 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2604 "#\tendif\n"
2605 "#else\n"
2606 "#\tdefine A 1\n"
2607 "#endif",
2608 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002609
2610 // Regression test: Multiline-macro inside include guards.
2611 verifyFormat("#ifndef HEADER_H\n"
2612 "#define HEADER_H\n"
2613 "#define A() \\\n"
2614 " int i; \\\n"
2615 " int j;\n"
2616 "#endif // HEADER_H",
2617 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002618}
2619
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002620TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002621 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002622}
2623
Manuel Klimek1058d982013-01-06 20:07:31 +00002624TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2625 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2626 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2627 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2628 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2629}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002630
Daniel Jaspere2408e32015-05-06 11:16:43 +00002631TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002632 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2633 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2634 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002635 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002636 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002637 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002638 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002639
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002640 FormatStyle AlignLeft = getLLVMStyle();
2641 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2642 EXPECT_EQ("#define MACRO(x) \\\n"
2643 "private: \\\n"
2644 " int x(int a);\n",
2645 format("#define MACRO(x) \\\n"
2646 "private: \\\n"
2647 " int x(int a);\n",
2648 AlignLeft));
2649
2650 // CRLF line endings
2651 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2652 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2653 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2654 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2655 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2656 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2657 EXPECT_EQ("#define MACRO(x) \\\r\n"
2658 "private: \\\r\n"
2659 " int x(int a);\r\n",
2660 format("#define MACRO(x) \\\r\n"
2661 "private: \\\r\n"
2662 " int x(int a);\r\n",
2663 AlignLeft));
2664
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002665 FormatStyle DontAlign = getLLVMStyle();
2666 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2667 DontAlign.MaxEmptyLinesToKeep = 3;
2668 // FIXME: can't use verifyFormat here because the newline before
2669 // "public:" is not inserted the first time it's reformatted
2670 EXPECT_EQ("#define A \\\n"
2671 " class Foo { \\\n"
2672 " void bar(); \\\n"
2673 "\\\n"
2674 "\\\n"
2675 "\\\n"
2676 " public: \\\n"
2677 " void baz(); \\\n"
2678 " };",
2679 format("#define A \\\n"
2680 " class Foo { \\\n"
2681 " void bar(); \\\n"
2682 "\\\n"
2683 "\\\n"
2684 "\\\n"
2685 " public: \\\n"
2686 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002687 " };",
2688 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002689}
2690
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002691TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2692 verifyFormat("#define A \\\n"
2693 " int v( \\\n"
2694 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002695 " int i;",
2696 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002697}
2698
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002699TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002700 EXPECT_EQ(
2701 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2702 " \\\n"
2703 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2704 "\n"
2705 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2706 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2707 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2708 "\\\n"
2709 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2710 " \n"
2711 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2712 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002713}
2714
Manuel Klimek52b15152013-01-09 15:25:02 +00002715TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2716 EXPECT_EQ("int\n"
2717 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002718 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002719 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002720 verifyFormat("functionCallTo(\n"
2721 " someOtherFunction(\n"
2722 " withSomeParameters, whichInSequence,\n"
2723 " areLongerThanALine(andAnotherCall,\n"
2724 "#define A B\n"
2725 " withMoreParamters,\n"
2726 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002727 " andMoreParameters),\n"
2728 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002729 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002730 verifyFormat("Foo::Foo()\n"
2731 "#ifdef BAR\n"
2732 " : baz(0)\n"
2733 "#endif\n"
2734 "{\n"
2735 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002736 verifyFormat("void f() {\n"
2737 " if (true)\n"
2738 "#ifdef A\n"
2739 " f(42);\n"
2740 " x();\n"
2741 "#else\n"
2742 " g();\n"
2743 " x();\n"
2744 "#endif\n"
2745 "}");
2746 verifyFormat("void f(param1, param2,\n"
2747 " param3,\n"
2748 "#ifdef A\n"
2749 " param4(param5,\n"
2750 "#ifdef A1\n"
2751 " param6,\n"
2752 "#ifdef A2\n"
2753 " param7),\n"
2754 "#else\n"
2755 " param8),\n"
2756 " param9,\n"
2757 "#endif\n"
2758 " param10,\n"
2759 "#endif\n"
2760 " param11)\n"
2761 "#else\n"
2762 " param12)\n"
2763 "#endif\n"
2764 "{\n"
2765 " x();\n"
2766 "}",
2767 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002768 verifyFormat("#if 1\n"
2769 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002770 verifyFormat("#if 1\n"
2771 "#endif\n"
2772 "#if 1\n"
2773 "#else\n"
2774 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002775 verifyFormat("DEBUG({\n"
2776 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2778 "});\n"
2779 "#if a\n"
2780 "#else\n"
2781 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002782
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002783 verifyIncompleteFormat("void f(\n"
2784 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002785 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002786 "#else\n"
2787 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002788}
2789
Manuel Klimek14bd9172014-01-29 08:49:02 +00002790TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2791 verifyFormat("#endif\n"
2792 "#if B");
2793}
2794
Manuel Klimek88033d72013-10-21 08:11:15 +00002795TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2796 FormatStyle SingleLine = getLLVMStyle();
2797 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002798 verifyFormat("#if 0\n"
2799 "#elif 1\n"
2800 "#endif\n"
2801 "void foo() {\n"
2802 " if (test) foo2();\n"
2803 "}",
2804 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002805}
2806
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002807TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002808 verifyFormat("functionCall({ int i; });");
2809 verifyFormat("functionCall({\n"
2810 " int i;\n"
2811 " int j;\n"
2812 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002813 verifyFormat("functionCall(\n"
2814 " {\n"
2815 " int i;\n"
2816 " int j;\n"
2817 " },\n"
2818 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002819 verifyFormat("functionA(functionB({\n"
2820 " int i;\n"
2821 " int j;\n"
2822 " }),\n"
2823 " aaaa, bbbb, cccc);");
2824 verifyFormat("functionCall(\n"
2825 " {\n"
2826 " int i;\n"
2827 " int j;\n"
2828 " },\n"
2829 " aaaa, bbbb, // comment\n"
2830 " cccc);");
2831 verifyFormat("functionA(functionB({\n"
2832 " int i;\n"
2833 " int j;\n"
2834 " }),\n"
2835 " aaaa, bbbb, // comment\n"
2836 " cccc);");
2837 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2838 verifyFormat("functionCall(aaaa, bbbb, {\n"
2839 " int i;\n"
2840 " int j;\n"
2841 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002842 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002843 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002844 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002845 " int i; // break\n"
2846 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2848 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002849 verifyFormat("DEBUG({\n"
2850 " if (a)\n"
2851 " f();\n"
2852 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002853}
2854
2855TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002856 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002857 "int i;",
2858 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002859}
2860
2861TEST_F(FormatTest, LayoutNestedBlocks) {
2862 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2863 " struct s {\n"
2864 " int i;\n"
2865 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002866 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002867 " for (int i = 0; i < 10; ++i)\n"
2868 " return;\n"
2869 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002870 verifyFormat("call(parameter, {\n"
2871 " something();\n"
2872 " // Comment using all columns.\n"
2873 " somethingelse();\n"
2874 "});",
2875 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002876 verifyFormat("DEBUG( //\n"
2877 " { f(); }, a);");
2878 verifyFormat("DEBUG( //\n"
2879 " {\n"
2880 " f(); //\n"
2881 " },\n"
2882 " a);");
2883
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002884 EXPECT_EQ("call(parameter, {\n"
2885 " something();\n"
2886 " // Comment too\n"
2887 " // looooooooooong.\n"
2888 " somethingElse();\n"
2889 "});",
2890 format("call(parameter, {\n"
2891 " something();\n"
2892 " // Comment too looooooooooong.\n"
2893 " somethingElse();\n"
2894 "});",
2895 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002896 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002897 EXPECT_EQ("DEBUG({ // comment\n"
2898 " int i;\n"
2899 "});",
2900 format("DEBUG({ // comment\n"
2901 "int i;\n"
2902 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002903 EXPECT_EQ("DEBUG({\n"
2904 " int i;\n"
2905 "\n"
2906 " // comment\n"
2907 " int j;\n"
2908 "});",
2909 format("DEBUG({\n"
2910 " int i;\n"
2911 "\n"
2912 " // comment\n"
2913 " int j;\n"
2914 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002915
2916 verifyFormat("DEBUG({\n"
2917 " if (a)\n"
2918 " return;\n"
2919 "});");
2920 verifyGoogleFormat("DEBUG({\n"
2921 " if (a) return;\n"
2922 "});");
2923 FormatStyle Style = getGoogleStyle();
2924 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002925 verifyFormat("Debug(aaaaa,\n"
2926 " {\n"
2927 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2928 " },\n"
2929 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002930 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002931
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002932 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2933
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002934 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002935}
2936
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002937TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2938 EXPECT_EQ("#define MACRO() \\\n"
2939 " Debug(aaa, /* force line break */ \\\n"
2940 " { \\\n"
2941 " int i; \\\n"
2942 " int j; \\\n"
2943 " })",
2944 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2945 " { int i; int j; })",
2946 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002947
2948 EXPECT_EQ("#define A \\\n"
2949 " [] { \\\n"
2950 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2951 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2952 " }",
2953 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2954 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2955 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002956}
2957
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002958TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2959 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002960 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002961 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002962}
2963
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002964TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2965 FormatStyle Style = getLLVMStyle();
2966 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2967 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2968 verifyFormat("FOO_BEGIN\n"
2969 " FOO_ENTRY\n"
2970 "FOO_END", Style);
2971 verifyFormat("FOO_BEGIN\n"
2972 " NESTED_FOO_BEGIN\n"
2973 " NESTED_FOO_ENTRY\n"
2974 " NESTED_FOO_END\n"
2975 "FOO_END", Style);
2976 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2977 " int x;\n"
2978 " x = 1;\n"
2979 "FOO_END(Baz)", Style);
2980}
2981
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002982//===----------------------------------------------------------------------===//
2983// Line break tests.
2984//===----------------------------------------------------------------------===//
2985
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002986TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002987 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002988 "void f() {\n"
2989 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2990 " parameter, parameter, parameter)),\n"
2991 " SecondLongCall(parameter));\n"
2992 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002993 verifyFormat(
2994 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2995 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2997 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2998 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002999 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3000 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3001 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3002 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003003 verifyFormat(
3004 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3005 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3007 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003008 verifyFormat("int a = bbbb && ccc &&\n"
3009 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003010 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003011 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003012}
3013
Daniel Jasperd69fc772013-05-08 14:12:04 +00003014TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3015 verifyFormat(
3016 "bool aaaaaaa =\n"
3017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3018 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003019 verifyFormat(
3020 "bool aaaaaaa =\n"
3021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3022 " bbbbbbbb();");
3023
Daniel Jasperd69fc772013-05-08 14:12:04 +00003024 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3026 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003027 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3029 " ccccccccc == ddddddddddd;");
3030 verifyFormat(
3031 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3033 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003034
3035 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3036 " aaaaaa) &&\n"
3037 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003038 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3039 " aaaaaa) >>\n"
3040 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003041 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003042 " SourceMgr.getSpellingColumnNumber(\n"
3043 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3044 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003045
Daniel Jasper68d888c2013-06-03 08:42:05 +00003046 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3047 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3048 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003049 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3050 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3051 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003052 verifyFormat("b = a &&\n"
3053 " // Comment\n"
3054 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003055
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003056 // If the LHS of a comparison is not a binary expression itself, the
3057 // additional linebreak confuses many people.
3058 verifyFormat(
3059 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3061 "}");
3062 verifyFormat(
3063 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3065 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003066 verifyFormat(
3067 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3069 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003070 // Even explicit parentheses stress the precedence enough to make the
3071 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003072 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3074 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003075 // This cases is borderline, but with the indentation it is still readable.
3076 verifyFormat(
3077 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3078 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3080 "}",
3081 getLLVMStyleWithColumns(75));
3082
3083 // If the LHS is a binary expression, we should still use the additional break
3084 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003085 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3087 " 5) {\n"
3088 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003089
Daniel Jasper571f1af2013-05-14 20:39:56 +00003090 FormatStyle OnePerLine = getLLVMStyle();
3091 OnePerLine.BinPackParameters = false;
3092 verifyFormat(
3093 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3096 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003097
3098 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3099 " .aaa(aaaaaaaaaaaaa) *\n"
3100 " aaaaaaa +\n"
3101 " aaaaaaa;",
3102 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003103}
3104
Daniel Jasper6bee6822013-04-08 20:33:42 +00003105TEST_F(FormatTest, ExpressionIndentation) {
3106 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3110 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3111 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3114 " ccccccccccccccccccccccccccccccccccccccccc;");
3115 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3118 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3119 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3122 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3123 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3126 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003127 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003128 "} else if (aaaaa && bbbbb > // break\n"
3129 " ccccc) {\n"
3130 "}");
3131 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003132 "} else if (aaaaa &&\n"
3133 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003134 " ccccc &&\n"
3135 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003136 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003137
3138 // Presence of a trailing comment used to change indentation of b.
3139 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3140 " b;\n"
3141 "return aaaaaaaaaaaaaaaaaaa +\n"
3142 " b; //",
3143 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003144}
3145
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003146TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3147 // Not sure what the best system is here. Like this, the LHS can be found
3148 // immediately above an operator (everything with the same or a higher
3149 // indent). The RHS is aligned right of the operator and so compasses
3150 // everything until something with the same indent as the operator is found.
3151 // FIXME: Is this a good system?
3152 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003153 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003154 verifyFormat(
3155 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003156 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3157 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3158 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3159 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3160 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003161 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003162 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3163 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003164 Style);
3165 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003166 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3167 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003168 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3169 Style);
3170 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003171 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3172 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003173 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3174 Style);
3175 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3176 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003177 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3178 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003179 Style);
3180 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003181 "} else if (aaaaa\n"
3182 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003183 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003184 "}",
3185 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003186 verifyFormat("return (a)\n"
3187 " // comment\n"
3188 " + b;",
3189 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003190 verifyFormat(
3191 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3192 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3193 " + cc;",
3194 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003195
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003196 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3197 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3198 Style);
3199
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003200 // Forced by comments.
3201 verifyFormat(
3202 "unsigned ContentSize =\n"
3203 " sizeof(int16_t) // DWARF ARange version number\n"
3204 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3205 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3206 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003207
3208 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3209 " == boost::fusion::at_c<1>(iiii).second;",
3210 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003211
3212 Style.ColumnLimit = 60;
3213 verifyFormat("zzzzzzzzzz\n"
3214 " = bbbbbbbbbbbbbbbbb\n"
3215 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3216 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003217}
3218
Daniel Jasperb1270392017-02-01 23:27:37 +00003219TEST_F(FormatTest, EnforcedOperatorWraps) {
3220 // Here we'd like to wrap after the || operators, but a comment is forcing an
3221 // earlier wrap.
3222 verifyFormat("bool x = aaaaa //\n"
3223 " || bbbbb\n"
3224 " //\n"
3225 " || cccc;");
3226}
3227
Daniel Jasper3219e432014-12-02 13:24:51 +00003228TEST_F(FormatTest, NoOperandAlignment) {
3229 FormatStyle Style = getLLVMStyle();
3230 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003231 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3234 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003235 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003236 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3237 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3238 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3239 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3240 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3241 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3242 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3243 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3244 " > ccccccccccccccccccccccccccccccccccccccccc;",
3245 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003246
3247 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3248 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3249 " + cc;",
3250 Style);
3251 verifyFormat("int a = aa\n"
3252 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003253 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003254 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003255
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003256 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003257 verifyFormat("return (a > b\n"
3258 " // comment1\n"
3259 " // comment2\n"
3260 " || c);",
3261 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003262}
3263
Daniel Jasperac043c92014-09-15 11:11:00 +00003264TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3265 FormatStyle Style = getLLVMStyle();
3266 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3267 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003269 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3270 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003271}
3272
Daniel Jasper988e7e42017-05-08 15:07:52 +00003273TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3274 FormatStyle Style = getLLVMStyle();
3275 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3276 Style.BinPackArguments = false;
3277 Style.ColumnLimit = 40;
3278 verifyFormat("void test() {\n"
3279 " someFunction(\n"
3280 " this + argument + is + quite\n"
3281 " + long + so + it + gets + wrapped\n"
3282 " + but + remains + bin - packed);\n"
3283 "}",
3284 Style);
3285 verifyFormat("void test() {\n"
3286 " someFunction(arg1,\n"
3287 " this + argument + is\n"
3288 " + quite + long + so\n"
3289 " + it + gets + wrapped\n"
3290 " + but + remains + bin\n"
3291 " - packed,\n"
3292 " arg3);\n"
3293 "}",
3294 Style);
3295 verifyFormat("void test() {\n"
3296 " someFunction(\n"
3297 " arg1,\n"
3298 " this + argument + has\n"
3299 " + anotherFunc(nested,\n"
3300 " calls + whose\n"
3301 " + arguments\n"
3302 " + are + also\n"
3303 " + wrapped,\n"
3304 " in + addition)\n"
3305 " + to + being + bin - packed,\n"
3306 " arg3);\n"
3307 "}",
3308 Style);
3309
3310 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3311 verifyFormat("void test() {\n"
3312 " someFunction(\n"
3313 " arg1,\n"
3314 " this + argument + has +\n"
3315 " anotherFunc(nested,\n"
3316 " calls + whose +\n"
3317 " arguments +\n"
3318 " are + also +\n"
3319 " wrapped,\n"
3320 " in + addition) +\n"
3321 " to + being + bin - packed,\n"
3322 " arg3);\n"
3323 "}",
3324 Style);
3325}
3326
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003327TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003328 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003329 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3330 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003331 verifyFormat("Constructor()\n"
3332 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003333 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003334 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003335 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003336 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003337
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003338 verifyFormat("template <typename T>\n"
3339 "Constructor() : Initializer(FitsOnTheLine) {}",
3340 getLLVMStyleWithColumns(45));
3341
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003342 verifyFormat(
3343 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003344 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003345
3346 verifyFormat(
3347 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003348 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003349 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003350 verifyFormat(
3351 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003352 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003353 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003354 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3355 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3356 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003357
3358 verifyFormat("Constructor()\n"
3359 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3360 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3361 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003362 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003363
Daniel Jasper65585ed2013-01-28 13:31:35 +00003364 verifyFormat("Constructor()\n"
3365 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003367
Daniel Jasper62e68172013-02-25 15:59:54 +00003368 verifyFormat("Constructor(int Parameter = 0)\n"
3369 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3370 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003371 verifyFormat("Constructor()\n"
3372 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3373 "}",
3374 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003375 verifyFormat("Constructor()\n"
3376 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3377 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003378
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003379 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003380 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003381 verifyFormat("Constructor()\n"
3382 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3383 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3384 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003385
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003386 FormatStyle OnePerLine = getLLVMStyle();
3387 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003388 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003389 verifyFormat("SomeClass::Constructor()\n"
3390 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3391 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003392 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003393 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003394 verifyFormat("SomeClass::Constructor()\n"
3395 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3396 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003397 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003398 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003399 verifyFormat("MyClass::MyClass(int var)\n"
3400 " : some_var_(var), // 4 space indent\n"
3401 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003402 "}",
3403 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003404 verifyFormat("Constructor()\n"
3405 " : aaaaa(aaaaaa),\n"
3406 " aaaaa(aaaaaa),\n"
3407 " aaaaa(aaaaaa),\n"
3408 " aaaaa(aaaaaa),\n"
3409 " aaaaa(aaaaaa) {}",
3410 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003411 verifyFormat("Constructor()\n"
3412 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3413 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3414 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003415 OnePerLine.BinPackParameters = false;
3416 verifyFormat(
3417 "Constructor()\n"
3418 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3419 " aaaaaaaaaaa().aaa(),\n"
3420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3421 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003422 OnePerLine.ColumnLimit = 60;
3423 verifyFormat("Constructor()\n"
3424 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3425 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3426 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003427
3428 EXPECT_EQ("Constructor()\n"
3429 " : // Comment forcing unwanted break.\n"
3430 " aaaa(aaaa) {}",
3431 format("Constructor() :\n"
3432 " // Comment forcing unwanted break.\n"
3433 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003434}
3435
Francois Ferranda6b6d512017-05-24 11:36:58 +00003436TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3437 FormatStyle Style = getLLVMStyle();
3438 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3439
3440 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3441 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3442 getStyleWithColumns(Style, 45));
3443 verifyFormat("Constructor() :\n"
3444 " Initializer(FitsOnTheLine) {}",
3445 getStyleWithColumns(Style, 44));
3446 verifyFormat("Constructor() :\n"
3447 " Initializer(FitsOnTheLine) {}",
3448 getStyleWithColumns(Style, 43));
3449
3450 verifyFormat("template <typename T>\n"
3451 "Constructor() : Initializer(FitsOnTheLine) {}",
3452 getStyleWithColumns(Style, 50));
3453
3454 verifyFormat(
3455 "SomeClass::Constructor() :\n"
3456 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3457 Style);
3458
3459 verifyFormat(
3460 "SomeClass::Constructor() :\n"
3461 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3462 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3463 Style);
3464 verifyFormat(
3465 "SomeClass::Constructor() :\n"
3466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3467 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3468 Style);
3469 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3470 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3471 " aaaaaaaaaa(aaaaaa) {}",
3472 Style);
3473
3474 verifyFormat("Constructor() :\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3476 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3477 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3478 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3479 Style);
3480
3481 verifyFormat("Constructor() :\n"
3482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3484 Style);
3485
3486 verifyFormat("Constructor(int Parameter = 0) :\n"
3487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3488 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3489 Style);
3490 verifyFormat("Constructor() :\n"
3491 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3492 "}",
3493 getStyleWithColumns(Style, 60));
3494 verifyFormat("Constructor() :\n"
3495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3496 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3497 Style);
3498
3499 // Here a line could be saved by splitting the second initializer onto two
3500 // lines, but that is not desirable.
3501 verifyFormat("Constructor() :\n"
3502 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3503 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3504 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3505 Style);
3506
3507 FormatStyle OnePerLine = Style;
3508 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3509 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3510 verifyFormat("SomeClass::Constructor() :\n"
3511 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3512 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3513 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3514 OnePerLine);
3515 verifyFormat("SomeClass::Constructor() :\n"
3516 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3517 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3518 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3519 OnePerLine);
3520 verifyFormat("MyClass::MyClass(int var) :\n"
3521 " some_var_(var), // 4 space indent\n"
3522 " some_other_var_(var + 1) { // lined up\n"
3523 "}",
3524 OnePerLine);
3525 verifyFormat("Constructor() :\n"
3526 " aaaaa(aaaaaa),\n"
3527 " aaaaa(aaaaaa),\n"
3528 " aaaaa(aaaaaa),\n"
3529 " aaaaa(aaaaaa),\n"
3530 " aaaaa(aaaaaa) {}",
3531 OnePerLine);
3532 verifyFormat("Constructor() :\n"
3533 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3534 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3535 OnePerLine);
3536 OnePerLine.BinPackParameters = false;
3537 verifyFormat(
3538 "Constructor() :\n"
3539 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3540 " aaaaaaaaaaa().aaa(),\n"
3541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3542 OnePerLine);
3543 OnePerLine.ColumnLimit = 60;
3544 verifyFormat("Constructor() :\n"
3545 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3546 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3547 OnePerLine);
3548
3549 EXPECT_EQ("Constructor() :\n"
3550 " // Comment forcing unwanted break.\n"
3551 " aaaa(aaaa) {}",
3552 format("Constructor() :\n"
3553 " // Comment forcing unwanted break.\n"
3554 " aaaa(aaaa) {}",
3555 Style));
3556
3557 Style.ColumnLimit = 0;
3558 verifyFormat("SomeClass::Constructor() :\n"
3559 " a(a) {}",
3560 Style);
3561 verifyFormat("SomeClass::Constructor() noexcept :\n"
3562 " a(a) {}",
3563 Style);
3564 verifyFormat("SomeClass::Constructor() :\n"
3565 " a(a), b(b), c(c) {}",
3566 Style);
3567 verifyFormat("SomeClass::Constructor() :\n"
3568 " a(a) {\n"
3569 " foo();\n"
3570 " bar();\n"
3571 "}",
3572 Style);
3573
3574 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3575 verifyFormat("SomeClass::Constructor() :\n"
3576 " a(a), b(b), c(c) {\n"
3577 "}",
3578 Style);
3579 verifyFormat("SomeClass::Constructor() :\n"
3580 " a(a) {\n"
3581 "}",
3582 Style);
3583
3584 Style.ColumnLimit = 80;
3585 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3586 Style.ConstructorInitializerIndentWidth = 2;
3587 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3588 Style);
3589 verifyFormat("SomeClass::Constructor() :\n"
3590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3591 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3592 Style);
3593}
3594
David Blaikieea95dd72017-08-31 18:49:34 +00003595#ifndef EXPENSIVE_CHECKS
3596// Expensive checks enables libstdc++ checking which includes validating the
3597// state of ranges used in std::priority_queue - this blows out the
3598// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003599TEST_F(FormatTest, MemoizationTests) {
3600 // This breaks if the memoization lookup does not take \c Indent and
3601 // \c LastSpace into account.
3602 verifyFormat(
3603 "extern CFRunLoopTimerRef\n"
3604 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3605 " CFTimeInterval interval, CFOptionFlags flags,\n"
3606 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003607 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003608
3609 // Deep nesting somewhat works around our memoization.
3610 verifyFormat(
3611 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3612 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3613 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3614 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3615 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3616 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003617 verifyFormat(
3618 "aaaaa(\n"
3619 " aaaaa,\n"
3620 " aaaaa(\n"
3621 " aaaaa,\n"
3622 " aaaaa(\n"
3623 " aaaaa,\n"
3624 " aaaaa(\n"
3625 " aaaaa,\n"
3626 " aaaaa(\n"
3627 " aaaaa,\n"
3628 " aaaaa(\n"
3629 " aaaaa,\n"
3630 " aaaaa(\n"
3631 " aaaaa,\n"
3632 " aaaaa(\n"
3633 " aaaaa,\n"
3634 " aaaaa(\n"
3635 " aaaaa,\n"
3636 " aaaaa(\n"
3637 " aaaaa,\n"
3638 " aaaaa(\n"
3639 " aaaaa,\n"
3640 " aaaaa(\n"
3641 " aaaaa,\n"
3642 " aaaaa))))))))))));",
3643 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003644 verifyFormat(
3645 "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"
3646 " a),\n"
3647 " a),\n"
3648 " a),\n"
3649 " a),\n"
3650 " a),\n"
3651 " a),\n"
3652 " a),\n"
3653 " a),\n"
3654 " a),\n"
3655 " a),\n"
3656 " a),\n"
3657 " a),\n"
3658 " a),\n"
3659 " a),\n"
3660 " a),\n"
3661 " a),\n"
3662 " a)",
3663 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003664
3665 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003666 FormatStyle OnePerLine = getLLVMStyle();
3667 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003668 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003669 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003670 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003671 for (unsigned i = 0, e = 80; i != e; ++i) {
3672 input += " a,\n";
3673 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003674 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003675 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003676}
David Blaikieea95dd72017-08-31 18:49:34 +00003677#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003678
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003679TEST_F(FormatTest, BreaksAsHighAsPossible) {
3680 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003681 "void f() {\n"
3682 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3683 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3684 " f();\n"
3685 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003686 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003687 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003688}
3689
Daniel Jasper6728fc12013-04-11 14:29:13 +00003690TEST_F(FormatTest, BreaksFunctionDeclarations) {
3691 // Principially, we break function declarations in a certain order:
3692 // 1) break amongst arguments.
3693 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3694 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003695 verifyFormat("template <class TemplateIt>\n"
3696 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3697 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003698
3699 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003700 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003701 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003702 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003703 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003704
3705 // 3) break after (.
3706 verifyFormat(
3707 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003708 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3709 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003710
3711 // 4) break before after nested name specifiers.
3712 verifyFormat(
3713 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003714 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3715 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003716 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003717
3718 // However, there are exceptions, if a sufficient amount of lines can be
3719 // saved.
3720 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3721 // more adjusting.
3722 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3723 " Cccccccccccccc cccccccccc,\n"
3724 " Cccccccccccccc cccccccccc,\n"
3725 " Cccccccccccccc cccccccccc,\n"
3726 " Cccccccccccccc cccccccccc);");
3727 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003728 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003729 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3730 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3731 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003732 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003733 verifyFormat(
3734 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3735 " Cccccccccccccc cccccccccc,\n"
3736 " Cccccccccccccc cccccccccc,\n"
3737 " Cccccccccccccc cccccccccc,\n"
3738 " Cccccccccccccc cccccccccc,\n"
3739 " Cccccccccccccc cccccccccc,\n"
3740 " Cccccccccccccc cccccccccc);");
3741 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3742 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3743 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3744 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3745 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003746
3747 // Break after multi-line parameters.
3748 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3751 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003752 verifyFormat("void SomeLoooooooooooongFunction(\n"
3753 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3754 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3755 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003756
3757 // Treat overloaded operators like other functions.
3758 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3759 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003760 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3761 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003762 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3763 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3764 verifyGoogleFormat(
3765 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3766 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003767 verifyGoogleFormat(
3768 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3769 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003770 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3771 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3772 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3773 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003774 verifyGoogleFormat(
3775 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3776 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3777 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003778 verifyGoogleFormat(
3779 "template <typename T>\n"
3780 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3781 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3782 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003783
3784 FormatStyle Style = getLLVMStyle();
3785 Style.PointerAlignment = FormatStyle::PAS_Left;
3786 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3787 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3788 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003789 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3790 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3791 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003792}
3793
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003794TEST_F(FormatTest, TrailingReturnType) {
3795 verifyFormat("auto foo() -> int;\n");
3796 verifyFormat("struct S {\n"
3797 " auto bar() const -> int;\n"
3798 "};");
3799 verifyFormat("template <size_t Order, typename T>\n"
3800 "auto load_img(const std::string &filename)\n"
3801 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003802 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3803 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003804 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003805 verifyFormat("template <typename T>\n"
3806 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3807 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003808
3809 // Not trailing return types.
3810 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003811}
3812
Daniel Jasper5be31f72013-05-21 09:16:31 +00003813TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003814 // Avoid breaking before trailing 'const' or other trailing annotations, if
3815 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003816 FormatStyle Style = getGoogleStyle();
3817 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003818 verifyFormat("void someLongFunction(\n"
3819 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003820 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003821 verifyFormat("LoooooongReturnType\n"
3822 "someLoooooooongFunction() const {}",
3823 getLLVMStyleWithColumns(47));
3824 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3825 " const {}",
3826 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003827 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3828 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3829 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3830 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3831 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3832 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003833 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3834 " aaaaaaaaaaa aaaaa) const override;");
3835 verifyGoogleFormat(
3836 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3837 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003838
Daniel Jasper5550de62014-02-17 07:57:46 +00003839 // Even if the first parameter has to be wrapped.
3840 verifyFormat("void someLongFunction(\n"
3841 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003842 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003843 verifyFormat("void someLongFunction(\n"
3844 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003845 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003846 verifyFormat("void someLongFunction(\n"
3847 " int someLongParameter) override {}",
3848 Style);
3849 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003850 " int someLongParameter) OVERRIDE {}",
3851 Style);
3852 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003853 " int someLongParameter) final {}",
3854 Style);
3855 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003856 " int someLongParameter) FINAL {}",
3857 Style);
3858 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003859 " int parameter) const override {}",
3860 Style);
3861
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003862 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3863 verifyFormat("void someLongFunction(\n"
3864 " int someLongParameter) const\n"
3865 "{\n"
3866 "}",
3867 Style);
3868
Daniel Jasper5550de62014-02-17 07:57:46 +00003869 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003870 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3871 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3872 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003873
3874 // Breaking before function-like trailing annotations is fine to keep them
3875 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003876 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3877 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3878 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3879 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3880 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3881 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003882 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3883 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003884 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003885
3886 verifyFormat(
3887 "void aaaaaaaaaaaaaaaaaa()\n"
3888 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3889 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3890 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3891 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003892 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003893 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003894 " GUARDED_BY(aaaaaaaaaaaa);");
3895 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003896 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003897 " GUARDED_BY(aaaaaaaaaaaa);");
3898 verifyGoogleFormat(
3899 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3900 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003901 verifyGoogleFormat(
3902 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3903 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003904}
3905
Daniel Jasperf090f032015-05-18 09:47:22 +00003906TEST_F(FormatTest, FunctionAnnotations) {
3907 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003908 "int OldFunction(const string &parameter) {}");
3909 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003910 "string OldFunction(const string &parameter) {}");
3911 verifyFormat("template <typename T>\n"
3912 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3913 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003914
3915 // Not function annotations.
3916 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3917 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003918 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3919 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003920 verifyFormat("MACRO(abc).function() // wrap\n"
3921 " << abc;");
3922 verifyFormat("MACRO(abc)->function() // wrap\n"
3923 " << abc;");
3924 verifyFormat("MACRO(abc)::function() // wrap\n"
3925 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003926}
3927
Daniel Jasperf7935112012-12-03 18:12:45 +00003928TEST_F(FormatTest, BreaksDesireably) {
3929 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3930 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003931 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003932 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3934 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003935
3936 verifyFormat(
3937 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003939
3940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003943
3944 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003945 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3946 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003948 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003950
3951 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3952 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3953
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003954 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003955 "void f() {\n"
3956 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3958 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003959 verifyFormat(
3960 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3962 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003963 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3964 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3965 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003966 "aaaaaa(aaa,\n"
3967 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3969 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003970 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003973
Daniel Jasper739b85f2015-06-29 10:42:59 +00003974 // Indent consistently independent of call expression and unary operator.
3975 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3976 " dddddddddddddddddddddddddddddd));");
3977 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3978 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003979 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003980 " dddddddddddddddddddddddddddddd));");
3981
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003982 // This test case breaks on an incorrect memoization, i.e. an optimization not
3983 // taking into account the StopAt value.
3984 verifyFormat(
3985 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003986 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3987 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3988 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003989
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003990 verifyFormat("{\n {\n {\n"
3991 " Annotation.SpaceRequiredBefore =\n"
3992 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3993 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3994 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003995
3996 // Break on an outer level if there was a break on an inner level.
3997 EXPECT_EQ("f(g(h(a, // comment\n"
3998 " b, c),\n"
3999 " d, e),\n"
4000 " x, y);",
4001 format("f(g(h(a, // comment\n"
4002 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004003
4004 // Prefer breaking similar line breaks.
4005 verifyFormat(
4006 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4007 " NSTrackingMouseEnteredAndExited |\n"
4008 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004009}
4010
Daniel Jasper18210d72014-10-09 09:52:05 +00004011TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4012 FormatStyle NoBinPacking = getGoogleStyle();
4013 NoBinPacking.BinPackParameters = false;
4014 NoBinPacking.BinPackArguments = true;
4015 verifyFormat("void f() {\n"
4016 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4018 "}",
4019 NoBinPacking);
4020 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4021 " int aaaaaaaaaaaaaaaaaaaa,\n"
4022 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4023 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004024
Daniel Jasper00693b082016-01-09 15:56:47 +00004025 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4026 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4027 " vector<int> bbbbbbbbbbbbbbb);",
4028 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004029 // FIXME: This behavior difference is probably not wanted. However, currently
4030 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4031 // template arguments from BreakBeforeParameter being set because of the
4032 // one-per-line formatting.
4033 verifyFormat(
4034 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4035 " aaaaaaaaaa> aaaaaaaaaa);",
4036 NoBinPacking);
4037 verifyFormat(
4038 "void fffffffffff(\n"
4039 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4040 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004041}
4042
Daniel Jasper9278eb92013-01-16 14:59:02 +00004043TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004044 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004045 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004046 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004047 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4048 " aaaaaaaaaaaaaaaaaaaa,\n"
4049 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4050 NoBinPacking);
4051 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4052 " aaaaaaaaaaaaa,\n"
4053 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4054 NoBinPacking);
4055 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004056 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4057 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4059 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4061 NoBinPacking);
4062 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4063 " .aaaaaaaaaaaaaaaaaa();",
4064 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004065 verifyFormat("void f() {\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4067 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4068 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004069 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004070
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004071 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004072 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4073 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004074 " aaaaaaaaaaaa);",
4075 NoBinPacking);
4076 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004077 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4078 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004079 " test);",
4080 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004081
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004082 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4083 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004084 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4085 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004086 NoBinPacking);
4087 verifyFormat("a(\"a\"\n"
4088 " \"a\",\n"
4089 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004090
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004091 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004092 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004093 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004095 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004096 verifyFormat(
4097 "void f() {\n"
4098 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4099 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004100 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004101 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004102 verifyFormat(
4103 "template <class SomeType, class SomeOtherType>\n"
4104 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4105 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004106}
4107
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004108TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4109 FormatStyle Style = getLLVMStyleWithColumns(15);
4110 Style.ExperimentalAutoDetectBinPacking = true;
4111 EXPECT_EQ("aaa(aaaa,\n"
4112 " aaaa,\n"
4113 " aaaa);\n"
4114 "aaa(aaaa,\n"
4115 " aaaa,\n"
4116 " aaaa);",
4117 format("aaa(aaaa,\n" // one-per-line
4118 " aaaa,\n"
4119 " aaaa );\n"
4120 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4121 Style));
4122 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4123 " aaaa);\n"
4124 "aaa(aaaa, aaaa,\n"
4125 " aaaa);",
4126 format("aaa(aaaa, aaaa,\n" // bin-packed
4127 " aaaa );\n"
4128 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4129 Style));
4130}
4131
Daniel Jasper04468962013-01-18 10:56:38 +00004132TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004133 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4134 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4135 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4136 " .StartsWith(\".init\", ORDER_INIT)\n"
4137 " .StartsWith(\".fini\", ORDER_FINI)\n"
4138 " .StartsWith(\".hash\", ORDER_HASH)\n"
4139 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004140
Daniel Jaspereb50c672013-02-15 20:33:06 +00004141 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004142 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004143 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004144 "aaaaaaa->aaaaaaa\n"
4145 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004147 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004148 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004149 "aaaaaaa->aaaaaaa\n"
4150 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4151 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4152 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004153 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004154 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004155 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004156 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4157 " aaaaaa->aaaaaaaaaaaa()\n"
4158 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004160 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004161 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004162 "void f() {\n"
4163 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004164 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004165 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004166 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004167 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004168 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004169 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004170 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004171 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004172 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004173 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004174 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004175
4176 verifyFormat(
4177 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4178 verifyFormat("aaaaaaaaaaaaaaa()\n"
4179 " .aaaaaaaaaaaaaaa()\n"
4180 " .aaaaaaaaaaaaaaa()\n"
4181 " .aaaaaaaaaaaaaaa()\n"
4182 " .aaaaaaaaaaaaaaa();");
4183 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4184 " .aaaaaaaaaaaaaaa()\n"
4185 " .aaaaaaaaaaaaaaa()\n"
4186 " .aaaaaaaaaaaaaaa();");
4187 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4188 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4189 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004190 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4191 " ->aaaaaaaaaaaaaae(0)\n"
4192 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004193
Daniel Jasper775954b2015-04-24 10:08:09 +00004194 // Don't linewrap after very short segments.
4195 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4196 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4197 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4198 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4199 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4200 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4201 verifyFormat("aaa()\n"
4202 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4203 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4204 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4205
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004206 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4207 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4208 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4209 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4210 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004211 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004212
Daniel Jaspera41aa532014-09-19 08:01:25 +00004213 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004214 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4215 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004216
4217 // Prefer not to create "hanging" indents.
4218 verifyFormat(
4219 "return !soooooooooooooome_map\n"
4220 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4221 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004222 verifyFormat(
4223 "return aaaaaaaaaaaaaaaa\n"
4224 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4225 " .aaaa(aaaaaaaaaaaaaa);");
4226 // No hanging indent here.
4227 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4229 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004231 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4232 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4233 getLLVMStyleWithColumns(60));
4234 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4235 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4236 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4237 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004238 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4240 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004241}
4242
Daniel Jasperde5c2072012-12-24 00:13:23 +00004243TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4244 verifyFormat(
4245 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004246 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004247 verifyFormat(
4248 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4249 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4250
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004251 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004252 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004253 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4254 " ccccccccccccccccccccccccc) {\n}");
4255
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004256 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004257 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004258 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4259 " ccccccccccccccccccccccccc) {\n}");
4260
Daniel Jasperde5c2072012-12-24 00:13:23 +00004261 verifyFormat(
4262 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004263 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004264 verifyFormat(
4265 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4266 " ccccccccccccccccccccccccc) {\n}");
4267
Daniel Jasper400adc62013-02-08 15:28:42 +00004268 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4269 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4270 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4271 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004272 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4273 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4274 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4275 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4276
Daniel Jasper400adc62013-02-08 15:28:42 +00004277 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4278 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4279 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004280 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4281 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4282 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004283}
4284
Daniel Jasper43b65482013-01-23 12:27:43 +00004285TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004286 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004287 "unsigned Cost =\n"
4288 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4289 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004290 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004291 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4292 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004293
4294 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004295 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4296 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004297 verifyFormat("unsigned OriginalStartColumn =\n"
4298 " SourceMgr.getSpellingColumnNumber(\n"
4299 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4300 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004301}
4302
Francois Ferrand9976efa2017-05-22 08:28:17 +00004303TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4304 FormatStyle Style = getLLVMStyle();
4305 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4306 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4307 Style);
4308
4309 Style.PenaltyBreakAssignment = 20;
4310 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4311 " cccccccccccccccccccccccccc;",
4312 Style);
4313}
4314
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004315TEST_F(FormatTest, AlignsAfterAssignments) {
4316 verifyFormat(
4317 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004318 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004319 verifyFormat(
4320 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004321 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004322 verifyFormat(
4323 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004324 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004325 verifyFormat(
4326 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004327 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004328 verifyFormat(
4329 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4330 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4331 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004332}
4333
4334TEST_F(FormatTest, AlignsAfterReturn) {
4335 verifyFormat(
4336 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4337 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4338 verifyFormat(
4339 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4340 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004341 verifyFormat(
4342 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004343 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004344 verifyFormat(
4345 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004346 " aaaaaaaaaaaaaaaaaaaaaa());");
4347 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4349 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4351 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004352 verifyFormat("return\n"
4353 " // true if code is one of a or b.\n"
4354 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004355}
4356
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004357TEST_F(FormatTest, AlignsAfterOpenBracket) {
4358 verifyFormat(
4359 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4360 " aaaaaaaaa aaaaaaa) {}");
4361 verifyFormat(
4362 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4363 " aaaaaaaaaaa aaaaaaaaa);");
4364 verifyFormat(
4365 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4366 " aaaaaaaaaaaaaaaaaaaaa));");
4367 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004368 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004369 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4370 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4371 Style);
4372 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4373 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4374 Style);
4375 verifyFormat("SomeLongVariableName->someFunction(\n"
4376 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4377 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004378 verifyFormat(
4379 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4380 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4381 Style);
4382 verifyFormat(
4383 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4384 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4385 Style);
4386 verifyFormat(
4387 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4388 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4389 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004390
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004391 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4392 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4393 " b));",
4394 Style);
4395
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004396 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4397 Style.BinPackArguments = false;
4398 Style.BinPackParameters = false;
4399 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4400 " aaaaaaaaaaa aaaaaaaa,\n"
4401 " aaaaaaaaa aaaaaaa,\n"
4402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4403 Style);
4404 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4405 " aaaaaaaaaaa aaaaaaaaa,\n"
4406 " aaaaaaaaaaa aaaaaaaaa,\n"
4407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4408 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004409 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4410 " aaaaaaaaaaaaaaa,\n"
4411 " aaaaaaaaaaaaaaaaaaaaa,\n"
4412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004413 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004414 verifyFormat(
4415 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4416 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4417 Style);
4418 verifyFormat(
4419 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4420 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4421 Style);
4422 verifyFormat(
4423 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4424 " aaaaaaaaaaaaaaaaaaaaa(\n"
4425 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4426 " aaaaaaaaaaaaaaaa);",
4427 Style);
4428 verifyFormat(
4429 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4430 " aaaaaaaaaaaaaaaaaaaaa(\n"
4431 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4432 " aaaaaaaaaaaaaaaa);",
4433 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004434}
4435
Daniel Jasper3219e432014-12-02 13:24:51 +00004436TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4437 FormatStyle Style = getLLVMStyleWithColumns(40);
4438 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4439 " bbbbbbbbbbbbbbbbbbbbbb);",
4440 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004441 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004442 Style.AlignOperands = false;
4443 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4444 " bbbbbbbbbbbbbbbbbbbbbb);",
4445 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004446 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004447 Style.AlignOperands = true;
4448 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4449 " bbbbbbbbbbbbbbbbbbbbbb);",
4450 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004451 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004452 Style.AlignOperands = false;
4453 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4454 " bbbbbbbbbbbbbbbbbbbbbb);",
4455 Style);
4456}
4457
Daniel Jasper399d24b2013-01-09 07:06:56 +00004458TEST_F(FormatTest, BreaksConditionalExpressions) {
4459 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004460 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4461 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4462 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4463 verifyFormat(
4464 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004465 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4466 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004467 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004468 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4469 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4470 verifyFormat(
4471 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004472 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4473 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004474 verifyFormat(
4475 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4476 " : aaaaaaaaaaaaa);");
4477 verifyFormat(
4478 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004479 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004480 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4481 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004482 verifyFormat(
4483 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4484 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4485 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004486 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4487 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4489 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4491 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4493 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4495 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4497 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004498 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4500 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4501 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004503 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4504 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4505 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004506 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4507 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4508 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4509 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004510 verifyFormat(
4511 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4512 " ? aaaaaaaaaaaaaaa\n"
4513 " : aaaaaaaaaaaaaaa;");
4514 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004515 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004516 " ? b\n"
4517 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004518 verifyFormat("return aaaa == bbbb\n"
4519 " // comment\n"
4520 " ? aaaa\n"
4521 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004522 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004523 " format(TheLine.First,\n"
4524 " IndentForLevel[TheLine.Level] >= 0\n"
4525 " ? IndentForLevel[TheLine.Level]\n"
4526 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004527 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004528 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004529 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4530 " ? aaaaaaaaaaaaaaa\n"
4531 " : bbbbbbbbbbbbbbb //\n"
4532 " ? ccccccccccccccc\n"
4533 " : ddddddddddddddd;");
4534 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4535 " ? aaaaaaaaaaaaaaa\n"
4536 " : (bbbbbbbbbbbbbbb //\n"
4537 " ? ccccccccccccccc\n"
4538 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004539 verifyFormat(
4540 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4541 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4542 " aaaaaaaaaaaaaaaaaaaaa +\n"
4543 " aaaaaaaaaaaaaaaaaaaaa\n"
4544 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004545 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004546 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4547 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4548 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004549
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004550 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004551 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004552 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004553 "void f() {\n"
4554 " g(aaa,\n"
4555 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4557 " ? aaaaaaaaaaaaaaa\n"
4558 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004559 "}",
4560 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004561 verifyFormat(
4562 "void f() {\n"
4563 " g(aaa,\n"
4564 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4566 " ?: aaaaaaaaaaaaaaa);\n"
4567 "}",
4568 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004569
4570 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4571 " // comment.\n"
4572 " ccccccccccccccccccccccccccccccccccccccc\n"
4573 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4574 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004575
4576 // Assignments in conditional expressions. Apparently not uncommon :-(.
4577 verifyFormat("return a != b\n"
4578 " // comment\n"
4579 " ? a = b\n"
4580 " : a = b;");
4581 verifyFormat("return a != b\n"
4582 " // comment\n"
4583 " ? a = a != b\n"
4584 " // comment\n"
4585 " ? a = b\n"
4586 " : a\n"
4587 " : a;\n");
4588 verifyFormat("return a != b\n"
4589 " // comment\n"
4590 " ? a\n"
4591 " : a = a != b\n"
4592 " // comment\n"
4593 " ? a = b\n"
4594 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004595}
4596
Daniel Jasper165b29e2013-11-08 00:57:11 +00004597TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4598 FormatStyle Style = getLLVMStyle();
4599 Style.BreakBeforeTernaryOperators = false;
4600 Style.ColumnLimit = 70;
4601 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004602 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4605 Style);
4606 verifyFormat(
4607 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004608 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004610 Style);
4611 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004612 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4614 Style);
4615 verifyFormat(
4616 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004617 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004619 Style);
4620 verifyFormat(
4621 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4622 " aaaaaaaaaaaaa);",
4623 Style);
4624 verifyFormat(
4625 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4626 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4628 " aaaaaaaaaaaaa);",
4629 Style);
4630 verifyFormat(
4631 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4632 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4633 " aaaaaaaaaaaaa);",
4634 Style);
4635 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4640 Style);
4641 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4647 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4648 Style);
4649 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4653 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4654 Style);
4655 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4656 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4657 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4658 Style);
4659 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4663 Style);
4664 verifyFormat(
4665 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4666 " aaaaaaaaaaaaaaa :\n"
4667 " aaaaaaaaaaaaaaa;",
4668 Style);
4669 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4670 " aaaaaaaaa ?\n"
4671 " b :\n"
4672 " c);",
4673 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004674 verifyFormat("unsigned Indent =\n"
4675 " format(TheLine.First,\n"
4676 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4677 " IndentForLevel[TheLine.Level] :\n"
4678 " TheLine * 2,\n"
4679 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4680 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004681 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4682 " aaaaaaaaaaaaaaa :\n"
4683 " bbbbbbbbbbbbbbb ? //\n"
4684 " ccccccccccccccc :\n"
4685 " ddddddddddddddd;",
4686 Style);
4687 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4688 " aaaaaaaaaaaaaaa :\n"
4689 " (bbbbbbbbbbbbbbb ? //\n"
4690 " ccccccccccccccc :\n"
4691 " ddddddddddddddd);",
4692 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004693 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4694 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4695 " ccccccccccccccccccccccccccc;",
4696 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004697 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4698 " aaaaa :\n"
4699 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4700 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004701}
4702
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004703TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4704 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4705 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4706 verifyFormat("bool a = true, b = false;");
4707
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004708 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004710 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004711 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004712 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004713 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004714 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004715 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004716 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4717 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4718 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4719 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4720 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4721 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004722
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004723 FormatStyle Style = getGoogleStyle();
4724 Style.PointerAlignment = FormatStyle::PAS_Left;
4725 Style.DerivePointerAlignment = false;
4726 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4727 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4728 " *b = bbbbbbbbbbbbbbbbbbb;",
4729 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004730 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4731 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4732 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004733 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004734 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004735}
4736
Nico Weber4a5030c2013-01-12 01:28:06 +00004737TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4738 verifyFormat("arr[foo ? bar : baz];");
4739 verifyFormat("f()[foo ? bar : baz];");
4740 verifyFormat("(a + b)[foo ? bar : baz];");
4741 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4742}
4743
Daniel Jasperf7935112012-12-03 18:12:45 +00004744TEST_F(FormatTest, AlignsStringLiterals) {
4745 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4746 " \"short literal\");");
4747 verifyFormat(
4748 "looooooooooooooooooooooooongFunction(\n"
4749 " \"short literal\"\n"
4750 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004751 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4752 " \" string literals\",\n"
4753 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004754 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4755 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004756 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004757 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004758 getLLVMStyleWithColumns(28)));
4759 EXPECT_EQ(
4760 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4761 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4762 " \"aaaaaaaaaaaaaaaa\";",
4763 format("aaaaaa ="
4764 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4765 "aaaaaaaaaaaaaaaaaaaaa\" "
4766 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004767 verifyFormat("a = a + \"a\"\n"
4768 " \"a\"\n"
4769 " \"a\";");
4770 verifyFormat("f(\"a\", \"b\"\n"
4771 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004772
4773 verifyFormat(
4774 "#define LL_FORMAT \"ll\"\n"
4775 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4776 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004777
4778 verifyFormat("#define A(X) \\\n"
4779 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4780 " \"ccccc\"",
4781 getLLVMStyleWithColumns(23));
4782 verifyFormat("#define A \"def\"\n"
4783 "f(\"abc\" A \"ghi\"\n"
4784 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004785
4786 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004787 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004788 verifyFormat("#define A(X) \\\n"
4789 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4790 " L\"ccccc\"",
4791 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004792
4793 verifyFormat("f(@\"a\"\n"
4794 " @\"b\");");
4795 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004796 " @\"b\"\n"
4797 " @\"c\";");
4798 verifyFormat("NSString s = @\"a\"\n"
4799 " \"b\"\n"
4800 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004801}
4802
Zachary Turner448592e2015-12-18 22:20:15 +00004803TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004804 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004805 // No declarations or definitions should be moved to own line.
4806 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4807 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004808 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004809 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004810 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004811 "int f() { return 1; }\n"
4812 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004813 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004814
4815 // All declarations and definitions should have the return type moved to its
4816 // own
4817 // line.
4818 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4819 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004820 " int\n"
4821 " f() {\n"
4822 " return 1;\n"
4823 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004824 " int\n"
4825 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004826 "};\n"
4827 "int\n"
4828 "f() {\n"
4829 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004830 "}\n"
4831 "int\n"
4832 "g();\n",
4833 Style);
4834
4835 // Top-level definitions, and no kinds of declarations should have the
4836 // return type moved to its own line.
4837 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4838 verifyFormat("class B {\n"
4839 " int f() { return 1; }\n"
4840 " int g();\n"
4841 "};\n"
4842 "int\n"
4843 "f() {\n"
4844 " return 1;\n"
4845 "}\n"
4846 "int g();\n",
4847 Style);
4848
4849 // Top-level definitions and declarations should have the return type moved
4850 // to its own line.
4851 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4852 verifyFormat("class C {\n"
4853 " int f() { return 1; }\n"
4854 " int g();\n"
4855 "};\n"
4856 "int\n"
4857 "f() {\n"
4858 " return 1;\n"
4859 "}\n"
4860 "int\n"
4861 "g();\n",
4862 Style);
4863
4864 // All definitions should have the return type moved to its own line, but no
4865 // kinds of declarations.
4866 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4867 verifyFormat("class D {\n"
4868 " int\n"
4869 " f() {\n"
4870 " return 1;\n"
4871 " }\n"
4872 " int g();\n"
4873 "};\n"
4874 "int\n"
4875 "f() {\n"
4876 " return 1;\n"
4877 "}\n"
4878 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004879 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004880 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004881 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004882 " return \"\";\n"
4883 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004884 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004885 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004886 verifyFormat("template <class T>\n"
4887 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004888 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004889 " return NULL;\n"
4890 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004891 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004892 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004893 verifyFormat("class C {\n"
4894 " int\n"
4895 " operator+() {\n"
4896 " return 1;\n"
4897 " }\n"
4898 " int\n"
4899 " operator()() {\n"
4900 " return 1;\n"
4901 " }\n"
4902 "};\n",
4903 Style);
4904 verifyFormat("void\n"
4905 "A::operator()() {}\n"
4906 "void\n"
4907 "A::operator>>() {}\n"
4908 "void\n"
4909 "A::operator+() {}\n",
4910 Style);
4911 verifyFormat("void *operator new(std::size_t s);", // No break here.
4912 Style);
4913 verifyFormat("void *\n"
4914 "operator new(std::size_t s) {}",
4915 Style);
4916 verifyFormat("void *\n"
4917 "operator delete[](void *ptr) {}",
4918 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004919 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004920 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004921 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004922 "{\n"
4923 " return \"\";\n"
4924 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004925 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004926 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004927 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004928 "T *\n" // Problem here: no line break
4929 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004930 "{\n"
4931 " return NULL;\n"
4932 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004933 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004934 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004935}
4936
Alexander Kornienko58611712013-07-04 12:02:44 +00004937TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4938 FormatStyle NoBreak = getLLVMStyle();
4939 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4940 FormatStyle Break = getLLVMStyle();
4941 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004942 verifyFormat("aaaa = \"bbbb\"\n"
4943 " \"cccc\";",
4944 NoBreak);
4945 verifyFormat("aaaa =\n"
4946 " \"bbbb\"\n"
4947 " \"cccc\";",
4948 Break);
4949 verifyFormat("aaaa(\"bbbb\"\n"
4950 " \"cccc\");",
4951 NoBreak);
4952 verifyFormat("aaaa(\n"
4953 " \"bbbb\"\n"
4954 " \"cccc\");",
4955 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004956 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4957 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004958 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004959 verifyFormat("aaaa(qqq,\n"
4960 " \"bbbb\"\n"
4961 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004962 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004963 verifyFormat("aaaa(qqq,\n"
4964 " L\"bbbb\"\n"
4965 " L\"cccc\");",
4966 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004967 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4968 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004969 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004970 verifyFormat("string s = someFunction(\n"
4971 " \"abc\"\n"
4972 " \"abc\");",
4973 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004974
Daniel Jasper3251fff2014-06-10 06:27:23 +00004975 // As we break before unary operators, breaking right after them is bad.
4976 verifyFormat("string foo = abc ? \"x\"\n"
4977 " \"blah blah blah blah blah blah\"\n"
4978 " : \"y\";",
4979 Break);
4980
Daniel Jasperc834c702013-07-17 15:38:19 +00004981 // Don't break if there is no column gain.
4982 verifyFormat("f(\"aaaa\"\n"
4983 " \"bbbb\");",
4984 Break);
4985
4986 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004987 EXPECT_EQ("x = \"a\\\n"
4988 "b\\\n"
4989 "c\";",
4990 format("x = \"a\\\n"
4991 "b\\\n"
4992 "c\";",
4993 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004994 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004995 " \"a\\\n"
4996 "b\\\n"
4997 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004998 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004999 "b\\\n"
5000 "c\";",
5001 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005002
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005003 EXPECT_EQ("NSString *const kString =\n"
5004 " @\"aaaa\"\n"
5005 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005006 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005007 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005008 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005009
5010 Break.ColumnLimit = 0;
5011 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005012}
5013
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005014TEST_F(FormatTest, AlignsPipes) {
5015 verifyFormat(
5016 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5017 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5018 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5019 verifyFormat(
5020 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5021 " << aaaaaaaaaaaaaaaaaaaa;");
5022 verifyFormat(
5023 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5024 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5025 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005026 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5027 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5028 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005029 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5030 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5031 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5032 verifyFormat(
5033 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5034 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5035 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005036 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5039 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005040 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5041 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005042 verifyFormat(
5043 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005045 verifyFormat(
5046 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5047 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005048
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005049 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5050 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005051 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5053 " aaaaaaaaaaaaaaaaaaaaa)\n"
5054 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005055 verifyFormat("LOG_IF(aaa == //\n"
5056 " bbb)\n"
5057 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005058
Daniel Jasper467ddb12013-08-12 12:58:05 +00005059 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005060 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5061 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005062 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5063 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5064 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005065 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5066 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005067 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5068 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5070 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5071 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5073 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005074
Daniel Jasperc238c872013-04-02 14:33:13 +00005075 verifyFormat(
5076 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5077 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005078
5079 // Incomplete string literal.
5080 EXPECT_EQ("llvm::errs() << \"\n"
5081 " << a;",
5082 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005083
5084 verifyFormat("void f() {\n"
5085 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5086 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5087 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005088
5089 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005090 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5091 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5092 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005093
5094 // Handle '\n'.
5095 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5096 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5097 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5098 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5099 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5100 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5101 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005102}
5103
Daniel Jasper7209bb92016-12-13 11:16:42 +00005104TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5105 verifyFormat("return out << \"somepacket = {\\n\"\n"
5106 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5107 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5108 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5109 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5110 " << \"}\";");
5111
5112 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5113 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5114 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5115 verifyFormat(
5116 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5117 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5118 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5119 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5120 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5121 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5122 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5123 verifyFormat(
5124 "void f() {\n"
5125 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5126 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5127 "}");
5128
5129 // Breaking before the first "<<" is generally not desirable.
5130 verifyFormat(
5131 "llvm::errs()\n"
5132 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5133 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5134 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5135 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5136 getLLVMStyleWithColumns(70));
5137 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5138 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5139 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5141 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5142 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5143 getLLVMStyleWithColumns(70));
5144
5145 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5146 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5147 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5148 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5149 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5150 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005151 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5152 " (aaaa + aaaa);",
5153 getLLVMStyleWithColumns(40));
5154 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5155 " (aaaaaaa + aaaaa));",
5156 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005157 verifyFormat(
5158 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5159 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5160 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005161}
5162
Daniel Jasperf7935112012-12-03 18:12:45 +00005163TEST_F(FormatTest, UnderstandsEquals) {
5164 verifyFormat(
5165 "aaaaaaaaaaaaaaaaa =\n"
5166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5167 verifyFormat(
5168 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005170 verifyFormat(
5171 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005172 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005173 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5175 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005176
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005177 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5178 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005179}
5180
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005181TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005182 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5183 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005184
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005185 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5186 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005187
5188 verifyFormat(
5189 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5190 " Parameter2);");
5191
5192 verifyFormat(
5193 "ShortObject->shortFunction(\n"
5194 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5195 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5196
5197 verifyFormat("loooooooooooooongFunction(\n"
5198 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5199
5200 verifyFormat(
5201 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5202 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5203
Daniel Jasper687af3b2013-02-14 14:26:07 +00005204 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5205 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005206 verifyFormat("void f() {\n"
5207 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5208 " .Times(2)\n"
5209 " .WillRepeatedly(Return(SomeValue));\n"
5210 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005211 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5212 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005213 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5215 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005216 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005217 verifyFormat("void f() {\n"
5218 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5219 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5220 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005221 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5223 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5224 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5225 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005226 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5227 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5228 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5229 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5230 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005231
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005232 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005233 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005234 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005235 verifyFormat(
5236 "aaaaaaaaaaa->aaaaaaaaa(\n"
5237 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5238 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005239
5240 verifyFormat(
5241 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005243 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5244 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5245 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5246 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005247
Daniel Jasper9b334242013-03-15 14:57:30 +00005248 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5250 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005251
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005252 FormatStyle NoBinPacking = getLLVMStyle();
5253 NoBinPacking.BinPackParameters = false;
5254 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5255 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5256 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5257 " aaaaaaaaaaaaaaaaaaa,\n"
5258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5259 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005260
5261 // If there is a subsequent call, change to hanging indentation.
5262 verifyFormat(
5263 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5264 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5265 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5266 verifyFormat(
5267 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5268 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005269 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5271 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5272 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5274 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005275}
5276
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005277TEST_F(FormatTest, WrapsTemplateDeclarations) {
5278 verifyFormat("template <typename T>\n"
5279 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005280 verifyFormat("template <typename T>\n"
5281 "// T should be one of {A, B}.\n"
5282 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005283 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005284 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005285 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005286 verifyFormat("template <typename T>\n"
5287 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5288 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005289 verifyFormat(
5290 "template <typename T>\n"
5291 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5292 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005293 verifyFormat(
5294 "template <typename T>\n"
5295 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5296 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005298 verifyFormat("template <typename T>\n"
5299 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005300 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005301 verifyFormat(
5302 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5303 " typename T4 = char>\n"
5304 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005305 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5306 " template <typename> class cccccccccccccccccccccc,\n"
5307 " typename ddddddddddddd>\n"
5308 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005309 verifyFormat(
5310 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5311 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005312
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005313 verifyFormat("void f() {\n"
5314 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5315 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5316 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005317
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005318 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005319 verifyFormat("template <typename T> void f();");
5320 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005321 verifyFormat(
5322 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5323 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5325 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5327 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5328 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5329 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005330 EXPECT_EQ("static_cast<A< //\n"
5331 " B> *>(\n"
5332 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005333 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005334 format("static_cast<A<//\n"
5335 " B>*>(\n"
5336 "\n"
5337 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005338 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5339 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005340
5341 FormatStyle AlwaysBreak = getLLVMStyle();
5342 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5343 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5344 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5345 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5346 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5347 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5348 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5349 verifyFormat("template <template <typename> class Fooooooo,\n"
5350 " template <typename> class Baaaaaaar>\n"
5351 "struct C {};",
5352 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005353 verifyFormat("template <typename T> // T can be A, B or C.\n"
5354 "struct C {};",
5355 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005356 verifyFormat("template <enum E> class A {\n"
5357 "public:\n"
5358 " E *f();\n"
5359 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005360}
5361
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005362TEST_F(FormatTest, WrapsTemplateParameters) {
5363 FormatStyle Style = getLLVMStyle();
5364 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5365 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5366 verifyFormat(
5367 "template <typename... a> struct q {};\n"
5368 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5369 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5370 " y;",
5371 Style);
5372 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5373 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5374 verifyFormat(
5375 "template <typename... a> struct r {};\n"
5376 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5377 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5378 " y;",
5379 Style);
5380 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5381 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5382 verifyFormat(
5383 "template <typename... a> struct s {};\n"
5384 "extern s<\n"
5385 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5386 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5387 " y;",
5388 Style);
5389 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5390 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5391 verifyFormat(
5392 "template <typename... a> struct t {};\n"
5393 "extern t<\n"
5394 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5395 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5396 " y;",
5397 Style);
5398}
5399
Daniel Jasper45797022013-01-25 10:57:27 +00005400TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5401 verifyFormat(
5402 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5404 verifyFormat(
5405 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5408
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005409 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005410 verifyFormat(
5411 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005414
Daniel Jasper45797022013-01-25 10:57:27 +00005415 verifyFormat(
5416 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005417 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005418
5419 // Breaking at nested name specifiers is generally not desirable.
5420 verifyFormat(
5421 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5422 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005423
5424 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005425 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005428 " aaaaaaaaaaaaaaaaaaaaa);",
5429 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005430
5431 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5433 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005434}
5435
Daniel Jasperf7935112012-12-03 18:12:45 +00005436TEST_F(FormatTest, UnderstandsTemplateParameters) {
5437 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005438 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005439 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5440 verifyFormat("bool x = a < 1 || 2 > a;");
5441 verifyFormat("bool x = 5 < f<int>();");
5442 verifyFormat("bool x = f<int>() > 5;");
5443 verifyFormat("bool x = 5 < a<int>::x;");
5444 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5445 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5446
5447 verifyGoogleFormat("A<A<int>> a;");
5448 verifyGoogleFormat("A<A<A<int>>> a;");
5449 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005450 verifyGoogleFormat("A<A<int> > a;");
5451 verifyGoogleFormat("A<A<A<int> > > a;");
5452 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005453 verifyGoogleFormat("A<::A<int>> a;");
5454 verifyGoogleFormat("A<::A> a;");
5455 verifyGoogleFormat("A< ::A> a;");
5456 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005457 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5458 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005459 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5460 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005461 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5462 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005463
Nico Weber7533b4d2014-09-24 17:17:32 +00005464 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5465
Daniel Jasperf7935112012-12-03 18:12:45 +00005466 verifyFormat("test >> a >> b;");
5467 verifyFormat("test << a >> b;");
5468
5469 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005470 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005471 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005472 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5473 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005474 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005475 verifyFormat("f(a.operator()<A>());");
5476 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5477 " .template operator()<A>());",
5478 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005479
5480 // Not template parameters.
5481 verifyFormat("return a < b && c > d;");
5482 verifyFormat("void f() {\n"
5483 " while (a < b && c > d) {\n"
5484 " }\n"
5485 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005486 verifyFormat("template <typename... Types>\n"
5487 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005488
5489 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5491 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005492 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005493 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005494 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005495}
5496
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005497TEST_F(FormatTest, BitshiftOperatorWidth) {
5498 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5499 " bar */",
5500 format("int a=1<<2; /* foo\n"
5501 " bar */"));
5502
5503 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5504 " bar */",
5505 format("int b =256>>1 ; /* foo\n"
5506 " bar */"));
5507}
5508
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005509TEST_F(FormatTest, UnderstandsBinaryOperators) {
5510 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005511 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005512}
5513
5514TEST_F(FormatTest, UnderstandsPointersToMembers) {
5515 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005516 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005517 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005518 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005519 verifyFormat("void f() {\n"
5520 " (a->*f)();\n"
5521 " a->*x;\n"
5522 " (a.*f)();\n"
5523 " ((*a).*f)();\n"
5524 " a.*x;\n"
5525 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005526 verifyFormat("void f() {\n"
5527 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5528 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5529 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005530 verifyFormat(
5531 "(aaaaaaaaaa->*bbbbbbb)(\n"
5532 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005533 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005534 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005535 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005536}
5537
Daniel Jasper8dd40472012-12-21 09:41:31 +00005538TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005539 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005540 verifyFormat("f(-1, -2, -3);");
5541 verifyFormat("a[-1] = 5;");
5542 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005543 verifyFormat("if (i == -1) {\n}");
5544 verifyFormat("if (i != -1) {\n}");
5545 verifyFormat("if (i > -1) {\n}");
5546 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005547 verifyFormat("++(a->f());");
5548 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005549 verifyFormat("(a->f())++;");
5550 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005551 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005552
5553 verifyFormat("a-- > b;");
5554 verifyFormat("b ? -a : c;");
5555 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005556 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005557 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005558 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005559
5560 verifyFormat("return -1;");
5561 verifyFormat("switch (a) {\n"
5562 "case -1:\n"
5563 " break;\n"
5564 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005565 verifyFormat("#define X -1");
5566 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005567
Chandler Carruthf8b72662014-03-02 12:37:31 +00005568 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5569 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005570
5571 verifyFormat("int a = /* confusing comment */ -1;");
5572 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5573 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005574}
5575
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005576TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005577 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005578 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005579 "}");
5580 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005581 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005582 verifyFormat("*aaa = aaaaaaa( // break\n"
5583 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005584}
5585
Daniel Jasper8863ada2013-08-26 08:10:17 +00005586TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005587 verifyFormat("bool operator<();");
5588 verifyFormat("bool operator>();");
5589 verifyFormat("bool operator=();");
5590 verifyFormat("bool operator==();");
5591 verifyFormat("bool operator!=();");
5592 verifyFormat("int operator+();");
5593 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005594 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005595 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005596 verifyFormat("bool operator();");
5597 verifyFormat("bool operator()();");
5598 verifyFormat("bool operator[]();");
5599 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005600 verifyFormat("operator int();");
5601 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005602 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005603 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005604 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005605 verifyFormat("void *operator new(std::size_t size);");
5606 verifyFormat("void *operator new[](std::size_t size);");
5607 verifyFormat("void operator delete(void *ptr);");
5608 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005609 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5610 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005611 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005612 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005613
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005614 verifyFormat(
5615 "ostream &operator<<(ostream &OutputStream,\n"
5616 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005617 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5618 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5619 " return left.group < right.group;\n"
5620 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005621 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005622 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005623
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005624 verifyGoogleFormat("operator void*();");
5625 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005626 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005627
5628 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005629 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5630 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005631}
5632
Daniel Jasper1c220482015-02-25 10:30:06 +00005633TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005634 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5635 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5636 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5637 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5638 verifyFormat("Deleted &operator=(const Deleted &) &;");
5639 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5640 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5641 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5642 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5643 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5644 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005645 verifyFormat("void Fn(T const &) const &;");
5646 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005647 verifyFormat("template <typename T>\n"
5648 "void F(T) && = delete;",
5649 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005650
Daniel Jasperaf642c62015-08-25 13:40:51 +00005651 FormatStyle AlignLeft = getLLVMStyle();
5652 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005653 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005654 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5655 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5656 AlignLeft);
5657 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5658 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005659 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5660 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5661 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5662 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005663 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5664 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005665
5666 FormatStyle Spaces = getLLVMStyle();
5667 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005668 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5669 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5670 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5671 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005672
5673 Spaces.SpacesInCStyleCastParentheses = false;
5674 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005675 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5676 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5677 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5678 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005679}
5680
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005681TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005682 verifyFormat("void f() {\n"
5683 " A *a = new A;\n"
5684 " A *a = new (placement) A;\n"
5685 " delete a;\n"
5686 " delete (A *)a;\n"
5687 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005688 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5689 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005690 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5691 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5692 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005693 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005694}
5695
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005696TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005697 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005698 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005699 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005700 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005701 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005702 verifyIndependentOfContext("int a = b * 10;");
5703 verifyIndependentOfContext("int a = 10 * b;");
5704 verifyIndependentOfContext("int a = b * c;");
5705 verifyIndependentOfContext("int a += b * c;");
5706 verifyIndependentOfContext("int a -= b * c;");
5707 verifyIndependentOfContext("int a *= b * c;");
5708 verifyIndependentOfContext("int a /= b * c;");
5709 verifyIndependentOfContext("int a = *b;");
5710 verifyIndependentOfContext("int a = *b * c;");
5711 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005712 verifyIndependentOfContext("int a = b * (10);");
5713 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005714 verifyIndependentOfContext("return 10 * b;");
5715 verifyIndependentOfContext("return *b * *c;");
5716 verifyIndependentOfContext("return a & ~b;");
5717 verifyIndependentOfContext("f(b ? *c : *d);");
5718 verifyIndependentOfContext("int a = b ? *c : *d;");
5719 verifyIndependentOfContext("*b = a;");
5720 verifyIndependentOfContext("a * ~b;");
5721 verifyIndependentOfContext("a * !b;");
5722 verifyIndependentOfContext("a * +b;");
5723 verifyIndependentOfContext("a * -b;");
5724 verifyIndependentOfContext("a * ++b;");
5725 verifyIndependentOfContext("a * --b;");
5726 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005727 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005728 verifyIndependentOfContext("f() * b;");
5729 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005730 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005731 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005732 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005733 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005734 verifyIndependentOfContext("return sizeof(int **);");
5735 verifyIndependentOfContext("return sizeof(int ******);");
5736 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005737 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005738 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005739 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005740 verifyGoogleFormat("return sizeof(int**);");
5741 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5742 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005743 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005744 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005745 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005746 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005747 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005748 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005749 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005750 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005751 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005752 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005753 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005754 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005755 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005756 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005757 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005758 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005759 verifyFormat("void f(const MyOverride &override);");
5760 verifyFormat("void f(const MyFinal &final);");
5761 verifyIndependentOfContext("bool a = f() && override.f();");
5762 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005763
Daniel Jasper5b49f472013-01-23 12:10:53 +00005764 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005765
Daniel Jasper5b49f472013-01-23 12:10:53 +00005766 verifyIndependentOfContext("A<int *> a;");
5767 verifyIndependentOfContext("A<int **> a;");
5768 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005769 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005770 verifyIndependentOfContext(
5771 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005772 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005773 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005774 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005775 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005776 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005777
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005778 verifyFormat(
5779 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5781
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005782 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005783 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005784 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005785 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005786 verifyGoogleFormat("A<int*> a;");
5787 verifyGoogleFormat("A<int**> a;");
5788 verifyGoogleFormat("A<int*, int*> a;");
5789 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005790 verifyGoogleFormat("f(b ? *c : *d);");
5791 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005792 verifyGoogleFormat("Type* t = **x;");
5793 verifyGoogleFormat("Type* t = *++*x;");
5794 verifyGoogleFormat("*++*x;");
5795 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5796 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005797 verifyGoogleFormat(
5798 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005799 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005800 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5801 verifyGoogleFormat("template <typename T>\n"
5802 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005803
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005804 FormatStyle Left = getLLVMStyle();
5805 Left.PointerAlignment = FormatStyle::PAS_Left;
5806 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005807 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005808 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005809 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005810 verifyFormat("delete *x;", Left);
5811 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5812 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5813 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005814
Daniel Jasper5b49f472013-01-23 12:10:53 +00005815 verifyIndependentOfContext("a = *(x + y);");
5816 verifyIndependentOfContext("a = &(x + y);");
5817 verifyIndependentOfContext("*(x + y).call();");
5818 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005819 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005820
Daniel Jasper5b49f472013-01-23 12:10:53 +00005821 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005822 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005823 "int *MyValues = {\n"
5824 " *A, // Operator detection might be confused by the '{'\n"
5825 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005826 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005827
Daniel Jasper5b49f472013-01-23 12:10:53 +00005828 verifyIndependentOfContext("if (int *a = &b)");
5829 verifyIndependentOfContext("if (int &a = *b)");
5830 verifyIndependentOfContext("if (a & b[i])");
5831 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5832 verifyIndependentOfContext("if (*b[i])");
5833 verifyIndependentOfContext("if (int *a = (&b))");
5834 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005835 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005836 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005837 verifyFormat("void f() {\n"
5838 " for (const int &v : Values) {\n"
5839 " }\n"
5840 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005841 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5842 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005843 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005844
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005845 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005846 verifyFormat("#define MACRO \\\n"
5847 " int *i = a * b; \\\n"
5848 " void f(a *b);",
5849 getLLVMStyleWithColumns(19));
5850
Daniel Jasper97b89482013-03-13 07:49:51 +00005851 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005852 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005853 verifyIndependentOfContext("T **t = new T *;");
5854 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005855 verifyGoogleFormat("A = new SomeType*[Length]();");
5856 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005857 verifyGoogleFormat("T** t = new T*;");
5858 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005859
Daniel Jaspera65e8872014-03-25 10:52:45 +00005860 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5861 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005862 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005863 "typename t::if<x && y>::type f() {}");
5864 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005865 verifyFormat("vector<int *> v;");
5866 verifyFormat("vector<int *const> v;");
5867 verifyFormat("vector<int *const **const *> v;");
5868 verifyFormat("vector<int *volatile> v;");
5869 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005870 verifyFormat("foo<b && false>();");
5871 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005872 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005873 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005874 "template <class T, class = typename std::enable_if<\n"
5875 " std::is_integral<T>::value &&\n"
5876 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5877 "void F();",
5878 getLLVMStyleWithColumns(70));
5879 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005880 "template <class T,\n"
5881 " class = typename std::enable_if<\n"
5882 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005883 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5884 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005885 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005886 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005887 verifyFormat(
5888 "template <class T,\n"
5889 " class = typename ::std::enable_if<\n"
5890 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5891 "void F();",
5892 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005893
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005894 verifyIndependentOfContext("MACRO(int *i);");
5895 verifyIndependentOfContext("MACRO(auto *a);");
5896 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005897 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005898 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005899 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005900 // FIXME: Is there a way to make this work?
5901 // verifyIndependentOfContext("MACRO(A *a);");
5902
Daniel Jasper32ccb032014-06-23 07:36:18 +00005903 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005904 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005905
Daniel Jasper866468a2014-04-14 13:15:29 +00005906 EXPECT_EQ("#define OP(x) \\\n"
5907 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5908 " return s << a.DebugString(); \\\n"
5909 " }",
5910 format("#define OP(x) \\\n"
5911 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5912 " return s << a.DebugString(); \\\n"
5913 " }",
5914 getLLVMStyleWithColumns(50)));
5915
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005916 // FIXME: We cannot handle this case yet; we might be able to figure out that
5917 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005918 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005919
5920 FormatStyle PointerMiddle = getLLVMStyle();
5921 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5922 verifyFormat("delete *x;", PointerMiddle);
5923 verifyFormat("int * x;", PointerMiddle);
5924 verifyFormat("template <int * y> f() {}", PointerMiddle);
5925 verifyFormat("int * f(int * a) {}", PointerMiddle);
5926 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5927 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5928 verifyFormat("A<int *> a;", PointerMiddle);
5929 verifyFormat("A<int **> a;", PointerMiddle);
5930 verifyFormat("A<int *, int *> a;", PointerMiddle);
5931 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005932 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5933 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005934 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005935
5936 // Member function reference qualifiers aren't binary operators.
5937 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005938 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005939 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005940 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005941 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005942 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005943}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005944
Daniel Jasperee6d6502013-07-17 20:25:02 +00005945TEST_F(FormatTest, UnderstandsAttributes) {
5946 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005947 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5948 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005949 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005950 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005951 verifyFormat("__attribute__((nodebug)) void\n"
5952 "foo() {}\n",
5953 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005954}
5955
Daniel Jasper10cd5812013-05-06 06:35:44 +00005956TEST_F(FormatTest, UnderstandsEllipsis) {
5957 verifyFormat("int printf(const char *fmt, ...);");
5958 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005959 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5960
5961 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005962 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005963 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005964}
5965
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005966TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005967 EXPECT_EQ("int *a;\n"
5968 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005969 "int *a;",
5970 format("int *a;\n"
5971 "int* a;\n"
5972 "int *a;",
5973 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005974 EXPECT_EQ("int* a;\n"
5975 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005976 "int* a;",
5977 format("int* a;\n"
5978 "int* a;\n"
5979 "int *a;",
5980 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005981 EXPECT_EQ("int *a;\n"
5982 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005983 "int *a;",
5984 format("int *a;\n"
5985 "int * a;\n"
5986 "int * a;",
5987 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005988 EXPECT_EQ("auto x = [] {\n"
5989 " int *a;\n"
5990 " int *a;\n"
5991 " int *a;\n"
5992 "};",
5993 format("auto x=[]{int *a;\n"
5994 "int * a;\n"
5995 "int * a;};",
5996 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005997}
5998
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005999TEST_F(FormatTest, UnderstandsRvalueReferences) {
6000 verifyFormat("int f(int &&a) {}");
6001 verifyFormat("int f(int a, char &&b) {}");
6002 verifyFormat("void f() { int &&a = b; }");
6003 verifyGoogleFormat("int f(int a, char&& b) {}");
6004 verifyGoogleFormat("void f() { int&& a = b; }");
6005
Daniel Jasper1eff9082013-05-27 16:36:33 +00006006 verifyIndependentOfContext("A<int &&> a;");
6007 verifyIndependentOfContext("A<int &&, int &&> a;");
6008 verifyGoogleFormat("A<int&&> a;");
6009 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006010
6011 // Not rvalue references:
6012 verifyFormat("template <bool B, bool C> class A {\n"
6013 " static_assert(B && C, \"Something is wrong\");\n"
6014 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006015 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6016 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006017 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006018}
6019
Manuel Klimekc1237a82013-01-23 14:08:21 +00006020TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6021 verifyFormat("void f() {\n"
6022 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006023 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006024 "}",
6025 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006026}
6027
Daniel Jasperef906a92013-01-13 08:01:36 +00006028TEST_F(FormatTest, FormatsCasts) {
6029 verifyFormat("Type *A = static_cast<Type *>(P);");
6030 verifyFormat("Type *A = (Type *)P;");
6031 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6032 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006033 verifyFormat("int a = (int)2.0f;");
6034 verifyFormat("x[(int32)y];");
6035 verifyFormat("x = (int32)y;");
6036 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6037 verifyFormat("int a = (int)*b;");
6038 verifyFormat("int a = (int)2.0f;");
6039 verifyFormat("int a = (int)~0;");
6040 verifyFormat("int a = (int)++a;");
6041 verifyFormat("int a = (int)sizeof(int);");
6042 verifyFormat("int a = (int)+2;");
6043 verifyFormat("my_int a = (my_int)2.0f;");
6044 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006045 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006046 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006047 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006048 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006049 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006050
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006051 verifyFormat("void f() { my_int a = (my_int)*b; }");
6052 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6053 verifyFormat("my_int a = (my_int)~0;");
6054 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006055 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006056 verifyFormat("my_int a = (my_int)1;");
6057 verifyFormat("my_int a = (my_int *)1;");
6058 verifyFormat("my_int a = (const my_int)-1;");
6059 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006060 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006061 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006062 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006063 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006064
6065 // FIXME: single value wrapped with paren will be treated as cast.
6066 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006067
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006068 verifyFormat("{ (void)F; }");
6069
Daniel Jasper998cabc2013-07-18 14:46:07 +00006070 // Don't break after a cast's
6071 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6072 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6073 " bbbbbbbbbbbbbbbbbbbbbb);");
6074
Daniel Jasperef906a92013-01-13 08:01:36 +00006075 // These are not casts.
6076 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006077 verifyFormat("f(foo)->b;");
6078 verifyFormat("f(foo).b;");
6079 verifyFormat("f(foo)(b);");
6080 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006081 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006082 verifyFormat("(*funptr)(foo)[4];");
6083 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006084 verifyFormat("void f(int *);");
6085 verifyFormat("void f(int *) = 0;");
6086 verifyFormat("void f(SmallVector<int>) {}");
6087 verifyFormat("void f(SmallVector<int>);");
6088 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006089 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006090 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006091 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006092 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6093 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006094 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006095
Daniel Jasperba0bda92013-02-23 08:07:18 +00006096 // These are not casts, but at some point were confused with casts.
6097 verifyFormat("virtual void foo(int *) override;");
6098 verifyFormat("virtual void foo(char &) const;");
6099 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006100 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006101 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006102 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006103 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006104
6105 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6106 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006107 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006108 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006109 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6110 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6111 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006112}
6113
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006114TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006115 verifyFormat("A<bool()> a;");
6116 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006117 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006118 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006119 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006120 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006121 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006122 verifyFormat("template <class CallbackClass>\n"
6123 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006124
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006125 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6126 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006127 verifyGoogleFormat(
6128 "template <class CallbackClass>\n"
6129 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006130
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006131 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006132 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006133 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006134 verifyFormat("some_var = function(*some_pointer_var)[0];");
6135 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006136 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006137 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006138 verifyFormat("std::function<\n"
6139 " LooooooooooongTemplatedType<\n"
6140 " SomeType>*(\n"
6141 " LooooooooooooooooongType type)>\n"
6142 " function;",
6143 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006144}
6145
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006146TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6147 verifyFormat("A (*foo_)[6];");
6148 verifyFormat("vector<int> (*foo_)[6];");
6149}
6150
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006151TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6152 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6153 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6154 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6155 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006156 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6157 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006158
6159 // Different ways of ()-initializiation.
6160 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6161 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6162 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6163 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6164 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6165 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006166 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6167 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006168
6169 // Lambdas should not confuse the variable declaration heuristic.
6170 verifyFormat("LooooooooooooooooongType\n"
6171 " variable(nullptr, [](A *a) {});",
6172 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006173}
6174
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006175TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006176 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006177 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006178 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006180 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006181 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006182 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6183 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006184 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6185 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006186 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6187 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6189 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006190 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6191 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006192 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6193 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6194 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6195 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006196 FormatStyle Indented = getLLVMStyle();
6197 Indented.IndentWrappedFunctionNames = true;
6198 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6199 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6200 Indented);
6201 verifyFormat(
6202 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6203 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6204 Indented);
6205 verifyFormat(
6206 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6207 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6208 Indented);
6209 verifyFormat(
6210 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6211 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6212 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006213
6214 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006215 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6216 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6217 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006218
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006219 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006220 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006221 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006222 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6223 " SourceLocation L, IdentifierIn *II,\n"
6224 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006225 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006226 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006227 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006228 " const SomeType<string, SomeOtherTemplateParameter>\n"
6229 " &ReallyReallyLongParameterName,\n"
6230 " const SomeType<string, SomeOtherTemplateParameter>\n"
6231 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006232 verifyFormat("template <typename A>\n"
6233 "SomeLoooooooooooooooooooooongType<\n"
6234 " typename some_namespace::SomeOtherType<A>::Type>\n"
6235 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006236
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006237 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006238 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6239 " aaaaaaaaaaaaaaaaaaaaaaa;");
6240 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006241 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6242 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006243 verifyGoogleFormat(
6244 "some_namespace::LongReturnType\n"
6245 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006246 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006247
6248 verifyGoogleFormat("template <typename T>\n"
6249 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006250 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006251 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6252 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006253
6254 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006255 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6256 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006257 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6258 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6259 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6260 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6261 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006264
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006265 verifyFormat("template <typename T> // Templates on own line.\n"
6266 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006267 "MyFunction(int a);",
6268 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006269}
6270
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006271TEST_F(FormatTest, FormatsArrays) {
6272 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6273 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006274 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6275 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6277 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006278 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6279 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6280 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6281 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6282 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6283 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6284 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6285 verifyFormat(
6286 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6287 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6288 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006289 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6290 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006291
6292 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006294 verifyFormat(
6295 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6296 " .aaaaaaa[0]\n"
6297 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006298 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006299
6300 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006301
6302 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6303 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006304}
6305
Daniel Jaspere9de2602012-12-06 09:56:08 +00006306TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6307 verifyFormat("(a)->b();");
6308 verifyFormat("--a;");
6309}
6310
Daniel Jasper8b529712012-12-04 13:02:32 +00006311TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006312 verifyFormat("#include <string>\n"
6313 "#include <a/b/c.h>\n"
6314 "#include \"a/b/string\"\n"
6315 "#include \"string.h\"\n"
6316 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006317 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006318 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006319 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006320 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006321 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006322 "#include \"some very long include path\"\n"
6323 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006324 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006325 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6326 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006327
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006328 verifyFormat("#import <string>");
6329 verifyFormat("#import <a/b/c.h>");
6330 verifyFormat("#import \"a/b/string\"");
6331 verifyFormat("#import \"string.h\"");
6332 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006333 verifyFormat("#if __has_include(<strstream>)\n"
6334 "#include <strstream>\n"
6335 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006336
Daniel Jasper343643b2014-08-13 08:29:18 +00006337 verifyFormat("#define MY_IMPORT <a/b>");
6338
Nico Weber21088802017-02-10 19:36:52 +00006339 verifyFormat("#if __has_include(<a/b>)");
6340 verifyFormat("#if __has_include_next(<a/b>)");
6341 verifyFormat("#define F __has_include(<a/b>)");
6342 verifyFormat("#define F __has_include_next(<a/b>)");
6343
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006344 // Protocol buffer definition or missing "#".
6345 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6346 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006347
6348 FormatStyle Style = getLLVMStyle();
6349 Style.AlwaysBreakBeforeMultilineStrings = true;
6350 Style.ColumnLimit = 0;
6351 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006352
6353 // But 'import' might also be a regular C++ namespace.
6354 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006356}
6357
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006358//===----------------------------------------------------------------------===//
6359// Error recovery tests.
6360//===----------------------------------------------------------------------===//
6361
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006362TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006363 FormatStyle NoBinPacking = getLLVMStyle();
6364 NoBinPacking.BinPackParameters = false;
6365 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6366 " double *min_x,\n"
6367 " double *max_x,\n"
6368 " double *min_y,\n"
6369 " double *max_y,\n"
6370 " double *min_z,\n"
6371 " double *max_z, ) {}",
6372 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006373}
6374
Daniel Jasper83a54d22013-01-10 09:26:47 +00006375TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006376 verifyFormat("void f() { return; }\n42");
6377 verifyFormat("void f() {\n"
6378 " if (0)\n"
6379 " return;\n"
6380 "}\n"
6381 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006382 verifyFormat("void f() { return }\n42");
6383 verifyFormat("void f() {\n"
6384 " if (0)\n"
6385 " return\n"
6386 "}\n"
6387 "42");
6388}
6389
6390TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6391 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6392 EXPECT_EQ("void f() {\n"
6393 " if (a)\n"
6394 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006395 "}",
6396 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006397 EXPECT_EQ("namespace N {\n"
6398 "void f()\n"
6399 "}",
6400 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006401 EXPECT_EQ("namespace N {\n"
6402 "void f() {}\n"
6403 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006404 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006405 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006406}
6407
Daniel Jasper2df93312013-01-09 10:16:05 +00006408TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6409 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006410 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006411 " b;",
6412 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006413 verifyFormat("function(\n"
6414 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006415 " LoooooooooooongArgument);\n",
6416 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006417}
6418
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006419TEST_F(FormatTest, IncorrectAccessSpecifier) {
6420 verifyFormat("public:");
6421 verifyFormat("class A {\n"
6422 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006423 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006424 "};");
6425 verifyFormat("public\n"
6426 "int qwerty;");
6427 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006428 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006429 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006430 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006431 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006432 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006433}
Daniel Jasperf7935112012-12-03 18:12:45 +00006434
Daniel Jasper291f9362013-03-20 15:58:10 +00006435TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6436 verifyFormat("{");
6437 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006438 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006439}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006440
6441TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006442 verifyFormat("do {\n}");
6443 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006444 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006445 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006446 "wheeee(fun);");
6447 verifyFormat("do {\n"
6448 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006449 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006450}
6451
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006452TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006453 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006454 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006455 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006456 verifyFormat("while {\n foo;\n foo();\n}");
6457 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006458}
6459
Daniel Jasperc0880a92013-01-04 18:52:56 +00006460TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006461 verifyIncompleteFormat("namespace {\n"
6462 "class Foo { Foo (\n"
6463 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006464 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006465}
6466
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006467TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006468 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006469 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6470 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006471 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006472
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006473 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006474 " {\n"
6475 " breakme(\n"
6476 " qwe);\n"
6477 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006478 format("{\n"
6479 " {\n"
6480 " breakme(qwe);\n"
6481 "}\n",
6482 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006483}
6484
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006485TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006486 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006487 " avariable,\n"
6488 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006489 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006490}
6491
Manuel Klimek762dd182013-01-21 10:07:49 +00006492TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006493 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006494}
6495
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006496TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006497 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006498 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006499 " 1,\n"
6500 " 2,\n"
6501 " 3,\n"
6502 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006503 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006504 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6505 verifyFormat("f({1, 2});");
6506 verifyFormat("auto v = Foo{-1};");
6507 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6508 verifyFormat("Class::Class : member{1, 2, 3} {}");
6509 verifyFormat("new vector<int>{1, 2, 3};");
6510 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006511 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006512 verifyFormat("return {arg1, arg2};");
6513 verifyFormat("return {arg1, SomeType{parameter}};");
6514 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6515 verifyFormat("new T{arg1, arg2};");
6516 verifyFormat("f(MyMap[{composite, key}]);");
6517 verifyFormat("class Class {\n"
6518 " T member = {arg1, arg2};\n"
6519 "};");
6520 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006521 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6522 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006523 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6524 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006525
Daniel Jasper438059e2014-05-22 12:11:13 +00006526 verifyFormat("int foo(int i) { return fo1{}(i); }");
6527 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006528 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006529 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006530 verifyFormat("Node n{1, Node{1000}, //\n"
6531 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006532 verifyFormat("Aaaa aaaaaaa{\n"
6533 " {\n"
6534 " aaaa,\n"
6535 " },\n"
6536 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006537 verifyFormat("class C : public D {\n"
6538 " SomeClass SC{2};\n"
6539 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006540 verifyFormat("class C : public A {\n"
6541 " class D : public B {\n"
6542 " void f() { int i{2}; }\n"
6543 " };\n"
6544 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006545 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006546
Francois Ferrandd2130f52017-06-30 20:00:02 +00006547 // Binpacking only if there is no trailing comma
6548 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6549 " cccccccccc, dddddddddd};",
6550 getLLVMStyleWithColumns(50));
6551 verifyFormat("const Aaaaaa aaaaa = {\n"
6552 " aaaaaaaaaaa,\n"
6553 " bbbbbbbbbbb,\n"
6554 " ccccccccccc,\n"
6555 " ddddddddddd,\n"
6556 "};", getLLVMStyleWithColumns(50));
6557
Daniel Jaspere4ada022016-12-13 10:05:03 +00006558 // Cases where distinguising braced lists and blocks is hard.
6559 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6560 verifyFormat("void f() {\n"
6561 " return; // comment\n"
6562 "}\n"
6563 "SomeType t;");
6564 verifyFormat("void f() {\n"
6565 " if (a) {\n"
6566 " f();\n"
6567 " }\n"
6568 "}\n"
6569 "SomeType t;");
6570
Daniel Jasper08434342015-05-26 07:26:26 +00006571 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006572 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006573 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006574 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6575 " bbbbb,\n"
6576 " ccccc,\n"
6577 " ddddd,\n"
6578 " eeeee,\n"
6579 " ffffff,\n"
6580 " ggggg,\n"
6581 " hhhhhh,\n"
6582 " iiiiii,\n"
6583 " jjjjjj,\n"
6584 " kkkkkk};",
6585 NoBinPacking);
6586 verifyFormat("const Aaaaaa aaaaa = {\n"
6587 " aaaaa,\n"
6588 " bbbbb,\n"
6589 " ccccc,\n"
6590 " ddddd,\n"
6591 " eeeee,\n"
6592 " ffffff,\n"
6593 " ggggg,\n"
6594 " hhhhhh,\n"
6595 " iiiiii,\n"
6596 " jjjjjj,\n"
6597 " kkkkkk,\n"
6598 "};",
6599 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006600 verifyFormat(
6601 "const Aaaaaa aaaaa = {\n"
6602 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6603 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6604 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6605 "};",
6606 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006607
Chandler Carruthf8b72662014-03-02 12:37:31 +00006608 // FIXME: The alignment of these trailing comments might be bad. Then again,
6609 // this might be utterly useless in real code.
6610 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006611 " : some_value{ //\n"
6612 " aaaaaaa, //\n"
6613 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006614
Chandler Carruthf8b72662014-03-02 12:37:31 +00006615 // In braced lists, the first comment is always assumed to belong to the
6616 // first element. Thus, it can be moved to the next or previous line as
6617 // appropriate.
6618 EXPECT_EQ("function({// First element:\n"
6619 " 1,\n"
6620 " // Second element:\n"
6621 " 2});",
6622 format("function({\n"
6623 " // First element:\n"
6624 " 1,\n"
6625 " // Second element:\n"
6626 " 2});"));
6627 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6628 " // First element:\n"
6629 " 1,\n"
6630 " // Second element:\n"
6631 " 2};",
6632 format("std::vector<int> MyNumbers{// First element:\n"
6633 " 1,\n"
6634 " // Second element:\n"
6635 " 2};",
6636 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006637 // A trailing comma should still lead to an enforced line break and no
6638 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006639 EXPECT_EQ("vector<int> SomeVector = {\n"
6640 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006641 " 1,\n"
6642 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006643 "};",
6644 format("vector<int> SomeVector = { // aaa\n"
6645 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006646
Chandler Carruthf8b72662014-03-02 12:37:31 +00006647 FormatStyle ExtraSpaces = getLLVMStyle();
6648 ExtraSpaces.Cpp11BracedListStyle = false;
6649 ExtraSpaces.ColumnLimit = 75;
6650 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6651 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6652 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6653 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6654 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6655 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6656 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6657 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6658 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6659 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6660 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6661 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6662 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6663 verifyFormat("class Class {\n"
6664 " T member = { arg1, arg2 };\n"
6665 "};",
6666 ExtraSpaces);
6667 verifyFormat(
6668 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6669 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6670 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6671 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6672 ExtraSpaces);
6673 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006674 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006675 ExtraSpaces);
6676 verifyFormat(
6677 "someFunction(OtherParam,\n"
6678 " BracedList{ // comment 1 (Forcing interesting break)\n"
6679 " param1, param2,\n"
6680 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006681 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006682 ExtraSpaces);
6683 verifyFormat(
6684 "std::this_thread::sleep_for(\n"
6685 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6686 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006687 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006688 " aaaaaaa,\n"
6689 " aaaaaaaaaa,\n"
6690 " aaaaa,\n"
6691 " aaaaaaaaaaaaaaa,\n"
6692 " aaa,\n"
6693 " aaaaaaaaaa,\n"
6694 " a,\n"
6695 " aaaaaaaaaaaaaaaaaaaaa,\n"
6696 " aaaaaaaaaaaa,\n"
6697 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6698 " aaaaaaa,\n"
6699 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006700 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006701 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6702 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006703}
6704
Daniel Jasper33b909c2013-10-25 14:29:37 +00006705TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006706 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6707 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6708 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6709 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6710 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6711 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006712 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006713 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006714 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006715 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6716 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006717 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006718 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6719 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6720 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6721 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6722 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6723 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6724 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006725 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006726 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6727 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006728 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6729 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6730 " // Separating comment.\n"
6731 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6732 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6733 " // Leading comment\n"
6734 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6735 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006736 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6737 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006738 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006739 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6740 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006741 getLLVMStyleWithColumns(38));
6742 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006743 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6744 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006745 verifyFormat(
6746 "static unsigned SomeValues[10][3] = {\n"
6747 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6748 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6749 verifyFormat("static auto fields = new vector<string>{\n"
6750 " \"aaaaaaaaaaaaa\",\n"
6751 " \"aaaaaaaaaaaaa\",\n"
6752 " \"aaaaaaaaaaaa\",\n"
6753 " \"aaaaaaaaaaaaaa\",\n"
6754 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6755 " \"aaaaaaaaaaaa\",\n"
6756 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6757 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006758 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6759 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6760 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6761 " 3, cccccccccccccccccccccc};",
6762 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006763
6764 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006765 verifyFormat("vector<int> x = {\n"
6766 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6767 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006768 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006769 verifyFormat("vector<int> x = {\n"
6770 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006771 "};",
6772 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006773 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6774 " 1, 1, 1, 1,\n"
6775 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006776 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006777
Daniel Jasper60c27072015-05-13 08:16:00 +00006778 // Trailing comment in the first line.
6779 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6780 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6781 " 111111111, 222222222, 3333333333, 444444444, //\n"
6782 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006783 // Trailing comment in the last line.
6784 verifyFormat("int aaaaa[] = {\n"
6785 " 1, 2, 3, // comment\n"
6786 " 4, 5, 6 // comment\n"
6787 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006788
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006789 // With nested lists, we should either format one item per line or all nested
6790 // lists one on line.
6791 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006792 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6793 " {aaaaaaaaaaaaaaaaaaa},\n"
6794 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6795 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006796 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006797 verifyFormat(
6798 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006799 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6800 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6801 " {aaa, aaa},\n"
6802 " {aaa, aaa},\n"
6803 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6804 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6805 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006806
6807 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006808 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006809 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006810
6811 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006812
Daniel Jaspereb65e912015-12-21 18:31:15 +00006813 // No braced initializer here.
6814 verifyFormat("void f() {\n"
6815 " struct Dummy {};\n"
6816 " f(v);\n"
6817 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006818
6819 // Long lists should be formatted in columns even if they are nested.
6820 verifyFormat(
6821 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6822 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6823 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6824 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6825 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6826 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006827
6828 // Allow "single-column" layout even if that violates the column limit. There
6829 // isn't going to be a better way.
6830 verifyFormat("std::vector<int> a = {\n"
6831 " aaaaaaaa,\n"
6832 " aaaaaaaa,\n"
6833 " aaaaaaaa,\n"
6834 " aaaaaaaa,\n"
6835 " aaaaaaaaaa,\n"
6836 " aaaaaaaa,\n"
6837 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6838 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006839 verifyFormat("vector<int> aaaa = {\n"
6840 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6841 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6842 " aaaaaa.aaaaaaa,\n"
6843 " aaaaaa.aaaaaaa,\n"
6844 " aaaaaa.aaaaaaa,\n"
6845 " aaaaaa.aaaaaaa,\n"
6846 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006847
6848 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006849 verifyFormat("someFunction(Param, {List1, List2,\n"
6850 " List3});",
6851 getLLVMStyleWithColumns(35));
6852 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006853 " {List1, List2,\n"
6854 " List3});",
6855 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006856 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6857 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006858}
6859
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006860TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006861 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006862 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006863
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006864 verifyFormat("void f() { return 42; }");
6865 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006866 " return 42;\n"
6867 "}",
6868 DoNotMerge);
6869 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006870 " // Comment\n"
6871 "}");
6872 verifyFormat("{\n"
6873 "#error {\n"
6874 " int a;\n"
6875 "}");
6876 verifyFormat("{\n"
6877 " int a;\n"
6878 "#error {\n"
6879 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006880 verifyFormat("void f() {} // comment");
6881 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006882 verifyFormat("void f() {\n"
6883 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006884 DoNotMerge);
6885 verifyFormat("void f() {\n"
6886 " int a;\n"
6887 "} // comment",
6888 DoNotMerge);
6889 verifyFormat("void f() {\n"
6890 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006891 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006892
6893 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6894 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6895
6896 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6897 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006898 verifyFormat("class C {\n"
6899 " C()\n"
6900 " : iiiiiiii(nullptr),\n"
6901 " kkkkkkk(nullptr),\n"
6902 " mmmmmmm(nullptr),\n"
6903 " nnnnnnn(nullptr) {}\n"
6904 "};",
6905 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006906
6907 FormatStyle NoColumnLimit = getLLVMStyle();
6908 NoColumnLimit.ColumnLimit = 0;
6909 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6910 EXPECT_EQ("class C {\n"
6911 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006912 "};",
6913 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006914 EXPECT_EQ("A()\n"
6915 " : b(0) {\n"
6916 "}",
6917 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6918
6919 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006920 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6921 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006922 EXPECT_EQ("A()\n"
6923 " : b(0) {\n"
6924 "}",
6925 format("A():b(0){}", DoNotMergeNoColumnLimit));
6926 EXPECT_EQ("A()\n"
6927 " : b(0) {\n"
6928 "}",
6929 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006930
6931 verifyFormat("#define A \\\n"
6932 " void f() { \\\n"
6933 " int i; \\\n"
6934 " }",
6935 getLLVMStyleWithColumns(20));
6936 verifyFormat("#define A \\\n"
6937 " void f() { int i; }",
6938 getLLVMStyleWithColumns(21));
6939 verifyFormat("#define A \\\n"
6940 " void f() { \\\n"
6941 " int i; \\\n"
6942 " } \\\n"
6943 " int j;",
6944 getLLVMStyleWithColumns(22));
6945 verifyFormat("#define A \\\n"
6946 " void f() { int i; } \\\n"
6947 " int j;",
6948 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006949}
6950
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006951TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6952 FormatStyle MergeEmptyOnly = getLLVMStyle();
6953 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6954 verifyFormat("class C {\n"
6955 " int f() {}\n"
6956 "};",
6957 MergeEmptyOnly);
6958 verifyFormat("class C {\n"
6959 " int f() {\n"
6960 " return 42;\n"
6961 " }\n"
6962 "};",
6963 MergeEmptyOnly);
6964 verifyFormat("int f() {}", MergeEmptyOnly);
6965 verifyFormat("int f() {\n"
6966 " return 42;\n"
6967 "}",
6968 MergeEmptyOnly);
6969
6970 // Also verify behavior when BraceWrapping.AfterFunction = true
6971 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6972 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6973 verifyFormat("int f() {}", MergeEmptyOnly);
6974 verifyFormat("class C {\n"
6975 " int f() {}\n"
6976 "};",
6977 MergeEmptyOnly);
6978}
6979
Daniel Jasperd74cf402014-04-08 12:46:38 +00006980TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6981 FormatStyle MergeInlineOnly = getLLVMStyle();
6982 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6983 verifyFormat("class C {\n"
6984 " int f() { return 42; }\n"
6985 "};",
6986 MergeInlineOnly);
6987 verifyFormat("int f() {\n"
6988 " return 42;\n"
6989 "}",
6990 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006991
6992 // SFS_Inline implies SFS_Empty
6993 verifyFormat("class C {\n"
6994 " int f() {}\n"
6995 "};",
6996 MergeInlineOnly);
6997 verifyFormat("int f() {}", MergeInlineOnly);
6998
6999 // Also verify behavior when BraceWrapping.AfterFunction = true
7000 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7001 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7002 verifyFormat("class C {\n"
7003 " int f() { return 42; }\n"
7004 "};",
7005 MergeInlineOnly);
7006 verifyFormat("int f()\n"
7007 "{\n"
7008 " return 42;\n"
7009 "}",
7010 MergeInlineOnly);
7011
7012 // SFS_Inline implies SFS_Empty
7013 verifyFormat("int f() {}", MergeInlineOnly);
7014 verifyFormat("class C {\n"
7015 " int f() {}\n"
7016 "};",
7017 MergeInlineOnly);
7018}
7019
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007020TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7021 FormatStyle MergeInlineOnly = getLLVMStyle();
7022 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7023 FormatStyle::SFS_InlineOnly;
7024 verifyFormat("class C {\n"
7025 " int f() { return 42; }\n"
7026 "};",
7027 MergeInlineOnly);
7028 verifyFormat("int f() {\n"
7029 " return 42;\n"
7030 "}",
7031 MergeInlineOnly);
7032
7033 // SFS_InlineOnly does not imply SFS_Empty
7034 verifyFormat("class C {\n"
7035 " int f() {}\n"
7036 "};",
7037 MergeInlineOnly);
7038 verifyFormat("int f() {\n"
7039 "}",
7040 MergeInlineOnly);
7041
7042 // Also verify behavior when BraceWrapping.AfterFunction = true
7043 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7044 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7045 verifyFormat("class C {\n"
7046 " int f() { return 42; }\n"
7047 "};",
7048 MergeInlineOnly);
7049 verifyFormat("int f()\n"
7050 "{\n"
7051 " return 42;\n"
7052 "}",
7053 MergeInlineOnly);
7054
7055 // SFS_InlineOnly does not imply SFS_Empty
7056 verifyFormat("int f()\n"
7057 "{\n"
7058 "}",
7059 MergeInlineOnly);
7060 verifyFormat("class C {\n"
7061 " int f() {}\n"
7062 "};",
7063 MergeInlineOnly);
7064}
7065
Francois Ferrandad722562017-06-30 20:25:55 +00007066TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007067 FormatStyle Style = getLLVMStyle();
7068 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7069 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7070 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007071 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007072 Style.ColumnLimit = 40;
7073
7074 verifyFormat("int f()\n"
7075 "{}",
7076 Style);
7077 verifyFormat("int f()\n"
7078 "{\n"
7079 " return 42;\n"
7080 "}",
7081 Style);
7082 verifyFormat("int f()\n"
7083 "{\n"
7084 " // some comment\n"
7085 "}",
7086 Style);
7087
7088 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7089 verifyFormat("int f() {}", Style);
7090 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7091 "{}",
7092 Style);
7093 verifyFormat("int f()\n"
7094 "{\n"
7095 " return 0;\n"
7096 "}",
7097 Style);
7098
7099 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7100 verifyFormat("class Foo {\n"
7101 " int f() {}\n"
7102 "};\n",
7103 Style);
7104 verifyFormat("class Foo {\n"
7105 " int f() { return 0; }\n"
7106 "};\n",
7107 Style);
7108 verifyFormat("class Foo {\n"
7109 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7110 " {}\n"
7111 "};\n",
7112 Style);
7113 verifyFormat("class Foo {\n"
7114 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7115 " {\n"
7116 " return 0;\n"
7117 " }\n"
7118 "};\n",
7119 Style);
7120
7121 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7122 verifyFormat("int f() {}", Style);
7123 verifyFormat("int f() { return 0; }", Style);
7124 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7125 "{}",
7126 Style);
7127 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7128 "{\n"
7129 " return 0;\n"
7130 "}",
7131 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007132}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007133TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7134 FormatStyle Style = getLLVMStyle();
7135 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7136 verifyFormat("#ifdef A\n"
7137 "int f() {}\n"
7138 "#else\n"
7139 "int g() {}\n"
7140 "#endif",
7141 Style);
7142}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007143
Francois Ferrandad722562017-06-30 20:25:55 +00007144TEST_F(FormatTest, SplitEmptyClass) {
7145 FormatStyle Style = getLLVMStyle();
7146 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7147 Style.BraceWrapping.AfterClass = true;
7148 Style.BraceWrapping.SplitEmptyRecord = false;
7149
7150 verifyFormat("class Foo\n"
7151 "{};",
7152 Style);
7153 verifyFormat("/* something */ class Foo\n"
7154 "{};",
7155 Style);
7156 verifyFormat("template <typename X> class Foo\n"
7157 "{};",
7158 Style);
7159 verifyFormat("class Foo\n"
7160 "{\n"
7161 " Foo();\n"
7162 "};",
7163 Style);
7164 verifyFormat("typedef class Foo\n"
7165 "{\n"
7166 "} Foo_t;",
7167 Style);
7168}
7169
7170TEST_F(FormatTest, SplitEmptyStruct) {
7171 FormatStyle Style = getLLVMStyle();
7172 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7173 Style.BraceWrapping.AfterStruct = true;
7174 Style.BraceWrapping.SplitEmptyRecord = false;
7175
7176 verifyFormat("struct Foo\n"
7177 "{};",
7178 Style);
7179 verifyFormat("/* something */ struct Foo\n"
7180 "{};",
7181 Style);
7182 verifyFormat("template <typename X> struct Foo\n"
7183 "{};",
7184 Style);
7185 verifyFormat("struct Foo\n"
7186 "{\n"
7187 " Foo();\n"
7188 "};",
7189 Style);
7190 verifyFormat("typedef struct Foo\n"
7191 "{\n"
7192 "} Foo_t;",
7193 Style);
7194 //typedef struct Bar {} Bar_t;
7195}
7196
7197TEST_F(FormatTest, SplitEmptyUnion) {
7198 FormatStyle Style = getLLVMStyle();
7199 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7200 Style.BraceWrapping.AfterUnion = true;
7201 Style.BraceWrapping.SplitEmptyRecord = false;
7202
7203 verifyFormat("union Foo\n"
7204 "{};",
7205 Style);
7206 verifyFormat("/* something */ union Foo\n"
7207 "{};",
7208 Style);
7209 verifyFormat("union Foo\n"
7210 "{\n"
7211 " A,\n"
7212 "};",
7213 Style);
7214 verifyFormat("typedef union Foo\n"
7215 "{\n"
7216 "} Foo_t;",
7217 Style);
7218}
7219
7220TEST_F(FormatTest, SplitEmptyNamespace) {
7221 FormatStyle Style = getLLVMStyle();
7222 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7223 Style.BraceWrapping.AfterNamespace = true;
7224 Style.BraceWrapping.SplitEmptyNamespace = false;
7225
7226 verifyFormat("namespace Foo\n"
7227 "{};",
7228 Style);
7229 verifyFormat("/* something */ namespace Foo\n"
7230 "{};",
7231 Style);
7232 verifyFormat("inline namespace Foo\n"
7233 "{};",
7234 Style);
7235 verifyFormat("namespace Foo\n"
7236 "{\n"
7237 "void Bar();\n"
7238 "};",
7239 Style);
7240}
7241
7242TEST_F(FormatTest, NeverMergeShortRecords) {
7243 FormatStyle Style = getLLVMStyle();
7244
7245 verifyFormat("class Foo {\n"
7246 " Foo();\n"
7247 "};",
7248 Style);
7249 verifyFormat("typedef class Foo {\n"
7250 " Foo();\n"
7251 "} Foo_t;",
7252 Style);
7253 verifyFormat("struct Foo {\n"
7254 " Foo();\n"
7255 "};",
7256 Style);
7257 verifyFormat("typedef struct Foo {\n"
7258 " Foo();\n"
7259 "} Foo_t;",
7260 Style);
7261 verifyFormat("union Foo {\n"
7262 " A,\n"
7263 "};",
7264 Style);
7265 verifyFormat("typedef union Foo {\n"
7266 " A,\n"
7267 "} Foo_t;",
7268 Style);
7269 verifyFormat("namespace Foo {\n"
7270 "void Bar();\n"
7271 "};",
7272 Style);
7273
7274 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7275 Style.BraceWrapping.AfterClass = true;
7276 Style.BraceWrapping.AfterStruct = true;
7277 Style.BraceWrapping.AfterUnion = true;
7278 Style.BraceWrapping.AfterNamespace = true;
7279 verifyFormat("class Foo\n"
7280 "{\n"
7281 " Foo();\n"
7282 "};",
7283 Style);
7284 verifyFormat("typedef class Foo\n"
7285 "{\n"
7286 " Foo();\n"
7287 "} Foo_t;",
7288 Style);
7289 verifyFormat("struct Foo\n"
7290 "{\n"
7291 " Foo();\n"
7292 "};",
7293 Style);
7294 verifyFormat("typedef struct Foo\n"
7295 "{\n"
7296 " Foo();\n"
7297 "} Foo_t;",
7298 Style);
7299 verifyFormat("union Foo\n"
7300 "{\n"
7301 " A,\n"
7302 "};",
7303 Style);
7304 verifyFormat("typedef union Foo\n"
7305 "{\n"
7306 " A,\n"
7307 "} Foo_t;",
7308 Style);
7309 verifyFormat("namespace Foo\n"
7310 "{\n"
7311 "void Bar();\n"
7312 "};",
7313 Style);
7314}
7315
Manuel Klimeke01bab52013-01-15 13:38:33 +00007316TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7317 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007318 verifyFormat("struct foo a = {bar};\nint n;");
7319 verifyFormat("class foo a = {bar};\nint n;");
7320 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007321
7322 // Elaborate types inside function definitions.
7323 verifyFormat("struct foo f() {}\nint n;");
7324 verifyFormat("class foo f() {}\nint n;");
7325 verifyFormat("union foo f() {}\nint n;");
7326
7327 // Templates.
7328 verifyFormat("template <class X> void f() {}\nint n;");
7329 verifyFormat("template <struct X> void f() {}\nint n;");
7330 verifyFormat("template <union X> void f() {}\nint n;");
7331
7332 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007333 verifyFormat("struct {\n} n;");
7334 verifyFormat(
7335 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007336 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007337 verifyFormat("class MACRO Z {\n} n;");
7338 verifyFormat("class MACRO(X) Z {\n} n;");
7339 verifyFormat("class __attribute__(X) Z {\n} n;");
7340 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007341 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007342 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007343 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7344 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007345
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007346 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007347 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007348
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007349 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007350 verifyFormat(
7351 "template <typename F>\n"
7352 "Matcher(const Matcher<F> &Other,\n"
7353 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7354 " !is_same<F, T>::value>::type * = 0)\n"
7355 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7356
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007357 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007358 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007359 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007360
7361 // FIXME:
7362 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007363 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007364
Manuel Klimeke01bab52013-01-15 13:38:33 +00007365 // Elaborate types where incorrectly parsing the structural element would
7366 // break the indent.
7367 verifyFormat("if (true)\n"
7368 " class X x;\n"
7369 "else\n"
7370 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007371
7372 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007373 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007374}
7375
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007376TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007377 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7378 format("#error Leave all white!!!!! space* alone!\n"));
7379 EXPECT_EQ(
7380 "#warning Leave all white!!!!! space* alone!\n",
7381 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007382 EXPECT_EQ("#error 1", format(" # error 1"));
7383 EXPECT_EQ("#warning 1", format(" # warning 1"));
7384}
7385
Daniel Jasper4431aa92013-04-23 13:54:04 +00007386TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007387 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007388 verifyFormat("#if (AAAA && BBBB)");
7389 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007390 // FIXME: Come up with a better indentation for #elif.
7391 verifyFormat(
7392 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7393 " defined(BBBBBBBB)\n"
7394 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7395 " defined(BBBBBBBB)\n"
7396 "#endif",
7397 getLLVMStyleWithColumns(65));
7398}
7399
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007400TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7401 FormatStyle AllowsMergedIf = getGoogleStyle();
7402 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7403 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7404 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007405 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7406 EXPECT_EQ("if (true) return 42;",
7407 format("if (true)\nreturn 42;", AllowsMergedIf));
7408 FormatStyle ShortMergedIf = AllowsMergedIf;
7409 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007410 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007411 " if (true) return 42;",
7412 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007413 verifyFormat("#define A \\\n"
7414 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007415 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007416 "#define B",
7417 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007418 verifyFormat("#define A \\\n"
7419 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007420 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007421 "g();",
7422 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007423 verifyFormat("{\n"
7424 "#ifdef A\n"
7425 " // Comment\n"
7426 " if (true) continue;\n"
7427 "#endif\n"
7428 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007429 " if (true) continue;\n"
7430 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007431 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007432 ShortMergedIf.ColumnLimit = 33;
7433 verifyFormat("#define A \\\n"
7434 " if constexpr (true) return 42;",
7435 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007436 ShortMergedIf.ColumnLimit = 29;
7437 verifyFormat("#define A \\\n"
7438 " if (aaaaaaaaaa) return 1; \\\n"
7439 " return 2;",
7440 ShortMergedIf);
7441 ShortMergedIf.ColumnLimit = 28;
7442 verifyFormat("#define A \\\n"
7443 " if (aaaaaaaaaa) \\\n"
7444 " return 1; \\\n"
7445 " return 2;",
7446 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007447 verifyFormat("#define A \\\n"
7448 " if constexpr (aaaaaaa) \\\n"
7449 " return 1; \\\n"
7450 " return 2;",
7451 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007452}
7453
Manuel Klimekd33516e2013-01-23 10:09:28 +00007454TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007455 verifyFormat("void f(int *a);");
7456 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007457 verifyFormat("class A {\n void f(int *a);\n};");
7458 verifyFormat("class A {\n int *a;\n};");
7459 verifyFormat("namespace a {\n"
7460 "namespace b {\n"
7461 "class A {\n"
7462 " void f() {}\n"
7463 " int *a;\n"
7464 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007465 "} // namespace b\n"
7466 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007467}
7468
Manuel Klimekd33516e2013-01-23 10:09:28 +00007469TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7470 verifyFormat("while");
7471 verifyFormat("operator");
7472}
7473
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007474TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7475 // This code would be painfully slow to format if we didn't skip it.
7476 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
7477 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7478 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7479 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7480 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7481 "A(1, 1)\n"
7482 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7483 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7484 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7485 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7486 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7487 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7488 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7489 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7490 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7491 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7492 // Deeply nested part is untouched, rest is formatted.
7493 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7494 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007495 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007496}
7497
Nico Weber7e6a7a12013-01-08 17:56:31 +00007498//===----------------------------------------------------------------------===//
7499// Objective-C tests.
7500//===----------------------------------------------------------------------===//
7501
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007502TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7503 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7504 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7505 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007506 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007507 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7508 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7509 format("-(NSInteger)Method3:(id)anObject;"));
7510 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7511 format("-(NSInteger)Method4:(id)anObject;"));
7512 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7513 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7514 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7515 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007516 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7517 "forAllCells:(BOOL)flag;",
7518 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7519 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007520
7521 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007522 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7523 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007524 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7525 " inRange:(NSRange)range\n"
7526 " outRange:(NSRange)out_range\n"
7527 " outRange1:(NSRange)out_range1\n"
7528 " outRange2:(NSRange)out_range2\n"
7529 " outRange3:(NSRange)out_range3\n"
7530 " outRange4:(NSRange)out_range4\n"
7531 " outRange5:(NSRange)out_range5\n"
7532 " outRange6:(NSRange)out_range6\n"
7533 " outRange7:(NSRange)out_range7\n"
7534 " outRange8:(NSRange)out_range8\n"
7535 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007536
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007537 // When the function name has to be wrapped.
7538 FormatStyle Style = getLLVMStyle();
7539 Style.IndentWrappedFunctionNames = false;
7540 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7541 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7542 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7543 "}",
7544 Style);
7545 Style.IndentWrappedFunctionNames = true;
7546 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7547 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7548 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7549 "}",
7550 Style);
7551
Nico Weberd6f962f2013-01-10 20:18:33 +00007552 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007553 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007554 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7555 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007556 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007557
Daniel Jasper37194282013-05-28 08:33:00 +00007558 verifyFormat("- (int (*)())foo:(int (*)())f;");
7559 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007560
7561 // If there's no return type (very rare in practice!), LLVM and Google style
7562 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007563 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007564 verifyFormat("- foo:(int)f;");
7565 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007566}
7567
Nico Weber0588b502013-02-07 00:19:29 +00007568
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007569TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007570 EXPECT_EQ("\"some text \"\n"
7571 "\"other\";",
7572 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007573 EXPECT_EQ("\"some text \"\n"
7574 "\"other\";",
7575 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007576 EXPECT_EQ(
7577 "#define A \\\n"
7578 " \"some \" \\\n"
7579 " \"text \" \\\n"
7580 " \"other\";",
7581 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7582 EXPECT_EQ(
7583 "#define A \\\n"
7584 " \"so \" \\\n"
7585 " \"text \" \\\n"
7586 " \"other\";",
7587 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7588
7589 EXPECT_EQ("\"some text\"",
7590 format("\"some text\"", getLLVMStyleWithColumns(1)));
7591 EXPECT_EQ("\"some text\"",
7592 format("\"some text\"", getLLVMStyleWithColumns(11)));
7593 EXPECT_EQ("\"some \"\n"
7594 "\"text\"",
7595 format("\"some text\"", getLLVMStyleWithColumns(10)));
7596 EXPECT_EQ("\"some \"\n"
7597 "\"text\"",
7598 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007599 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007600 "\" tex\"\n"
7601 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007602 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007603 EXPECT_EQ("\"some\"\n"
7604 "\" tex\"\n"
7605 "\" and\"",
7606 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7607 EXPECT_EQ("\"some\"\n"
7608 "\"/tex\"\n"
7609 "\"/and\"",
7610 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007611
7612 EXPECT_EQ("variable =\n"
7613 " \"long string \"\n"
7614 " \"literal\";",
7615 format("variable = \"long string literal\";",
7616 getLLVMStyleWithColumns(20)));
7617
7618 EXPECT_EQ("variable = f(\n"
7619 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007620 " \"literal\",\n"
7621 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007622 " loooooooooooooooooooong);",
7623 format("variable = f(\"long string literal\", short, "
7624 "loooooooooooooooooooong);",
7625 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007626
Daniel Jaspera44991332015-04-29 13:06:49 +00007627 EXPECT_EQ(
7628 "f(g(\"long string \"\n"
7629 " \"literal\"),\n"
7630 " b);",
7631 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007632 EXPECT_EQ("f(g(\"long string \"\n"
7633 " \"literal\",\n"
7634 " a),\n"
7635 " b);",
7636 format("f(g(\"long string literal\", a), b);",
7637 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007638 EXPECT_EQ(
7639 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007640 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007641 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7642 EXPECT_EQ("f(\"one two three four five six \"\n"
7643 " \"seven\".split(\n"
7644 " really_looooong_variable));",
7645 format("f(\"one two three four five six seven\"."
7646 "split(really_looooong_variable));",
7647 getLLVMStyleWithColumns(33)));
7648
7649 EXPECT_EQ("f(\"some \"\n"
7650 " \"text\",\n"
7651 " other);",
7652 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007653
7654 // Only break as a last resort.
7655 verifyFormat(
7656 "aaaaaaaaaaaaaaaaaaaa(\n"
7657 " aaaaaaaaaaaaaaaaaaaa,\n"
7658 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007659
Daniel Jaspera44991332015-04-29 13:06:49 +00007660 EXPECT_EQ("\"splitmea\"\n"
7661 "\"trandomp\"\n"
7662 "\"oint\"",
7663 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007664
Daniel Jaspera44991332015-04-29 13:06:49 +00007665 EXPECT_EQ("\"split/\"\n"
7666 "\"pathat/\"\n"
7667 "\"slashes\"",
7668 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007669
Daniel Jaspera44991332015-04-29 13:06:49 +00007670 EXPECT_EQ("\"split/\"\n"
7671 "\"pathat/\"\n"
7672 "\"slashes\"",
7673 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007674 EXPECT_EQ("\"split at \"\n"
7675 "\"spaces/at/\"\n"
7676 "\"slashes.at.any$\"\n"
7677 "\"non-alphanumeric%\"\n"
7678 "\"1111111111characte\"\n"
7679 "\"rs\"",
7680 format("\"split at "
7681 "spaces/at/"
7682 "slashes.at."
7683 "any$non-"
7684 "alphanumeric%"
7685 "1111111111characte"
7686 "rs\"",
7687 getLLVMStyleWithColumns(20)));
7688
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007689 // Verify that splitting the strings understands
7690 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007691 EXPECT_EQ(
7692 "aaaaaaaaaaaa(\n"
7693 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7694 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7695 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7696 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7697 "aaaaaaaaaaaaaaaaaaaaaa\");",
7698 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007699 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7700 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7701 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7702 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7703 "aaaaaaaaaaaaaaaaaaaaaa\";",
7704 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007705 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7706 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7707 format("llvm::outs() << "
7708 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7709 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007710 EXPECT_EQ("ffff(\n"
7711 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7712 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7713 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7714 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7715 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007716
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007717 FormatStyle Style = getLLVMStyleWithColumns(12);
7718 Style.BreakStringLiterals = false;
7719 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7720
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007721 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007722 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007723 EXPECT_EQ("#define A \\\n"
7724 " \"some \" \\\n"
7725 " \"text \" \\\n"
7726 " \"other\";",
7727 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007728}
7729
Manuel Klimek9e321992015-07-28 15:50:24 +00007730TEST_F(FormatTest, FullyRemoveEmptyLines) {
7731 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7732 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7733 EXPECT_EQ("int i = a(b());",
7734 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7735}
7736
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007737TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7738 EXPECT_EQ(
7739 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7740 "(\n"
7741 " \"x\t\");",
7742 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7743 "aaaaaaa("
7744 "\"x\t\");"));
7745}
7746
Daniel Jasper174b0122014-01-09 14:18:12 +00007747TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007748 EXPECT_EQ(
7749 "u8\"utf8 string \"\n"
7750 "u8\"literal\";",
7751 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7752 EXPECT_EQ(
7753 "u\"utf16 string \"\n"
7754 "u\"literal\";",
7755 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7756 EXPECT_EQ(
7757 "U\"utf32 string \"\n"
7758 "U\"literal\";",
7759 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7760 EXPECT_EQ("L\"wide string \"\n"
7761 "L\"literal\";",
7762 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007763 EXPECT_EQ("@\"NSString \"\n"
7764 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007765 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007766 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007767
7768 // This input makes clang-format try to split the incomplete unicode escape
7769 // sequence, which used to lead to a crasher.
7770 verifyNoCrash(
7771 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7772 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007773}
7774
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007775TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7776 FormatStyle Style = getGoogleStyleWithColumns(15);
7777 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7778 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7779 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7780 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7781 EXPECT_EQ("u8R\"x(raw literal)x\";",
7782 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007783}
7784
7785TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7786 FormatStyle Style = getLLVMStyleWithColumns(20);
7787 EXPECT_EQ(
7788 "_T(\"aaaaaaaaaaaaaa\")\n"
7789 "_T(\"aaaaaaaaaaaaaa\")\n"
7790 "_T(\"aaaaaaaaaaaa\")",
7791 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007792 EXPECT_EQ("f(x,\n"
7793 " _T(\"aaaaaaaaaaaa\")\n"
7794 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007795 " z);",
7796 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7797
7798 // FIXME: Handle embedded spaces in one iteration.
7799 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7800 // "_T(\"aaaaaaaaaaaaa\")\n"
7801 // "_T(\"aaaaaaaaaaaaa\")\n"
7802 // "_T(\"a\")",
7803 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7804 // getLLVMStyleWithColumns(20)));
7805 EXPECT_EQ(
7806 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7807 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007808 EXPECT_EQ("f(\n"
7809 "#if !TEST\n"
7810 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7811 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007812 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007813 format("f(\n"
7814 "#if !TEST\n"
7815 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7816 "#endif\n"
7817 ");"));
7818 EXPECT_EQ("f(\n"
7819 "\n"
7820 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7821 format("f(\n"
7822 "\n"
7823 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007824}
7825
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007826TEST_F(FormatTest, BreaksStringLiteralOperands) {
7827 // In a function call with two operands, the second can be broken with no line
7828 // break before it.
7829 EXPECT_EQ("func(a, \"long long \"\n"
7830 " \"long long\");",
7831 format("func(a, \"long long long long\");",
7832 getLLVMStyleWithColumns(24)));
7833 // In a function call with three operands, the second must be broken with a
7834 // line break before it.
7835 EXPECT_EQ("func(a,\n"
7836 " \"long long long \"\n"
7837 " \"long\",\n"
7838 " c);",
7839 format("func(a, \"long long long long\", c);",
7840 getLLVMStyleWithColumns(24)));
7841 // In a function call with three operands, the third must be broken with a
7842 // line break before it.
7843 EXPECT_EQ("func(a, b,\n"
7844 " \"long long long \"\n"
7845 " \"long\");",
7846 format("func(a, b, \"long long long long\");",
7847 getLLVMStyleWithColumns(24)));
7848 // In a function call with three operands, both the second and the third must
7849 // be broken with a line break before them.
7850 EXPECT_EQ("func(a,\n"
7851 " \"long long long \"\n"
7852 " \"long\",\n"
7853 " \"long long long \"\n"
7854 " \"long\");",
7855 format("func(a, \"long long long long\", \"long long long long\");",
7856 getLLVMStyleWithColumns(24)));
7857 // In a chain of << with two operands, the second can be broken with no line
7858 // break before it.
7859 EXPECT_EQ("a << \"line line \"\n"
7860 " \"line\";",
7861 format("a << \"line line line\";",
7862 getLLVMStyleWithColumns(20)));
7863 // In a chain of << with three operands, the second can be broken with no line
7864 // break before it.
7865 EXPECT_EQ("abcde << \"line \"\n"
7866 " \"line line\"\n"
7867 " << c;",
7868 format("abcde << \"line line line\" << c;",
7869 getLLVMStyleWithColumns(20)));
7870 // In a chain of << with three operands, the third must be broken with a line
7871 // break before it.
7872 EXPECT_EQ("a << b\n"
7873 " << \"line line \"\n"
7874 " \"line\";",
7875 format("a << b << \"line line line\";",
7876 getLLVMStyleWithColumns(20)));
7877 // In a chain of << with three operands, the second can be broken with no line
7878 // break before it and the third must be broken with a line break before it.
7879 EXPECT_EQ("abcd << \"line line \"\n"
7880 " \"line\"\n"
7881 " << \"line line \"\n"
7882 " \"line\";",
7883 format("abcd << \"line line line\" << \"line line line\";",
7884 getLLVMStyleWithColumns(20)));
7885 // In a chain of binary operators with two operands, the second can be broken
7886 // with no line break before it.
7887 EXPECT_EQ("abcd + \"line line \"\n"
7888 " \"line line\";",
7889 format("abcd + \"line line line line\";",
7890 getLLVMStyleWithColumns(20)));
7891 // In a chain of binary operators with three operands, the second must be
7892 // broken with a line break before it.
7893 EXPECT_EQ("abcd +\n"
7894 " \"line line \"\n"
7895 " \"line line\" +\n"
7896 " e;",
7897 format("abcd + \"line line line line\" + e;",
7898 getLLVMStyleWithColumns(20)));
7899 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7900 // the first must be broken with a line break before it.
7901 FormatStyle Style = getLLVMStyleWithColumns(25);
7902 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7903 EXPECT_EQ("someFunction(\n"
7904 " \"long long long \"\n"
7905 " \"long\",\n"
7906 " a);",
7907 format("someFunction(\"long long long long\", a);", Style));
7908}
7909
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007910TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007911 EXPECT_EQ(
7912 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7913 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7915 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7918}
7919
7920TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7921 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007922 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007923 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7924 "multiline raw string literal xxxxxxxxxxxxxx\n"
7925 ")x\",\n"
7926 " a),\n"
7927 " b);",
7928 format("fffffffffff(g(R\"x(\n"
7929 "multiline raw string literal xxxxxxxxxxxxxx\n"
7930 ")x\", a), b);",
7931 getGoogleStyleWithColumns(20)));
7932 EXPECT_EQ("fffffffffff(\n"
7933 " g(R\"x(qqq\n"
7934 "multiline raw string literal xxxxxxxxxxxxxx\n"
7935 ")x\",\n"
7936 " a),\n"
7937 " b);",
7938 format("fffffffffff(g(R\"x(qqq\n"
7939 "multiline raw string literal xxxxxxxxxxxxxx\n"
7940 ")x\", a), b);",
7941 getGoogleStyleWithColumns(20)));
7942
7943 EXPECT_EQ("fffffffffff(R\"x(\n"
7944 "multiline raw string literal xxxxxxxxxxxxxx\n"
7945 ")x\");",
7946 format("fffffffffff(R\"x(\n"
7947 "multiline raw string literal xxxxxxxxxxxxxx\n"
7948 ")x\");",
7949 getGoogleStyleWithColumns(20)));
7950 EXPECT_EQ("fffffffffff(R\"x(\n"
7951 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007952 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007953 format("fffffffffff(R\"x(\n"
7954 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007955 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007956 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007957 EXPECT_EQ("fffffffffff(\n"
7958 " R\"x(\n"
7959 "multiline raw string literal xxxxxxxxxxxxxx\n"
7960 ")x\" +\n"
7961 " bbbbbb);",
7962 format("fffffffffff(\n"
7963 " R\"x(\n"
7964 "multiline raw string literal xxxxxxxxxxxxxx\n"
7965 ")x\" + bbbbbb);",
7966 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007967}
7968
Alexander Kornienkobe633902013-06-14 11:46:10 +00007969TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007970 verifyFormat("string a = \"unterminated;");
7971 EXPECT_EQ("function(\"unterminated,\n"
7972 " OtherParameter);",
7973 format("function( \"unterminated,\n"
7974 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007975}
7976
7977TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007978 FormatStyle Style = getLLVMStyle();
7979 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007980 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007981 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007982}
7983
Daniel Jaspera44991332015-04-29 13:06:49 +00007984TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007985
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007986TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7987 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7988 " \"ddeeefff\");",
7989 format("someFunction(\"aaabbbcccdddeeefff\");",
7990 getLLVMStyleWithColumns(25)));
7991 EXPECT_EQ("someFunction1234567890(\n"
7992 " \"aaabbbcccdddeeefff\");",
7993 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7994 getLLVMStyleWithColumns(26)));
7995 EXPECT_EQ("someFunction1234567890(\n"
7996 " \"aaabbbcccdddeeeff\"\n"
7997 " \"f\");",
7998 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7999 getLLVMStyleWithColumns(25)));
8000 EXPECT_EQ("someFunction1234567890(\n"
8001 " \"aaabbbcccdddeeeff\"\n"
8002 " \"f\");",
8003 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8004 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008005 EXPECT_EQ("someFunction(\n"
8006 " \"aaabbbcc ddde \"\n"
8007 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008008 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008009 getLLVMStyleWithColumns(25)));
8010 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8011 " \"ddeeefff\");",
8012 format("someFunction(\"aaabbbccc ddeeefff\");",
8013 getLLVMStyleWithColumns(25)));
8014 EXPECT_EQ("someFunction1234567890(\n"
8015 " \"aaabb \"\n"
8016 " \"cccdddeeefff\");",
8017 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8018 getLLVMStyleWithColumns(25)));
8019 EXPECT_EQ("#define A \\\n"
8020 " string s = \\\n"
8021 " \"123456789\" \\\n"
8022 " \"0\"; \\\n"
8023 " int i;",
8024 format("#define A string s = \"1234567890\"; int i;",
8025 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008026 EXPECT_EQ("someFunction(\n"
8027 " \"aaabbbcc \"\n"
8028 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008029 format("someFunction(\"aaabbbcc dddeeefff\");",
8030 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008031}
8032
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008033TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008034 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8035 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008036 EXPECT_EQ("\"test\"\n"
8037 "\"\\n\"",
8038 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8039 EXPECT_EQ("\"tes\\\\\"\n"
8040 "\"n\"",
8041 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8042 EXPECT_EQ("\"\\\\\\\\\"\n"
8043 "\"\\n\"",
8044 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008045 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008046 EXPECT_EQ("\"\\uff01\"\n"
8047 "\"test\"",
8048 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8049 EXPECT_EQ("\"\\Uff01ff02\"",
8050 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8051 EXPECT_EQ("\"\\x000000000001\"\n"
8052 "\"next\"",
8053 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8054 EXPECT_EQ("\"\\x000000000001next\"",
8055 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8056 EXPECT_EQ("\"\\x000000000001\"",
8057 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8058 EXPECT_EQ("\"test\"\n"
8059 "\"\\000000\"\n"
8060 "\"000001\"",
8061 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8062 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008063 "\"00000000\"\n"
8064 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008065 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008066}
8067
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008068TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8069 verifyFormat("void f() {\n"
8070 " return g() {}\n"
8071 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008072 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008073 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008074 "}");
8075}
8076
Manuel Klimek421147e2014-01-24 09:25:23 +00008077TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8078 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008079 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008080}
8081
Manuel Klimek13b97d82013-05-13 08:42:42 +00008082TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8083 verifyFormat("class X {\n"
8084 " void f() {\n"
8085 " }\n"
8086 "};",
8087 getLLVMStyleWithColumns(12));
8088}
8089
8090TEST_F(FormatTest, ConfigurableIndentWidth) {
8091 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8092 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008093 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008094 verifyFormat("void f() {\n"
8095 " someFunction();\n"
8096 " if (true) {\n"
8097 " f();\n"
8098 " }\n"
8099 "}",
8100 EightIndent);
8101 verifyFormat("class X {\n"
8102 " void f() {\n"
8103 " }\n"
8104 "};",
8105 EightIndent);
8106 verifyFormat("int x[] = {\n"
8107 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008108 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008109 EightIndent);
8110}
8111
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008112TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008113 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008114 "f();",
8115 getLLVMStyleWithColumns(8));
8116}
8117
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008118TEST_F(FormatTest, ConfigurableUseOfTab) {
8119 FormatStyle Tab = getLLVMStyleWithColumns(42);
8120 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008121 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008122 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008123
8124 EXPECT_EQ("if (aaaaaaaa && // q\n"
8125 " bb)\t\t// w\n"
8126 "\t;",
8127 format("if (aaaaaaaa &&// q\n"
8128 "bb)// w\n"
8129 ";",
8130 Tab));
8131 EXPECT_EQ("if (aaa && bbb) // w\n"
8132 "\t;",
8133 format("if(aaa&&bbb)// w\n"
8134 ";",
8135 Tab));
8136
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008137 verifyFormat("class X {\n"
8138 "\tvoid f() {\n"
8139 "\t\tsomeFunction(parameter1,\n"
8140 "\t\t\t parameter2);\n"
8141 "\t}\n"
8142 "};",
8143 Tab);
8144 verifyFormat("#define A \\\n"
8145 "\tvoid f() { \\\n"
8146 "\t\tsomeFunction( \\\n"
8147 "\t\t parameter1, \\\n"
8148 "\t\t parameter2); \\\n"
8149 "\t}",
8150 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008151
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008152 Tab.TabWidth = 4;
8153 Tab.IndentWidth = 8;
8154 verifyFormat("class TabWidth4Indent8 {\n"
8155 "\t\tvoid f() {\n"
8156 "\t\t\t\tsomeFunction(parameter1,\n"
8157 "\t\t\t\t\t\t\t parameter2);\n"
8158 "\t\t}\n"
8159 "};",
8160 Tab);
8161
8162 Tab.TabWidth = 4;
8163 Tab.IndentWidth = 4;
8164 verifyFormat("class TabWidth4Indent4 {\n"
8165 "\tvoid f() {\n"
8166 "\t\tsomeFunction(parameter1,\n"
8167 "\t\t\t\t\t parameter2);\n"
8168 "\t}\n"
8169 "};",
8170 Tab);
8171
8172 Tab.TabWidth = 8;
8173 Tab.IndentWidth = 4;
8174 verifyFormat("class TabWidth8Indent4 {\n"
8175 " void f() {\n"
8176 "\tsomeFunction(parameter1,\n"
8177 "\t\t parameter2);\n"
8178 " }\n"
8179 "};",
8180 Tab);
8181
Alexander Kornienko39856b72013-09-10 09:38:25 +00008182 Tab.TabWidth = 8;
8183 Tab.IndentWidth = 8;
8184 EXPECT_EQ("/*\n"
8185 "\t a\t\tcomment\n"
8186 "\t in multiple lines\n"
8187 " */",
8188 format(" /*\t \t \n"
8189 " \t \t a\t\tcomment\t \t\n"
8190 " \t \t in multiple lines\t\n"
8191 " \t */",
8192 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008193
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008194 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008195 verifyFormat("{\n"
8196 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8197 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8198 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8199 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8200 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8201 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008202 "};",
8203 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008204 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008205 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008206 "\ta2,\n"
8207 "\ta3\n"
8208 "};",
8209 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008210 EXPECT_EQ("if (aaaaaaaa && // q\n"
8211 " bb) // w\n"
8212 "\t;",
8213 format("if (aaaaaaaa &&// q\n"
8214 "bb)// w\n"
8215 ";",
8216 Tab));
8217 verifyFormat("class X {\n"
8218 "\tvoid f() {\n"
8219 "\t\tsomeFunction(parameter1,\n"
8220 "\t\t parameter2);\n"
8221 "\t}\n"
8222 "};",
8223 Tab);
8224 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008225 "\tQ(\n"
8226 "\t {\n"
8227 "\t\t int a;\n"
8228 "\t\t someFunction(aaaaaaaa,\n"
8229 "\t\t bbbbbbb);\n"
8230 "\t },\n"
8231 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008232 "}",
8233 Tab);
8234 EXPECT_EQ("{\n"
8235 "\t/* aaaa\n"
8236 "\t bbbb */\n"
8237 "}",
8238 format("{\n"
8239 "/* aaaa\n"
8240 " bbbb */\n"
8241 "}",
8242 Tab));
8243 EXPECT_EQ("{\n"
8244 "\t/*\n"
8245 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8246 "\t bbbbbbbbbbbbb\n"
8247 "\t*/\n"
8248 "}",
8249 format("{\n"
8250 "/*\n"
8251 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8252 "*/\n"
8253 "}",
8254 Tab));
8255 EXPECT_EQ("{\n"
8256 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8257 "\t// bbbbbbbbbbbbb\n"
8258 "}",
8259 format("{\n"
8260 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8261 "}",
8262 Tab));
8263 EXPECT_EQ("{\n"
8264 "\t/*\n"
8265 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8266 "\t bbbbbbbbbbbbb\n"
8267 "\t*/\n"
8268 "}",
8269 format("{\n"
8270 "\t/*\n"
8271 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8272 "\t*/\n"
8273 "}",
8274 Tab));
8275 EXPECT_EQ("{\n"
8276 "\t/*\n"
8277 "\n"
8278 "\t*/\n"
8279 "}",
8280 format("{\n"
8281 "\t/*\n"
8282 "\n"
8283 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008284 "}",
8285 Tab));
8286 EXPECT_EQ("{\n"
8287 "\t/*\n"
8288 " asdf\n"
8289 "\t*/\n"
8290 "}",
8291 format("{\n"
8292 "\t/*\n"
8293 " asdf\n"
8294 "\t*/\n"
8295 "}",
8296 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008297
8298 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008299 EXPECT_EQ("/*\n"
8300 " a\t\tcomment\n"
8301 " in multiple lines\n"
8302 " */",
8303 format(" /*\t \t \n"
8304 " \t \t a\t\tcomment\t \t\n"
8305 " \t \t in multiple lines\t\n"
8306 " \t */",
8307 Tab));
8308 EXPECT_EQ("/* some\n"
8309 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008310 format(" \t \t /* some\n"
8311 " \t \t comment */",
8312 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008313 EXPECT_EQ("int a; /* some\n"
8314 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008315 format(" \t \t int a; /* some\n"
8316 " \t \t comment */",
8317 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008318
Alexander Kornienko39856b72013-09-10 09:38:25 +00008319 EXPECT_EQ("int a; /* some\n"
8320 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008321 format(" \t \t int\ta; /* some\n"
8322 " \t \t comment */",
8323 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008324 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8325 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008326 format(" \t \t f(\"\t\t\"); /* some\n"
8327 " \t \t comment */",
8328 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008329 EXPECT_EQ("{\n"
8330 " /*\n"
8331 " * Comment\n"
8332 " */\n"
8333 " int i;\n"
8334 "}",
8335 format("{\n"
8336 "\t/*\n"
8337 "\t * Comment\n"
8338 "\t */\n"
8339 "\t int i;\n"
8340 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008341
8342 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8343 Tab.TabWidth = 8;
8344 Tab.IndentWidth = 8;
8345 EXPECT_EQ("if (aaaaaaaa && // q\n"
8346 " bb) // w\n"
8347 "\t;",
8348 format("if (aaaaaaaa &&// q\n"
8349 "bb)// w\n"
8350 ";",
8351 Tab));
8352 EXPECT_EQ("if (aaa && bbb) // w\n"
8353 "\t;",
8354 format("if(aaa&&bbb)// w\n"
8355 ";",
8356 Tab));
8357 verifyFormat("class X {\n"
8358 "\tvoid f() {\n"
8359 "\t\tsomeFunction(parameter1,\n"
8360 "\t\t\t parameter2);\n"
8361 "\t}\n"
8362 "};",
8363 Tab);
8364 verifyFormat("#define A \\\n"
8365 "\tvoid f() { \\\n"
8366 "\t\tsomeFunction( \\\n"
8367 "\t\t parameter1, \\\n"
8368 "\t\t parameter2); \\\n"
8369 "\t}",
8370 Tab);
8371 Tab.TabWidth = 4;
8372 Tab.IndentWidth = 8;
8373 verifyFormat("class TabWidth4Indent8 {\n"
8374 "\t\tvoid f() {\n"
8375 "\t\t\t\tsomeFunction(parameter1,\n"
8376 "\t\t\t\t\t\t\t parameter2);\n"
8377 "\t\t}\n"
8378 "};",
8379 Tab);
8380 Tab.TabWidth = 4;
8381 Tab.IndentWidth = 4;
8382 verifyFormat("class TabWidth4Indent4 {\n"
8383 "\tvoid f() {\n"
8384 "\t\tsomeFunction(parameter1,\n"
8385 "\t\t\t\t\t parameter2);\n"
8386 "\t}\n"
8387 "};",
8388 Tab);
8389 Tab.TabWidth = 8;
8390 Tab.IndentWidth = 4;
8391 verifyFormat("class TabWidth8Indent4 {\n"
8392 " void f() {\n"
8393 "\tsomeFunction(parameter1,\n"
8394 "\t\t parameter2);\n"
8395 " }\n"
8396 "};",
8397 Tab);
8398 Tab.TabWidth = 8;
8399 Tab.IndentWidth = 8;
8400 EXPECT_EQ("/*\n"
8401 "\t a\t\tcomment\n"
8402 "\t in multiple lines\n"
8403 " */",
8404 format(" /*\t \t \n"
8405 " \t \t a\t\tcomment\t \t\n"
8406 " \t \t in multiple lines\t\n"
8407 " \t */",
8408 Tab));
8409 verifyFormat("{\n"
8410 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8411 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8412 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8413 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8414 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8415 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8416 "};",
8417 Tab);
8418 verifyFormat("enum AA {\n"
8419 "\ta1, // Force multiple lines\n"
8420 "\ta2,\n"
8421 "\ta3\n"
8422 "};",
8423 Tab);
8424 EXPECT_EQ("if (aaaaaaaa && // q\n"
8425 " bb) // w\n"
8426 "\t;",
8427 format("if (aaaaaaaa &&// q\n"
8428 "bb)// w\n"
8429 ";",
8430 Tab));
8431 verifyFormat("class X {\n"
8432 "\tvoid f() {\n"
8433 "\t\tsomeFunction(parameter1,\n"
8434 "\t\t\t parameter2);\n"
8435 "\t}\n"
8436 "};",
8437 Tab);
8438 verifyFormat("{\n"
8439 "\tQ(\n"
8440 "\t {\n"
8441 "\t\t int a;\n"
8442 "\t\t someFunction(aaaaaaaa,\n"
8443 "\t\t\t\t bbbbbbb);\n"
8444 "\t },\n"
8445 "\t p);\n"
8446 "}",
8447 Tab);
8448 EXPECT_EQ("{\n"
8449 "\t/* aaaa\n"
8450 "\t bbbb */\n"
8451 "}",
8452 format("{\n"
8453 "/* aaaa\n"
8454 " bbbb */\n"
8455 "}",
8456 Tab));
8457 EXPECT_EQ("{\n"
8458 "\t/*\n"
8459 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8460 "\t bbbbbbbbbbbbb\n"
8461 "\t*/\n"
8462 "}",
8463 format("{\n"
8464 "/*\n"
8465 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8466 "*/\n"
8467 "}",
8468 Tab));
8469 EXPECT_EQ("{\n"
8470 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8471 "\t// bbbbbbbbbbbbb\n"
8472 "}",
8473 format("{\n"
8474 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8475 "}",
8476 Tab));
8477 EXPECT_EQ("{\n"
8478 "\t/*\n"
8479 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8480 "\t bbbbbbbbbbbbb\n"
8481 "\t*/\n"
8482 "}",
8483 format("{\n"
8484 "\t/*\n"
8485 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8486 "\t*/\n"
8487 "}",
8488 Tab));
8489 EXPECT_EQ("{\n"
8490 "\t/*\n"
8491 "\n"
8492 "\t*/\n"
8493 "}",
8494 format("{\n"
8495 "\t/*\n"
8496 "\n"
8497 "\t*/\n"
8498 "}",
8499 Tab));
8500 EXPECT_EQ("{\n"
8501 "\t/*\n"
8502 " asdf\n"
8503 "\t*/\n"
8504 "}",
8505 format("{\n"
8506 "\t/*\n"
8507 " asdf\n"
8508 "\t*/\n"
8509 "}",
8510 Tab));
8511 EXPECT_EQ("/*\n"
8512 "\t a\t\tcomment\n"
8513 "\t in multiple lines\n"
8514 " */",
8515 format(" /*\t \t \n"
8516 " \t \t a\t\tcomment\t \t\n"
8517 " \t \t in multiple lines\t\n"
8518 " \t */",
8519 Tab));
8520 EXPECT_EQ("/* some\n"
8521 " comment */",
8522 format(" \t \t /* some\n"
8523 " \t \t comment */",
8524 Tab));
8525 EXPECT_EQ("int a; /* some\n"
8526 " comment */",
8527 format(" \t \t int a; /* some\n"
8528 " \t \t comment */",
8529 Tab));
8530 EXPECT_EQ("int a; /* some\n"
8531 "comment */",
8532 format(" \t \t int\ta; /* some\n"
8533 " \t \t comment */",
8534 Tab));
8535 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8536 " comment */",
8537 format(" \t \t f(\"\t\t\"); /* some\n"
8538 " \t \t comment */",
8539 Tab));
8540 EXPECT_EQ("{\n"
8541 " /*\n"
8542 " * Comment\n"
8543 " */\n"
8544 " int i;\n"
8545 "}",
8546 format("{\n"
8547 "\t/*\n"
8548 "\t * Comment\n"
8549 "\t */\n"
8550 "\t int i;\n"
8551 "}"));
8552 Tab.AlignConsecutiveAssignments = true;
8553 Tab.AlignConsecutiveDeclarations = true;
8554 Tab.TabWidth = 4;
8555 Tab.IndentWidth = 4;
8556 verifyFormat("class Assign {\n"
8557 "\tvoid f() {\n"
8558 "\t\tint x = 123;\n"
8559 "\t\tint random = 4;\n"
8560 "\t\tstd::string alphabet =\n"
8561 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8562 "\t}\n"
8563 "};",
8564 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008565}
8566
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008567TEST_F(FormatTest, CalculatesOriginalColumn) {
8568 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8569 "q\"; /* some\n"
8570 " comment */",
8571 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8572 "q\"; /* some\n"
8573 " comment */",
8574 getLLVMStyle()));
8575 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8576 "/* some\n"
8577 " comment */",
8578 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8579 " /* some\n"
8580 " comment */",
8581 getLLVMStyle()));
8582 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8583 "qqq\n"
8584 "/* some\n"
8585 " comment */",
8586 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8587 "qqq\n"
8588 " /* some\n"
8589 " comment */",
8590 getLLVMStyle()));
8591 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8592 "wwww; /* some\n"
8593 " comment */",
8594 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8595 "wwww; /* some\n"
8596 " comment */",
8597 getLLVMStyle()));
8598}
8599
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008600TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008601 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008602 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008603
8604 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008605 " continue;",
8606 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008607 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008608 " continue;",
8609 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008610 verifyFormat("if(true)\n"
8611 " f();\n"
8612 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008613 " f();",
8614 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008615 verifyFormat("do {\n"
8616 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008617 "} while(something());",
8618 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008619 verifyFormat("switch(x) {\n"
8620 "default:\n"
8621 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008622 "}",
8623 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008624 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008625 verifyFormat("size_t x = sizeof(x);", NoSpace);
8626 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8627 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8628 verifyFormat("alignas(128) char a[128];", NoSpace);
8629 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8630 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8631 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008632 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008633 verifyFormat("T A::operator()();", NoSpace);
8634 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008635
8636 FormatStyle Space = getLLVMStyle();
8637 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8638
8639 verifyFormat("int f ();", Space);
8640 verifyFormat("void f (int a, T b) {\n"
8641 " while (true)\n"
8642 " continue;\n"
8643 "}",
8644 Space);
8645 verifyFormat("if (true)\n"
8646 " f ();\n"
8647 "else if (true)\n"
8648 " f ();",
8649 Space);
8650 verifyFormat("do {\n"
8651 " do_something ();\n"
8652 "} while (something ());",
8653 Space);
8654 verifyFormat("switch (x) {\n"
8655 "default:\n"
8656 " break;\n"
8657 "}",
8658 Space);
8659 verifyFormat("A::A () : a (1) {}", Space);
8660 verifyFormat("void f () __attribute__ ((asdf));", Space);
8661 verifyFormat("*(&a + 1);\n"
8662 "&((&a)[1]);\n"
8663 "a[(b + c) * d];\n"
8664 "(((a + 1) * 2) + 3) * 4;",
8665 Space);
8666 verifyFormat("#define A(x) x", Space);
8667 verifyFormat("#define A (x) x", Space);
8668 verifyFormat("#if defined(x)\n"
8669 "#endif",
8670 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008671 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008672 verifyFormat("size_t x = sizeof (x);", Space);
8673 verifyFormat("auto f (int x) -> decltype (x);", Space);
8674 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8675 verifyFormat("alignas (128) char a[128];", Space);
8676 verifyFormat("size_t x = alignof (MyType);", Space);
8677 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8678 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008679 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008680 verifyFormat("T A::operator() ();", Space);
8681 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008682}
8683
8684TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8685 FormatStyle Spaces = getLLVMStyle();
8686
8687 Spaces.SpacesInParentheses = true;
8688 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008689 verifyFormat("call();", Spaces);
8690 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008691 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8692 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008693 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008694 " continue;",
8695 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008696 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008697 " continue;",
8698 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008699 verifyFormat("if ( true )\n"
8700 " f();\n"
8701 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008702 " f();",
8703 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008704 verifyFormat("do {\n"
8705 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008706 "} while ( something() );",
8707 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008708 verifyFormat("switch ( x ) {\n"
8709 "default:\n"
8710 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008711 "}",
8712 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008713
8714 Spaces.SpacesInParentheses = false;
8715 Spaces.SpacesInCStyleCastParentheses = true;
8716 verifyFormat("Type *A = ( Type * )P;", Spaces);
8717 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8718 verifyFormat("x = ( int32 )y;", Spaces);
8719 verifyFormat("int a = ( int )(2.0f);", Spaces);
8720 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8721 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8722 verifyFormat("#define x (( int )-1)", Spaces);
8723
Daniel Jasper92e09822015-03-18 12:59:19 +00008724 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008725 Spaces.SpacesInParentheses = false;
8726 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008727 Spaces.SpacesInCStyleCastParentheses = true;
8728 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008729 verifyFormat("call( );", Spaces);
8730 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008731 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008732 " continue;",
8733 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008734 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008735 " continue;",
8736 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008737 verifyFormat("if (true)\n"
8738 " f( );\n"
8739 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008740 " f( );",
8741 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008742 verifyFormat("do {\n"
8743 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008744 "} while (something( ));",
8745 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008746 verifyFormat("switch (x) {\n"
8747 "default:\n"
8748 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008749 "}",
8750 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008751
Daniel Jasper92e09822015-03-18 12:59:19 +00008752 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008753 Spaces.SpaceAfterCStyleCast = true;
8754 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008755 verifyFormat("call( );", Spaces);
8756 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008757 verifyFormat("while (( bool ) 1)\n"
8758 " continue;",
8759 Spaces);
8760 verifyFormat("for (;;)\n"
8761 " continue;",
8762 Spaces);
8763 verifyFormat("if (true)\n"
8764 " f( );\n"
8765 "else if (true)\n"
8766 " f( );",
8767 Spaces);
8768 verifyFormat("do {\n"
8769 " do_something(( int ) i);\n"
8770 "} while (something( ));",
8771 Spaces);
8772 verifyFormat("switch (x) {\n"
8773 "default:\n"
8774 " break;\n"
8775 "}",
8776 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008777
8778 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008779 Spaces.SpacesInCStyleCastParentheses = false;
8780 Spaces.SpaceAfterCStyleCast = true;
8781 verifyFormat("while ((bool) 1)\n"
8782 " continue;",
8783 Spaces);
8784 verifyFormat("do {\n"
8785 " do_something((int) i);\n"
8786 "} while (something( ));",
8787 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008788}
8789
Daniel Jasperad981f82014-08-26 11:41:14 +00008790TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8791 verifyFormat("int a[5];");
8792 verifyFormat("a[3] += 42;");
8793
8794 FormatStyle Spaces = getLLVMStyle();
8795 Spaces.SpacesInSquareBrackets = true;
8796 // Lambdas unchanged.
8797 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8798 verifyFormat("return [i, args...] {};", Spaces);
8799
8800 // Not lambdas.
8801 verifyFormat("int a[ 5 ];", Spaces);
8802 verifyFormat("a[ 3 ] += 42;", Spaces);
8803 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8804 verifyFormat("double &operator[](int i) { return 0; }\n"
8805 "int i;",
8806 Spaces);
8807 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8808 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8809 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8810}
8811
Daniel Jasperd94bff32013-09-25 15:15:02 +00008812TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8813 verifyFormat("int a = 5;");
8814 verifyFormat("a += 42;");
8815 verifyFormat("a or_eq 8;");
8816
8817 FormatStyle Spaces = getLLVMStyle();
8818 Spaces.SpaceBeforeAssignmentOperators = false;
8819 verifyFormat("int a= 5;", Spaces);
8820 verifyFormat("a+= 42;", Spaces);
8821 verifyFormat("a or_eq 8;", Spaces);
8822}
8823
Daniel Jaspera44991332015-04-29 13:06:49 +00008824TEST_F(FormatTest, AlignConsecutiveAssignments) {
8825 FormatStyle Alignment = getLLVMStyle();
8826 Alignment.AlignConsecutiveAssignments = false;
8827 verifyFormat("int a = 5;\n"
8828 "int oneTwoThree = 123;",
8829 Alignment);
8830 verifyFormat("int a = 5;\n"
8831 "int oneTwoThree = 123;",
8832 Alignment);
8833
8834 Alignment.AlignConsecutiveAssignments = true;
8835 verifyFormat("int a = 5;\n"
8836 "int oneTwoThree = 123;",
8837 Alignment);
8838 verifyFormat("int a = method();\n"
8839 "int oneTwoThree = 133;",
8840 Alignment);
8841 verifyFormat("a &= 5;\n"
8842 "bcd *= 5;\n"
8843 "ghtyf += 5;\n"
8844 "dvfvdb -= 5;\n"
8845 "a /= 5;\n"
8846 "vdsvsv %= 5;\n"
8847 "sfdbddfbdfbb ^= 5;\n"
8848 "dvsdsv |= 5;\n"
8849 "int dsvvdvsdvvv = 123;",
8850 Alignment);
8851 verifyFormat("int i = 1, j = 10;\n"
8852 "something = 2000;",
8853 Alignment);
8854 verifyFormat("something = 2000;\n"
8855 "int i = 1, j = 10;\n",
8856 Alignment);
8857 verifyFormat("something = 2000;\n"
8858 "another = 911;\n"
8859 "int i = 1, j = 10;\n"
8860 "oneMore = 1;\n"
8861 "i = 2;",
8862 Alignment);
8863 verifyFormat("int a = 5;\n"
8864 "int one = 1;\n"
8865 "method();\n"
8866 "int oneTwoThree = 123;\n"
8867 "int oneTwo = 12;",
8868 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008869 verifyFormat("int oneTwoThree = 123;\n"
8870 "int oneTwo = 12;\n"
8871 "method();\n",
8872 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008873 verifyFormat("int oneTwoThree = 123; // comment\n"
8874 "int oneTwo = 12; // comment",
8875 Alignment);
8876 EXPECT_EQ("int a = 5;\n"
8877 "\n"
8878 "int oneTwoThree = 123;",
8879 format("int a = 5;\n"
8880 "\n"
8881 "int oneTwoThree= 123;",
8882 Alignment));
8883 EXPECT_EQ("int a = 5;\n"
8884 "int one = 1;\n"
8885 "\n"
8886 "int oneTwoThree = 123;",
8887 format("int a = 5;\n"
8888 "int one = 1;\n"
8889 "\n"
8890 "int oneTwoThree = 123;",
8891 Alignment));
8892 EXPECT_EQ("int a = 5;\n"
8893 "int one = 1;\n"
8894 "\n"
8895 "int oneTwoThree = 123;\n"
8896 "int oneTwo = 12;",
8897 format("int a = 5;\n"
8898 "int one = 1;\n"
8899 "\n"
8900 "int oneTwoThree = 123;\n"
8901 "int oneTwo = 12;",
8902 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008903 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8904 verifyFormat("#define A \\\n"
8905 " int aaaa = 12; \\\n"
8906 " int b = 23; \\\n"
8907 " int ccc = 234; \\\n"
8908 " int dddddddddd = 2345;",
8909 Alignment);
8910 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008911 verifyFormat("#define A \\\n"
8912 " int aaaa = 12; \\\n"
8913 " int b = 23; \\\n"
8914 " int ccc = 234; \\\n"
8915 " int dddddddddd = 2345;",
8916 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008917 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008918 verifyFormat("#define A "
8919 " \\\n"
8920 " int aaaa = 12; "
8921 " \\\n"
8922 " int b = 23; "
8923 " \\\n"
8924 " int ccc = 234; "
8925 " \\\n"
8926 " int dddddddddd = 2345;",
8927 Alignment);
8928 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8929 "k = 4, int l = 5,\n"
8930 " int m = 6) {\n"
8931 " int j = 10;\n"
8932 " otherThing = 1;\n"
8933 "}",
8934 Alignment);
8935 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8936 " int i = 1;\n"
8937 " int j = 2;\n"
8938 " int big = 10000;\n"
8939 "}",
8940 Alignment);
8941 verifyFormat("class C {\n"
8942 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008943 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008944 " virtual void f() = 0;\n"
8945 "};",
8946 Alignment);
8947 verifyFormat("int i = 1;\n"
8948 "if (SomeType t = getSomething()) {\n"
8949 "}\n"
8950 "int j = 2;\n"
8951 "int big = 10000;",
8952 Alignment);
8953 verifyFormat("int j = 7;\n"
8954 "for (int k = 0; k < N; ++k) {\n"
8955 "}\n"
8956 "int j = 2;\n"
8957 "int big = 10000;\n"
8958 "}",
8959 Alignment);
8960 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8961 verifyFormat("int i = 1;\n"
8962 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8963 " = someLooooooooooooooooongFunction();\n"
8964 "int j = 2;",
8965 Alignment);
8966 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8967 verifyFormat("int i = 1;\n"
8968 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8969 " someLooooooooooooooooongFunction();\n"
8970 "int j = 2;",
8971 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008972
8973 verifyFormat("auto lambda = []() {\n"
8974 " auto i = 0;\n"
8975 " return 0;\n"
8976 "};\n"
8977 "int i = 0;\n"
8978 "auto v = type{\n"
8979 " i = 1, //\n"
8980 " (i = 2), //\n"
8981 " i = 3 //\n"
8982 "};",
8983 Alignment);
8984
Daniel Jaspera44991332015-04-29 13:06:49 +00008985 verifyFormat(
8986 "int i = 1;\n"
8987 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8988 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008989 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008990 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008991
8992 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8993 " typename B = very_long_type_name_1,\n"
8994 " typename T_2 = very_long_type_name_2>\n"
8995 "auto foo() {}\n",
8996 Alignment);
8997 verifyFormat("int a, b = 1;\n"
8998 "int c = 2;\n"
8999 "int dd = 3;\n",
9000 Alignment);
9001 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9002 "float b[1][] = {{3.f}};\n",
9003 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009004 verifyFormat("for (int i = 0; i < 1; i++)\n"
9005 " int x = 1;\n",
9006 Alignment);
9007 verifyFormat("for (i = 0; i < 1; i++)\n"
9008 " x = 1;\n"
9009 "y = 1;\n",
9010 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009011}
9012
Daniel Jaspere12597c2015-10-01 10:06:54 +00009013TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9014 FormatStyle Alignment = getLLVMStyle();
9015 Alignment.AlignConsecutiveDeclarations = false;
9016 verifyFormat("float const a = 5;\n"
9017 "int oneTwoThree = 123;",
9018 Alignment);
9019 verifyFormat("int a = 5;\n"
9020 "float const oneTwoThree = 123;",
9021 Alignment);
9022
9023 Alignment.AlignConsecutiveDeclarations = true;
9024 verifyFormat("float const a = 5;\n"
9025 "int oneTwoThree = 123;",
9026 Alignment);
9027 verifyFormat("int a = method();\n"
9028 "float const oneTwoThree = 133;",
9029 Alignment);
9030 verifyFormat("int i = 1, j = 10;\n"
9031 "something = 2000;",
9032 Alignment);
9033 verifyFormat("something = 2000;\n"
9034 "int i = 1, j = 10;\n",
9035 Alignment);
9036 verifyFormat("float something = 2000;\n"
9037 "double another = 911;\n"
9038 "int i = 1, j = 10;\n"
9039 "const int *oneMore = 1;\n"
9040 "unsigned i = 2;",
9041 Alignment);
9042 verifyFormat("float a = 5;\n"
9043 "int one = 1;\n"
9044 "method();\n"
9045 "const double oneTwoThree = 123;\n"
9046 "const unsigned int oneTwo = 12;",
9047 Alignment);
9048 verifyFormat("int oneTwoThree{0}; // comment\n"
9049 "unsigned oneTwo; // comment",
9050 Alignment);
9051 EXPECT_EQ("float const a = 5;\n"
9052 "\n"
9053 "int oneTwoThree = 123;",
9054 format("float const a = 5;\n"
9055 "\n"
9056 "int oneTwoThree= 123;",
9057 Alignment));
9058 EXPECT_EQ("float a = 5;\n"
9059 "int one = 1;\n"
9060 "\n"
9061 "unsigned oneTwoThree = 123;",
9062 format("float a = 5;\n"
9063 "int one = 1;\n"
9064 "\n"
9065 "unsigned oneTwoThree = 123;",
9066 Alignment));
9067 EXPECT_EQ("float a = 5;\n"
9068 "int one = 1;\n"
9069 "\n"
9070 "unsigned oneTwoThree = 123;\n"
9071 "int oneTwo = 12;",
9072 format("float a = 5;\n"
9073 "int one = 1;\n"
9074 "\n"
9075 "unsigned oneTwoThree = 123;\n"
9076 "int oneTwo = 12;",
9077 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009078 // Function prototype alignment
9079 verifyFormat("int a();\n"
9080 "double b();",
9081 Alignment);
9082 verifyFormat("int a(int x);\n"
9083 "double b();",
9084 Alignment);
9085 unsigned OldColumnLimit = Alignment.ColumnLimit;
9086 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9087 // otherwise the function parameters will be re-flowed onto a single line.
9088 Alignment.ColumnLimit = 0;
9089 EXPECT_EQ("int a(int x,\n"
9090 " float y);\n"
9091 "double b(int x,\n"
9092 " double y);",
9093 format("int a(int x,\n"
9094 " float y);\n"
9095 "double b(int x,\n"
9096 " double y);",
9097 Alignment));
9098 // This ensures that function parameters of function declarations are
9099 // correctly indented when their owning functions are indented.
9100 // The failure case here is for 'double y' to not be indented enough.
9101 EXPECT_EQ("double a(int x);\n"
9102 "int b(int y,\n"
9103 " double z);",
9104 format("double a(int x);\n"
9105 "int b(int y,\n"
9106 " double z);",
9107 Alignment));
9108 // Set ColumnLimit low so that we induce wrapping immediately after
9109 // the function name and opening paren.
9110 Alignment.ColumnLimit = 13;
9111 verifyFormat("int function(\n"
9112 " int x,\n"
9113 " bool y);",
9114 Alignment);
9115 Alignment.ColumnLimit = OldColumnLimit;
9116 // Ensure function pointers don't screw up recursive alignment
9117 verifyFormat("int a(int x, void (*fp)(int y));\n"
9118 "double b();",
9119 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009120 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009121 // Ensure recursive alignment is broken by function braces, so that the
9122 // "a = 1" does not align with subsequent assignments inside the function
9123 // body.
9124 verifyFormat("int func(int a = 1) {\n"
9125 " int b = 2;\n"
9126 " int cc = 3;\n"
9127 "}",
9128 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009129 verifyFormat("float something = 2000;\n"
9130 "double another = 911;\n"
9131 "int i = 1, j = 10;\n"
9132 "const int *oneMore = 1;\n"
9133 "unsigned i = 2;",
9134 Alignment);
9135 verifyFormat("int oneTwoThree = {0}; // comment\n"
9136 "unsigned oneTwo = 0; // comment",
9137 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009138 // Make sure that scope is correctly tracked, in the absence of braces
9139 verifyFormat("for (int i = 0; i < n; i++)\n"
9140 " j = i;\n"
9141 "double x = 1;\n",
9142 Alignment);
9143 verifyFormat("if (int i = 0)\n"
9144 " j = i;\n"
9145 "double x = 1;\n",
9146 Alignment);
9147 // Ensure operator[] and operator() are comprehended
9148 verifyFormat("struct test {\n"
9149 " long long int foo();\n"
9150 " int operator[](int a);\n"
9151 " double bar();\n"
9152 "};\n",
9153 Alignment);
9154 verifyFormat("struct test {\n"
9155 " long long int foo();\n"
9156 " int operator()(int a);\n"
9157 " double bar();\n"
9158 "};\n",
9159 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009160 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9161 " int const i = 1;\n"
9162 " int * j = 2;\n"
9163 " int big = 10000;\n"
9164 "\n"
9165 " unsigned oneTwoThree = 123;\n"
9166 " int oneTwo = 12;\n"
9167 " method();\n"
9168 " float k = 2;\n"
9169 " int ll = 10000;\n"
9170 "}",
9171 format("void SomeFunction(int parameter= 0) {\n"
9172 " int const i= 1;\n"
9173 " int *j=2;\n"
9174 " int big = 10000;\n"
9175 "\n"
9176 "unsigned oneTwoThree =123;\n"
9177 "int oneTwo = 12;\n"
9178 " method();\n"
9179 "float k= 2;\n"
9180 "int ll=10000;\n"
9181 "}",
9182 Alignment));
9183 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009184 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9185 verifyFormat("#define A \\\n"
9186 " int aaaa = 12; \\\n"
9187 " float b = 23; \\\n"
9188 " const int ccc = 234; \\\n"
9189 " unsigned dddddddddd = 2345;",
9190 Alignment);
9191 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009192 verifyFormat("#define A \\\n"
9193 " int aaaa = 12; \\\n"
9194 " float b = 23; \\\n"
9195 " const int ccc = 234; \\\n"
9196 " unsigned dddddddddd = 2345;",
9197 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009198 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009199 Alignment.ColumnLimit = 30;
9200 verifyFormat("#define A \\\n"
9201 " int aaaa = 12; \\\n"
9202 " float b = 23; \\\n"
9203 " const int ccc = 234; \\\n"
9204 " int dddddddddd = 2345;",
9205 Alignment);
9206 Alignment.ColumnLimit = 80;
9207 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9208 "k = 4, int l = 5,\n"
9209 " int m = 6) {\n"
9210 " const int j = 10;\n"
9211 " otherThing = 1;\n"
9212 "}",
9213 Alignment);
9214 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9215 " int const i = 1;\n"
9216 " int * j = 2;\n"
9217 " int big = 10000;\n"
9218 "}",
9219 Alignment);
9220 verifyFormat("class C {\n"
9221 "public:\n"
9222 " int i = 1;\n"
9223 " virtual void f() = 0;\n"
9224 "};",
9225 Alignment);
9226 verifyFormat("float i = 1;\n"
9227 "if (SomeType t = getSomething()) {\n"
9228 "}\n"
9229 "const unsigned j = 2;\n"
9230 "int big = 10000;",
9231 Alignment);
9232 verifyFormat("float j = 7;\n"
9233 "for (int k = 0; k < N; ++k) {\n"
9234 "}\n"
9235 "unsigned j = 2;\n"
9236 "int big = 10000;\n"
9237 "}",
9238 Alignment);
9239 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9240 verifyFormat("float i = 1;\n"
9241 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9242 " = someLooooooooooooooooongFunction();\n"
9243 "int j = 2;",
9244 Alignment);
9245 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9246 verifyFormat("int i = 1;\n"
9247 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9248 " someLooooooooooooooooongFunction();\n"
9249 "int j = 2;",
9250 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009251
9252 Alignment.AlignConsecutiveAssignments = true;
9253 verifyFormat("auto lambda = []() {\n"
9254 " auto ii = 0;\n"
9255 " float j = 0;\n"
9256 " return 0;\n"
9257 "};\n"
9258 "int i = 0;\n"
9259 "float i2 = 0;\n"
9260 "auto v = type{\n"
9261 " i = 1, //\n"
9262 " (i = 2), //\n"
9263 " i = 3 //\n"
9264 "};",
9265 Alignment);
9266 Alignment.AlignConsecutiveAssignments = false;
9267
Daniel Jaspere12597c2015-10-01 10:06:54 +00009268 verifyFormat(
9269 "int i = 1;\n"
9270 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9271 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009272 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009273 Alignment);
9274
9275 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9276 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009277 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009278 // happens.
9279 Alignment.AlignConsecutiveAssignments = true;
9280 Alignment.ColumnLimit = 30;
9281 verifyFormat("float ii = 1;\n"
9282 "unsigned j = 2;\n"
9283 "int someVerylongVariable = 1;\n"
9284 "AnotherLongType ll = 123456;\n"
9285 "VeryVeryLongType k = 2;\n"
9286 "int myvar = 1;",
9287 Alignment);
9288 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009289 Alignment.AlignConsecutiveAssignments = false;
9290
9291 verifyFormat(
9292 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9293 " typename LongType, typename B>\n"
9294 "auto foo() {}\n",
9295 Alignment);
9296 verifyFormat("float a, b = 1;\n"
9297 "int c = 2;\n"
9298 "int dd = 3;\n",
9299 Alignment);
9300 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9301 "float b[1][] = {{3.f}};\n",
9302 Alignment);
9303 Alignment.AlignConsecutiveAssignments = true;
9304 verifyFormat("float a, b = 1;\n"
9305 "int c = 2;\n"
9306 "int dd = 3;\n",
9307 Alignment);
9308 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9309 "float b[1][] = {{3.f}};\n",
9310 Alignment);
9311 Alignment.AlignConsecutiveAssignments = false;
9312
9313 Alignment.ColumnLimit = 30;
9314 Alignment.BinPackParameters = false;
9315 verifyFormat("void foo(float a,\n"
9316 " float b,\n"
9317 " int c,\n"
9318 " uint32_t *d) {\n"
9319 " int * e = 0;\n"
9320 " float f = 0;\n"
9321 " double g = 0;\n"
9322 "}\n"
9323 "void bar(ino_t a,\n"
9324 " int b,\n"
9325 " uint32_t *c,\n"
9326 " bool d) {}\n",
9327 Alignment);
9328 Alignment.BinPackParameters = true;
9329 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009330
9331 // Bug 33507
9332 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9333 verifyFormat(
9334 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9335 " static const Version verVs2017;\n"
9336 " return true;\n"
9337 "});\n",
9338 Alignment);
9339 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009340}
9341
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009342TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009343 FormatStyle LinuxBraceStyle = getLLVMStyle();
9344 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009345 verifyFormat("namespace a\n"
9346 "{\n"
9347 "class A\n"
9348 "{\n"
9349 " void f()\n"
9350 " {\n"
9351 " if (true) {\n"
9352 " a();\n"
9353 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009354 " } else {\n"
9355 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009356 " }\n"
9357 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009358 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009359 "};\n"
9360 "struct B {\n"
9361 " int x;\n"
9362 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009363 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009364 LinuxBraceStyle);
9365 verifyFormat("enum X {\n"
9366 " Y = 0,\n"
9367 "}\n",
9368 LinuxBraceStyle);
9369 verifyFormat("struct S {\n"
9370 " int Type;\n"
9371 " union {\n"
9372 " int x;\n"
9373 " double y;\n"
9374 " } Value;\n"
9375 " class C\n"
9376 " {\n"
9377 " MyFavoriteType Value;\n"
9378 " } Class;\n"
9379 "}\n",
9380 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009381}
9382
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009383TEST_F(FormatTest, MozillaBraceBreaking) {
9384 FormatStyle MozillaBraceStyle = getLLVMStyle();
9385 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009386 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009387 verifyFormat("namespace a {\n"
9388 "class A\n"
9389 "{\n"
9390 " void f()\n"
9391 " {\n"
9392 " if (true) {\n"
9393 " a();\n"
9394 " b();\n"
9395 " }\n"
9396 " }\n"
9397 " void g() { return; }\n"
9398 "};\n"
9399 "enum E\n"
9400 "{\n"
9401 " A,\n"
9402 " // foo\n"
9403 " B,\n"
9404 " C\n"
9405 "};\n"
9406 "struct B\n"
9407 "{\n"
9408 " int x;\n"
9409 "};\n"
9410 "}\n",
9411 MozillaBraceStyle);
9412 verifyFormat("struct S\n"
9413 "{\n"
9414 " int Type;\n"
9415 " union\n"
9416 " {\n"
9417 " int x;\n"
9418 " double y;\n"
9419 " } Value;\n"
9420 " class C\n"
9421 " {\n"
9422 " MyFavoriteType Value;\n"
9423 " } Class;\n"
9424 "}\n",
9425 MozillaBraceStyle);
9426}
9427
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009428TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009429 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9430 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009431 verifyFormat("namespace a {\n"
9432 "class A {\n"
9433 " void f()\n"
9434 " {\n"
9435 " if (true) {\n"
9436 " a();\n"
9437 " b();\n"
9438 " }\n"
9439 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009440 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009441 "};\n"
9442 "struct B {\n"
9443 " int x;\n"
9444 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009445 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009446 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009447
Daniel Jasperd9670872014-08-05 12:06:20 +00009448 verifyFormat("void foo()\n"
9449 "{\n"
9450 " if (a) {\n"
9451 " a();\n"
9452 " }\n"
9453 " else {\n"
9454 " b();\n"
9455 " }\n"
9456 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009457 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009458
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009459 verifyFormat("#ifdef _DEBUG\n"
9460 "int foo(int i = 0)\n"
9461 "#else\n"
9462 "int foo(int i = 5)\n"
9463 "#endif\n"
9464 "{\n"
9465 " return i;\n"
9466 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009467 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009468
9469 verifyFormat("void foo() {}\n"
9470 "void bar()\n"
9471 "#ifdef _DEBUG\n"
9472 "{\n"
9473 " foo();\n"
9474 "}\n"
9475 "#else\n"
9476 "{\n"
9477 "}\n"
9478 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009479 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009480
9481 verifyFormat("void foobar() { int i = 5; }\n"
9482 "#ifdef _DEBUG\n"
9483 "void bar() {}\n"
9484 "#else\n"
9485 "void bar() { foobar(); }\n"
9486 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009487 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009488}
9489
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009490TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009491 FormatStyle AllmanBraceStyle = getLLVMStyle();
9492 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009493
9494 EXPECT_EQ("namespace a\n"
9495 "{\n"
9496 "void f();\n"
9497 "void g();\n"
9498 "} // namespace a\n",
9499 format("namespace a\n"
9500 "{\n"
9501 "void f();\n"
9502 "void g();\n"
9503 "}\n",
9504 AllmanBraceStyle));
9505
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009506 verifyFormat("namespace a\n"
9507 "{\n"
9508 "class A\n"
9509 "{\n"
9510 " void f()\n"
9511 " {\n"
9512 " if (true)\n"
9513 " {\n"
9514 " a();\n"
9515 " b();\n"
9516 " }\n"
9517 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009518 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009519 "};\n"
9520 "struct B\n"
9521 "{\n"
9522 " int x;\n"
9523 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009524 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009525 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009526
9527 verifyFormat("void f()\n"
9528 "{\n"
9529 " if (true)\n"
9530 " {\n"
9531 " a();\n"
9532 " }\n"
9533 " else if (false)\n"
9534 " {\n"
9535 " b();\n"
9536 " }\n"
9537 " else\n"
9538 " {\n"
9539 " c();\n"
9540 " }\n"
9541 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009542 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009543
9544 verifyFormat("void f()\n"
9545 "{\n"
9546 " for (int i = 0; i < 10; ++i)\n"
9547 " {\n"
9548 " a();\n"
9549 " }\n"
9550 " while (false)\n"
9551 " {\n"
9552 " b();\n"
9553 " }\n"
9554 " do\n"
9555 " {\n"
9556 " c();\n"
9557 " } while (false)\n"
9558 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009559 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009560
9561 verifyFormat("void f(int a)\n"
9562 "{\n"
9563 " switch (a)\n"
9564 " {\n"
9565 " case 0:\n"
9566 " break;\n"
9567 " case 1:\n"
9568 " {\n"
9569 " break;\n"
9570 " }\n"
9571 " case 2:\n"
9572 " {\n"
9573 " }\n"
9574 " break;\n"
9575 " default:\n"
9576 " break;\n"
9577 " }\n"
9578 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009579 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009580
9581 verifyFormat("enum X\n"
9582 "{\n"
9583 " Y = 0,\n"
9584 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009585 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009586 verifyFormat("enum X\n"
9587 "{\n"
9588 " Y = 0\n"
9589 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009590 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009591
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009592 verifyFormat("@interface BSApplicationController ()\n"
9593 "{\n"
9594 "@private\n"
9595 " id _extraIvar;\n"
9596 "}\n"
9597 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009598 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009599
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009600 verifyFormat("#ifdef _DEBUG\n"
9601 "int foo(int i = 0)\n"
9602 "#else\n"
9603 "int foo(int i = 5)\n"
9604 "#endif\n"
9605 "{\n"
9606 " return i;\n"
9607 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009608 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009609
9610 verifyFormat("void foo() {}\n"
9611 "void bar()\n"
9612 "#ifdef _DEBUG\n"
9613 "{\n"
9614 " foo();\n"
9615 "}\n"
9616 "#else\n"
9617 "{\n"
9618 "}\n"
9619 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009620 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009621
9622 verifyFormat("void foobar() { int i = 5; }\n"
9623 "#ifdef _DEBUG\n"
9624 "void bar() {}\n"
9625 "#else\n"
9626 "void bar() { foobar(); }\n"
9627 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009628 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009629
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009630 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009631 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009632 " // ...\n"
9633 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009634 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009635 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009636 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009637 " // ...\n"
9638 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009639 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009640 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009641 // .. or dict literals.
9642 verifyFormat("void f()\n"
9643 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009644 " // ...\n"
9645 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9646 "}",
9647 AllmanBraceStyle);
9648 verifyFormat("void f()\n"
9649 "{\n"
9650 " // ...\n"
9651 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009652 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009653 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009654 verifyFormat("int f()\n"
9655 "{ // comment\n"
9656 " return 42;\n"
9657 "}",
9658 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009659
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009660 AllmanBraceStyle.ColumnLimit = 19;
9661 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9662 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009663 verifyFormat("void f()\n"
9664 "{\n"
9665 " int i;\n"
9666 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009667 AllmanBraceStyle);
9668 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009669
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009670 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009671 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9672 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9673 verifyFormat("void f(bool b)\n"
9674 "{\n"
9675 " if (b)\n"
9676 " {\n"
9677 " return;\n"
9678 " }\n"
9679 "}\n",
9680 BreakBeforeBraceShortIfs);
9681 verifyFormat("void f(bool b)\n"
9682 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009683 " if constexpr (b)\n"
9684 " {\n"
9685 " return;\n"
9686 " }\n"
9687 "}\n",
9688 BreakBeforeBraceShortIfs);
9689 verifyFormat("void f(bool b)\n"
9690 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009691 " if (b) return;\n"
9692 "}\n",
9693 BreakBeforeBraceShortIfs);
9694 verifyFormat("void f(bool b)\n"
9695 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009696 " if constexpr (b) return;\n"
9697 "}\n",
9698 BreakBeforeBraceShortIfs);
9699 verifyFormat("void f(bool b)\n"
9700 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009701 " while (b)\n"
9702 " {\n"
9703 " return;\n"
9704 " }\n"
9705 "}\n",
9706 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009707}
9708
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009709TEST_F(FormatTest, GNUBraceBreaking) {
9710 FormatStyle GNUBraceStyle = getLLVMStyle();
9711 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9712 verifyFormat("namespace a\n"
9713 "{\n"
9714 "class A\n"
9715 "{\n"
9716 " void f()\n"
9717 " {\n"
9718 " int a;\n"
9719 " {\n"
9720 " int b;\n"
9721 " }\n"
9722 " if (true)\n"
9723 " {\n"
9724 " a();\n"
9725 " b();\n"
9726 " }\n"
9727 " }\n"
9728 " void g() { return; }\n"
9729 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009730 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009731 GNUBraceStyle);
9732
9733 verifyFormat("void f()\n"
9734 "{\n"
9735 " if (true)\n"
9736 " {\n"
9737 " a();\n"
9738 " }\n"
9739 " else if (false)\n"
9740 " {\n"
9741 " b();\n"
9742 " }\n"
9743 " else\n"
9744 " {\n"
9745 " c();\n"
9746 " }\n"
9747 "}\n",
9748 GNUBraceStyle);
9749
9750 verifyFormat("void f()\n"
9751 "{\n"
9752 " for (int i = 0; i < 10; ++i)\n"
9753 " {\n"
9754 " a();\n"
9755 " }\n"
9756 " while (false)\n"
9757 " {\n"
9758 " b();\n"
9759 " }\n"
9760 " do\n"
9761 " {\n"
9762 " c();\n"
9763 " }\n"
9764 " while (false);\n"
9765 "}\n",
9766 GNUBraceStyle);
9767
9768 verifyFormat("void f(int a)\n"
9769 "{\n"
9770 " switch (a)\n"
9771 " {\n"
9772 " case 0:\n"
9773 " break;\n"
9774 " case 1:\n"
9775 " {\n"
9776 " break;\n"
9777 " }\n"
9778 " case 2:\n"
9779 " {\n"
9780 " }\n"
9781 " break;\n"
9782 " default:\n"
9783 " break;\n"
9784 " }\n"
9785 "}\n",
9786 GNUBraceStyle);
9787
9788 verifyFormat("enum X\n"
9789 "{\n"
9790 " Y = 0,\n"
9791 "}\n",
9792 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009793
9794 verifyFormat("@interface BSApplicationController ()\n"
9795 "{\n"
9796 "@private\n"
9797 " id _extraIvar;\n"
9798 "}\n"
9799 "@end\n",
9800 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009801
9802 verifyFormat("#ifdef _DEBUG\n"
9803 "int foo(int i = 0)\n"
9804 "#else\n"
9805 "int foo(int i = 5)\n"
9806 "#endif\n"
9807 "{\n"
9808 " return i;\n"
9809 "}",
9810 GNUBraceStyle);
9811
9812 verifyFormat("void foo() {}\n"
9813 "void bar()\n"
9814 "#ifdef _DEBUG\n"
9815 "{\n"
9816 " foo();\n"
9817 "}\n"
9818 "#else\n"
9819 "{\n"
9820 "}\n"
9821 "#endif",
9822 GNUBraceStyle);
9823
9824 verifyFormat("void foobar() { int i = 5; }\n"
9825 "#ifdef _DEBUG\n"
9826 "void bar() {}\n"
9827 "#else\n"
9828 "void bar() { foobar(); }\n"
9829 "#endif",
9830 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009831}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009832
9833TEST_F(FormatTest, WebKitBraceBreaking) {
9834 FormatStyle WebKitBraceStyle = getLLVMStyle();
9835 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009836 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009837 verifyFormat("namespace a {\n"
9838 "class A {\n"
9839 " void f()\n"
9840 " {\n"
9841 " if (true) {\n"
9842 " a();\n"
9843 " b();\n"
9844 " }\n"
9845 " }\n"
9846 " void g() { return; }\n"
9847 "};\n"
9848 "enum E {\n"
9849 " A,\n"
9850 " // foo\n"
9851 " B,\n"
9852 " C\n"
9853 "};\n"
9854 "struct B {\n"
9855 " int x;\n"
9856 "};\n"
9857 "}\n",
9858 WebKitBraceStyle);
9859 verifyFormat("struct S {\n"
9860 " int Type;\n"
9861 " union {\n"
9862 " int x;\n"
9863 " double y;\n"
9864 " } Value;\n"
9865 " class C {\n"
9866 " MyFavoriteType Value;\n"
9867 " } Class;\n"
9868 "};\n",
9869 WebKitBraceStyle);
9870}
9871
Manuel Klimekd5735502013-08-12 03:51:17 +00009872TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9873 verifyFormat("void f() {\n"
9874 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009875 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009876 " }\n"
9877 "}\n",
9878 getLLVMStyle());
9879}
9880
Daniel Jasper9613c812013-08-07 16:29:23 +00009881TEST_F(FormatTest, UnderstandsPragmas) {
9882 verifyFormat("#pragma omp reduction(| : var)");
9883 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009884
9885 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9886 "(including parentheses).",
9887 format("#pragma mark Any non-hyphenated or hyphenated string "
9888 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009889}
9890
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009891TEST_F(FormatTest, UnderstandPragmaOption) {
9892 verifyFormat("#pragma option -C -A");
9893
9894 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9895}
9896
Manuel Klimek77866142017-11-17 11:17:15 +00009897TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
9898 FormatStyle Style = getLLVMStyle();
9899 Style.ColumnLimit = 20;
9900
9901 verifyFormat("int a; // the\n"
9902 " // comment", Style);
9903 EXPECT_EQ("int a; /* first line\n"
9904 " * second\n"
9905 " * line third\n"
9906 " * line\n"
9907 " */",
9908 format("int a; /* first line\n"
9909 " * second\n"
9910 " * line third\n"
9911 " * line\n"
9912 " */",
9913 Style));
9914 EXPECT_EQ("int a; // first line\n"
9915 " // second\n"
9916 " // line third\n"
9917 " // line",
9918 format("int a; // first line\n"
9919 " // second line\n"
9920 " // third line",
9921 Style));
9922
9923 Style.PenaltyExcessCharacter = 90;
9924 verifyFormat("int a; // the comment", Style);
9925 EXPECT_EQ("int a; // the\n"
9926 " // comment aa",
9927 format("int a; // the comment aa", Style));
9928 EXPECT_EQ("int a; // first line\n"
9929 " // second line\n"
9930 " // third line",
9931 format("int a; // first line\n"
9932 " // second line\n"
9933 " // third line",
9934 Style));
9935 EXPECT_EQ("int a; /* first line\n"
9936 " * second line\n"
9937 " * third line\n"
9938 " */",
9939 format("int a; /* first line\n"
9940 " * second line\n"
9941 " * third line\n"
9942 " */",
9943 Style));
9944 // FIXME: Investigate why this is not getting the same layout as the test
9945 // above.
9946 EXPECT_EQ("int a; /* first line\n"
9947 " * second\n"
9948 " * line third\n"
9949 " * line\n"
9950 " */",
9951 format("int a; /* first line second line third line"
9952 "\n*/",
9953 Style));
9954
9955 EXPECT_EQ("// foo bar baz bazfoo\n"
9956 "// foo bar\n",
9957 format("// foo bar baz bazfoo\n"
9958 "// foo bar\n",
9959 Style));
9960 EXPECT_EQ("// foo bar baz bazfoo\n"
9961 "// foo bar\n",
9962 format("// foo bar baz bazfoo\n"
9963 "// foo bar\n",
9964 Style));
9965
9966 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
9967 // next one.
9968 EXPECT_EQ("// foo bar baz\n"
9969 "// bazfoo bar foo\n"
9970 "// bar\n",
9971 format("// foo bar baz bazfoo bar\n"
9972 "// foo bar\n",
9973 Style));
9974
9975 EXPECT_EQ("// foo bar baz bazfoo\n"
9976 "// foo bar baz\n"
9977 "// bazfoo bar foo\n"
9978 "// bar\n",
9979 format("// foo bar baz bazfoo\n"
9980 "// foo bar baz bazfoo bar\n"
9981 "// foo bar\n",
9982 Style));
9983
9984 // FIXME: Optimally, we'd keep 'bar' in the last line at the end of the line,
9985 // as it does not actually protrude far enough to make breaking pay off.
9986 // Unfortunately, due to how reflowing is currently implemented, we already
9987 // check the column limit after the reflowing decision and extend the reflow
9988 // range, so we will not take whitespace compression into account.
9989 EXPECT_EQ("// foo bar baz bazfoo\n"
9990 "// foo bar baz\n"
9991 "// bazfoo bar foo\n"
9992 "// bar\n",
9993 format("// foo bar baz bazfoo\n"
9994 "// foo bar baz bazfoo bar\n"
9995 "// foo bar\n",
9996 Style));
9997}
9998
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009999#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10000 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010001 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10002 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010003
10004TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010005 SmallVector<FormatStyle, 3> Styles;
10006 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010007
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010008 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010009 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10010 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10011 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010012
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010013 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010014 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10015 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10016 EXPECT_ALL_STYLES_EQUAL(Styles);
10017
Nico Weber514ecc82014-02-02 20:50:45 +000010018 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010019 EXPECT_TRUE(
10020 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10021 EXPECT_TRUE(
10022 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10023 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010024
Nico Weber514ecc82014-02-02 20:50:45 +000010025 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010026 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10027 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10028 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010029
10030 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010031 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10032 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10033 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010034
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010035 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010036 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10037 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10038 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010039
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010040 Styles[0] = getGNUStyle();
10041 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10042 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10043 EXPECT_ALL_STYLES_EQUAL(Styles);
10044
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010045 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10046}
10047
10048TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10049 SmallVector<FormatStyle, 8> Styles;
10050 Styles.resize(2);
10051
10052 Styles[0] = getGoogleStyle();
10053 Styles[1] = getLLVMStyle();
10054 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10055 EXPECT_ALL_STYLES_EQUAL(Styles);
10056
10057 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010058 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010059 Styles[1] = getLLVMStyle();
10060 Styles[1].Language = FormatStyle::LK_JavaScript;
10061 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10062
10063 Styles[2] = getLLVMStyle();
10064 Styles[2].Language = FormatStyle::LK_JavaScript;
10065 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10066 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010067 &Styles[2])
10068 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010069
10070 Styles[3] = getLLVMStyle();
10071 Styles[3].Language = FormatStyle::LK_JavaScript;
10072 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10073 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010074 &Styles[3])
10075 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010076
10077 Styles[4] = getLLVMStyle();
10078 Styles[4].Language = FormatStyle::LK_JavaScript;
10079 EXPECT_EQ(0, parseConfiguration("---\n"
10080 "BasedOnStyle: LLVM\n"
10081 "IndentWidth: 123\n"
10082 "---\n"
10083 "BasedOnStyle: Google\n"
10084 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010085 &Styles[4])
10086 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010087 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010088}
10089
Daniel Jasper91881d92014-09-29 08:07:46 +000010090#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010091 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010092 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010093 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010094 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010095 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010096
Daniel Jasper91881d92014-09-29 08:07:46 +000010097#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10098
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010099#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10100 Style.STRUCT.FIELD = false; \
10101 EXPECT_EQ(0, \
10102 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10103 .value()); \
10104 EXPECT_TRUE(Style.STRUCT.FIELD); \
10105 EXPECT_EQ(0, \
10106 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10107 .value()); \
10108 EXPECT_FALSE(Style.STRUCT.FIELD);
10109
10110#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10111 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10112
Daniel Jasper00853002014-09-16 16:22:30 +000010113#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10114 EXPECT_NE(VALUE, Style.FIELD); \
10115 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10116 EXPECT_EQ(VALUE, Style.FIELD)
10117
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010118TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010119 FormatStyle Style = {};
10120 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010121 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010122 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010123 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010124 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010125 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010126 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010127 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010128 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010129 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010130 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010131 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010132 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010133 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010134 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010135 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010136 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010137 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010138 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010139 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010140 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010141 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010142 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010143 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010144 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010145 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010146 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010147 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010148 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010149 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010150 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010151 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010152 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010153 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010154 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010155 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010156 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010157 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010158 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010159 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010160
10161 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10162 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10163 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10164 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10165 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10166 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10167 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10168 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010169 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010170 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10171 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10172 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010173 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10174 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10175 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010176}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010177
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010178#undef CHECK_PARSE_BOOL
10179
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010180TEST_F(FormatTest, ParsesConfiguration) {
10181 FormatStyle Style = {};
10182 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010183 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010184 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10185 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010186 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010187 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10188 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010189 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10190 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010191 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10192 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010193 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10194 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10195 PenaltyReturnTypeOnItsOwnLine, 1234u);
10196 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10197 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010198 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010199 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010200 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010201
Daniel Jasper553d4872014-06-17 12:40:34 +000010202 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010203 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10204 FormatStyle::PAS_Left);
10205 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10206 FormatStyle::PAS_Right);
10207 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10208 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010209 // For backward compatibility:
10210 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10211 FormatStyle::PAS_Left);
10212 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10213 FormatStyle::PAS_Right);
10214 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10215 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010216
Alexander Kornienkod6538332013-05-07 15:32:14 +000010217 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010218 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10219 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010220 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10221 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10222 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10223
Daniel Jasperac043c92014-09-15 11:11:00 +000010224 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010225 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10226 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010227 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10228 FormatStyle::BOS_None);
10229 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10230 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010231 // For backward compatibility:
10232 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10233 FormatStyle::BOS_None);
10234 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10235 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010236
Francois Ferranda6b6d512017-05-24 11:36:58 +000010237 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10238 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10239 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10240 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10241 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10242 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10243 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10244 // For backward compatibility:
10245 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10246 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10247
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010248 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10249 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10250 FormatStyle::BAS_Align);
10251 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10252 FormatStyle::BAS_DontAlign);
10253 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10254 FormatStyle::BAS_AlwaysBreak);
10255 // For backward compatibility:
10256 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10257 FormatStyle::BAS_DontAlign);
10258 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10259 FormatStyle::BAS_Align);
10260
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010261 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10262 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10263 FormatStyle::ENAS_DontAlign);
10264 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10265 FormatStyle::ENAS_Left);
10266 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10267 FormatStyle::ENAS_Right);
10268 // For backward compatibility:
10269 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10270 FormatStyle::ENAS_Left);
10271 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10272 FormatStyle::ENAS_Right);
10273
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010274 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010275 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10276 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10277 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010278 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10279 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010280 // For backward compatibility:
10281 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10282 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010283
Daniel Jasperd74cf402014-04-08 12:46:38 +000010284 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010285 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10286 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10287 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10288 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010289 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10290 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010291 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10292 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010293 // For backward compatibility:
10294 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10295 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10296 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10297 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010298
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010299 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10300 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10301 FormatStyle::SBPO_Never);
10302 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10303 FormatStyle::SBPO_Always);
10304 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10305 FormatStyle::SBPO_ControlStatements);
10306 // For backward compatibility:
10307 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10308 FormatStyle::SBPO_Never);
10309 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10310 FormatStyle::SBPO_ControlStatements);
10311
Alexander Kornienkod6538332013-05-07 15:32:14 +000010312 Style.ColumnLimit = 123;
10313 FormatStyle BaseStyle = getLLVMStyle();
10314 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10315 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10316
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010317 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10318 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10319 FormatStyle::BS_Attach);
10320 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10321 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010322 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10323 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010324 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10325 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010326 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10327 FormatStyle::BS_Allman);
10328 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010329 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10330 FormatStyle::BS_WebKit);
10331 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10332 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010333
Zachary Turner448592e2015-12-18 22:20:15 +000010334 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10335 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10336 FormatStyle::RTBS_None);
10337 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10338 FormatStyle::RTBS_All);
10339 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010340 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010341 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10342 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10343 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10344 AlwaysBreakAfterReturnType,
10345 FormatStyle::RTBS_TopLevelDefinitions);
10346
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010347 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10348 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10349 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10350 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10351 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10352 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10353 AlwaysBreakAfterDefinitionReturnType,
10354 FormatStyle::DRTBS_TopLevel);
10355
Daniel Jasper65ee3472013-07-31 23:16:02 +000010356 Style.NamespaceIndentation = FormatStyle::NI_All;
10357 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10358 FormatStyle::NI_None);
10359 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10360 FormatStyle::NI_Inner);
10361 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10362 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010363
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010364 // FIXME: This is required because parsing a configuration simply overwrites
10365 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010366 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010367 std::vector<std::string> BoostForeach;
10368 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010369 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010370 std::vector<std::string> BoostAndQForeach;
10371 BoostAndQForeach.push_back("BOOST_FOREACH");
10372 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010373 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10374 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010375
10376 Style.IncludeCategories.clear();
10377 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10378 {".*", 1}};
10379 CHECK_PARSE("IncludeCategories:\n"
10380 " - Regex: abc/.*\n"
10381 " Priority: 2\n"
10382 " - Regex: .*\n"
10383 " Priority: 1",
10384 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010385 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010386
10387 Style.RawStringFormats.clear();
10388 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
10389 {"pb", FormatStyle::LK_TextProto, "llvm"},
10390 {"cpp", FormatStyle::LK_Cpp, "google"}};
10391
10392 CHECK_PARSE("RawStringFormats:\n"
10393 " - Delimiter: 'pb'\n"
10394 " Language: TextProto\n"
10395 " BasedOnStyle: llvm\n"
10396 " - Delimiter: 'cpp'\n"
10397 " Language: Cpp\n"
10398 " BasedOnStyle: google",
10399 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010400}
10401
10402TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10403 FormatStyle Style = {};
10404 Style.Language = FormatStyle::LK_Cpp;
10405 CHECK_PARSE("Language: Cpp\n"
10406 "IndentWidth: 12",
10407 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010408 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10409 "IndentWidth: 34",
10410 &Style),
10411 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010412 EXPECT_EQ(12u, Style.IndentWidth);
10413 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10414 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10415
10416 Style.Language = FormatStyle::LK_JavaScript;
10417 CHECK_PARSE("Language: JavaScript\n"
10418 "IndentWidth: 12",
10419 IndentWidth, 12u);
10420 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010421 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10422 "IndentWidth: 34",
10423 &Style),
10424 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010425 EXPECT_EQ(23u, Style.IndentWidth);
10426 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10427 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10428
10429 CHECK_PARSE("BasedOnStyle: LLVM\n"
10430 "IndentWidth: 67",
10431 IndentWidth, 67u);
10432
10433 CHECK_PARSE("---\n"
10434 "Language: JavaScript\n"
10435 "IndentWidth: 12\n"
10436 "---\n"
10437 "Language: Cpp\n"
10438 "IndentWidth: 34\n"
10439 "...\n",
10440 IndentWidth, 12u);
10441
10442 Style.Language = FormatStyle::LK_Cpp;
10443 CHECK_PARSE("---\n"
10444 "Language: JavaScript\n"
10445 "IndentWidth: 12\n"
10446 "---\n"
10447 "Language: Cpp\n"
10448 "IndentWidth: 34\n"
10449 "...\n",
10450 IndentWidth, 34u);
10451 CHECK_PARSE("---\n"
10452 "IndentWidth: 78\n"
10453 "---\n"
10454 "Language: JavaScript\n"
10455 "IndentWidth: 56\n"
10456 "...\n",
10457 IndentWidth, 78u);
10458
10459 Style.ColumnLimit = 123;
10460 Style.IndentWidth = 234;
10461 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10462 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010463 EXPECT_FALSE(parseConfiguration("---\n"
10464 "IndentWidth: 456\n"
10465 "BreakBeforeBraces: Allman\n"
10466 "---\n"
10467 "Language: JavaScript\n"
10468 "IndentWidth: 111\n"
10469 "TabWidth: 111\n"
10470 "---\n"
10471 "Language: Cpp\n"
10472 "BreakBeforeBraces: Stroustrup\n"
10473 "TabWidth: 789\n"
10474 "...\n",
10475 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010476 EXPECT_EQ(123u, Style.ColumnLimit);
10477 EXPECT_EQ(456u, Style.IndentWidth);
10478 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10479 EXPECT_EQ(789u, Style.TabWidth);
10480
Rafael Espindola1f243172014-06-12 11:35:17 +000010481 EXPECT_EQ(parseConfiguration("---\n"
10482 "Language: JavaScript\n"
10483 "IndentWidth: 56\n"
10484 "---\n"
10485 "IndentWidth: 78\n"
10486 "...\n",
10487 &Style),
10488 ParseError::Error);
10489 EXPECT_EQ(parseConfiguration("---\n"
10490 "Language: JavaScript\n"
10491 "IndentWidth: 56\n"
10492 "---\n"
10493 "Language: JavaScript\n"
10494 "IndentWidth: 78\n"
10495 "...\n",
10496 &Style),
10497 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010498
10499 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10500}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010501
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010502#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010503
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010504TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10505 FormatStyle Style = {};
10506 Style.Language = FormatStyle::LK_JavaScript;
10507 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010508 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010509 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010510
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010511 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010512 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010513 "BasedOnStyle: Google\n"
10514 "---\n"
10515 "Language: JavaScript\n"
10516 "IndentWidth: 76\n"
10517 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010518 &Style)
10519 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010520 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010521 EXPECT_EQ(76u, Style.IndentWidth);
10522 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10523}
10524
Alexander Kornienkod6538332013-05-07 15:32:14 +000010525TEST_F(FormatTest, ConfigurationRoundTripTest) {
10526 FormatStyle Style = getLLVMStyle();
10527 std::string YAML = configurationAsText(Style);
10528 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010529 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010530 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10531 EXPECT_EQ(Style, ParsedStyle);
10532}
10533
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010534TEST_F(FormatTest, WorksFor8bitEncodings) {
10535 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10536 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10537 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10538 "\"\xef\xee\xf0\xf3...\"",
10539 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10540 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10541 "\xef\xee\xf0\xf3...\"",
10542 getLLVMStyleWithColumns(12)));
10543}
10544
Alexander Kornienko393e3082013-11-13 14:04:17 +000010545TEST_F(FormatTest, HandlesUTF8BOM) {
10546 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10547 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10548 format("\xef\xbb\xbf#include <iostream>"));
10549 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10550 format("\xef\xbb\xbf\n#include <iostream>"));
10551}
10552
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010553// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10554#if !defined(_MSC_VER)
10555
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010556TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10557 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10558 getLLVMStyleWithColumns(35));
10559 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010560 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010561 verifyFormat("// Однажды в студёную зимнюю пору...",
10562 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010563 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010564 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10565 getLLVMStyleWithColumns(39));
10566 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010567 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010568}
10569
10570TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010571 // Non-printable characters' width is currently considered to be the length in
10572 // bytes in UTF8. The characters can be displayed in very different manner
10573 // (zero-width, single width with a substitution glyph, expanded to their code
10574 // (e.g. "<8d>"), so there's no single correct way to handle them.
10575 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010576 "\"\xc2\x8d\";",
10577 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010578 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010579 "\"\xc2\x8d\";",
10580 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010581 EXPECT_EQ("\"Однажды, в \"\n"
10582 "\"студёную \"\n"
10583 "\"зимнюю \"\n"
10584 "\"пору,\"",
10585 format("\"Однажды, в студёную зимнюю пору,\"",
10586 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010587 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010588 "\"一 二 三 \"\n"
10589 "\"四 五六 \"\n"
10590 "\"七 八 九 \"\n"
10591 "\"十\"",
10592 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010593 EXPECT_EQ("\"一\t二 \"\n"
10594 "\"\t三 \"\n"
10595 "\"四 五\t六 \"\n"
10596 "\"\t七 \"\n"
10597 "\"八九十\tqq\"",
10598 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10599 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010600
10601 // UTF8 character in an escape sequence.
10602 EXPECT_EQ("\"aaaaaa\"\n"
10603 "\"\\\xC2\x8D\"",
10604 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010605}
10606
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010607TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10608 EXPECT_EQ("const char *sssss =\n"
10609 " \"一二三四五六七八\\\n"
10610 " 九 十\";",
10611 format("const char *sssss = \"一二三四五六七八\\\n"
10612 " 九 十\";",
10613 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010614}
10615
10616TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010617 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10618 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010619 EXPECT_EQ("// Я из лесу\n"
10620 "// вышел; был\n"
10621 "// сильный\n"
10622 "// мороз.",
10623 format("// Я из лесу вышел; был сильный мороз.",
10624 getLLVMStyleWithColumns(13)));
10625 EXPECT_EQ("// 一二三\n"
10626 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010627 "// 八 九\n"
10628 "// 十",
10629 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010630}
10631
10632TEST_F(FormatTest, SplitsUTF8BlockComments) {
10633 EXPECT_EQ("/* Гляжу,\n"
10634 " * поднимается\n"
10635 " * медленно в\n"
10636 " * гору\n"
10637 " * Лошадка,\n"
10638 " * везущая\n"
10639 " * хворосту\n"
10640 " * воз. */",
10641 format("/* Гляжу, поднимается медленно в гору\n"
10642 " * Лошадка, везущая хворосту воз. */",
10643 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010644 EXPECT_EQ(
10645 "/* 一二三\n"
10646 " * 四五六七\n"
10647 " * 八 九\n"
10648 " * 十 */",
10649 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010650 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10651 " * 𝕓𝕪𝕥𝕖\n"
10652 " * 𝖀𝕿𝕱-𝟠 */",
10653 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010654}
10655
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010656#endif // _MSC_VER
10657
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010658TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10659 FormatStyle Style = getLLVMStyle();
10660
10661 Style.ConstructorInitializerIndentWidth = 4;
10662 verifyFormat(
10663 "SomeClass::Constructor()\n"
10664 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10665 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10666 Style);
10667
10668 Style.ConstructorInitializerIndentWidth = 2;
10669 verifyFormat(
10670 "SomeClass::Constructor()\n"
10671 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10672 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10673 Style);
10674
10675 Style.ConstructorInitializerIndentWidth = 0;
10676 verifyFormat(
10677 "SomeClass::Constructor()\n"
10678 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10679 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10680 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010681 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10682 verifyFormat(
10683 "SomeLongTemplateVariableName<\n"
10684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10685 Style);
10686 verifyFormat(
10687 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10689 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010690}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010691
Daniel Jasper00853002014-09-16 16:22:30 +000010692TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10693 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010694 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010695 Style.ConstructorInitializerIndentWidth = 4;
10696 verifyFormat("SomeClass::Constructor()\n"
10697 " : a(a)\n"
10698 " , b(b)\n"
10699 " , c(c) {}",
10700 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010701 verifyFormat("SomeClass::Constructor()\n"
10702 " : a(a) {}",
10703 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010704
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010705 Style.ColumnLimit = 0;
10706 verifyFormat("SomeClass::Constructor()\n"
10707 " : a(a) {}",
10708 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010709 verifyFormat("SomeClass::Constructor() noexcept\n"
10710 " : a(a) {}",
10711 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010712 verifyFormat("SomeClass::Constructor()\n"
10713 " : a(a)\n"
10714 " , b(b)\n"
10715 " , c(c) {}",
10716 Style);
10717 verifyFormat("SomeClass::Constructor()\n"
10718 " : a(a) {\n"
10719 " foo();\n"
10720 " bar();\n"
10721 "}",
10722 Style);
10723
Daniel Jasperd74cf402014-04-08 12:46:38 +000010724 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010725 verifyFormat("SomeClass::Constructor()\n"
10726 " : a(a)\n"
10727 " , b(b)\n"
10728 " , c(c) {\n}",
10729 Style);
10730 verifyFormat("SomeClass::Constructor()\n"
10731 " : a(a) {\n}",
10732 Style);
10733
10734 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010735 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010736 Style.ConstructorInitializerIndentWidth = 2;
10737 verifyFormat("SomeClass::Constructor()\n"
10738 " : a(a)\n"
10739 " , b(b)\n"
10740 " , c(c) {}",
10741 Style);
10742
10743 Style.ConstructorInitializerIndentWidth = 0;
10744 verifyFormat("SomeClass::Constructor()\n"
10745 ": a(a)\n"
10746 ", b(b)\n"
10747 ", c(c) {}",
10748 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010749
10750 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10751 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010752 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10753 verifyFormat(
10754 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10755 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010756 verifyFormat(
10757 "SomeClass::Constructor()\n"
10758 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10759 Style);
10760 Style.ConstructorInitializerIndentWidth = 4;
10761 Style.ColumnLimit = 60;
10762 verifyFormat("SomeClass::Constructor()\n"
10763 " : aaaaaaaa(aaaaaaaa)\n"
10764 " , aaaaaaaa(aaaaaaaa)\n"
10765 " , aaaaaaaa(aaaaaaaa) {}",
10766 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010767}
10768
Daniel Jasper38efc132014-10-21 07:51:54 +000010769TEST_F(FormatTest, Destructors) {
10770 verifyFormat("void F(int &i) { i.~int(); }");
10771 verifyFormat("void F(int &i) { i->~int(); }");
10772}
10773
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010774TEST_F(FormatTest, FormatsWithWebKitStyle) {
10775 FormatStyle Style = getWebKitStyle();
10776
10777 // Don't indent in outer namespaces.
10778 verifyFormat("namespace outer {\n"
10779 "int i;\n"
10780 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010781 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010782 "} // namespace inner\n"
10783 "} // namespace outer\n"
10784 "namespace other_outer {\n"
10785 "int i;\n"
10786 "}",
10787 Style);
10788
10789 // Don't indent case labels.
10790 verifyFormat("switch (variable) {\n"
10791 "case 1:\n"
10792 "case 2:\n"
10793 " doSomething();\n"
10794 " break;\n"
10795 "default:\n"
10796 " ++variable;\n"
10797 "}",
10798 Style);
10799
10800 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010801 EXPECT_EQ("void f()\n"
10802 "{\n"
10803 " if (aaaaaaaaaaaaaaaa\n"
10804 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10805 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10806 " return;\n"
10807 "}",
10808 format("void f() {\n"
10809 "if (aaaaaaaaaaaaaaaa\n"
10810 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10811 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10812 "return;\n"
10813 "}",
10814 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010815
Daniel Jasper35995672014-04-29 14:05:20 +000010816 // Allow functions on a single line.
10817 verifyFormat("void f() { return; }", Style);
10818
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010819 // Constructor initializers are formatted one per line with the "," on the
10820 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010821 verifyFormat("Constructor()\n"
10822 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10823 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010824 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010825 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10826 "{\n"
10827 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010828 Style);
10829 verifyFormat("SomeClass::Constructor()\n"
10830 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010831 "{\n"
10832 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010833 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010834 EXPECT_EQ("SomeClass::Constructor()\n"
10835 " : a(a)\n"
10836 "{\n"
10837 "}",
10838 format("SomeClass::Constructor():a(a){}", Style));
10839 verifyFormat("SomeClass::Constructor()\n"
10840 " : a(a)\n"
10841 " , b(b)\n"
10842 " , c(c)\n"
10843 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010844 "}",
10845 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010846 verifyFormat("SomeClass::Constructor()\n"
10847 " : a(a)\n"
10848 "{\n"
10849 " foo();\n"
10850 " bar();\n"
10851 "}",
10852 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010853
Daniel Jasper65ee3472013-07-31 23:16:02 +000010854 // Access specifiers should be aligned left.
10855 verifyFormat("class C {\n"
10856 "public:\n"
10857 " int i;\n"
10858 "};",
10859 Style);
10860
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010861 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010862 verifyFormat("int a; // Do not\n"
10863 "double b; // align comments.",
10864 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010865
Daniel Jasper3219e432014-12-02 13:24:51 +000010866 // Do not align operands.
10867 EXPECT_EQ("ASSERT(aaaa\n"
10868 " || bbbb);",
10869 format("ASSERT ( aaaa\n||bbbb);", Style));
10870
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010871 // Accept input's line breaks.
10872 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10873 " || bbbbbbbbbbbbbbb) {\n"
10874 " i++;\n"
10875 "}",
10876 format("if (aaaaaaaaaaaaaaa\n"
10877 "|| bbbbbbbbbbbbbbb) { i++; }",
10878 Style));
10879 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10880 " i++;\n"
10881 "}",
10882 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010883
10884 // Don't automatically break all macro definitions (llvm.org/PR17842).
10885 verifyFormat("#define aNumber 10", Style);
10886 // However, generally keep the line breaks that the user authored.
10887 EXPECT_EQ("#define aNumber \\\n"
10888 " 10",
10889 format("#define aNumber \\\n"
10890 " 10",
10891 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010892
10893 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010894 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10895 " copyItems:YES];",
10896 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10897 "copyItems:YES];",
10898 Style));
10899 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10900 " copyItems:YES];",
10901 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10902 " copyItems:YES];",
10903 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010904 // FIXME: This does not seem right, there should be more indentation before
10905 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010906 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010907 " @\"a\",\n"
10908 " @\"a\"\n"
10909 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010910 " copyItems:YES];",
10911 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10912 " @\"a\",\n"
10913 " @\"a\"\n"
10914 " ]\n"
10915 " copyItems:YES];",
10916 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010917 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010918 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10919 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010920 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10921 " copyItems:YES];",
10922 Style));
10923
10924 verifyFormat("[self.a b:c c:d];", Style);
10925 EXPECT_EQ("[self.a b:c\n"
10926 " c:d];",
10927 format("[self.a b:c\n"
10928 "c:d];",
10929 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010930}
10931
Manuel Klimekffdeb592013-09-03 15:10:01 +000010932TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010933 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10934 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10935 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10936 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10937 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010938 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000010939 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
10940 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010941 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010942 verifyFormat("void f() {\n"
10943 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10944 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010945 verifyFormat("void f() {\n"
10946 " other(x.begin(), //\n"
10947 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010948 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010949 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010950 verifyFormat("SomeFunction([]() { // A cool function...\n"
10951 " return 43;\n"
10952 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010953 EXPECT_EQ("SomeFunction([]() {\n"
10954 "#define A a\n"
10955 " return 43;\n"
10956 "});",
10957 format("SomeFunction([](){\n"
10958 "#define A a\n"
10959 "return 43;\n"
10960 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010961 verifyFormat("void f() {\n"
10962 " SomeFunction([](decltype(x), A *a) {});\n"
10963 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010964 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10965 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010966 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10967 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10968 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010969 verifyFormat("Constructor()\n"
10970 " : Field([] { // comment\n"
10971 " int i;\n"
10972 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010973 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10974 " return some_parameter.size();\n"
10975 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010976 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10977 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010978 verifyFormat("int i = aaaaaa ? 1 //\n"
10979 " : [] {\n"
10980 " return 2; //\n"
10981 " }();");
10982 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10983 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10984 " return x == 2; // force break\n"
10985 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010986 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10987 " [=](int iiiiiiiiiiii) {\n"
10988 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10989 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10990 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010991 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010992 verifyFormat("SomeFunction({[&] {\n"
10993 " // comment\n"
10994 " },\n"
10995 " [&] {\n"
10996 " // comment\n"
10997 " }});");
10998 verifyFormat("SomeFunction({[&] {\n"
10999 " // comment\n"
11000 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011001 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11002 " [&]() { return true; },\n"
11003 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011004
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011005 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011006 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011007 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011008 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11009 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011010 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011011 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011012 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11013 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011014 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011015 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11016 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011017 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011018 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011019 verifyFormat(
11020 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11021 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11022 " return aaaaaaaaaaaaaaaaa;\n"
11023 " });",
11024 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011025 verifyFormat("[]() //\n"
11026 " -> int {\n"
11027 " return 1; //\n"
11028 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011029
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011030 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011031 verifyFormat("SomeFunction(\n"
11032 " []() {\n"
11033 " int i = 42;\n"
11034 " return i;\n"
11035 " },\n"
11036 " []() {\n"
11037 " int j = 43;\n"
11038 " return j;\n"
11039 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011040
Daniel Jasperda18fd82014-06-10 06:39:03 +000011041 // More complex introducers.
11042 verifyFormat("return [i, args...] {};");
11043
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011044 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011045 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011046 verifyFormat("double &operator[](int i) { return 0; }\n"
11047 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011048 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011049 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011050 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011051
11052 // Other corner cases.
11053 verifyFormat("void f() {\n"
11054 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011055 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011056 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011057
11058 // Lambdas created through weird macros.
11059 verifyFormat("void f() {\n"
11060 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011061 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011062 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011063
11064 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11065 " doo_dah();\n"
11066 " doo_dah();\n"
11067 " })) {\n"
11068 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011069 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11070 " doo_dah();\n"
11071 " doo_dah();\n"
11072 " })) {\n"
11073 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011074 verifyFormat("auto lambda = []() {\n"
11075 " int a = 2\n"
11076 "#if A\n"
11077 " + 2\n"
11078 "#endif\n"
11079 " ;\n"
11080 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011081
11082 // Lambdas with complex multiline introducers.
11083 verifyFormat(
11084 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11085 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11086 " -> ::std::unordered_set<\n"
11087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11088 " //\n"
11089 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011090}
11091
Manuel Klimek516e0542013-09-04 13:25:30 +000011092TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011093 FormatStyle ShortBlocks = getLLVMStyle();
11094 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11095 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11096 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11097 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11098 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11099 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11100 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011101
Daniel Jasper76284682014-10-22 09:12:44 +000011102 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11103 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11104 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011105
Daniel Jasper76284682014-10-22 09:12:44 +000011106 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011107 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011108 "}];");
11109 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011110 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011111 "}]};");
11112 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011113 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011114 "}];");
11115 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011116 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011117 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011118 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011119 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011120 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011121 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011122 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011123
11124 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011125 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011126 "}];",
11127 getLLVMStyleWithColumns(60));
11128 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011129 " NSString *path = [self sessionFilePath];\n"
11130 " if (path) {\n"
11131 " // ...\n"
11132 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011133 "});");
11134 verifyFormat("[[SessionService sharedService]\n"
11135 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011136 " if (window) {\n"
11137 " [self windowDidLoad:window];\n"
11138 " } else {\n"
11139 " [self errorLoadingWindow];\n"
11140 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011141 " }];");
11142 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011143 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011144 "};\n",
11145 getLLVMStyleWithColumns(40));
11146 verifyFormat("[[SessionService sharedService]\n"
11147 " loadWindowWithCompletionBlock: //\n"
11148 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011149 " if (window) {\n"
11150 " [self windowDidLoad:window];\n"
11151 " } else {\n"
11152 " [self errorLoadingWindow];\n"
11153 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011154 " }];",
11155 getLLVMStyleWithColumns(60));
11156 verifyFormat("[myObject doSomethingWith:arg1\n"
11157 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011158 " // ...\n"
11159 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011160 " }\n"
11161 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011162 " // ...\n"
11163 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011164 " }\n"
11165 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011166 " // ...\n"
11167 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011168 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011169 verifyFormat("[myObject doSomethingWith:arg1\n"
11170 " firstBlock:-1\n"
11171 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011172 " // ...\n"
11173 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011174 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011175
11176 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011177 " @autoreleasepool {\n"
11178 " if (a) {\n"
11179 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011180 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011181 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011182 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011183 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011184 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11185 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011186
11187 FormatStyle FourIndent = getLLVMStyle();
11188 FourIndent.ObjCBlockIndentWidth = 4;
11189 verifyFormat("[operation setCompletionBlock:^{\n"
11190 " [self onOperationDone];\n"
11191 "}];",
11192 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011193}
11194
Daniel Jasper289afc02015-04-23 09:23:17 +000011195TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11196 FormatStyle ZeroColumn = getLLVMStyle();
11197 ZeroColumn.ColumnLimit = 0;
11198
11199 verifyFormat("[[SessionService sharedService] "
11200 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11201 " if (window) {\n"
11202 " [self windowDidLoad:window];\n"
11203 " } else {\n"
11204 " [self errorLoadingWindow];\n"
11205 " }\n"
11206 "}];",
11207 ZeroColumn);
11208 EXPECT_EQ("[[SessionService sharedService]\n"
11209 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11210 " if (window) {\n"
11211 " [self windowDidLoad:window];\n"
11212 " } else {\n"
11213 " [self errorLoadingWindow];\n"
11214 " }\n"
11215 " }];",
11216 format("[[SessionService sharedService]\n"
11217 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11218 " if (window) {\n"
11219 " [self windowDidLoad:window];\n"
11220 " } else {\n"
11221 " [self errorLoadingWindow];\n"
11222 " }\n"
11223 "}];",
11224 ZeroColumn));
11225 verifyFormat("[myObject doSomethingWith:arg1\n"
11226 " firstBlock:^(Foo *a) {\n"
11227 " // ...\n"
11228 " int i;\n"
11229 " }\n"
11230 " secondBlock:^(Bar *b) {\n"
11231 " // ...\n"
11232 " int i;\n"
11233 " }\n"
11234 " thirdBlock:^Foo(Bar *b) {\n"
11235 " // ...\n"
11236 " int i;\n"
11237 " }];",
11238 ZeroColumn);
11239 verifyFormat("f(^{\n"
11240 " @autoreleasepool {\n"
11241 " if (a) {\n"
11242 " g();\n"
11243 " }\n"
11244 " }\n"
11245 "});",
11246 ZeroColumn);
11247 verifyFormat("void (^largeBlock)(void) = ^{\n"
11248 " // ...\n"
11249 "};",
11250 ZeroColumn);
11251
11252 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11253 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011254 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011255 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11256 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11257 " int i;\n"
11258 "};",
11259 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11260}
11261
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011262TEST_F(FormatTest, SupportsCRLF) {
11263 EXPECT_EQ("int a;\r\n"
11264 "int b;\r\n"
11265 "int c;\r\n",
11266 format("int a;\r\n"
11267 " int b;\r\n"
11268 " int c;\r\n",
11269 getLLVMStyle()));
11270 EXPECT_EQ("int a;\r\n"
11271 "int b;\r\n"
11272 "int c;\r\n",
11273 format("int a;\r\n"
11274 " int b;\n"
11275 " int c;\r\n",
11276 getLLVMStyle()));
11277 EXPECT_EQ("int a;\n"
11278 "int b;\n"
11279 "int c;\n",
11280 format("int a;\r\n"
11281 " int b;\n"
11282 " int c;\n",
11283 getLLVMStyle()));
11284 EXPECT_EQ("\"aaaaaaa \"\r\n"
11285 "\"bbbbbbb\";\r\n",
11286 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11287 EXPECT_EQ("#define A \\\r\n"
11288 " b; \\\r\n"
11289 " c; \\\r\n"
11290 " d;\r\n",
11291 format("#define A \\\r\n"
11292 " b; \\\r\n"
11293 " c; d; \r\n",
11294 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011295
11296 EXPECT_EQ("/*\r\n"
11297 "multi line block comments\r\n"
11298 "should not introduce\r\n"
11299 "an extra carriage return\r\n"
11300 "*/\r\n",
11301 format("/*\r\n"
11302 "multi line block comments\r\n"
11303 "should not introduce\r\n"
11304 "an extra carriage return\r\n"
11305 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011306}
11307
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011308TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11309 verifyFormat("MY_CLASS(C) {\n"
11310 " int i;\n"
11311 " int j;\n"
11312 "};");
11313}
11314
Daniel Jasper6633ab82013-10-18 10:38:14 +000011315TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11316 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11317 TwoIndent.ContinuationIndentWidth = 2;
11318
11319 EXPECT_EQ("int i =\n"
11320 " longFunction(\n"
11321 " arg);",
11322 format("int i = longFunction(arg);", TwoIndent));
11323
11324 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11325 SixIndent.ContinuationIndentWidth = 6;
11326
11327 EXPECT_EQ("int i =\n"
11328 " longFunction(\n"
11329 " arg);",
11330 format("int i = longFunction(arg);", SixIndent));
11331}
11332
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011333TEST_F(FormatTest, SpacesInAngles) {
11334 FormatStyle Spaces = getLLVMStyle();
11335 Spaces.SpacesInAngles = true;
11336
11337 verifyFormat("static_cast< int >(arg);", Spaces);
11338 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11339 verifyFormat("f< int, float >();", Spaces);
11340 verifyFormat("template <> g() {}", Spaces);
11341 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011342 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11343 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11344 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011345
11346 Spaces.Standard = FormatStyle::LS_Cpp03;
11347 Spaces.SpacesInAngles = true;
11348 verifyFormat("A< A< int > >();", Spaces);
11349
11350 Spaces.SpacesInAngles = false;
11351 verifyFormat("A<A<int> >();", Spaces);
11352
11353 Spaces.Standard = FormatStyle::LS_Cpp11;
11354 Spaces.SpacesInAngles = true;
11355 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011356
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011357 Spaces.SpacesInAngles = false;
11358 verifyFormat("A<A<int>>();", Spaces);
11359}
11360
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011361TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11362 FormatStyle Style = getLLVMStyle();
11363 Style.SpaceAfterTemplateKeyword = false;
11364 verifyFormat("template<int> void foo();", Style);
11365}
11366
Jacques Pienaarfc275112015-02-18 23:48:37 +000011367TEST_F(FormatTest, TripleAngleBrackets) {
11368 verifyFormat("f<<<1, 1>>>();");
11369 verifyFormat("f<<<1, 1, 1, s>>>();");
11370 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011371 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011372 verifyFormat("f<param><<<1, 1>>>();");
11373 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011374 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011375 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11376 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011377 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11378 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011379}
11380
11381TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011382 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011383 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011384 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11385 "aaallvm::outs() <<");
11386 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11387 "aaaallvm::outs()\n <<");
11388}
11389
Manuel Klimek819788d2014-03-18 11:22:45 +000011390TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11391 std::string code = "#if A\n"
11392 "#if B\n"
11393 "a.\n"
11394 "#endif\n"
11395 " a = 1;\n"
11396 "#else\n"
11397 "#endif\n"
11398 "#if C\n"
11399 "#else\n"
11400 "#endif\n";
11401 EXPECT_EQ(code, format(code));
11402}
11403
Manuel Klimek68b03042014-04-14 09:14:11 +000011404TEST_F(FormatTest, HandleConflictMarkers) {
11405 // Git/SVN conflict markers.
11406 EXPECT_EQ("int a;\n"
11407 "void f() {\n"
11408 " callme(some(parameter1,\n"
11409 "<<<<<<< text by the vcs\n"
11410 " parameter2),\n"
11411 "||||||| text by the vcs\n"
11412 " parameter2),\n"
11413 " parameter3,\n"
11414 "======= text by the vcs\n"
11415 " parameter2, parameter3),\n"
11416 ">>>>>>> text by the vcs\n"
11417 " otherparameter);\n",
11418 format("int a;\n"
11419 "void f() {\n"
11420 " callme(some(parameter1,\n"
11421 "<<<<<<< text by the vcs\n"
11422 " parameter2),\n"
11423 "||||||| text by the vcs\n"
11424 " parameter2),\n"
11425 " parameter3,\n"
11426 "======= text by the vcs\n"
11427 " parameter2,\n"
11428 " parameter3),\n"
11429 ">>>>>>> text by the vcs\n"
11430 " otherparameter);\n"));
11431
11432 // Perforce markers.
11433 EXPECT_EQ("void f() {\n"
11434 " function(\n"
11435 ">>>> text by the vcs\n"
11436 " parameter,\n"
11437 "==== text by the vcs\n"
11438 " parameter,\n"
11439 "==== text by the vcs\n"
11440 " parameter,\n"
11441 "<<<< text by the vcs\n"
11442 " parameter);\n",
11443 format("void f() {\n"
11444 " function(\n"
11445 ">>>> text by the vcs\n"
11446 " parameter,\n"
11447 "==== text by the vcs\n"
11448 " parameter,\n"
11449 "==== text by the vcs\n"
11450 " parameter,\n"
11451 "<<<< text by the vcs\n"
11452 " parameter);\n"));
11453
11454 EXPECT_EQ("<<<<<<<\n"
11455 "|||||||\n"
11456 "=======\n"
11457 ">>>>>>>",
11458 format("<<<<<<<\n"
11459 "|||||||\n"
11460 "=======\n"
11461 ">>>>>>>"));
11462
11463 EXPECT_EQ("<<<<<<<\n"
11464 "|||||||\n"
11465 "int i;\n"
11466 "=======\n"
11467 ">>>>>>>",
11468 format("<<<<<<<\n"
11469 "|||||||\n"
11470 "int i;\n"
11471 "=======\n"
11472 ">>>>>>>"));
11473
11474 // FIXME: Handle parsing of macros around conflict markers correctly:
11475 EXPECT_EQ("#define Macro \\\n"
11476 "<<<<<<<\n"
11477 "Something \\\n"
11478 "|||||||\n"
11479 "Else \\\n"
11480 "=======\n"
11481 "Other \\\n"
11482 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011483 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011484 format("#define Macro \\\n"
11485 "<<<<<<<\n"
11486 " Something \\\n"
11487 "|||||||\n"
11488 " Else \\\n"
11489 "=======\n"
11490 " Other \\\n"
11491 ">>>>>>>\n"
11492 " End\n"
11493 "int i;\n"));
11494}
11495
Daniel Jasper471894432014-08-06 13:40:26 +000011496TEST_F(FormatTest, DisableRegions) {
11497 EXPECT_EQ("int i;\n"
11498 "// clang-format off\n"
11499 " int j;\n"
11500 "// clang-format on\n"
11501 "int k;",
11502 format(" int i;\n"
11503 " // clang-format off\n"
11504 " int j;\n"
11505 " // clang-format on\n"
11506 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011507 EXPECT_EQ("int i;\n"
11508 "/* clang-format off */\n"
11509 " int j;\n"
11510 "/* clang-format on */\n"
11511 "int k;",
11512 format(" int i;\n"
11513 " /* clang-format off */\n"
11514 " int j;\n"
11515 " /* clang-format on */\n"
11516 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011517
11518 // Don't reflow comments within disabled regions.
11519 EXPECT_EQ(
11520 "// clang-format off\n"
11521 "// long long long long long long line\n"
11522 "/* clang-format on */\n"
11523 "/* long long long\n"
11524 " * long long long\n"
11525 " * line */\n"
11526 "int i;\n"
11527 "/* clang-format off */\n"
11528 "/* long long long long long long line */\n",
11529 format("// clang-format off\n"
11530 "// long long long long long long line\n"
11531 "/* clang-format on */\n"
11532 "/* long long long long long long line */\n"
11533 "int i;\n"
11534 "/* clang-format off */\n"
11535 "/* long long long long long long line */\n",
11536 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011537}
11538
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011539TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11540 format("? ) =");
11541 verifyNoCrash("#define a\\\n /**/}");
11542}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011543
Daniel Jasper498f5582015-12-25 08:53:31 +000011544TEST_F(FormatTest, FormatsTableGenCode) {
11545 FormatStyle Style = getLLVMStyle();
11546 Style.Language = FormatStyle::LK_TableGen;
11547 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11548}
11549
Nico Weberb2673a12016-11-10 21:49:25 +000011550TEST_F(FormatTest, ArrayOfTemplates) {
11551 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11552 format("auto a = new unique_ptr<int > [ 10];"));
11553
11554 FormatStyle Spaces = getLLVMStyle();
11555 Spaces.SpacesInSquareBrackets = true;
11556 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11557 format("auto a = new unique_ptr<int > [10];", Spaces));
11558}
11559
11560TEST_F(FormatTest, ArrayAsTemplateType) {
11561 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11562 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11563
11564 FormatStyle Spaces = getLLVMStyle();
11565 Spaces.SpacesInSquareBrackets = true;
11566 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11567 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11568}
11569
Martin Probstc9c51c42017-03-16 10:21:35 +000011570TEST_F(FormatTest, NoSpaceAfterSuper) {
11571 verifyFormat("__super::FooBar();");
11572}
11573
Eric Liu547d8792016-03-24 13:22:42 +000011574TEST(FormatStyle, GetStyleOfFile) {
11575 vfs::InMemoryFileSystem FS;
11576 // Test 1: format file in the same directory.
11577 ASSERT_TRUE(
11578 FS.addFile("/a/.clang-format", 0,
11579 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11580 ASSERT_TRUE(
11581 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011582 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011583 ASSERT_TRUE((bool)Style1);
11584 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011585
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011586 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011587 ASSERT_TRUE(
11588 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011589 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011590 ASSERT_TRUE((bool)Style2);
11591 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011592
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011593 // Test 2.2: no format on 'none' fallback style.
11594 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11595 ASSERT_TRUE((bool)Style2);
11596 ASSERT_EQ(*Style2, getNoStyle());
11597
11598 // Test 2.3: format if config is found with no based style while fallback is
11599 // 'none'.
11600 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11601 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11602 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11603 ASSERT_TRUE((bool)Style2);
11604 ASSERT_EQ(*Style2, getLLVMStyle());
11605
11606 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11607 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11608 ASSERT_TRUE((bool)Style2);
11609 ASSERT_EQ(*Style2, getLLVMStyle());
11610
Eric Liu547d8792016-03-24 13:22:42 +000011611 // Test 3: format file in parent directory.
11612 ASSERT_TRUE(
11613 FS.addFile("/c/.clang-format", 0,
11614 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11615 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11616 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011617 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011618 ASSERT_TRUE((bool)Style3);
11619 ASSERT_EQ(*Style3, getGoogleStyle());
11620
11621 // Test 4: error on invalid fallback style
11622 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11623 ASSERT_FALSE((bool)Style4);
11624 llvm::consumeError(Style4.takeError());
11625
11626 // Test 5: error on invalid yaml on command line
11627 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11628 ASSERT_FALSE((bool)Style5);
11629 llvm::consumeError(Style5.takeError());
11630
11631 // Test 6: error on invalid style
11632 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11633 ASSERT_FALSE((bool)Style6);
11634 llvm::consumeError(Style6.takeError());
11635
11636 // Test 7: found config file, error on parsing it
11637 ASSERT_TRUE(
11638 FS.addFile("/d/.clang-format", 0,
11639 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11640 "InvalidKey: InvalidValue")));
11641 ASSERT_TRUE(
11642 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11643 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11644 ASSERT_FALSE((bool)Style7);
11645 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011646}
11647
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011648TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11649 // Column limit is 20.
11650 std::string Code = "Type *a =\n"
11651 " new Type();\n"
11652 "g(iiiii, 0, jjjjj,\n"
11653 " 0, kkkkk, 0, mm);\n"
11654 "int bad = format ;";
11655 std::string Expected = "auto a = new Type();\n"
11656 "g(iiiii, nullptr,\n"
11657 " jjjjj, nullptr,\n"
11658 " kkkkk, nullptr,\n"
11659 " mm);\n"
11660 "int bad = format ;";
11661 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011662 tooling::Replacements Replaces = toReplacements(
11663 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11664 "auto "),
11665 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11666 "nullptr"),
11667 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11668 "nullptr"),
11669 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11670 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011671
11672 format::FormatStyle Style = format::getLLVMStyle();
11673 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011674 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11675 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11676 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11677 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11678 EXPECT_TRUE(static_cast<bool>(Result));
11679 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011680}
11681
Eric Liubaf58c22016-05-18 13:43:48 +000011682TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11683 std::string Code = "#include \"a.h\"\n"
11684 "#include \"c.h\"\n"
11685 "\n"
11686 "int main() {\n"
11687 " return 0;\n"
11688 "}";
11689 std::string Expected = "#include \"a.h\"\n"
11690 "#include \"b.h\"\n"
11691 "#include \"c.h\"\n"
11692 "\n"
11693 "int main() {\n"
11694 " return 0;\n"
11695 "}";
11696 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011697 tooling::Replacements Replaces = toReplacements(
11698 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11699 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011700
11701 format::FormatStyle Style = format::getLLVMStyle();
11702 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011703 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11704 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11705 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11706 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11707 EXPECT_TRUE(static_cast<bool>(Result));
11708 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011709}
11710
Krasimir Georgievac16a202017-06-23 11:46:03 +000011711TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11712 EXPECT_EQ("using std::cin;\n"
11713 "using std::cout;",
11714 format("using std::cout;\n"
11715 "using std::cin;", getGoogleStyle()));
11716}
11717
Nico Weberdc065182017-04-05 18:10:42 +000011718TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11719 format::FormatStyle Style = format::getLLVMStyle();
11720 Style.Standard = FormatStyle::LS_Cpp03;
11721 // cpp03 recognize this string as identifier u8 and literal character 'a'
11722 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11723}
11724
11725TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11726 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11727 // all modes, including C++11, C++14 and C++17
11728 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11729}
11730
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000011731TEST_F(FormatTest, DoNotFormatLikelyXml) {
11732 EXPECT_EQ("<!-- ;> -->",
11733 format("<!-- ;> -->", getGoogleStyle()));
11734 EXPECT_EQ(" <!-- >; -->",
11735 format(" <!-- >; -->", getGoogleStyle()));
11736}
11737
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011738TEST_F(FormatTest, StructuredBindings) {
11739 // Structured bindings is a C++17 feature.
11740 // all modes, including C++11, C++14 and C++17
11741 verifyFormat("auto [a, b] = f();");
11742 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
11743 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
11744 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
11745 EXPECT_EQ("auto const volatile [a, b] = f();",
11746 format("auto const volatile[a, b] = f();"));
11747 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011748 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011749 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011750 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011751 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011752 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
11753 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011754 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011755 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
11756 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
11757 EXPECT_EQ("const auto volatile &&[a, b] = f();",
11758 format("const auto volatile &&[a, b] = f();"));
11759 EXPECT_EQ("volatile const auto &&[a, b] = f();",
11760 format("volatile const auto &&[a, b] = f();"));
11761 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011762
Manuel Klimeke411aa82017-09-20 09:29:37 +000011763 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011764 FormatStyle PointerMiddle = getLLVMStyle();
11765 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
11766 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
11767 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
11768 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
11769 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
11770 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
11771 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
11772 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
11773 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
11774 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
11775 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
11776 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
11777 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
11778
11779 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
11780 format("for (const auto && [a, b] : some_range) {\n}"));
11781 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
11782 format("for (const auto & [a, b] : some_range) {\n}"));
11783 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
11784 format("for (const auto[a, b] : some_range) {\n}"));
11785 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
11786 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
11787 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
11788 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
11789 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
11790 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
11791 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
11792 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000011793
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011794 format::FormatStyle Spaces = format::getLLVMStyle();
11795 Spaces.SpacesInSquareBrackets = true;
11796 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011797 verifyFormat("auto &&[ a, b ] = f();", Spaces);
11798 verifyFormat("auto &[ a, b ] = f();", Spaces);
11799 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
11800 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011801}
11802
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011803} // end namespace
11804} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011805} // end namespace clang