blob: 1c57b509064ad90e6ebe38dc40f44faab6c19cc0 [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000033 enum StatusCheck {
34 SC_ExpectComplete,
35 SC_ExpectIncomplete,
36 SC_DoNotCheck
Manuel Klimekec5c3db2015-05-07 12:26:30 +000037 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000041 StatusCheck CheckComplete = SC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000045 FormattingAttemptStatus Status;
Manuel Klimekec5c3db2015-05-07 12:26:30 +000046 tooling::Replacements Replaces =
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000047 reformat(Style, Code, Ranges, "<stdin>", &Status);
48 if (CheckComplete != SC_DoNotCheck) {
49 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
50 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
51 << Code << "\n\n";
Manuel Klimekec5c3db2015-05-07 12:26:30 +000052 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000053 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000054 auto Result = applyAllReplacements(Code, Replaces);
55 EXPECT_TRUE(static_cast<bool>(Result));
56 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
57 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000058 }
59
Francois Ferranda6b6d512017-05-24 11:36:58 +000060 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000061 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Francois Ferranda6b6d512017-05-24 11:36:58 +000065 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
66 return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
67 }
68
Daniel Jasper1b750ed2013-01-14 16:24:39 +000069 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
Francois Ferranda6b6d512017-05-24 11:36:58 +000070 return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
Daniel Jasper1b750ed2013-01-14 16:24:39 +000071 }
72
Manuel Klimekb69e3c62013-01-02 18:33:23 +000073 void verifyFormat(llvm::StringRef Code,
74 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000075 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Nico Weberd96ae862017-02-24 19:10:12 +000076 if (Style.Language == FormatStyle::LK_Cpp) {
77 // Objective-C++ is a superset of C++, so everything checked for C++
78 // needs to be checked for Objective-C++ as well.
79 FormatStyle ObjCStyle = Style;
80 ObjCStyle.Language = FormatStyle::LK_ObjC;
81 EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
82 }
Daniel Jasperf7935112012-12-03 18:12:45 +000083 }
84
Manuel Klimekec5c3db2015-05-07 12:26:30 +000085 void verifyIncompleteFormat(llvm::StringRef Code,
86 const FormatStyle &Style = getLLVMStyle()) {
87 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000088 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000089 }
90
Daniel Jasperf7935112012-12-03 18:12:45 +000091 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000092 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000093 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000094
95 void verifyIndependentOfContext(llvm::StringRef text) {
96 verifyFormat(text);
97 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
98 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000099
Daniel Jasper675b4f82015-01-19 10:51:23 +0000100 /// \brief Verify that clang-format does not crash on the given input.
101 void verifyNoCrash(llvm::StringRef Code,
102 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000103 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000104 }
105
Daniel Jasper7b038a22013-01-30 09:46:12 +0000106 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000107};
108
Manuel Klimek52b15152013-01-09 15:25:02 +0000109TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000110 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
111 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
112 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
113 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
114 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000115}
116
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000117//===----------------------------------------------------------------------===//
118// Basic function tests.
119//===----------------------------------------------------------------------===//
120
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000121TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000122 EXPECT_EQ(";", format(";"));
123}
124
125TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
126 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000127 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000128 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
129 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
130}
131
132TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
133 EXPECT_EQ("int i;", format("int\ni;"));
134}
135
136TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000137 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000138}
139
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000140TEST_F(FormatTest, FormatsNestedCall) {
141 verifyFormat("Method(f1, f2(f3));");
142 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000143 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000144}
145
Daniel Jasper14556742013-02-07 21:08:36 +0000146TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000147 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000148 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000149 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000150 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000151 verifyFormat("ALWAYS_INLINE ::std::string getName();");
152 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000153}
154
Daniel Jasper7b038a22013-01-30 09:46:12 +0000155TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
156 EXPECT_EQ("if (a) {\n"
157 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000158 "}",
159 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000160 EXPECT_EQ(4, ReplacementCount);
161 EXPECT_EQ("if (a) {\n"
162 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000163 "}",
164 format("if (a) {\n"
165 " f();\n"
166 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000167 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000168 EXPECT_EQ("/*\r\n"
169 "\r\n"
170 "*/\r\n",
171 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000172 "\r\n"
173 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000174 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000175}
176
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000177TEST_F(FormatTest, RemovesEmptyLines) {
178 EXPECT_EQ("class C {\n"
179 " int i;\n"
180 "};",
181 format("class C {\n"
182 " int i;\n"
183 "\n"
184 "};"));
185
Nico Weber34272652014-11-13 16:25:37 +0000186 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000187 EXPECT_EQ("namespace N {\n"
188 "\n"
189 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000190 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000191 format("namespace N {\n"
192 "\n"
193 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000194 "}",
195 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000196 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
197 "\n"
198 "int i;\n"
199 "}",
200 format("extern /**/ \"C\" /**/ {\n"
201 "\n"
202 "int i;\n"
203 "}",
204 getGoogleStyle()));
205
206 // ...but do keep inlining and removing empty lines for non-block extern "C"
207 // functions.
208 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
209 EXPECT_EQ("extern \"C\" int f() {\n"
210 " int i = 42;\n"
211 " return i;\n"
212 "}",
213 format("extern \"C\" int f() {\n"
214 "\n"
215 " int i = 42;\n"
216 " return i;\n"
217 "}",
218 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000219
Daniel Jasper11164bd2014-03-21 12:58:53 +0000220 // Remove empty lines at the beginning and end of blocks.
221 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000222 "\n"
223 " if (a) {\n"
224 "\n"
225 " f();\n"
226 " }\n"
227 "}",
228 format("void f() {\n"
229 "\n"
230 " if (a) {\n"
231 "\n"
232 " f();\n"
233 "\n"
234 " }\n"
235 "\n"
236 "}",
237 getLLVMStyle()));
238 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000239 " if (a) {\n"
240 " f();\n"
241 " }\n"
242 "}",
243 format("void f() {\n"
244 "\n"
245 " if (a) {\n"
246 "\n"
247 " f();\n"
248 "\n"
249 " }\n"
250 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000251 "}",
252 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000253
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000254 // Don't remove empty lines in more complex control statements.
255 EXPECT_EQ("void f() {\n"
256 " if (a) {\n"
257 " f();\n"
258 "\n"
259 " } else if (b) {\n"
260 " f();\n"
261 " }\n"
262 "}",
263 format("void f() {\n"
264 " if (a) {\n"
265 " f();\n"
266 "\n"
267 " } else if (b) {\n"
268 " f();\n"
269 "\n"
270 " }\n"
271 "\n"
272 "}"));
273
274 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000275 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
276 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000277 EXPECT_EQ("namespace {\n"
278 "int i;\n"
279 "}",
280 format("namespace {\n"
281 "int i;\n"
282 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000283 "}", LLVMWithNoNamespaceFix));
284 EXPECT_EQ("namespace {\n"
285 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000286 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000287 format("namespace {\n"
288 "int i;\n"
289 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000290 "}"));
291 EXPECT_EQ("namespace {\n"
292 "int i;\n"
293 "\n"
294 "} // namespace",
295 format("namespace {\n"
296 "int i;\n"
297 "\n"
298 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000299
300 FormatStyle Style = getLLVMStyle();
301 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
302 Style.MaxEmptyLinesToKeep = 2;
303 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
304 Style.BraceWrapping.AfterClass = true;
305 Style.BraceWrapping.AfterFunction = true;
306 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
307
308 EXPECT_EQ("class Foo\n"
309 "{\n"
310 " Foo() {}\n"
311 "\n"
312 " void funk() {}\n"
313 "};",
314 format("class Foo\n"
315 "{\n"
316 " Foo()\n"
317 " {\n"
318 " }\n"
319 "\n"
320 " void funk() {}\n"
321 "};",
322 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323}
324
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000325TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000326 verifyFormat("x = (a) and (b);");
327 verifyFormat("x = (a) or (b);");
328 verifyFormat("x = (a) bitand (b);");
329 verifyFormat("x = (a) bitor (b);");
330 verifyFormat("x = (a) not_eq (b);");
331 verifyFormat("x = (a) and_eq (b);");
332 verifyFormat("x = (a) or_eq (b);");
333 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000334}
335
Olivier Goffart90f981b2017-07-14 09:23:40 +0000336TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
337 verifyFormat("x = compl(a);");
338 verifyFormat("x = not(a);");
339 verifyFormat("x = bitand(a);");
340 // Unary operator must not be merged with the next identifier
341 verifyFormat("x = compl a;");
342 verifyFormat("x = not a;");
343 verifyFormat("x = bitand a;");
344}
345
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000346//===----------------------------------------------------------------------===//
347// Tests for control statements.
348//===----------------------------------------------------------------------===//
349
Daniel Jaspercdd06622013-05-14 10:31:09 +0000350TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000351 verifyFormat("if (true)\n f();\ng();");
352 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000353 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000354 verifyFormat("if constexpr (true)\n"
355 " f();\ng();");
356 verifyFormat("if constexpr (a)\n"
357 " if constexpr (b)\n"
358 " if constexpr (c)\n"
359 " g();\n"
360 "h();");
361 verifyFormat("if constexpr (a)\n"
362 " if constexpr (b) {\n"
363 " f();\n"
364 " }\n"
365 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000366
Daniel Jasper3a685df2013-05-16 12:12:21 +0000367 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000368 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000369 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
370 verifyFormat("if (a)\n"
371 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000372 " f();",
373 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000374 verifyFormat("{\n"
375 " if (a)\n"
376 " label:\n"
377 " f();\n"
378 "}",
379 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000380 verifyFormat("#define A \\\n"
381 " if (a) \\\n"
382 " label: \\\n"
383 " f()",
384 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000385 verifyFormat("if (a)\n"
386 " ;",
387 AllowsMergedIf);
388 verifyFormat("if (a)\n"
389 " if (b) return;",
390 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000391
Daniel Jasper3a685df2013-05-16 12:12:21 +0000392 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000393 " f();\n",
394 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000395 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000396 " f();",
397 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000398 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000399 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000400 "}",
401 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000402 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000403 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000404 "}",
405 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000406
407 AllowsMergedIf.ColumnLimit = 14;
408 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000409 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000410 " return;",
411 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000412
413 AllowsMergedIf.ColumnLimit = 13;
414 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000415}
416
Daniel Jasper3a685df2013-05-16 12:12:21 +0000417TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
418 FormatStyle AllowsMergedLoops = getLLVMStyle();
419 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
420 verifyFormat("while (true) continue;", AllowsMergedLoops);
421 verifyFormat("for (;;) continue;", AllowsMergedLoops);
422 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
423 verifyFormat("while (true)\n"
424 " ;",
425 AllowsMergedLoops);
426 verifyFormat("for (;;)\n"
427 " ;",
428 AllowsMergedLoops);
429 verifyFormat("for (;;)\n"
430 " for (;;) continue;",
431 AllowsMergedLoops);
432 verifyFormat("for (;;) // Can't merge this\n"
433 " continue;",
434 AllowsMergedLoops);
435 verifyFormat("for (;;) /* still don't merge */\n"
436 " continue;",
437 AllowsMergedLoops);
438}
439
Daniel Jasper17605d32014-05-14 09:33:35 +0000440TEST_F(FormatTest, FormatShortBracedStatements) {
441 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
442 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
443
444 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
445 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
446
447 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000448 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000449 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
450 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
451 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000452 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000453 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
454 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
455 verifyFormat("if (true) { //\n"
456 " f();\n"
457 "}",
458 AllowSimpleBracedStatements);
459 verifyFormat("if (true) {\n"
460 " f();\n"
461 " f();\n"
462 "}",
463 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000464 verifyFormat("if (true) {\n"
465 " f();\n"
466 "} else {\n"
467 " f();\n"
468 "}",
469 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000470
Daniel Jasperf92659e2017-06-19 07:45:41 +0000471 verifyFormat("struct A2 {\n"
472 " int X;\n"
473 "};",
474 AllowSimpleBracedStatements);
475 verifyFormat("typedef struct A2 {\n"
476 " int X;\n"
477 "} A2_t;",
478 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000479 verifyFormat("template <int> struct A2 {\n"
480 " struct B {};\n"
481 "};",
482 AllowSimpleBracedStatements);
483
Daniel Jasper17605d32014-05-14 09:33:35 +0000484 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
485 verifyFormat("if (true) {\n"
486 " f();\n"
487 "}",
488 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000489 verifyFormat("if (true) {\n"
490 " f();\n"
491 "} else {\n"
492 " f();\n"
493 "}",
494 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000495
496 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
497 verifyFormat("while (true) {\n"
498 " f();\n"
499 "}",
500 AllowSimpleBracedStatements);
501 verifyFormat("for (;;) {\n"
502 " f();\n"
503 "}",
504 AllowSimpleBracedStatements);
505}
506
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000507TEST_F(FormatTest, ParseIfElse) {
508 verifyFormat("if (true)\n"
509 " if (true)\n"
510 " if (true)\n"
511 " f();\n"
512 " else\n"
513 " g();\n"
514 " else\n"
515 " h();\n"
516 "else\n"
517 " i();");
518 verifyFormat("if (true)\n"
519 " if (true)\n"
520 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000521 " if (true)\n"
522 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000523 " } else {\n"
524 " g();\n"
525 " }\n"
526 " else\n"
527 " h();\n"
528 "else {\n"
529 " i();\n"
530 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000531 verifyFormat("if (true)\n"
532 " if constexpr (true)\n"
533 " if (true) {\n"
534 " if constexpr (true)\n"
535 " f();\n"
536 " } else {\n"
537 " g();\n"
538 " }\n"
539 " else\n"
540 " h();\n"
541 "else {\n"
542 " i();\n"
543 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000544 verifyFormat("void f() {\n"
545 " if (a) {\n"
546 " } else {\n"
547 " }\n"
548 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000549}
550
551TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000552 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000553 verifyFormat("if (a)\n"
554 " f();\n"
555 "else if (b)\n"
556 " g();\n"
557 "else\n"
558 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000559 verifyFormat("if constexpr (a)\n"
560 " f();\n"
561 "else if constexpr (b)\n"
562 " g();\n"
563 "else\n"
564 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000565 verifyFormat("if (a) {\n"
566 " f();\n"
567 "}\n"
568 "// or else ..\n"
569 "else {\n"
570 " g()\n"
571 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000572
573 verifyFormat("if (a) {\n"
574 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
576 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000577 verifyFormat("if (a) {\n"
578 "} else if (\n"
579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
580 "}",
581 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000582 verifyFormat("if (a) {\n"
583 "} else if constexpr (\n"
584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
585 "}",
586 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000587}
588
Daniel Jasperf7935112012-12-03 18:12:45 +0000589TEST_F(FormatTest, FormatsForLoop) {
590 verifyFormat(
591 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000592 " ++VeryVeryLongLoopVariable)\n"
593 " ;");
594 verifyFormat("for (;;)\n"
595 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000596 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000597 verifyFormat("for (;;) {\n"
598 " f();\n"
599 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000600 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000601
602 verifyFormat(
603 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
604 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000605 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000606
607 verifyFormat(
608 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000609 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000610 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
611 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000612 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000613 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
614 " I = FD->getDeclsInPrototypeScope().begin(),\n"
615 " E = FD->getDeclsInPrototypeScope().end();\n"
616 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000617 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
618 " I = Container.begin(),\n"
619 " E = Container.end();\n"
620 " I != E; ++I) {\n}",
621 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000622
Daniel Jasper48c62f92013-01-28 17:30:17 +0000623 verifyFormat(
624 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000628 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000629 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
630 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
631 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000632 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
633 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
634 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000635 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
636 " aaaaaaaaaa);\n"
637 " iter; ++iter) {\n"
638 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000639 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
641 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
642 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000643
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000644 FormatStyle NoBinPacking = getLLVMStyle();
645 NoBinPacking.BinPackParameters = false;
646 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
647 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
648 " aaaaaaaaaaaaaaaa,\n"
649 " aaaaaaaaaaaaaaaa,\n"
650 " aaaaaaaaaaaaaaaa);\n"
651 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
652 "}",
653 NoBinPacking);
654 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000655 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
656 " E = UnwrappedLines.end();\n"
657 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000658 " ++I) {\n}",
659 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000660
661 FormatStyle AlignLeft = getLLVMStyle();
662 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
663 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000664}
665
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000666TEST_F(FormatTest, RangeBasedForLoops) {
667 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
669 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
670 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000671 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000673 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
674 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000675}
676
Daniel Jaspere1e43192014-04-01 12:55:11 +0000677TEST_F(FormatTest, ForEachLoops) {
678 verifyFormat("void f() {\n"
679 " foreach (Item *item, itemlist) {}\n"
680 " Q_FOREACH (Item *item, itemlist) {}\n"
681 " BOOST_FOREACH (Item *item, itemlist) {}\n"
682 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
683 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000684
685 // As function-like macros.
686 verifyFormat("#define foreach(x, y)\n"
687 "#define Q_FOREACH(x, y)\n"
688 "#define BOOST_FOREACH(x, y)\n"
689 "#define UNKNOWN_FOREACH(x, y)\n");
690
691 // Not as function-like macros.
692 verifyFormat("#define foreach (x, y)\n"
693 "#define Q_FOREACH (x, y)\n"
694 "#define BOOST_FOREACH (x, y)\n"
695 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000696}
697
Daniel Jasperf7935112012-12-03 18:12:45 +0000698TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000699 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000700 verifyFormat("while (true)\n"
701 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000702 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000703 verifyFormat("while () {\n"
704 " f();\n"
705 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000706}
707
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000708TEST_F(FormatTest, FormatsDoWhile) {
709 verifyFormat("do {\n"
710 " do_something();\n"
711 "} while (something());");
712 verifyFormat("do\n"
713 " do_something();\n"
714 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000715}
716
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000717TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000718 verifyFormat("switch (x) {\n"
719 "case 1:\n"
720 " f();\n"
721 " break;\n"
722 "case kFoo:\n"
723 "case ns::kBar:\n"
724 "case kBaz:\n"
725 " break;\n"
726 "default:\n"
727 " g();\n"
728 " break;\n"
729 "}");
730 verifyFormat("switch (x) {\n"
731 "case 1: {\n"
732 " f();\n"
733 " break;\n"
734 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000735 "case 2: {\n"
736 " break;\n"
737 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000738 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000739 verifyFormat("switch (x) {\n"
740 "case 1: {\n"
741 " f();\n"
742 " {\n"
743 " g();\n"
744 " h();\n"
745 " }\n"
746 " break;\n"
747 "}\n"
748 "}");
749 verifyFormat("switch (x) {\n"
750 "case 1: {\n"
751 " f();\n"
752 " if (foo) {\n"
753 " g();\n"
754 " h();\n"
755 " }\n"
756 " break;\n"
757 "}\n"
758 "}");
759 verifyFormat("switch (x) {\n"
760 "case 1: {\n"
761 " f();\n"
762 " g();\n"
763 "} break;\n"
764 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000765 verifyFormat("switch (test)\n"
766 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000767 verifyFormat("switch (x) {\n"
768 "default: {\n"
769 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000770 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000771 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000772 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000773 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000774 "// if 1, do f()\n"
775 "case 1:\n"
776 " f();\n"
777 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000778 verifyFormat("switch (x) {\n"
779 "case 1:\n"
780 " // Do amazing stuff\n"
781 " {\n"
782 " f();\n"
783 " g();\n"
784 " }\n"
785 " break;\n"
786 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000787 verifyFormat("#define A \\\n"
788 " switch (x) { \\\n"
789 " case a: \\\n"
790 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000791 " }",
792 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000793 verifyFormat("#define OPERATION_CASE(name) \\\n"
794 " case OP_name: \\\n"
795 " return operations::Operation##name\n",
796 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000797 verifyFormat("switch (x) {\n"
798 "case 1:;\n"
799 "default:;\n"
800 " int i;\n"
801 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000802
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000803 verifyGoogleFormat("switch (x) {\n"
804 " case 1:\n"
805 " f();\n"
806 " break;\n"
807 " case kFoo:\n"
808 " case ns::kBar:\n"
809 " case kBaz:\n"
810 " break;\n"
811 " default:\n"
812 " g();\n"
813 " break;\n"
814 "}");
815 verifyGoogleFormat("switch (x) {\n"
816 " case 1: {\n"
817 " f();\n"
818 " break;\n"
819 " }\n"
820 "}");
821 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000822 " ;");
823
824 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
825 " case OP_name: \\\n"
826 " return operations::Operation##name\n");
827 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
828 " // Get the correction operation class.\n"
829 " switch (OpCode) {\n"
830 " CASE(Add);\n"
831 " CASE(Subtract);\n"
832 " default:\n"
833 " return operations::Unknown;\n"
834 " }\n"
835 "#undef OPERATION_CASE\n"
836 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000837 verifyFormat("DEBUG({\n"
838 " switch (x) {\n"
839 " case A:\n"
840 " f();\n"
841 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000842 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000843 " case B:\n"
844 " g();\n"
845 " break;\n"
846 " }\n"
847 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000848 EXPECT_EQ("DEBUG({\n"
849 " switch (x) {\n"
850 " case A:\n"
851 " f();\n"
852 " break;\n"
853 " // On B:\n"
854 " case B:\n"
855 " g();\n"
856 " break;\n"
857 " }\n"
858 "});",
859 format("DEBUG({\n"
860 " switch (x) {\n"
861 " case A:\n"
862 " f();\n"
863 " break;\n"
864 " // On B:\n"
865 " case B:\n"
866 " g();\n"
867 " break;\n"
868 " }\n"
869 "});",
870 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000871 verifyFormat("switch (a) {\n"
872 "case (b):\n"
873 " return;\n"
874 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000875
876 verifyFormat("switch (a) {\n"
877 "case some_namespace::\n"
878 " some_constant:\n"
879 " return;\n"
880 "}",
881 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000882}
883
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000884TEST_F(FormatTest, CaseRanges) {
885 verifyFormat("switch (x) {\n"
886 "case 'A' ... 'Z':\n"
887 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000888 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000889 " break;\n"
890 "}");
891}
892
Daniel Jasperb87899b2014-09-10 13:11:45 +0000893TEST_F(FormatTest, ShortCaseLabels) {
894 FormatStyle Style = getLLVMStyle();
895 Style.AllowShortCaseLabelsOnASingleLine = true;
896 verifyFormat("switch (a) {\n"
897 "case 1: x = 1; break;\n"
898 "case 2: return;\n"
899 "case 3:\n"
900 "case 4:\n"
901 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000902 "case 6: // comment\n"
903 " return;\n"
904 "case 7:\n"
905 " // comment\n"
906 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000907 "case 8:\n"
908 " x = 8; // comment\n"
909 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000910 "default: y = 1; break;\n"
911 "}",
912 Style);
913 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +0000914 "case 0: return; // comment\n"
915 "case 1: break; // comment\n"
916 "case 2: return;\n"
917 "// comment\n"
918 "case 3: return;\n"
919 "// comment 1\n"
920 "// comment 2\n"
921 "// comment 3\n"
922 "case 4: break; /* comment */\n"
923 "case 5:\n"
924 " // comment\n"
925 " break;\n"
926 "case 6: /* comment */ x = 1; break;\n"
927 "case 7: x = /* comment */ 1; break;\n"
928 "case 8:\n"
929 " x = 1; /* comment */\n"
930 " break;\n"
931 "case 9:\n"
932 " break; // comment line 1\n"
933 " // comment line 2\n"
934 "}",
935 Style);
936 EXPECT_EQ("switch (a) {\n"
937 "case 1:\n"
938 " x = 8;\n"
939 " // fall through\n"
940 "case 2: x = 8;\n"
941 "// comment\n"
942 "case 3:\n"
943 " return; /* comment line 1\n"
944 " * comment line 2 */\n"
945 "case 4: i = 8;\n"
946 "// something else\n"
947 "#if FOO\n"
948 "case 5: break;\n"
949 "#endif\n"
950 "}",
951 format("switch (a) {\n"
952 "case 1: x = 8;\n"
953 " // fall through\n"
954 "case 2:\n"
955 " x = 8;\n"
956 "// comment\n"
957 "case 3:\n"
958 " return; /* comment line 1\n"
959 " * comment line 2 */\n"
960 "case 4:\n"
961 " i = 8;\n"
962 "// something else\n"
963 "#if FOO\n"
964 "case 5: break;\n"
965 "#endif\n"
966 "}",
967 Style));
968 EXPECT_EQ("switch (a) {\n" "case 0:\n"
969 " return; // long long long long long long long long long long long long comment\n"
970 " // line\n" "}",
971 format("switch (a) {\n"
972 "case 0: return; // long long long long long long long long long long long long comment line\n"
973 "}",
974 Style));
975 EXPECT_EQ("switch (a) {\n"
976 "case 0:\n"
977 " return; /* long long long long long long long long long long long long comment\n"
978 " line */\n"
979 "}",
980 format("switch (a) {\n"
981 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
982 "}",
983 Style));
984 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000985 "#if FOO\n"
986 "case 0: return 0;\n"
987 "#endif\n"
988 "}",
989 Style);
990 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000991 "case 1: {\n"
992 "}\n"
993 "case 2: {\n"
994 " return;\n"
995 "}\n"
996 "case 3: {\n"
997 " x = 1;\n"
998 " return;\n"
999 "}\n"
1000 "case 4:\n"
1001 " if (x)\n"
1002 " return;\n"
1003 "}",
1004 Style);
1005 Style.ColumnLimit = 21;
1006 verifyFormat("switch (a) {\n"
1007 "case 1: x = 1; break;\n"
1008 "case 2: return;\n"
1009 "case 3:\n"
1010 "case 4:\n"
1011 "case 5: return;\n"
1012 "default:\n"
1013 " y = 1;\n"
1014 " break;\n"
1015 "}",
1016 Style);
1017}
1018
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001019TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001020 verifyFormat("void f() {\n"
1021 " some_code();\n"
1022 "test_label:\n"
1023 " some_other_code();\n"
1024 " {\n"
1025 " some_more_code();\n"
1026 " another_label:\n"
1027 " some_more_code();\n"
1028 " }\n"
1029 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001030 verifyFormat("{\n"
1031 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001032 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001033 " some_other_code();\n"
1034 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001035 verifyFormat("{\n"
1036 " some_code();\n"
1037 "test_label:;\n"
1038 " int i = 0;\n"
1039 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001040}
1041
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001042//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001043// Tests for classes, namespaces, etc.
1044//===----------------------------------------------------------------------===//
1045
1046TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001047 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001048}
1049
1050TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1051 verifyFormat("class A {\n"
1052 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001053 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001054 "protected:\n"
1055 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001056 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001057 "};");
1058 verifyGoogleFormat("class A {\n"
1059 " public:\n"
1060 " protected:\n"
1061 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001062 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001063 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001064 verifyFormat("class A {\n"
1065 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001066 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001067 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001068 " void f2() {}\n"
1069 "protected slots:\n"
1070 " void f3() {}\n"
1071 "protected Q_SLOTS:\n"
1072 " void f4() {}\n"
1073 "private slots:\n"
1074 " void f5() {}\n"
1075 "private Q_SLOTS:\n"
1076 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001077 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001078 " void g1();\n"
1079 "Q_SIGNALS:\n"
1080 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001081 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001082
1083 // Don't interpret 'signals' the wrong way.
1084 verifyFormat("signals.set();");
1085 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001086 verifyFormat("{\n"
1087 " signals.set(); // This needs indentation.\n"
1088 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001089 verifyFormat("void f() {\n"
1090 "label:\n"
1091 " signals.baz();\n"
1092 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001093}
1094
Alexander Kornienkofd433362013-03-27 17:08:02 +00001095TEST_F(FormatTest, SeparatesLogicalBlocks) {
1096 EXPECT_EQ("class A {\n"
1097 "public:\n"
1098 " void f();\n"
1099 "\n"
1100 "private:\n"
1101 " void g() {}\n"
1102 " // test\n"
1103 "protected:\n"
1104 " int h;\n"
1105 "};",
1106 format("class A {\n"
1107 "public:\n"
1108 "void f();\n"
1109 "private:\n"
1110 "void g() {}\n"
1111 "// test\n"
1112 "protected:\n"
1113 "int h;\n"
1114 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001115 EXPECT_EQ("class A {\n"
1116 "protected:\n"
1117 "public:\n"
1118 " void f();\n"
1119 "};",
1120 format("class A {\n"
1121 "protected:\n"
1122 "\n"
1123 "public:\n"
1124 "\n"
1125 " void f();\n"
1126 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001127
1128 // Even ensure proper spacing inside macros.
1129 EXPECT_EQ("#define B \\\n"
1130 " class A { \\\n"
1131 " protected: \\\n"
1132 " public: \\\n"
1133 " void f(); \\\n"
1134 " };",
1135 format("#define B \\\n"
1136 " class A { \\\n"
1137 " protected: \\\n"
1138 " \\\n"
1139 " public: \\\n"
1140 " \\\n"
1141 " void f(); \\\n"
1142 " };",
1143 getGoogleStyle()));
1144 // But don't remove empty lines after macros ending in access specifiers.
1145 EXPECT_EQ("#define A private:\n"
1146 "\n"
1147 "int i;",
1148 format("#define A private:\n"
1149 "\n"
1150 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001151}
1152
Daniel Jasper83193602013-04-05 17:22:09 +00001153TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001154 verifyFormat("class A : public B {};");
1155 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001156
1157 verifyFormat(
1158 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001159 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001160 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1161 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001162 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001163 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001164 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001165 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1166 " public C,\n"
1167 " public D,\n"
1168 " public E,\n"
1169 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001170 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001171
1172 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001173 " ReallyReallyLongClassName {\n"
1174 " int i;\n"
1175 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001176 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001177 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1178 " aaaaaaaaaaaaaaaa> {};");
1179 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1180 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1181 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001182 verifyFormat("template <class R, class C>\n"
1183 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1184 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001185 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001186}
1187
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001188TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1189 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1190 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1191
1192 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1193 verifyFormat("class MyClass\n"
1194 " : public X\n"
1195 " , public Y {};",
1196 StyleWithInheritanceBreak);
1197}
1198
Manuel Klimek28cacc72013-01-07 18:10:23 +00001199TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001200 verifyFormat("class A {\n} a, b;");
1201 verifyFormat("struct A {\n} a, b;");
1202 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001203}
1204
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001205TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001206 verifyFormat("enum {\n"
1207 " Zero,\n"
1208 " One = 1,\n"
1209 " Two = One + 1,\n"
1210 " Three = (One + Two),\n"
1211 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1212 " Five = (One, Two, Three, Four, 5)\n"
1213 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001214 verifyGoogleFormat("enum {\n"
1215 " Zero,\n"
1216 " One = 1,\n"
1217 " Two = One + 1,\n"
1218 " Three = (One + Two),\n"
1219 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1220 " Five = (One, Two, Three, Four, 5)\n"
1221 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001222 verifyFormat("enum Enum {};");
1223 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001224 verifyFormat("enum X E {} d;");
1225 verifyFormat("enum __attribute__((...)) E {} d;");
1226 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001227 verifyFormat("enum {\n"
1228 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001229 "};",
1230 getLLVMStyleWithColumns(30));
1231
1232 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001233 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001234
1235 EXPECT_EQ("enum KeepEmptyLines {\n"
1236 " ONE,\n"
1237 "\n"
1238 " TWO,\n"
1239 "\n"
1240 " THREE\n"
1241 "}",
1242 format("enum KeepEmptyLines {\n"
1243 " ONE,\n"
1244 "\n"
1245 " TWO,\n"
1246 "\n"
1247 "\n"
1248 " THREE\n"
1249 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001250 verifyFormat("enum E { // comment\n"
1251 " ONE,\n"
1252 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001253 "};\n"
1254 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001255 // Not enums.
1256 verifyFormat("enum X f() {\n"
1257 " a();\n"
1258 " return 42;\n"
1259 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001260 verifyFormat("enum X Type::f() {\n"
1261 " a();\n"
1262 " return 42;\n"
1263 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001264 verifyFormat("enum ::X f() {\n"
1265 " a();\n"
1266 " return 42;\n"
1267 "}");
1268 verifyFormat("enum ns::X f() {\n"
1269 " a();\n"
1270 " return 42;\n"
1271 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001272}
1273
Daniel Jasperb7150872013-08-30 10:10:19 +00001274TEST_F(FormatTest, FormatsEnumsWithErrors) {
1275 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001276 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001277 " Two = 1;\n"
1278 "};");
1279 verifyFormat("namespace n {\n"
1280 "enum Type {\n"
1281 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001282 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001283 " int i;\n"
1284 "}\n"
1285 "void g() {}");
1286}
1287
Daniel Jasper2b41a822013-08-20 12:42:50 +00001288TEST_F(FormatTest, FormatsEnumStruct) {
1289 verifyFormat("enum struct {\n"
1290 " Zero,\n"
1291 " One = 1,\n"
1292 " Two = One + 1,\n"
1293 " Three = (One + Two),\n"
1294 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1295 " Five = (One, Two, Three, Four, 5)\n"
1296 "};");
1297 verifyFormat("enum struct Enum {};");
1298 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001299 verifyFormat("enum struct X E {} d;");
1300 verifyFormat("enum struct __attribute__((...)) E {} d;");
1301 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001302 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1303}
1304
1305TEST_F(FormatTest, FormatsEnumClass) {
1306 verifyFormat("enum class {\n"
1307 " Zero,\n"
1308 " One = 1,\n"
1309 " Two = One + 1,\n"
1310 " Three = (One + Two),\n"
1311 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1312 " Five = (One, Two, Three, Four, 5)\n"
1313 "};");
1314 verifyFormat("enum class Enum {};");
1315 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001316 verifyFormat("enum class X E {} d;");
1317 verifyFormat("enum class __attribute__((...)) E {} d;");
1318 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001319 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1320}
1321
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001322TEST_F(FormatTest, FormatsEnumTypes) {
1323 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001324 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001325 " B\n"
1326 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001327 verifyFormat("enum X : int { A, B };");
1328 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001329}
1330
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001331TEST_F(FormatTest, FormatsTypedefEnum) {
1332 FormatStyle Style = getLLVMStyle();
1333 Style.ColumnLimit = 40;
1334 verifyFormat("typedef enum {} EmptyEnum;");
1335 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1336 verifyFormat("typedef enum {\n"
1337 " ZERO = 0,\n"
1338 " ONE = 1,\n"
1339 " TWO = 2,\n"
1340 " THREE = 3\n"
1341 "} LongEnum;",
1342 Style);
1343 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1344 Style.BraceWrapping.AfterEnum = true;
1345 verifyFormat("typedef enum {} EmptyEnum;");
1346 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1347 verifyFormat("typedef enum\n"
1348 "{\n"
1349 " ZERO = 0,\n"
1350 " ONE = 1,\n"
1351 " TWO = 2,\n"
1352 " THREE = 3\n"
1353 "} LongEnum;",
1354 Style);
1355}
1356
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001357TEST_F(FormatTest, FormatsNSEnums) {
1358 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1359 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1360 " // Information about someDecentlyLongValue.\n"
1361 " someDecentlyLongValue,\n"
1362 " // Information about anotherDecentlyLongValue.\n"
1363 " anotherDecentlyLongValue,\n"
1364 " // Information about aThirdDecentlyLongValue.\n"
1365 " aThirdDecentlyLongValue\n"
1366 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001367 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1368 " a = 1,\n"
1369 " b = 2,\n"
1370 " c = 3,\n"
1371 "};");
1372 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1373 " a = 1,\n"
1374 " b = 2,\n"
1375 " c = 3,\n"
1376 "};");
1377 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1378 " a = 1,\n"
1379 " b = 2,\n"
1380 " c = 3,\n"
1381 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001382}
1383
Nico Weber7769a902013-01-14 05:49:49 +00001384TEST_F(FormatTest, FormatsBitfields) {
1385 verifyFormat("struct Bitfields {\n"
1386 " unsigned sClass : 8;\n"
1387 " unsigned ValueKind : 2;\n"
1388 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001389 verifyFormat("struct A {\n"
1390 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1391 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1392 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001393 verifyFormat("struct MyStruct {\n"
1394 " uchar data;\n"
1395 " uchar : 8;\n"
1396 " uchar : 8;\n"
1397 " uchar other;\n"
1398 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001399}
1400
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001401TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001402 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1403 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1404
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001405 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001406 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001407 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001408 "}",
1409 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001410 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001411 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001412 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001413 "}",
1414 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001415 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001416 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001417 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001418 "}",
1419 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001420 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001421 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001422 "void f() { f(); }",
1423 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001424
1425 // This code is more common than we thought; if we
1426 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001427 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001428 verifyFormat("namespace {};",
1429 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001430 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001431 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001432 "};",
1433 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001434
1435 verifyFormat("namespace {\n"
1436 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001437 "} // namespace",
1438 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001439 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1440 "#define HEADER_GUARD\n"
1441 "namespace my_namespace {\n"
1442 "int i;\n"
1443 "} // my_namespace\n"
1444 "#endif // HEADER_GUARD",
1445 format("#ifndef HEADER_GUARD\n"
1446 " #define HEADER_GUARD\n"
1447 " namespace my_namespace {\n"
1448 "int i;\n"
1449 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001450 "#endif // HEADER_GUARD",
1451 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001452
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001453 EXPECT_EQ("namespace A::B {\n"
1454 "class C {};\n"
1455 "}",
1456 format("namespace A::B {\n"
1457 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001458 "}",
1459 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001460
Daniel Jasper65ee3472013-07-31 23:16:02 +00001461 FormatStyle Style = getLLVMStyle();
1462 Style.NamespaceIndentation = FormatStyle::NI_All;
1463 EXPECT_EQ("namespace out {\n"
1464 " int i;\n"
1465 " namespace in {\n"
1466 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001467 " } // namespace in\n"
1468 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001469 format("namespace out {\n"
1470 "int i;\n"
1471 "namespace in {\n"
1472 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001473 "} // namespace in\n"
1474 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001475 Style));
1476
1477 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1478 EXPECT_EQ("namespace out {\n"
1479 "int i;\n"
1480 "namespace in {\n"
1481 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001482 "} // namespace in\n"
1483 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001484 format("namespace out {\n"
1485 "int i;\n"
1486 "namespace in {\n"
1487 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001488 "} // namespace in\n"
1489 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001490 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001491}
1492
Francois Ferrande56a8292017-06-14 12:29:47 +00001493TEST_F(FormatTest, FormatsCompactNamespaces) {
1494 FormatStyle Style = getLLVMStyle();
1495 Style.CompactNamespaces = true;
1496
1497 verifyFormat("namespace A { namespace B {\n"
1498 "}} // namespace A::B",
1499 Style);
1500
1501 EXPECT_EQ("namespace out { namespace in {\n"
1502 "}} // namespace out::in",
1503 format("namespace out {\n"
1504 "namespace in {\n"
1505 "} // namespace in\n"
1506 "} // namespace out",
1507 Style));
1508
1509 // Only namespaces which have both consecutive opening and end get compacted
1510 EXPECT_EQ("namespace out {\n"
1511 "namespace in1 {\n"
1512 "} // namespace in1\n"
1513 "namespace in2 {\n"
1514 "} // namespace in2\n"
1515 "} // namespace out",
1516 format("namespace out {\n"
1517 "namespace in1 {\n"
1518 "} // namespace in1\n"
1519 "namespace in2 {\n"
1520 "} // namespace in2\n"
1521 "} // namespace out",
1522 Style));
1523
1524 EXPECT_EQ("namespace out {\n"
1525 "int i;\n"
1526 "namespace in {\n"
1527 "int j;\n"
1528 "} // namespace in\n"
1529 "int k;\n"
1530 "} // namespace out",
1531 format("namespace out { int i;\n"
1532 "namespace in { int j; } // namespace in\n"
1533 "int k; } // namespace out",
1534 Style));
1535
1536 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1537 "}}} // namespace A::B::C\n",
1538 format("namespace A { namespace B {\n"
1539 "namespace C {\n"
1540 "}} // namespace B::C\n"
1541 "} // namespace A\n",
1542 Style));
1543
1544 Style.ColumnLimit = 40;
1545 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1546 "namespace bbbbbbbbbb {\n"
1547 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1548 format("namespace aaaaaaaaaa {\n"
1549 "namespace bbbbbbbbbb {\n"
1550 "} // namespace bbbbbbbbbb\n"
1551 "} // namespace aaaaaaaaaa",
1552 Style));
1553
1554 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1555 "namespace cccccc {\n"
1556 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1557 format("namespace aaaaaa {\n"
1558 "namespace bbbbbb {\n"
1559 "namespace cccccc {\n"
1560 "} // namespace cccccc\n"
1561 "} // namespace bbbbbb\n"
1562 "} // namespace aaaaaa",
1563 Style));
1564 Style.ColumnLimit = 80;
1565
1566 // Extra semicolon after 'inner' closing brace prevents merging
1567 EXPECT_EQ("namespace out { namespace in {\n"
1568 "}; } // namespace out::in",
1569 format("namespace out {\n"
1570 "namespace in {\n"
1571 "}; // namespace in\n"
1572 "} // namespace out",
1573 Style));
1574
1575 // Extra semicolon after 'outer' closing brace is conserved
1576 EXPECT_EQ("namespace out { namespace in {\n"
1577 "}}; // namespace out::in",
1578 format("namespace out {\n"
1579 "namespace in {\n"
1580 "} // namespace in\n"
1581 "}; // namespace out",
1582 Style));
1583
1584 Style.NamespaceIndentation = FormatStyle::NI_All;
1585 EXPECT_EQ("namespace out { namespace in {\n"
1586 " int i;\n"
1587 "}} // namespace out::in",
1588 format("namespace out {\n"
1589 "namespace in {\n"
1590 "int i;\n"
1591 "} // namespace in\n"
1592 "} // namespace out",
1593 Style));
1594 EXPECT_EQ("namespace out { namespace mid {\n"
1595 " namespace in {\n"
1596 " int j;\n"
1597 " } // namespace in\n"
1598 " int k;\n"
1599 "}} // namespace out::mid",
1600 format("namespace out { namespace mid {\n"
1601 "namespace in { int j; } // namespace in\n"
1602 "int k; }} // namespace out::mid",
1603 Style));
1604
1605 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1606 EXPECT_EQ("namespace out { namespace in {\n"
1607 " int i;\n"
1608 "}} // namespace out::in",
1609 format("namespace out {\n"
1610 "namespace in {\n"
1611 "int i;\n"
1612 "} // namespace in\n"
1613 "} // namespace out",
1614 Style));
1615 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1616 " int i;\n"
1617 "}}} // namespace out::mid::in",
1618 format("namespace out {\n"
1619 "namespace mid {\n"
1620 "namespace in {\n"
1621 "int i;\n"
1622 "} // namespace in\n"
1623 "} // namespace mid\n"
1624 "} // namespace out",
1625 Style));
1626}
1627
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001628TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001629
Daniel Jasper40aacf42013-03-14 13:45:21 +00001630TEST_F(FormatTest, FormatsInlineASM) {
1631 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001632 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001633 verifyFormat(
1634 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1635 " \"cpuid\\n\\t\"\n"
1636 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001637 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001638 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001639 EXPECT_EQ(
1640 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001641 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001642 " mov edx,[that] // vtable in edx\n"
1643 " mov eax,methodIndex\n"
1644 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001645 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001646 "}",
1647 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1648 " __asm {\n"
1649 " mov edx,[that] // vtable in edx\n"
1650 " mov eax,methodIndex\n"
1651 " call [edx][eax*4] // stdcall\n"
1652 " }\n"
1653 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001654 EXPECT_EQ("_asm {\n"
1655 " xor eax, eax;\n"
1656 " cpuid;\n"
1657 "}",
1658 format("_asm {\n"
1659 " xor eax, eax;\n"
1660 " cpuid;\n"
1661 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001662 verifyFormat("void function() {\n"
1663 " // comment\n"
1664 " asm(\"\");\n"
1665 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001666 EXPECT_EQ("__asm {\n"
1667 "}\n"
1668 "int i;",
1669 format("__asm {\n"
1670 "}\n"
1671 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001672}
1673
Nico Weberd5650bd2013-01-07 16:36:17 +00001674TEST_F(FormatTest, FormatTryCatch) {
1675 verifyFormat("try {\n"
1676 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001677 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001678 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001679 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001680 " exit(42);\n"
1681 "}");
1682
1683 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001684 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001685 " return 5;\n"
1686 "}");
1687 verifyFormat("class A {\n"
1688 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001689 " A() try : a(0) {\n"
1690 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001691 " throw;\n"
1692 " }\n"
1693 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001694
1695 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001696 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001697}
1698
Nico Weberfac23712015-02-04 15:26:27 +00001699TEST_F(FormatTest, FormatSEHTryCatch) {
1700 verifyFormat("__try {\n"
1701 " int a = b * c;\n"
1702 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1703 " // Do nothing.\n"
1704 "}");
1705
1706 verifyFormat("__try {\n"
1707 " int a = b * c;\n"
1708 "} __finally {\n"
1709 " // Do nothing.\n"
1710 "}");
1711
1712 verifyFormat("DEBUG({\n"
1713 " __try {\n"
1714 " } __finally {\n"
1715 " }\n"
1716 "});\n");
1717}
1718
Daniel Jasper04a71a42014-05-08 11:58:24 +00001719TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1720 verifyFormat("try {\n"
1721 " f();\n"
1722 "} catch {\n"
1723 " g();\n"
1724 "}");
1725 verifyFormat("try {\n"
1726 " f();\n"
1727 "} catch (A a) MACRO(x) {\n"
1728 " g();\n"
1729 "} catch (B b) MACRO(x) {\n"
1730 " g();\n"
1731 "}");
1732}
1733
1734TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1735 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001736 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1737 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001738 Style.BreakBeforeBraces = BraceStyle;
1739 verifyFormat("try {\n"
1740 " // something\n"
1741 "} catch (...) {\n"
1742 " // something\n"
1743 "}",
1744 Style);
1745 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001746 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1747 verifyFormat("try {\n"
1748 " // something\n"
1749 "}\n"
1750 "catch (...) {\n"
1751 " // something\n"
1752 "}",
1753 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001754 verifyFormat("__try {\n"
1755 " // something\n"
1756 "}\n"
1757 "__finally {\n"
1758 " // something\n"
1759 "}",
1760 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001761 verifyFormat("@try {\n"
1762 " // something\n"
1763 "}\n"
1764 "@finally {\n"
1765 " // something\n"
1766 "}",
1767 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001768 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1769 verifyFormat("try\n"
1770 "{\n"
1771 " // something\n"
1772 "}\n"
1773 "catch (...)\n"
1774 "{\n"
1775 " // something\n"
1776 "}",
1777 Style);
1778 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1779 verifyFormat("try\n"
1780 " {\n"
1781 " // something\n"
1782 " }\n"
1783 "catch (...)\n"
1784 " {\n"
1785 " // something\n"
1786 " }",
1787 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001788 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1789 Style.BraceWrapping.BeforeCatch = true;
1790 verifyFormat("try {\n"
1791 " // something\n"
1792 "}\n"
1793 "catch (...) {\n"
1794 " // something\n"
1795 "}",
1796 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001797}
1798
Daniel Jaspere25509f2012-12-17 11:29:41 +00001799TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001800 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001801
Daniel Jaspera44991332015-04-29 13:06:49 +00001802 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1803 " 100000000, "
1804 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001805
Daniel Jasper473c62c2013-05-17 09:35:01 +00001806 // Here, everything other than the "}" would fit on a line.
1807 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001808 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001809 EXPECT_EQ("S s = {a,\n"
1810 "\n"
1811 " b};",
1812 format("S s = {\n"
1813 " a,\n"
1814 "\n"
1815 " b\n"
1816 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001817
1818 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1819 // line. However, the formatting looks a bit off and this probably doesn't
1820 // happen often in practice.
1821 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001822 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001823 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001824}
1825
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001826TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001827 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1828 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1829 " .bbbbbbbbbb = 2,\n"
1830 " .cccccccccc = 3,\n"
1831 " .dddddddddd = 4,\n"
1832 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001833 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001834 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1835 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1836 " .ccccccccccccccccccccccccccc = 3,\n"
1837 " .ddddddddddddddddddddddddddd = 4,\n"
1838 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001839
1840 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001841
1842 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1843 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1844 " [2] = bbbbbbbbbb,\n"
1845 " [3] = cccccccccc,\n"
1846 " [4] = dddddddddd,\n"
1847 " [5] = eeeeeeeeee};");
1848 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1849 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1850 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1851 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1852 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1853 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001854}
1855
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001856TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001857 verifyFormat("static A x = {{{}}};\n");
1858 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1859 " {init1, init2, init3, init4}}};",
1860 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001861
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001862 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001863 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1864 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1865 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1866 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001867 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001868 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1869 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1870 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001871 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1872 " {rect.fRight - rect.fLeft, rect.fBottom - "
1873 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001874
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001875 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001876 "SomeArrayOfSomeType a = {\n"
1877 " {{1, 2, 3},\n"
1878 " {1, 2, 3},\n"
1879 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1880 " 333333333333333333333333333333},\n"
1881 " {1, 2, 3},\n"
1882 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001883 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001884 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001885 " {{1, 2, 3}},\n"
1886 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001887 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1888 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001889 " {{1, 2, 3}},\n"
1890 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001891
Daniel Jaspera44991332015-04-29 13:06:49 +00001892 verifyFormat("struct {\n"
1893 " unsigned bit;\n"
1894 " const char *const name;\n"
1895 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1896 " {kOsWin, \"Windows\"},\n"
1897 " {kOsLinux, \"Linux\"},\n"
1898 " {kOsCrOS, \"Chrome OS\"}};");
1899 verifyFormat("struct {\n"
1900 " unsigned bit;\n"
1901 " const char *const name;\n"
1902 "} kBitsToOs[] = {\n"
1903 " {kOsMac, \"Mac\"},\n"
1904 " {kOsWin, \"Windows\"},\n"
1905 " {kOsLinux, \"Linux\"},\n"
1906 " {kOsCrOS, \"Chrome OS\"},\n"
1907 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001908}
1909
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001910TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1911 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1912 " \\\n"
1913 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1914}
1915
Daniel Jasperda16db32013-01-07 10:48:50 +00001916TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001917 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1918 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001919
1920 // Do break defaulted and deleted functions.
1921 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1922 " default;",
1923 getLLVMStyleWithColumns(40));
1924 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1925 " delete;",
1926 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001927}
1928
1929TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1930 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1931 getLLVMStyleWithColumns(40));
1932 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1933 getLLVMStyleWithColumns(40));
1934 EXPECT_EQ("#define Q \\\n"
1935 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1936 " \"aaaaaaaa.cpp\"",
1937 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1938 getLLVMStyleWithColumns(40)));
1939}
1940
1941TEST_F(FormatTest, UnderstandsLinePPDirective) {
1942 EXPECT_EQ("# 123 \"A string literal\"",
1943 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001944}
1945
Manuel Klimek591b5802013-01-31 15:58:48 +00001946TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001947 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001948 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001949}
1950
1951TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1952 EXPECT_EQ("#line 42 \"test\"\n",
1953 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001954 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1955 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001956}
1957
1958TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1959 EXPECT_EQ("#line 42 \"test\"",
1960 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001961 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001962}
1963
Daniel Jasper877615c2013-10-11 19:45:02 +00001964TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1965 verifyFormat("#define A \\x20");
1966 verifyFormat("#define A \\ x20");
1967 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1968 verifyFormat("#define A ''");
1969 verifyFormat("#define A ''qqq");
1970 verifyFormat("#define A `qqq");
1971 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001972 EXPECT_EQ("const char *c = STRINGIFY(\n"
1973 "\\na : b);",
1974 format("const char * c = STRINGIFY(\n"
1975 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001976
1977 verifyFormat("a\r\\");
1978 verifyFormat("a\v\\");
1979 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001980}
1981
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001982TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001983 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1984 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001985 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001986 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001987 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001988
1989 verifyFormat("#define A A\n#define A A");
1990 verifyFormat("#define A(X) A\n#define A A");
1991
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001992 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1993 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001994}
1995
1996TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001997 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001998 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001999 "#define A( \\\n"
2000 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002001 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002002 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002003 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002004 " #include \"a.h\"\n"
2005 "#define A(A,\\\n"
2006 " B)\n"
2007 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002008 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002009 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002010}
2011
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002012TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002013
2014TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2015 EXPECT_EQ("#define A \\\n"
2016 " c; \\\n"
2017 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002018 "f;",
2019 format("#define A c; e;\n"
2020 "f;",
2021 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002022}
2023
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002024TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002025
Manuel Klimek1abf7892013-01-04 23:34:14 +00002026TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002027 EXPECT_EQ("int x,\n"
2028 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002029 " y;",
2030 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002031}
2032
Manuel Klimek09e07972013-01-05 21:34:55 +00002033TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002034 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002035 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002036 verifyFormat("#define A \\\n"
2037 " { \\\n"
2038 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002039 " }",
2040 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002041
2042 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002043 " void function##X()",
2044 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002045
2046 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002047 " void a##b##c()",
2048 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002049
Daniel Jasper39825ea2013-01-14 15:40:57 +00002050 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002051}
2052
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002053TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002054 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2055 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002056}
2057
Manuel Klimek0c137952013-02-11 12:33:24 +00002058TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2059 EXPECT_EQ("#define A b;", format("#define A \\\n"
2060 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002061 " b;",
2062 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002063 EXPECT_EQ("#define A \\\n"
2064 " \\\n"
2065 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002066 " b;",
2067 format("#define A \\\n"
2068 " \\\n"
2069 " a; \\\n"
2070 " b;",
2071 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002072 EXPECT_EQ("#define A \\\n"
2073 " a; \\\n"
2074 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002075 " b;",
2076 format("#define A \\\n"
2077 " a; \\\n"
2078 " \\\n"
2079 " b;",
2080 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002081}
2082
Daniel Jasper00475962013-02-19 17:14:38 +00002083TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002084 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002085 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002086 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002087 " case 2\n",
2088 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002089 verifyFormat("#define MACRO(a) \\\n"
2090 " if (a) \\\n"
2091 " f(); \\\n"
2092 " else \\\n"
2093 " g()",
2094 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002095 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002096 verifyIncompleteFormat("#define STR(x) #x\n"
2097 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002098 verifyFormat("#pragma omp threadprivate( \\\n"
2099 " y)), // expected-warning",
2100 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002101 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002102 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002103 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002104 "#define b \\\n"
2105 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002106 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002107 "a",
2108 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002109 verifyFormat("#define A \\\n"
2110 " { \\\n"
2111 " {\n"
2112 "#define B \\\n"
2113 " } \\\n"
2114 " }",
2115 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002116 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002117 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002118 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002119 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002120}
2121
Daniel Jasper40e19212013-05-29 13:16:10 +00002122TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2123 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2124 EXPECT_EQ("class A : public QObject {\n"
2125 " Q_OBJECT\n"
2126 "\n"
2127 " A() {}\n"
2128 "};",
2129 format("class A : public QObject {\n"
2130 " Q_OBJECT\n"
2131 "\n"
2132 " A() {\n}\n"
2133 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002134 EXPECT_EQ("MACRO\n"
2135 "/*static*/ int i;",
2136 format("MACRO\n"
2137 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002138 EXPECT_EQ("SOME_MACRO\n"
2139 "namespace {\n"
2140 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002141 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002142 format("SOME_MACRO\n"
2143 " namespace {\n"
2144 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002145 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002146 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002147 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2148 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002149 // Only if everything is upper case.
2150 EXPECT_EQ("class A : public QObject {\n"
2151 " Q_Object A() {}\n"
2152 "};",
2153 format("class A : public QObject {\n"
2154 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002155 " A() {\n}\n"
2156 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002157
2158 // Only if the next line can actually start an unwrapped line.
2159 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2160 format("SOME_WEIRD_LOG_MACRO\n"
2161 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002162
2163 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002164 "(n, buffers))\n",
2165 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002166}
2167
Alexander Kornienkode644272013-04-08 22:16:06 +00002168TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2169 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2170 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2171 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002172 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002173 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2174 "int *createScopDetectionPass() { return 0; }",
2175 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2176 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2177 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2178 " class X {};\n"
2179 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2180 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002181 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2182 // braces, so that inner block is indented one level more.
2183 EXPECT_EQ("int q() {\n"
2184 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2185 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2186 " IPC_END_MESSAGE_MAP()\n"
2187 "}",
2188 format("int q() {\n"
2189 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2190 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2191 " IPC_END_MESSAGE_MAP()\n"
2192 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002193
Daniel Jasper352dae12014-01-03 11:50:46 +00002194 // Same inside macros.
2195 EXPECT_EQ("#define LIST(L) \\\n"
2196 " L(A) \\\n"
2197 " L(B) \\\n"
2198 " L(C)",
2199 format("#define LIST(L) \\\n"
2200 " L(A) \\\n"
2201 " L(B) \\\n"
2202 " L(C)",
2203 getGoogleStyle()));
2204
Daniel Jasper545c6522013-09-17 09:26:07 +00002205 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002206 EXPECT_EQ("int q() {\n"
2207 " f(x);\n"
2208 " f(x) {}\n"
2209 " f(x)->g();\n"
2210 " f(x)->*g();\n"
2211 " f(x).g();\n"
2212 " f(x) = x;\n"
2213 " f(x) += x;\n"
2214 " f(x) -= x;\n"
2215 " f(x) *= x;\n"
2216 " f(x) /= x;\n"
2217 " f(x) %= x;\n"
2218 " f(x) &= x;\n"
2219 " f(x) |= x;\n"
2220 " f(x) ^= x;\n"
2221 " f(x) >>= x;\n"
2222 " f(x) <<= x;\n"
2223 " f(x)[y].z();\n"
2224 " LOG(INFO) << x;\n"
2225 " ifstream(x) >> x;\n"
2226 "}\n",
2227 format("int q() {\n"
2228 " f(x)\n;\n"
2229 " f(x)\n {}\n"
2230 " f(x)\n->g();\n"
2231 " f(x)\n->*g();\n"
2232 " f(x)\n.g();\n"
2233 " f(x)\n = x;\n"
2234 " f(x)\n += x;\n"
2235 " f(x)\n -= x;\n"
2236 " f(x)\n *= x;\n"
2237 " f(x)\n /= x;\n"
2238 " f(x)\n %= x;\n"
2239 " f(x)\n &= x;\n"
2240 " f(x)\n |= x;\n"
2241 " f(x)\n ^= x;\n"
2242 " f(x)\n >>= x;\n"
2243 " f(x)\n <<= x;\n"
2244 " f(x)\n[y].z();\n"
2245 " LOG(INFO)\n << x;\n"
2246 " ifstream(x)\n >> x;\n"
2247 "}\n"));
2248 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002249 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002250 " if (1) {\n"
2251 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002252 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002253 " while (1) {\n"
2254 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002255 " F(x)\n"
2256 " G(x);\n"
2257 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002258 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002259 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002260 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002261 " }\n"
2262 "}\n",
2263 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002264 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002265 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002266 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002267 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002268 "F(x)\n"
2269 "G(x);\n"
2270 "F(x)\n"
2271 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002272 "}\n"));
2273 EXPECT_EQ("class A {\n"
2274 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002275 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002276 " A(X x)\n" // FIXME: function-level try blocks are broken.
2277 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002278 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002279 " }\n"
2280 "};",
2281 format("class A {\n"
2282 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002283 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002284 " A(X x)\n"
2285 " try : t(0) {} catch (...) {}\n"
2286 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002287 EXPECT_EQ("class SomeClass {\n"
2288 "public:\n"
2289 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2290 "};",
2291 format("class SomeClass {\n"
2292 "public:\n"
2293 " SomeClass()\n"
2294 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2295 "};"));
2296 EXPECT_EQ("class SomeClass {\n"
2297 "public:\n"
2298 " SomeClass()\n"
2299 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2300 "};",
2301 format("class SomeClass {\n"
2302 "public:\n"
2303 " SomeClass()\n"
2304 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2305 "};",
2306 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002307
2308 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002309}
2310
Manuel Klimek4fe43002013-05-22 12:51:29 +00002311TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2312 verifyFormat("#define A \\\n"
2313 " f({ \\\n"
2314 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002315 " });",
2316 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002317}
2318
Krasimir Georgievad47c902017-08-30 14:34:57 +00002319TEST_F(FormatTest, IndentPreprocessorDirectives) {
2320 FormatStyle Style = getLLVMStyle();
2321 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2322 Style.ColumnLimit = 40;
2323 verifyFormat("#ifdef _WIN32\n"
2324 "#define A 0\n"
2325 "#ifdef VAR2\n"
2326 "#define B 1\n"
2327 "#include <someheader.h>\n"
2328 "#define MACRO \\\n"
2329 " some_very_long_func_aaaaaaaaaa();\n"
2330 "#endif\n"
2331 "#else\n"
2332 "#define A 1\n"
2333 "#endif",
2334 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002335 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2336 verifyFormat("#ifdef _WIN32\n"
2337 "# define A 0\n"
2338 "# ifdef VAR2\n"
2339 "# define B 1\n"
2340 "# include <someheader.h>\n"
2341 "# define MACRO \\\n"
2342 " some_very_long_func_aaaaaaaaaa();\n"
2343 "# endif\n"
2344 "#else\n"
2345 "# define A 1\n"
2346 "#endif",
2347 Style);
2348 verifyFormat("#if A\n"
2349 "# define MACRO \\\n"
2350 " void a(int x) { \\\n"
2351 " b(); \\\n"
2352 " c(); \\\n"
2353 " d(); \\\n"
2354 " e(); \\\n"
2355 " f(); \\\n"
2356 " }\n"
2357 "#endif",
2358 Style);
2359 // Comments before include guard.
2360 verifyFormat("// file comment\n"
2361 "// file comment\n"
2362 "#ifndef HEADER_H\n"
2363 "#define HEADER_H\n"
2364 "code();\n"
2365 "#endif",
2366 Style);
2367 // Test with include guards.
2368 // EXPECT_EQ is used because verifyFormat() calls messUp() which incorrectly
2369 // merges lines.
2370 verifyFormat("#ifndef HEADER_H\n"
2371 "#define HEADER_H\n"
2372 "code();\n"
2373 "#endif",
2374 Style);
2375 // Include guards must have a #define with the same variable immediately
2376 // after #ifndef.
2377 verifyFormat("#ifndef NOT_GUARD\n"
2378 "# define FOO\n"
2379 "code();\n"
2380 "#endif",
2381 Style);
2382
2383 // Include guards must cover the entire file.
2384 verifyFormat("code();\n"
2385 "code();\n"
2386 "#ifndef NOT_GUARD\n"
2387 "# define NOT_GUARD\n"
2388 "code();\n"
2389 "#endif",
2390 Style);
2391 verifyFormat("#ifndef NOT_GUARD\n"
2392 "# define NOT_GUARD\n"
2393 "code();\n"
2394 "#endif\n"
2395 "code();",
2396 Style);
2397 // Test with trailing blank lines.
2398 verifyFormat("#ifndef HEADER_H\n"
2399 "#define HEADER_H\n"
2400 "code();\n"
2401 "#endif\n",
2402 Style);
2403 // Include guards don't have #else.
2404 verifyFormat("#ifndef NOT_GUARD\n"
2405 "# define NOT_GUARD\n"
2406 "code();\n"
2407 "#else\n"
2408 "#endif",
2409 Style);
2410 verifyFormat("#ifndef NOT_GUARD\n"
2411 "# define NOT_GUARD\n"
2412 "code();\n"
2413 "#elif FOO\n"
2414 "#endif",
2415 Style);
2416 // FIXME: This doesn't handle the case where there's code between the
2417 // #ifndef and #define but all other conditions hold. This is because when
2418 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2419 // previous code line yet, so we can't detect it.
2420 EXPECT_EQ("#ifndef NOT_GUARD\n"
2421 "code();\n"
2422 "#define NOT_GUARD\n"
2423 "code();\n"
2424 "#endif",
2425 format("#ifndef NOT_GUARD\n"
2426 "code();\n"
2427 "# define NOT_GUARD\n"
2428 "code();\n"
2429 "#endif",
2430 Style));
2431 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2432 // be outside an include guard. Examples are #pragma once and
2433 // #pragma GCC diagnostic, or anything else that does not change the meaning
2434 // of the file if it's included multiple times.
2435 EXPECT_EQ("#ifdef WIN32\n"
2436 "# pragma once\n"
2437 "#endif\n"
2438 "#ifndef HEADER_H\n"
2439 "# define HEADER_H\n"
2440 "code();\n"
2441 "#endif",
2442 format("#ifdef WIN32\n"
2443 "# pragma once\n"
2444 "#endif\n"
2445 "#ifndef HEADER_H\n"
2446 "#define HEADER_H\n"
2447 "code();\n"
2448 "#endif",
2449 Style));
2450 // FIXME: This does not detect when there is a single non-preprocessor line
2451 // in front of an include-guard-like structure where other conditions hold
2452 // because ScopedLineState hides the line.
2453 EXPECT_EQ("code();\n"
2454 "#ifndef HEADER_H\n"
2455 "#define HEADER_H\n"
2456 "code();\n"
2457 "#endif",
2458 format("code();\n"
2459 "#ifndef HEADER_H\n"
2460 "# define HEADER_H\n"
2461 "code();\n"
2462 "#endif",
2463 Style));
2464 // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
2465 // preprocessor indentation.
2466 EXPECT_EQ("#if 1\n"
2467 " // comment\n"
2468 "# define A 0\n"
2469 "// comment\n"
2470 "# define B 0\n"
2471 "#endif",
2472 format("#if 1\n"
2473 "// comment\n"
2474 "# define A 0\n"
2475 " // comment\n"
2476 "# define B 0\n"
2477 "#endif",
2478 Style));
2479 // Test with tabs.
2480 Style.UseTab = FormatStyle::UT_Always;
2481 Style.IndentWidth = 8;
2482 Style.TabWidth = 8;
2483 verifyFormat("#ifdef _WIN32\n"
2484 "#\tdefine A 0\n"
2485 "#\tifdef VAR2\n"
2486 "#\t\tdefine B 1\n"
2487 "#\t\tinclude <someheader.h>\n"
2488 "#\t\tdefine MACRO \\\n"
2489 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2490 "#\tendif\n"
2491 "#else\n"
2492 "#\tdefine A 1\n"
2493 "#endif",
2494 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002495
2496 // Regression test: Multiline-macro inside include guards.
2497 verifyFormat("#ifndef HEADER_H\n"
2498 "#define HEADER_H\n"
2499 "#define A() \\\n"
2500 " int i; \\\n"
2501 " int j;\n"
2502 "#endif // HEADER_H",
2503 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002504}
2505
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002506TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002507 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002508}
2509
Manuel Klimek1058d982013-01-06 20:07:31 +00002510TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2511 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2512 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2513 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2514 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2515}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002516
Daniel Jaspere2408e32015-05-06 11:16:43 +00002517TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002518 EXPECT_EQ(
2519 "#define A \\\n int i; \\\n int j;",
2520 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002521 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002522 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002523 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002524 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002525
2526 FormatStyle DontAlign = getLLVMStyle();
2527 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2528 DontAlign.MaxEmptyLinesToKeep = 3;
2529 // FIXME: can't use verifyFormat here because the newline before
2530 // "public:" is not inserted the first time it's reformatted
2531 EXPECT_EQ("#define A \\\n"
2532 " class Foo { \\\n"
2533 " void bar(); \\\n"
2534 "\\\n"
2535 "\\\n"
2536 "\\\n"
2537 " public: \\\n"
2538 " void baz(); \\\n"
2539 " };",
2540 format("#define A \\\n"
2541 " class Foo { \\\n"
2542 " void bar(); \\\n"
2543 "\\\n"
2544 "\\\n"
2545 "\\\n"
2546 " public: \\\n"
2547 " void baz(); \\\n"
2548 " };", DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002549}
2550
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002551TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2552 verifyFormat("#define A \\\n"
2553 " int v( \\\n"
2554 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002555 " int i;",
2556 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002557}
2558
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002559TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002560 EXPECT_EQ(
2561 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2562 " \\\n"
2563 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2564 "\n"
2565 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2566 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2567 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2568 "\\\n"
2569 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2570 " \n"
2571 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2572 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002573}
2574
Manuel Klimek52b15152013-01-09 15:25:02 +00002575TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2576 EXPECT_EQ("int\n"
2577 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002578 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002579 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002580 verifyFormat("functionCallTo(\n"
2581 " someOtherFunction(\n"
2582 " withSomeParameters, whichInSequence,\n"
2583 " areLongerThanALine(andAnotherCall,\n"
2584 "#define A B\n"
2585 " withMoreParamters,\n"
2586 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002587 " andMoreParameters),\n"
2588 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002589 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002590 verifyFormat("Foo::Foo()\n"
2591 "#ifdef BAR\n"
2592 " : baz(0)\n"
2593 "#endif\n"
2594 "{\n"
2595 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002596 verifyFormat("void f() {\n"
2597 " if (true)\n"
2598 "#ifdef A\n"
2599 " f(42);\n"
2600 " x();\n"
2601 "#else\n"
2602 " g();\n"
2603 " x();\n"
2604 "#endif\n"
2605 "}");
2606 verifyFormat("void f(param1, param2,\n"
2607 " param3,\n"
2608 "#ifdef A\n"
2609 " param4(param5,\n"
2610 "#ifdef A1\n"
2611 " param6,\n"
2612 "#ifdef A2\n"
2613 " param7),\n"
2614 "#else\n"
2615 " param8),\n"
2616 " param9,\n"
2617 "#endif\n"
2618 " param10,\n"
2619 "#endif\n"
2620 " param11)\n"
2621 "#else\n"
2622 " param12)\n"
2623 "#endif\n"
2624 "{\n"
2625 " x();\n"
2626 "}",
2627 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002628 verifyFormat("#if 1\n"
2629 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002630 verifyFormat("#if 1\n"
2631 "#endif\n"
2632 "#if 1\n"
2633 "#else\n"
2634 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002635 verifyFormat("DEBUG({\n"
2636 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2638 "});\n"
2639 "#if a\n"
2640 "#else\n"
2641 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002642
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002643 verifyIncompleteFormat("void f(\n"
2644 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002645 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002646 "#else\n"
2647 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002648}
2649
Manuel Klimek14bd9172014-01-29 08:49:02 +00002650TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2651 verifyFormat("#endif\n"
2652 "#if B");
2653}
2654
Manuel Klimek88033d72013-10-21 08:11:15 +00002655TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2656 FormatStyle SingleLine = getLLVMStyle();
2657 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002658 verifyFormat("#if 0\n"
2659 "#elif 1\n"
2660 "#endif\n"
2661 "void foo() {\n"
2662 " if (test) foo2();\n"
2663 "}",
2664 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002665}
2666
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002667TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002668 verifyFormat("functionCall({ int i; });");
2669 verifyFormat("functionCall({\n"
2670 " int i;\n"
2671 " int j;\n"
2672 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002673 verifyFormat("functionCall(\n"
2674 " {\n"
2675 " int i;\n"
2676 " int j;\n"
2677 " },\n"
2678 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002679 verifyFormat("functionA(functionB({\n"
2680 " int i;\n"
2681 " int j;\n"
2682 " }),\n"
2683 " aaaa, bbbb, cccc);");
2684 verifyFormat("functionCall(\n"
2685 " {\n"
2686 " int i;\n"
2687 " int j;\n"
2688 " },\n"
2689 " aaaa, bbbb, // comment\n"
2690 " cccc);");
2691 verifyFormat("functionA(functionB({\n"
2692 " int i;\n"
2693 " int j;\n"
2694 " }),\n"
2695 " aaaa, bbbb, // comment\n"
2696 " cccc);");
2697 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2698 verifyFormat("functionCall(aaaa, bbbb, {\n"
2699 " int i;\n"
2700 " int j;\n"
2701 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002702 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002703 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002704 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002705 " int i; // break\n"
2706 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2708 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002709 verifyFormat("DEBUG({\n"
2710 " if (a)\n"
2711 " f();\n"
2712 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002713}
2714
2715TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002716 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002717 "int i;",
2718 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002719}
2720
2721TEST_F(FormatTest, LayoutNestedBlocks) {
2722 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2723 " struct s {\n"
2724 " int i;\n"
2725 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002726 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002727 " for (int i = 0; i < 10; ++i)\n"
2728 " return;\n"
2729 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002730 verifyFormat("call(parameter, {\n"
2731 " something();\n"
2732 " // Comment using all columns.\n"
2733 " somethingelse();\n"
2734 "});",
2735 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002736 verifyFormat("DEBUG( //\n"
2737 " { f(); }, a);");
2738 verifyFormat("DEBUG( //\n"
2739 " {\n"
2740 " f(); //\n"
2741 " },\n"
2742 " a);");
2743
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002744 EXPECT_EQ("call(parameter, {\n"
2745 " something();\n"
2746 " // Comment too\n"
2747 " // looooooooooong.\n"
2748 " somethingElse();\n"
2749 "});",
2750 format("call(parameter, {\n"
2751 " something();\n"
2752 " // Comment too looooooooooong.\n"
2753 " somethingElse();\n"
2754 "});",
2755 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002756 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002757 EXPECT_EQ("DEBUG({ // comment\n"
2758 " int i;\n"
2759 "});",
2760 format("DEBUG({ // comment\n"
2761 "int i;\n"
2762 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002763 EXPECT_EQ("DEBUG({\n"
2764 " int i;\n"
2765 "\n"
2766 " // comment\n"
2767 " int j;\n"
2768 "});",
2769 format("DEBUG({\n"
2770 " int i;\n"
2771 "\n"
2772 " // comment\n"
2773 " int j;\n"
2774 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002775
2776 verifyFormat("DEBUG({\n"
2777 " if (a)\n"
2778 " return;\n"
2779 "});");
2780 verifyGoogleFormat("DEBUG({\n"
2781 " if (a) return;\n"
2782 "});");
2783 FormatStyle Style = getGoogleStyle();
2784 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002785 verifyFormat("Debug(aaaaa,\n"
2786 " {\n"
2787 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2788 " },\n"
2789 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002790 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002791
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002792 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2793
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002794 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002795}
2796
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002797TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2798 EXPECT_EQ("#define MACRO() \\\n"
2799 " Debug(aaa, /* force line break */ \\\n"
2800 " { \\\n"
2801 " int i; \\\n"
2802 " int j; \\\n"
2803 " })",
2804 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2805 " { int i; int j; })",
2806 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002807
2808 EXPECT_EQ("#define A \\\n"
2809 " [] { \\\n"
2810 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2811 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2812 " }",
2813 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2814 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2815 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002816}
2817
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002818TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2819 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002820 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002821 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002822}
2823
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002824TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2825 FormatStyle Style = getLLVMStyle();
2826 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2827 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2828 verifyFormat("FOO_BEGIN\n"
2829 " FOO_ENTRY\n"
2830 "FOO_END", Style);
2831 verifyFormat("FOO_BEGIN\n"
2832 " NESTED_FOO_BEGIN\n"
2833 " NESTED_FOO_ENTRY\n"
2834 " NESTED_FOO_END\n"
2835 "FOO_END", Style);
2836 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2837 " int x;\n"
2838 " x = 1;\n"
2839 "FOO_END(Baz)", Style);
2840}
2841
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002842//===----------------------------------------------------------------------===//
2843// Line break tests.
2844//===----------------------------------------------------------------------===//
2845
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002846TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002847 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002848 "void f() {\n"
2849 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2850 " parameter, parameter, parameter)),\n"
2851 " SecondLongCall(parameter));\n"
2852 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002853 verifyFormat(
2854 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2855 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2857 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2858 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002859 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2860 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2861 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2862 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002863 verifyFormat(
2864 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2865 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2867 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002868 verifyFormat("int a = bbbb && ccc &&\n"
2869 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002870 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002871 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002872}
2873
Daniel Jasperd69fc772013-05-08 14:12:04 +00002874TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2875 verifyFormat(
2876 "bool aaaaaaa =\n"
2877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2878 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002879 verifyFormat(
2880 "bool aaaaaaa =\n"
2881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2882 " bbbbbbbb();");
2883
Daniel Jasperd69fc772013-05-08 14:12:04 +00002884 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2886 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002887 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2889 " ccccccccc == ddddddddddd;");
2890 verifyFormat(
2891 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2893 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002894
2895 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2896 " aaaaaa) &&\n"
2897 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002898 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2899 " aaaaaa) >>\n"
2900 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002901 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002902 " SourceMgr.getSpellingColumnNumber(\n"
2903 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2904 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002905
Daniel Jasper68d888c2013-06-03 08:42:05 +00002906 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2907 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2908 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00002909 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2910 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
2911 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002912 verifyFormat("b = a &&\n"
2913 " // Comment\n"
2914 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002915
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002916 // If the LHS of a comparison is not a binary expression itself, the
2917 // additional linebreak confuses many people.
2918 verifyFormat(
2919 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2921 "}");
2922 verifyFormat(
2923 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2924 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2925 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002926 verifyFormat(
2927 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2929 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002930 // Even explicit parentheses stress the precedence enough to make the
2931 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002932 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2934 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002935 // This cases is borderline, but with the indentation it is still readable.
2936 verifyFormat(
2937 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2938 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2940 "}",
2941 getLLVMStyleWithColumns(75));
2942
2943 // If the LHS is a binary expression, we should still use the additional break
2944 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002945 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2946 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2947 " 5) {\n"
2948 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002949
Daniel Jasper571f1af2013-05-14 20:39:56 +00002950 FormatStyle OnePerLine = getLLVMStyle();
2951 OnePerLine.BinPackParameters = false;
2952 verifyFormat(
2953 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2954 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2956 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002957
2958 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2959 " .aaa(aaaaaaaaaaaaa) *\n"
2960 " aaaaaaa +\n"
2961 " aaaaaaa;",
2962 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002963}
2964
Daniel Jasper6bee6822013-04-08 20:33:42 +00002965TEST_F(FormatTest, ExpressionIndentation) {
2966 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2970 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2971 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2974 " ccccccccccccccccccccccccccccccccccccccccc;");
2975 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2978 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2979 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2982 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2983 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2986 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002987 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002988 "} else if (aaaaa && bbbbb > // break\n"
2989 " ccccc) {\n"
2990 "}");
2991 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002992 "} else if (aaaaa &&\n"
2993 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002994 " ccccc &&\n"
2995 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002996 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002997
2998 // Presence of a trailing comment used to change indentation of b.
2999 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3000 " b;\n"
3001 "return aaaaaaaaaaaaaaaaaaa +\n"
3002 " b; //",
3003 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003004}
3005
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003006TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3007 // Not sure what the best system is here. Like this, the LHS can be found
3008 // immediately above an operator (everything with the same or a higher
3009 // indent). The RHS is aligned right of the operator and so compasses
3010 // everything until something with the same indent as the operator is found.
3011 // FIXME: Is this a good system?
3012 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003013 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003014 verifyFormat(
3015 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003016 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3017 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3018 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3019 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3020 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003021 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003022 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3023 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003024 Style);
3025 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003026 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3027 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003028 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3029 Style);
3030 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003031 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3032 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003033 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3034 Style);
3035 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3036 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003037 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3038 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003039 Style);
3040 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003041 "} else if (aaaaa\n"
3042 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003043 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003044 "}",
3045 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003046 verifyFormat("return (a)\n"
3047 " // comment\n"
3048 " + b;",
3049 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003050 verifyFormat(
3051 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3052 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3053 " + cc;",
3054 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003055
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003056 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3057 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3058 Style);
3059
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003060 // Forced by comments.
3061 verifyFormat(
3062 "unsigned ContentSize =\n"
3063 " sizeof(int16_t) // DWARF ARange version number\n"
3064 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3065 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3066 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003067
3068 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3069 " == boost::fusion::at_c<1>(iiii).second;",
3070 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003071
3072 Style.ColumnLimit = 60;
3073 verifyFormat("zzzzzzzzzz\n"
3074 " = bbbbbbbbbbbbbbbbb\n"
3075 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3076 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003077}
3078
Daniel Jasperb1270392017-02-01 23:27:37 +00003079TEST_F(FormatTest, EnforcedOperatorWraps) {
3080 // Here we'd like to wrap after the || operators, but a comment is forcing an
3081 // earlier wrap.
3082 verifyFormat("bool x = aaaaa //\n"
3083 " || bbbbb\n"
3084 " //\n"
3085 " || cccc;");
3086}
3087
Daniel Jasper3219e432014-12-02 13:24:51 +00003088TEST_F(FormatTest, NoOperandAlignment) {
3089 FormatStyle Style = getLLVMStyle();
3090 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003091 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3094 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003095 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003096 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3097 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3098 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3099 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3100 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3101 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3102 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3103 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3104 " > ccccccccccccccccccccccccccccccccccccccccc;",
3105 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003106
3107 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3108 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3109 " + cc;",
3110 Style);
3111 verifyFormat("int a = aa\n"
3112 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003113 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003114 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003115
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003116 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003117 verifyFormat("return (a > b\n"
3118 " // comment1\n"
3119 " // comment2\n"
3120 " || c);",
3121 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003122}
3123
Daniel Jasperac043c92014-09-15 11:11:00 +00003124TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3125 FormatStyle Style = getLLVMStyle();
3126 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3127 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003129 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3130 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003131}
3132
Daniel Jasper988e7e42017-05-08 15:07:52 +00003133TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3134 FormatStyle Style = getLLVMStyle();
3135 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3136 Style.BinPackArguments = false;
3137 Style.ColumnLimit = 40;
3138 verifyFormat("void test() {\n"
3139 " someFunction(\n"
3140 " this + argument + is + quite\n"
3141 " + long + so + it + gets + wrapped\n"
3142 " + but + remains + bin - packed);\n"
3143 "}",
3144 Style);
3145 verifyFormat("void test() {\n"
3146 " someFunction(arg1,\n"
3147 " this + argument + is\n"
3148 " + quite + long + so\n"
3149 " + it + gets + wrapped\n"
3150 " + but + remains + bin\n"
3151 " - packed,\n"
3152 " arg3);\n"
3153 "}",
3154 Style);
3155 verifyFormat("void test() {\n"
3156 " someFunction(\n"
3157 " arg1,\n"
3158 " this + argument + has\n"
3159 " + anotherFunc(nested,\n"
3160 " calls + whose\n"
3161 " + arguments\n"
3162 " + are + also\n"
3163 " + wrapped,\n"
3164 " in + addition)\n"
3165 " + to + being + bin - packed,\n"
3166 " arg3);\n"
3167 "}",
3168 Style);
3169
3170 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3171 verifyFormat("void test() {\n"
3172 " someFunction(\n"
3173 " arg1,\n"
3174 " this + argument + has +\n"
3175 " anotherFunc(nested,\n"
3176 " calls + whose +\n"
3177 " arguments +\n"
3178 " are + also +\n"
3179 " wrapped,\n"
3180 " in + addition) +\n"
3181 " to + being + bin - packed,\n"
3182 " arg3);\n"
3183 "}",
3184 Style);
3185}
3186
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003187TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003188 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003189 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3190 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003191 verifyFormat("Constructor()\n"
3192 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003193 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003194 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003195 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003196 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003197
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003198 verifyFormat("template <typename T>\n"
3199 "Constructor() : Initializer(FitsOnTheLine) {}",
3200 getLLVMStyleWithColumns(45));
3201
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003202 verifyFormat(
3203 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003204 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003205
3206 verifyFormat(
3207 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003208 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003209 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003210 verifyFormat(
3211 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003212 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003213 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003214 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3215 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3216 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003217
3218 verifyFormat("Constructor()\n"
3219 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3220 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3221 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003222 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003223
Daniel Jasper65585ed2013-01-28 13:31:35 +00003224 verifyFormat("Constructor()\n"
3225 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003227
Daniel Jasper62e68172013-02-25 15:59:54 +00003228 verifyFormat("Constructor(int Parameter = 0)\n"
3229 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3230 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003231 verifyFormat("Constructor()\n"
3232 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3233 "}",
3234 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003235 verifyFormat("Constructor()\n"
3236 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3237 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003238
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003239 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003240 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003241 verifyFormat("Constructor()\n"
3242 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3243 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3244 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003245
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003246 FormatStyle OnePerLine = getLLVMStyle();
3247 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003248 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003249 verifyFormat("SomeClass::Constructor()\n"
3250 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3251 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003252 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003253 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003254 verifyFormat("SomeClass::Constructor()\n"
3255 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3256 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003257 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003258 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003259 verifyFormat("MyClass::MyClass(int var)\n"
3260 " : some_var_(var), // 4 space indent\n"
3261 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003262 "}",
3263 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003264 verifyFormat("Constructor()\n"
3265 " : aaaaa(aaaaaa),\n"
3266 " aaaaa(aaaaaa),\n"
3267 " aaaaa(aaaaaa),\n"
3268 " aaaaa(aaaaaa),\n"
3269 " aaaaa(aaaaaa) {}",
3270 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003271 verifyFormat("Constructor()\n"
3272 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3273 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3274 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003275 OnePerLine.BinPackParameters = false;
3276 verifyFormat(
3277 "Constructor()\n"
3278 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3279 " aaaaaaaaaaa().aaa(),\n"
3280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3281 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003282 OnePerLine.ColumnLimit = 60;
3283 verifyFormat("Constructor()\n"
3284 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3285 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3286 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003287
3288 EXPECT_EQ("Constructor()\n"
3289 " : // Comment forcing unwanted break.\n"
3290 " aaaa(aaaa) {}",
3291 format("Constructor() :\n"
3292 " // Comment forcing unwanted break.\n"
3293 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003294}
3295
Francois Ferranda6b6d512017-05-24 11:36:58 +00003296TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3297 FormatStyle Style = getLLVMStyle();
3298 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3299
3300 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3301 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3302 getStyleWithColumns(Style, 45));
3303 verifyFormat("Constructor() :\n"
3304 " Initializer(FitsOnTheLine) {}",
3305 getStyleWithColumns(Style, 44));
3306 verifyFormat("Constructor() :\n"
3307 " Initializer(FitsOnTheLine) {}",
3308 getStyleWithColumns(Style, 43));
3309
3310 verifyFormat("template <typename T>\n"
3311 "Constructor() : Initializer(FitsOnTheLine) {}",
3312 getStyleWithColumns(Style, 50));
3313
3314 verifyFormat(
3315 "SomeClass::Constructor() :\n"
3316 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3317 Style);
3318
3319 verifyFormat(
3320 "SomeClass::Constructor() :\n"
3321 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3322 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3323 Style);
3324 verifyFormat(
3325 "SomeClass::Constructor() :\n"
3326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3327 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3328 Style);
3329 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3330 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3331 " aaaaaaaaaa(aaaaaa) {}",
3332 Style);
3333
3334 verifyFormat("Constructor() :\n"
3335 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3336 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3337 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3338 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3339 Style);
3340
3341 verifyFormat("Constructor() :\n"
3342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3344 Style);
3345
3346 verifyFormat("Constructor(int Parameter = 0) :\n"
3347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3348 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3349 Style);
3350 verifyFormat("Constructor() :\n"
3351 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3352 "}",
3353 getStyleWithColumns(Style, 60));
3354 verifyFormat("Constructor() :\n"
3355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3356 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3357 Style);
3358
3359 // Here a line could be saved by splitting the second initializer onto two
3360 // lines, but that is not desirable.
3361 verifyFormat("Constructor() :\n"
3362 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3363 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3364 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3365 Style);
3366
3367 FormatStyle OnePerLine = Style;
3368 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3369 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3370 verifyFormat("SomeClass::Constructor() :\n"
3371 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3372 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3373 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3374 OnePerLine);
3375 verifyFormat("SomeClass::Constructor() :\n"
3376 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3377 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3378 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3379 OnePerLine);
3380 verifyFormat("MyClass::MyClass(int var) :\n"
3381 " some_var_(var), // 4 space indent\n"
3382 " some_other_var_(var + 1) { // lined up\n"
3383 "}",
3384 OnePerLine);
3385 verifyFormat("Constructor() :\n"
3386 " aaaaa(aaaaaa),\n"
3387 " aaaaa(aaaaaa),\n"
3388 " aaaaa(aaaaaa),\n"
3389 " aaaaa(aaaaaa),\n"
3390 " aaaaa(aaaaaa) {}",
3391 OnePerLine);
3392 verifyFormat("Constructor() :\n"
3393 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3394 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3395 OnePerLine);
3396 OnePerLine.BinPackParameters = false;
3397 verifyFormat(
3398 "Constructor() :\n"
3399 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3400 " aaaaaaaaaaa().aaa(),\n"
3401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3402 OnePerLine);
3403 OnePerLine.ColumnLimit = 60;
3404 verifyFormat("Constructor() :\n"
3405 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3406 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3407 OnePerLine);
3408
3409 EXPECT_EQ("Constructor() :\n"
3410 " // Comment forcing unwanted break.\n"
3411 " aaaa(aaaa) {}",
3412 format("Constructor() :\n"
3413 " // Comment forcing unwanted break.\n"
3414 " aaaa(aaaa) {}",
3415 Style));
3416
3417 Style.ColumnLimit = 0;
3418 verifyFormat("SomeClass::Constructor() :\n"
3419 " a(a) {}",
3420 Style);
3421 verifyFormat("SomeClass::Constructor() noexcept :\n"
3422 " a(a) {}",
3423 Style);
3424 verifyFormat("SomeClass::Constructor() :\n"
3425 " a(a), b(b), c(c) {}",
3426 Style);
3427 verifyFormat("SomeClass::Constructor() :\n"
3428 " a(a) {\n"
3429 " foo();\n"
3430 " bar();\n"
3431 "}",
3432 Style);
3433
3434 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3435 verifyFormat("SomeClass::Constructor() :\n"
3436 " a(a), b(b), c(c) {\n"
3437 "}",
3438 Style);
3439 verifyFormat("SomeClass::Constructor() :\n"
3440 " a(a) {\n"
3441 "}",
3442 Style);
3443
3444 Style.ColumnLimit = 80;
3445 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3446 Style.ConstructorInitializerIndentWidth = 2;
3447 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3448 Style);
3449 verifyFormat("SomeClass::Constructor() :\n"
3450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3451 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3452 Style);
3453}
3454
David Blaikieea95dd72017-08-31 18:49:34 +00003455#ifndef EXPENSIVE_CHECKS
3456// Expensive checks enables libstdc++ checking which includes validating the
3457// state of ranges used in std::priority_queue - this blows out the
3458// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003459TEST_F(FormatTest, MemoizationTests) {
3460 // This breaks if the memoization lookup does not take \c Indent and
3461 // \c LastSpace into account.
3462 verifyFormat(
3463 "extern CFRunLoopTimerRef\n"
3464 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3465 " CFTimeInterval interval, CFOptionFlags flags,\n"
3466 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003467 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003468
3469 // Deep nesting somewhat works around our memoization.
3470 verifyFormat(
3471 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3472 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3473 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3474 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3475 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3476 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003477 verifyFormat(
3478 "aaaaa(\n"
3479 " aaaaa,\n"
3480 " aaaaa(\n"
3481 " aaaaa,\n"
3482 " aaaaa(\n"
3483 " aaaaa,\n"
3484 " aaaaa(\n"
3485 " aaaaa,\n"
3486 " aaaaa(\n"
3487 " aaaaa,\n"
3488 " aaaaa(\n"
3489 " aaaaa,\n"
3490 " aaaaa(\n"
3491 " aaaaa,\n"
3492 " aaaaa(\n"
3493 " aaaaa,\n"
3494 " aaaaa(\n"
3495 " aaaaa,\n"
3496 " aaaaa(\n"
3497 " aaaaa,\n"
3498 " aaaaa(\n"
3499 " aaaaa,\n"
3500 " aaaaa(\n"
3501 " aaaaa,\n"
3502 " aaaaa))))))))))));",
3503 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003504 verifyFormat(
3505 "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"
3506 " a),\n"
3507 " a),\n"
3508 " a),\n"
3509 " a),\n"
3510 " a),\n"
3511 " a),\n"
3512 " a),\n"
3513 " a),\n"
3514 " a),\n"
3515 " a),\n"
3516 " a),\n"
3517 " a),\n"
3518 " a),\n"
3519 " a),\n"
3520 " a),\n"
3521 " a),\n"
3522 " a)",
3523 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003524
3525 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003526 FormatStyle OnePerLine = getLLVMStyle();
3527 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003528 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003529 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003530 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003531 for (unsigned i = 0, e = 80; i != e; ++i) {
3532 input += " a,\n";
3533 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003534 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003535 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003536}
David Blaikieea95dd72017-08-31 18:49:34 +00003537#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003538
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003539TEST_F(FormatTest, BreaksAsHighAsPossible) {
3540 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003541 "void f() {\n"
3542 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3543 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3544 " f();\n"
3545 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003546 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003547 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003548}
3549
Daniel Jasper6728fc12013-04-11 14:29:13 +00003550TEST_F(FormatTest, BreaksFunctionDeclarations) {
3551 // Principially, we break function declarations in a certain order:
3552 // 1) break amongst arguments.
3553 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3554 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003555 verifyFormat("template <class TemplateIt>\n"
3556 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3557 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003558
3559 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003560 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003561 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003562 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003563 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003564
3565 // 3) break after (.
3566 verifyFormat(
3567 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003568 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3569 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003570
3571 // 4) break before after nested name specifiers.
3572 verifyFormat(
3573 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003574 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3575 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003576 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003577
3578 // However, there are exceptions, if a sufficient amount of lines can be
3579 // saved.
3580 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3581 // more adjusting.
3582 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3583 " Cccccccccccccc cccccccccc,\n"
3584 " Cccccccccccccc cccccccccc,\n"
3585 " Cccccccccccccc cccccccccc,\n"
3586 " Cccccccccccccc cccccccccc);");
3587 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003588 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003589 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3590 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3591 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003592 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003593 verifyFormat(
3594 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3595 " Cccccccccccccc cccccccccc,\n"
3596 " Cccccccccccccc cccccccccc,\n"
3597 " Cccccccccccccc cccccccccc,\n"
3598 " Cccccccccccccc cccccccccc,\n"
3599 " Cccccccccccccc cccccccccc,\n"
3600 " Cccccccccccccc cccccccccc);");
3601 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3602 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3603 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3604 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3605 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003606
3607 // Break after multi-line parameters.
3608 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3611 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003612 verifyFormat("void SomeLoooooooooooongFunction(\n"
3613 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3614 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3615 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003616
3617 // Treat overloaded operators like other functions.
3618 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3619 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003620 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3621 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003622 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3623 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3624 verifyGoogleFormat(
3625 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3626 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003627 verifyGoogleFormat(
3628 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3629 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003630 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3631 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3632 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3633 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003634 verifyGoogleFormat(
3635 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3636 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3637 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003638 verifyGoogleFormat(
3639 "template <typename T>\n"
3640 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3641 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3642 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003643
3644 FormatStyle Style = getLLVMStyle();
3645 Style.PointerAlignment = FormatStyle::PAS_Left;
3646 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3647 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3648 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003649 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3651 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003652}
3653
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003654TEST_F(FormatTest, TrailingReturnType) {
3655 verifyFormat("auto foo() -> int;\n");
3656 verifyFormat("struct S {\n"
3657 " auto bar() const -> int;\n"
3658 "};");
3659 verifyFormat("template <size_t Order, typename T>\n"
3660 "auto load_img(const std::string &filename)\n"
3661 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003662 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3663 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003664 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003665 verifyFormat("template <typename T>\n"
3666 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3667 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003668
3669 // Not trailing return types.
3670 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003671}
3672
Daniel Jasper5be31f72013-05-21 09:16:31 +00003673TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003674 // Avoid breaking before trailing 'const' or other trailing annotations, if
3675 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003676 FormatStyle Style = getGoogleStyle();
3677 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003678 verifyFormat("void someLongFunction(\n"
3679 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003680 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003681 verifyFormat("LoooooongReturnType\n"
3682 "someLoooooooongFunction() const {}",
3683 getLLVMStyleWithColumns(47));
3684 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3685 " const {}",
3686 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003687 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3688 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3689 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3690 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3691 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3692 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003693 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3694 " aaaaaaaaaaa aaaaa) const override;");
3695 verifyGoogleFormat(
3696 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3697 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003698
Daniel Jasper5550de62014-02-17 07:57:46 +00003699 // Even if the first parameter has to be wrapped.
3700 verifyFormat("void someLongFunction(\n"
3701 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003702 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003703 verifyFormat("void someLongFunction(\n"
3704 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003705 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003706 verifyFormat("void someLongFunction(\n"
3707 " int someLongParameter) override {}",
3708 Style);
3709 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003710 " int someLongParameter) OVERRIDE {}",
3711 Style);
3712 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003713 " int someLongParameter) final {}",
3714 Style);
3715 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003716 " int someLongParameter) FINAL {}",
3717 Style);
3718 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003719 " int parameter) const override {}",
3720 Style);
3721
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003722 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3723 verifyFormat("void someLongFunction(\n"
3724 " int someLongParameter) const\n"
3725 "{\n"
3726 "}",
3727 Style);
3728
Daniel Jasper5550de62014-02-17 07:57:46 +00003729 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003730 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3731 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3732 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003733
3734 // Breaking before function-like trailing annotations is fine to keep them
3735 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003736 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3737 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3738 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3739 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3740 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3741 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003742 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3743 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003744 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003745
3746 verifyFormat(
3747 "void aaaaaaaaaaaaaaaaaa()\n"
3748 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3749 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3750 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3751 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003752 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003753 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003754 " GUARDED_BY(aaaaaaaaaaaa);");
3755 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003756 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003757 " GUARDED_BY(aaaaaaaaaaaa);");
3758 verifyGoogleFormat(
3759 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3760 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003761 verifyGoogleFormat(
3762 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3763 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003764}
3765
Daniel Jasperf090f032015-05-18 09:47:22 +00003766TEST_F(FormatTest, FunctionAnnotations) {
3767 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003768 "int OldFunction(const string &parameter) {}");
3769 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003770 "string OldFunction(const string &parameter) {}");
3771 verifyFormat("template <typename T>\n"
3772 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3773 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003774
3775 // Not function annotations.
3776 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3777 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003778 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3779 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003780 verifyFormat("MACRO(abc).function() // wrap\n"
3781 " << abc;");
3782 verifyFormat("MACRO(abc)->function() // wrap\n"
3783 " << abc;");
3784 verifyFormat("MACRO(abc)::function() // wrap\n"
3785 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003786}
3787
Daniel Jasperf7935112012-12-03 18:12:45 +00003788TEST_F(FormatTest, BreaksDesireably) {
3789 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3790 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003791 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003792 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3793 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3794 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003795
3796 verifyFormat(
3797 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003798 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003799
3800 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003803
3804 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003805 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3806 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003808 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003810
3811 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3812 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3813
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003814 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003815 "void f() {\n"
3816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3818 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003819 verifyFormat(
3820 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3822 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003823 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3825 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003826 "aaaaaa(aaa,\n"
3827 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3829 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003830 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3831 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003833
Daniel Jasper739b85f2015-06-29 10:42:59 +00003834 // Indent consistently independent of call expression and unary operator.
3835 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3836 " dddddddddddddddddddddddddddddd));");
3837 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3838 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003839 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003840 " dddddddddddddddddddddddddddddd));");
3841
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003842 // This test case breaks on an incorrect memoization, i.e. an optimization not
3843 // taking into account the StopAt value.
3844 verifyFormat(
3845 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003846 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3847 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3848 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003849
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003850 verifyFormat("{\n {\n {\n"
3851 " Annotation.SpaceRequiredBefore =\n"
3852 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3853 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3854 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003855
3856 // Break on an outer level if there was a break on an inner level.
3857 EXPECT_EQ("f(g(h(a, // comment\n"
3858 " b, c),\n"
3859 " d, e),\n"
3860 " x, y);",
3861 format("f(g(h(a, // comment\n"
3862 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003863
3864 // Prefer breaking similar line breaks.
3865 verifyFormat(
3866 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3867 " NSTrackingMouseEnteredAndExited |\n"
3868 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003869}
3870
Daniel Jasper18210d72014-10-09 09:52:05 +00003871TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3872 FormatStyle NoBinPacking = getGoogleStyle();
3873 NoBinPacking.BinPackParameters = false;
3874 NoBinPacking.BinPackArguments = true;
3875 verifyFormat("void f() {\n"
3876 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3878 "}",
3879 NoBinPacking);
3880 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3881 " int aaaaaaaaaaaaaaaaaaaa,\n"
3882 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3883 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003884
Daniel Jasper00693b082016-01-09 15:56:47 +00003885 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3886 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3887 " vector<int> bbbbbbbbbbbbbbb);",
3888 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003889 // FIXME: This behavior difference is probably not wanted. However, currently
3890 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3891 // template arguments from BreakBeforeParameter being set because of the
3892 // one-per-line formatting.
3893 verifyFormat(
3894 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3895 " aaaaaaaaaa> aaaaaaaaaa);",
3896 NoBinPacking);
3897 verifyFormat(
3898 "void fffffffffff(\n"
3899 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3900 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003901}
3902
Daniel Jasper9278eb92013-01-16 14:59:02 +00003903TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003904 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003905 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003906 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003907 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3908 " aaaaaaaaaaaaaaaaaaaa,\n"
3909 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3910 NoBinPacking);
3911 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3912 " aaaaaaaaaaaaa,\n"
3913 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3914 NoBinPacking);
3915 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003916 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3917 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3918 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3919 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3921 NoBinPacking);
3922 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3923 " .aaaaaaaaaaaaaaaaaa();",
3924 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003925 verifyFormat("void f() {\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3927 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3928 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003929 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003930
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003931 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003932 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3933 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003934 " aaaaaaaaaaaa);",
3935 NoBinPacking);
3936 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003937 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3938 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003939 " test);",
3940 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003941
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003942 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3943 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003944 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3945 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003946 NoBinPacking);
3947 verifyFormat("a(\"a\"\n"
3948 " \"a\",\n"
3949 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003950
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003951 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003952 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003953 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003954 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003955 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003956 verifyFormat(
3957 "void f() {\n"
3958 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3959 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003960 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003961 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003962 verifyFormat(
3963 "template <class SomeType, class SomeOtherType>\n"
3964 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3965 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003966}
3967
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003968TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3969 FormatStyle Style = getLLVMStyleWithColumns(15);
3970 Style.ExperimentalAutoDetectBinPacking = true;
3971 EXPECT_EQ("aaa(aaaa,\n"
3972 " aaaa,\n"
3973 " aaaa);\n"
3974 "aaa(aaaa,\n"
3975 " aaaa,\n"
3976 " aaaa);",
3977 format("aaa(aaaa,\n" // one-per-line
3978 " aaaa,\n"
3979 " aaaa );\n"
3980 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3981 Style));
3982 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3983 " aaaa);\n"
3984 "aaa(aaaa, aaaa,\n"
3985 " aaaa);",
3986 format("aaa(aaaa, aaaa,\n" // bin-packed
3987 " aaaa );\n"
3988 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3989 Style));
3990}
3991
Daniel Jasper04468962013-01-18 10:56:38 +00003992TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003993 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3994 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3995 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3996 " .StartsWith(\".init\", ORDER_INIT)\n"
3997 " .StartsWith(\".fini\", ORDER_FINI)\n"
3998 " .StartsWith(\".hash\", ORDER_HASH)\n"
3999 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004000
Daniel Jaspereb50c672013-02-15 20:33:06 +00004001 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004002 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004003 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004004 "aaaaaaa->aaaaaaa\n"
4005 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004007 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004008 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004009 "aaaaaaa->aaaaaaa\n"
4010 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4011 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4012 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004013 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004014 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004015 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004016 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4017 " aaaaaa->aaaaaaaaaaaa()\n"
4018 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004020 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004021 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004022 "void f() {\n"
4023 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004024 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004025 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004026 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004027 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004028 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004029 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004030 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004031 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004032 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004033 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004034 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004035
4036 verifyFormat(
4037 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4038 verifyFormat("aaaaaaaaaaaaaaa()\n"
4039 " .aaaaaaaaaaaaaaa()\n"
4040 " .aaaaaaaaaaaaaaa()\n"
4041 " .aaaaaaaaaaaaaaa()\n"
4042 " .aaaaaaaaaaaaaaa();");
4043 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4044 " .aaaaaaaaaaaaaaa()\n"
4045 " .aaaaaaaaaaaaaaa()\n"
4046 " .aaaaaaaaaaaaaaa();");
4047 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4048 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4049 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004050 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4051 " ->aaaaaaaaaaaaaae(0)\n"
4052 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004053
Daniel Jasper775954b2015-04-24 10:08:09 +00004054 // Don't linewrap after very short segments.
4055 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4056 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4057 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4058 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4059 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4060 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4061 verifyFormat("aaa()\n"
4062 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4063 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4064 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4065
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004066 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4067 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4068 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4069 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4070 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004072
Daniel Jaspera41aa532014-09-19 08:01:25 +00004073 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004074 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4075 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004076
4077 // Prefer not to create "hanging" indents.
4078 verifyFormat(
4079 "return !soooooooooooooome_map\n"
4080 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4081 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004082 verifyFormat(
4083 "return aaaaaaaaaaaaaaaa\n"
4084 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4085 " .aaaa(aaaaaaaaaaaaaa);");
4086 // No hanging indent here.
4087 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4089 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004091 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4092 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4093 getLLVMStyleWithColumns(60));
4094 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4095 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4096 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4097 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004098 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4100 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004101}
4102
Daniel Jasperde5c2072012-12-24 00:13:23 +00004103TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4104 verifyFormat(
4105 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004106 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004107 verifyFormat(
4108 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4109 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4110
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004111 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004112 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004113 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4114 " ccccccccccccccccccccccccc) {\n}");
4115
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004116 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004117 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004118 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4119 " ccccccccccccccccccccccccc) {\n}");
4120
Daniel Jasperde5c2072012-12-24 00:13:23 +00004121 verifyFormat(
4122 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004123 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004124 verifyFormat(
4125 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4126 " ccccccccccccccccccccccccc) {\n}");
4127
Daniel Jasper400adc62013-02-08 15:28:42 +00004128 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4129 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4130 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4131 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004132 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4133 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4134 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4135 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4136
Daniel Jasper400adc62013-02-08 15:28:42 +00004137 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4138 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4139 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004140 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4142 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004143}
4144
Daniel Jasper43b65482013-01-23 12:27:43 +00004145TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004146 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004147 "unsigned Cost =\n"
4148 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4149 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004150 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004151 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4152 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004153
4154 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004155 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4156 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004157 verifyFormat("unsigned OriginalStartColumn =\n"
4158 " SourceMgr.getSpellingColumnNumber(\n"
4159 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4160 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004161}
4162
Francois Ferrand9976efa2017-05-22 08:28:17 +00004163TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4164 FormatStyle Style = getLLVMStyle();
4165 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4166 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4167 Style);
4168
4169 Style.PenaltyBreakAssignment = 20;
4170 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4171 " cccccccccccccccccccccccccc;",
4172 Style);
4173}
4174
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004175TEST_F(FormatTest, AlignsAfterAssignments) {
4176 verifyFormat(
4177 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004178 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004179 verifyFormat(
4180 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004181 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004182 verifyFormat(
4183 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004184 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004185 verifyFormat(
4186 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004187 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004188 verifyFormat(
4189 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4190 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4191 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004192}
4193
4194TEST_F(FormatTest, AlignsAfterReturn) {
4195 verifyFormat(
4196 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4197 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4198 verifyFormat(
4199 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4200 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004201 verifyFormat(
4202 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004203 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004204 verifyFormat(
4205 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004206 " aaaaaaaaaaaaaaaaaaaaaa());");
4207 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4209 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4211 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004212 verifyFormat("return\n"
4213 " // true if code is one of a or b.\n"
4214 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004215}
4216
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004217TEST_F(FormatTest, AlignsAfterOpenBracket) {
4218 verifyFormat(
4219 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4220 " aaaaaaaaa aaaaaaa) {}");
4221 verifyFormat(
4222 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4223 " aaaaaaaaaaa aaaaaaaaa);");
4224 verifyFormat(
4225 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4226 " aaaaaaaaaaaaaaaaaaaaa));");
4227 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004228 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004229 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4230 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4231 Style);
4232 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4233 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4234 Style);
4235 verifyFormat("SomeLongVariableName->someFunction(\n"
4236 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4237 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004238 verifyFormat(
4239 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4240 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4241 Style);
4242 verifyFormat(
4243 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4244 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4245 Style);
4246 verifyFormat(
4247 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4248 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4249 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004250
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004251 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4252 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4253 " b));",
4254 Style);
4255
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004256 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4257 Style.BinPackArguments = false;
4258 Style.BinPackParameters = false;
4259 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4260 " aaaaaaaaaaa aaaaaaaa,\n"
4261 " aaaaaaaaa aaaaaaa,\n"
4262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4263 Style);
4264 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4265 " aaaaaaaaaaa aaaaaaaaa,\n"
4266 " aaaaaaaaaaa aaaaaaaaa,\n"
4267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4268 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004269 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4270 " aaaaaaaaaaaaaaa,\n"
4271 " aaaaaaaaaaaaaaaaaaaaa,\n"
4272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004273 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004274 verifyFormat(
4275 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4276 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4277 Style);
4278 verifyFormat(
4279 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4280 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4281 Style);
4282 verifyFormat(
4283 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4284 " aaaaaaaaaaaaaaaaaaaaa(\n"
4285 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4286 " aaaaaaaaaaaaaaaa);",
4287 Style);
4288 verifyFormat(
4289 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4290 " aaaaaaaaaaaaaaaaaaaaa(\n"
4291 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4292 " aaaaaaaaaaaaaaaa);",
4293 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004294}
4295
Daniel Jasper3219e432014-12-02 13:24:51 +00004296TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4297 FormatStyle Style = getLLVMStyleWithColumns(40);
4298 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4299 " bbbbbbbbbbbbbbbbbbbbbb);",
4300 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004301 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004302 Style.AlignOperands = false;
4303 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4304 " bbbbbbbbbbbbbbbbbbbbbb);",
4305 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004306 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004307 Style.AlignOperands = true;
4308 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4309 " bbbbbbbbbbbbbbbbbbbbbb);",
4310 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004311 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004312 Style.AlignOperands = false;
4313 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4314 " bbbbbbbbbbbbbbbbbbbbbb);",
4315 Style);
4316}
4317
Daniel Jasper399d24b2013-01-09 07:06:56 +00004318TEST_F(FormatTest, BreaksConditionalExpressions) {
4319 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004320 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4321 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4322 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4323 verifyFormat(
4324 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004325 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4326 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004327 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004328 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4329 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4330 verifyFormat(
4331 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004332 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4333 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004334 verifyFormat(
4335 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4336 " : aaaaaaaaaaaaa);");
4337 verifyFormat(
4338 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004339 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004340 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4341 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004342 verifyFormat(
4343 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4344 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4345 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004346 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4347 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4349 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4351 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4353 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4355 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004358 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4360 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4362 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004363 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4364 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4365 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004366 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4368 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4369 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004370 verifyFormat(
4371 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4372 " ? aaaaaaaaaaaaaaa\n"
4373 " : aaaaaaaaaaaaaaa;");
4374 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004375 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004376 " ? b\n"
4377 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004378 verifyFormat("return aaaa == bbbb\n"
4379 " // comment\n"
4380 " ? aaaa\n"
4381 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004382 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004383 " format(TheLine.First,\n"
4384 " IndentForLevel[TheLine.Level] >= 0\n"
4385 " ? IndentForLevel[TheLine.Level]\n"
4386 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004387 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004388 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004389 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4390 " ? aaaaaaaaaaaaaaa\n"
4391 " : bbbbbbbbbbbbbbb //\n"
4392 " ? ccccccccccccccc\n"
4393 " : ddddddddddddddd;");
4394 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4395 " ? aaaaaaaaaaaaaaa\n"
4396 " : (bbbbbbbbbbbbbbb //\n"
4397 " ? ccccccccccccccc\n"
4398 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004399 verifyFormat(
4400 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4401 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4402 " aaaaaaaaaaaaaaaaaaaaa +\n"
4403 " aaaaaaaaaaaaaaaaaaaaa\n"
4404 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004405 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004406 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4407 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4408 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004409
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004410 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004411 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004412 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004413 "void f() {\n"
4414 " g(aaa,\n"
4415 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4417 " ? aaaaaaaaaaaaaaa\n"
4418 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004419 "}",
4420 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004421 verifyFormat(
4422 "void f() {\n"
4423 " g(aaa,\n"
4424 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4426 " ?: aaaaaaaaaaaaaaa);\n"
4427 "}",
4428 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004429
4430 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4431 " // comment.\n"
4432 " ccccccccccccccccccccccccccccccccccccccc\n"
4433 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4434 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004435
4436 // Assignments in conditional expressions. Apparently not uncommon :-(.
4437 verifyFormat("return a != b\n"
4438 " // comment\n"
4439 " ? a = b\n"
4440 " : a = b;");
4441 verifyFormat("return a != b\n"
4442 " // comment\n"
4443 " ? a = a != b\n"
4444 " // comment\n"
4445 " ? a = b\n"
4446 " : a\n"
4447 " : a;\n");
4448 verifyFormat("return a != b\n"
4449 " // comment\n"
4450 " ? a\n"
4451 " : a = a != b\n"
4452 " // comment\n"
4453 " ? a = b\n"
4454 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004455}
4456
Daniel Jasper165b29e2013-11-08 00:57:11 +00004457TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4458 FormatStyle Style = getLLVMStyle();
4459 Style.BreakBeforeTernaryOperators = false;
4460 Style.ColumnLimit = 70;
4461 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004462 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4465 Style);
4466 verifyFormat(
4467 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004468 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004470 Style);
4471 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004472 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4474 Style);
4475 verifyFormat(
4476 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004477 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004479 Style);
4480 verifyFormat(
4481 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4482 " aaaaaaaaaaaaa);",
4483 Style);
4484 verifyFormat(
4485 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4486 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4488 " aaaaaaaaaaaaa);",
4489 Style);
4490 verifyFormat(
4491 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4492 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4493 " aaaaaaaaaaaaa);",
4494 Style);
4495 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4498 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4500 Style);
4501 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4507 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4508 Style);
4509 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4513 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4514 Style);
4515 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4516 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4517 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4518 Style);
4519 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004521 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4523 Style);
4524 verifyFormat(
4525 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4526 " aaaaaaaaaaaaaaa :\n"
4527 " aaaaaaaaaaaaaaa;",
4528 Style);
4529 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4530 " aaaaaaaaa ?\n"
4531 " b :\n"
4532 " c);",
4533 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004534 verifyFormat("unsigned Indent =\n"
4535 " format(TheLine.First,\n"
4536 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4537 " IndentForLevel[TheLine.Level] :\n"
4538 " TheLine * 2,\n"
4539 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4540 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004541 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4542 " aaaaaaaaaaaaaaa :\n"
4543 " bbbbbbbbbbbbbbb ? //\n"
4544 " ccccccccccccccc :\n"
4545 " ddddddddddddddd;",
4546 Style);
4547 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4548 " aaaaaaaaaaaaaaa :\n"
4549 " (bbbbbbbbbbbbbbb ? //\n"
4550 " ccccccccccccccc :\n"
4551 " ddddddddddddddd);",
4552 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004553 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4554 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4555 " ccccccccccccccccccccccccccc;",
4556 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004557 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4558 " aaaaa :\n"
4559 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4560 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004561}
4562
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004563TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4564 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4565 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4566 verifyFormat("bool a = true, b = false;");
4567
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004568 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004570 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004571 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004572 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004573 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004574 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004575 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004576 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4577 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4578 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4579 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4580 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4581 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004582
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004583 FormatStyle Style = getGoogleStyle();
4584 Style.PointerAlignment = FormatStyle::PAS_Left;
4585 Style.DerivePointerAlignment = false;
4586 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4587 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4588 " *b = bbbbbbbbbbbbbbbbbbb;",
4589 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004590 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4591 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4592 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004593 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004594 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004595}
4596
Nico Weber4a5030c2013-01-12 01:28:06 +00004597TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4598 verifyFormat("arr[foo ? bar : baz];");
4599 verifyFormat("f()[foo ? bar : baz];");
4600 verifyFormat("(a + b)[foo ? bar : baz];");
4601 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4602}
4603
Daniel Jasperf7935112012-12-03 18:12:45 +00004604TEST_F(FormatTest, AlignsStringLiterals) {
4605 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4606 " \"short literal\");");
4607 verifyFormat(
4608 "looooooooooooooooooooooooongFunction(\n"
4609 " \"short literal\"\n"
4610 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004611 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4612 " \" string literals\",\n"
4613 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004614 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4615 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004616 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004617 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004618 getLLVMStyleWithColumns(28)));
4619 EXPECT_EQ(
4620 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4621 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4622 " \"aaaaaaaaaaaaaaaa\";",
4623 format("aaaaaa ="
4624 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4625 "aaaaaaaaaaaaaaaaaaaaa\" "
4626 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004627 verifyFormat("a = a + \"a\"\n"
4628 " \"a\"\n"
4629 " \"a\";");
4630 verifyFormat("f(\"a\", \"b\"\n"
4631 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004632
4633 verifyFormat(
4634 "#define LL_FORMAT \"ll\"\n"
4635 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4636 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004637
4638 verifyFormat("#define A(X) \\\n"
4639 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4640 " \"ccccc\"",
4641 getLLVMStyleWithColumns(23));
4642 verifyFormat("#define A \"def\"\n"
4643 "f(\"abc\" A \"ghi\"\n"
4644 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004645
4646 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004647 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004648 verifyFormat("#define A(X) \\\n"
4649 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4650 " L\"ccccc\"",
4651 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004652
4653 verifyFormat("f(@\"a\"\n"
4654 " @\"b\");");
4655 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004656 " @\"b\"\n"
4657 " @\"c\";");
4658 verifyFormat("NSString s = @\"a\"\n"
4659 " \"b\"\n"
4660 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004661}
4662
Zachary Turner448592e2015-12-18 22:20:15 +00004663TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004664 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004665 // No declarations or definitions should be moved to own line.
4666 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4667 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004668 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004669 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004670 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004671 "int f() { return 1; }\n"
4672 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004673 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004674
4675 // All declarations and definitions should have the return type moved to its
4676 // own
4677 // line.
4678 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4679 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004680 " int\n"
4681 " f() {\n"
4682 " return 1;\n"
4683 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004684 " int\n"
4685 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004686 "};\n"
4687 "int\n"
4688 "f() {\n"
4689 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004690 "}\n"
4691 "int\n"
4692 "g();\n",
4693 Style);
4694
4695 // Top-level definitions, and no kinds of declarations should have the
4696 // return type moved to its own line.
4697 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4698 verifyFormat("class B {\n"
4699 " int f() { return 1; }\n"
4700 " int g();\n"
4701 "};\n"
4702 "int\n"
4703 "f() {\n"
4704 " return 1;\n"
4705 "}\n"
4706 "int g();\n",
4707 Style);
4708
4709 // Top-level definitions and declarations should have the return type moved
4710 // to its own line.
4711 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4712 verifyFormat("class C {\n"
4713 " int f() { return 1; }\n"
4714 " int g();\n"
4715 "};\n"
4716 "int\n"
4717 "f() {\n"
4718 " return 1;\n"
4719 "}\n"
4720 "int\n"
4721 "g();\n",
4722 Style);
4723
4724 // All definitions should have the return type moved to its own line, but no
4725 // kinds of declarations.
4726 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4727 verifyFormat("class D {\n"
4728 " int\n"
4729 " f() {\n"
4730 " return 1;\n"
4731 " }\n"
4732 " int g();\n"
4733 "};\n"
4734 "int\n"
4735 "f() {\n"
4736 " return 1;\n"
4737 "}\n"
4738 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004739 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004740 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004741 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004742 " return \"\";\n"
4743 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004744 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004745 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004746 verifyFormat("template <class T>\n"
4747 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004748 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004749 " return NULL;\n"
4750 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004751 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004752 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004753 verifyFormat("class C {\n"
4754 " int\n"
4755 " operator+() {\n"
4756 " return 1;\n"
4757 " }\n"
4758 " int\n"
4759 " operator()() {\n"
4760 " return 1;\n"
4761 " }\n"
4762 "};\n",
4763 Style);
4764 verifyFormat("void\n"
4765 "A::operator()() {}\n"
4766 "void\n"
4767 "A::operator>>() {}\n"
4768 "void\n"
4769 "A::operator+() {}\n",
4770 Style);
4771 verifyFormat("void *operator new(std::size_t s);", // No break here.
4772 Style);
4773 verifyFormat("void *\n"
4774 "operator new(std::size_t s) {}",
4775 Style);
4776 verifyFormat("void *\n"
4777 "operator delete[](void *ptr) {}",
4778 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004779 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004780 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004781 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004782 "{\n"
4783 " return \"\";\n"
4784 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004785 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004786 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004787 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004788 "T *\n" // Problem here: no line break
4789 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004790 "{\n"
4791 " return NULL;\n"
4792 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004793 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004794 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004795}
4796
Alexander Kornienko58611712013-07-04 12:02:44 +00004797TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4798 FormatStyle NoBreak = getLLVMStyle();
4799 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4800 FormatStyle Break = getLLVMStyle();
4801 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004802 verifyFormat("aaaa = \"bbbb\"\n"
4803 " \"cccc\";",
4804 NoBreak);
4805 verifyFormat("aaaa =\n"
4806 " \"bbbb\"\n"
4807 " \"cccc\";",
4808 Break);
4809 verifyFormat("aaaa(\"bbbb\"\n"
4810 " \"cccc\");",
4811 NoBreak);
4812 verifyFormat("aaaa(\n"
4813 " \"bbbb\"\n"
4814 " \"cccc\");",
4815 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004816 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4817 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004818 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004819 verifyFormat("aaaa(qqq,\n"
4820 " \"bbbb\"\n"
4821 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004822 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004823 verifyFormat("aaaa(qqq,\n"
4824 " L\"bbbb\"\n"
4825 " L\"cccc\");",
4826 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004827 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4828 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004829 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004830 verifyFormat("string s = someFunction(\n"
4831 " \"abc\"\n"
4832 " \"abc\");",
4833 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004834
Daniel Jasper3251fff2014-06-10 06:27:23 +00004835 // As we break before unary operators, breaking right after them is bad.
4836 verifyFormat("string foo = abc ? \"x\"\n"
4837 " \"blah blah blah blah blah blah\"\n"
4838 " : \"y\";",
4839 Break);
4840
Daniel Jasperc834c702013-07-17 15:38:19 +00004841 // Don't break if there is no column gain.
4842 verifyFormat("f(\"aaaa\"\n"
4843 " \"bbbb\");",
4844 Break);
4845
4846 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004847 EXPECT_EQ("x = \"a\\\n"
4848 "b\\\n"
4849 "c\";",
4850 format("x = \"a\\\n"
4851 "b\\\n"
4852 "c\";",
4853 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004854 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004855 " \"a\\\n"
4856 "b\\\n"
4857 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004858 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004859 "b\\\n"
4860 "c\";",
4861 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004862
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00004863 EXPECT_EQ("NSString *const kString =\n"
4864 " @\"aaaa\"\n"
4865 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004866 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004867 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004868 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004869
4870 Break.ColumnLimit = 0;
4871 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004872}
4873
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004874TEST_F(FormatTest, AlignsPipes) {
4875 verifyFormat(
4876 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4877 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4878 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4879 verifyFormat(
4880 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4881 " << aaaaaaaaaaaaaaaaaaaa;");
4882 verifyFormat(
4883 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4884 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4885 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004886 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4887 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4888 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004889 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4890 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4891 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4892 verifyFormat(
4893 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4894 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4895 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004896 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4897 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4899 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004900 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4901 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004902 verifyFormat(
4903 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004905 verifyFormat(
4906 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4907 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004908
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004909 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4910 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004911 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4913 " aaaaaaaaaaaaaaaaaaaaa)\n"
4914 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004915 verifyFormat("LOG_IF(aaa == //\n"
4916 " bbb)\n"
4917 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004918
Daniel Jasper467ddb12013-08-12 12:58:05 +00004919 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004920 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4921 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004922 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4923 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4924 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004925 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4926 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004927 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4928 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4929 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4930 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4931 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4933 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004934
Daniel Jasperc238c872013-04-02 14:33:13 +00004935 verifyFormat(
4936 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4937 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004938
4939 // Incomplete string literal.
4940 EXPECT_EQ("llvm::errs() << \"\n"
4941 " << a;",
4942 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004943
4944 verifyFormat("void f() {\n"
4945 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4946 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4947 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004948
4949 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004950 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4951 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4952 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004953
4954 // Handle '\n'.
4955 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4956 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4957 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4958 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4959 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4960 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4961 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004962}
4963
Daniel Jasper7209bb92016-12-13 11:16:42 +00004964TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4965 verifyFormat("return out << \"somepacket = {\\n\"\n"
4966 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4967 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4968 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4969 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4970 " << \"}\";");
4971
4972 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4973 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4974 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4975 verifyFormat(
4976 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4977 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4978 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4979 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4980 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4981 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4982 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4983 verifyFormat(
4984 "void f() {\n"
4985 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4986 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4987 "}");
4988
4989 // Breaking before the first "<<" is generally not desirable.
4990 verifyFormat(
4991 "llvm::errs()\n"
4992 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4993 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4994 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4995 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4996 getLLVMStyleWithColumns(70));
4997 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4998 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4999 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5000 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5001 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5002 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5003 getLLVMStyleWithColumns(70));
5004
5005 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5006 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5007 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5008 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5009 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5010 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005011 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5012 " (aaaa + aaaa);",
5013 getLLVMStyleWithColumns(40));
5014 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5015 " (aaaaaaa + aaaaa));",
5016 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005017 verifyFormat(
5018 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5019 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5020 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005021}
5022
Daniel Jasperf7935112012-12-03 18:12:45 +00005023TEST_F(FormatTest, UnderstandsEquals) {
5024 verifyFormat(
5025 "aaaaaaaaaaaaaaaaa =\n"
5026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5027 verifyFormat(
5028 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005030 verifyFormat(
5031 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005032 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005033 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5035 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005036
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005037 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5038 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005039}
5040
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005041TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005042 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5043 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005044
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005045 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5046 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005047
5048 verifyFormat(
5049 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5050 " Parameter2);");
5051
5052 verifyFormat(
5053 "ShortObject->shortFunction(\n"
5054 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5055 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5056
5057 verifyFormat("loooooooooooooongFunction(\n"
5058 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5059
5060 verifyFormat(
5061 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5062 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5063
Daniel Jasper687af3b2013-02-14 14:26:07 +00005064 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5065 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005066 verifyFormat("void f() {\n"
5067 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5068 " .Times(2)\n"
5069 " .WillRepeatedly(Return(SomeValue));\n"
5070 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005071 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5072 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005073 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5075 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005076 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005077 verifyFormat("void f() {\n"
5078 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5079 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5080 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005081 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5082 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5083 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5084 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5085 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005086 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5087 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5088 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5089 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5090 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005091
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005092 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005093 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005094 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005095 verifyFormat(
5096 "aaaaaaaaaaa->aaaaaaaaa(\n"
5097 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5098 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005099
5100 verifyFormat(
5101 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005103 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5104 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5105 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5106 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005107
Daniel Jasper9b334242013-03-15 14:57:30 +00005108 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5110 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005111
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005112 FormatStyle NoBinPacking = getLLVMStyle();
5113 NoBinPacking.BinPackParameters = false;
5114 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5115 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5116 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5117 " aaaaaaaaaaaaaaaaaaa,\n"
5118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5119 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005120
5121 // If there is a subsequent call, change to hanging indentation.
5122 verifyFormat(
5123 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5124 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5125 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5126 verifyFormat(
5127 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5128 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005129 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5131 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5132 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5133 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5134 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005135}
5136
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005137TEST_F(FormatTest, WrapsTemplateDeclarations) {
5138 verifyFormat("template <typename T>\n"
5139 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005140 verifyFormat("template <typename T>\n"
5141 "// T should be one of {A, B}.\n"
5142 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005143 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005144 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005145 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005146 verifyFormat("template <typename T>\n"
5147 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5148 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005149 verifyFormat(
5150 "template <typename T>\n"
5151 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5152 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005153 verifyFormat(
5154 "template <typename T>\n"
5155 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5156 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005158 verifyFormat("template <typename T>\n"
5159 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005160 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005161 verifyFormat(
5162 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5163 " typename T4 = char>\n"
5164 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005165 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5166 " template <typename> class cccccccccccccccccccccc,\n"
5167 " typename ddddddddddddd>\n"
5168 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005169 verifyFormat(
5170 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005172
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005173 verifyFormat("void f() {\n"
5174 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5175 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5176 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005177
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005178 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005179 verifyFormat("template <typename T> void f();");
5180 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005181 verifyFormat(
5182 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5185 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5188 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5189 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005190 EXPECT_EQ("static_cast<A< //\n"
5191 " B> *>(\n"
5192 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005193 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005194 format("static_cast<A<//\n"
5195 " B>*>(\n"
5196 "\n"
5197 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005198 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5199 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005200
5201 FormatStyle AlwaysBreak = getLLVMStyle();
5202 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5203 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5204 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5205 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5206 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5207 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5208 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5209 verifyFormat("template <template <typename> class Fooooooo,\n"
5210 " template <typename> class Baaaaaaar>\n"
5211 "struct C {};",
5212 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005213 verifyFormat("template <typename T> // T can be A, B or C.\n"
5214 "struct C {};",
5215 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005216 verifyFormat("template <enum E> class A {\n"
5217 "public:\n"
5218 " E *f();\n"
5219 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005220}
5221
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005222TEST_F(FormatTest, WrapsTemplateParameters) {
5223 FormatStyle Style = getLLVMStyle();
5224 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5225 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5226 verifyFormat(
5227 "template <typename... a> struct q {};\n"
5228 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5229 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5230 " y;",
5231 Style);
5232 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5233 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5234 verifyFormat(
5235 "template <typename... a> struct r {};\n"
5236 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5237 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5238 " y;",
5239 Style);
5240 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5241 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5242 verifyFormat(
5243 "template <typename... a> struct s {};\n"
5244 "extern s<\n"
5245 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5246 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5247 " y;",
5248 Style);
5249 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5250 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5251 verifyFormat(
5252 "template <typename... a> struct t {};\n"
5253 "extern t<\n"
5254 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5255 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5256 " y;",
5257 Style);
5258}
5259
Daniel Jasper45797022013-01-25 10:57:27 +00005260TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5261 verifyFormat(
5262 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5264 verifyFormat(
5265 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5268
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005269 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005270 verifyFormat(
5271 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005274
Daniel Jasper45797022013-01-25 10:57:27 +00005275 verifyFormat(
5276 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005277 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005278
5279 // Breaking at nested name specifiers is generally not desirable.
5280 verifyFormat(
5281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5282 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005283
5284 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005285 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005288 " aaaaaaaaaaaaaaaaaaaaa);",
5289 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005290
5291 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5293 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005294}
5295
Daniel Jasperf7935112012-12-03 18:12:45 +00005296TEST_F(FormatTest, UnderstandsTemplateParameters) {
5297 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005298 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005299 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5300 verifyFormat("bool x = a < 1 || 2 > a;");
5301 verifyFormat("bool x = 5 < f<int>();");
5302 verifyFormat("bool x = f<int>() > 5;");
5303 verifyFormat("bool x = 5 < a<int>::x;");
5304 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5305 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5306
5307 verifyGoogleFormat("A<A<int>> a;");
5308 verifyGoogleFormat("A<A<A<int>>> a;");
5309 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005310 verifyGoogleFormat("A<A<int> > a;");
5311 verifyGoogleFormat("A<A<A<int> > > a;");
5312 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005313 verifyGoogleFormat("A<::A<int>> a;");
5314 verifyGoogleFormat("A<::A> a;");
5315 verifyGoogleFormat("A< ::A> a;");
5316 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005317 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5318 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005319 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5320 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005321 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5322 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005323
Nico Weber7533b4d2014-09-24 17:17:32 +00005324 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5325
Daniel Jasperf7935112012-12-03 18:12:45 +00005326 verifyFormat("test >> a >> b;");
5327 verifyFormat("test << a >> b;");
5328
5329 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005330 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005331 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005332 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5333 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005334 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005335 verifyFormat("f(a.operator()<A>());");
5336 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5337 " .template operator()<A>());",
5338 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005339
5340 // Not template parameters.
5341 verifyFormat("return a < b && c > d;");
5342 verifyFormat("void f() {\n"
5343 " while (a < b && c > d) {\n"
5344 " }\n"
5345 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005346 verifyFormat("template <typename... Types>\n"
5347 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005348
5349 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5351 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005352 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005353 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005354 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005355}
5356
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005357TEST_F(FormatTest, BitshiftOperatorWidth) {
5358 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5359 " bar */",
5360 format("int a=1<<2; /* foo\n"
5361 " bar */"));
5362
5363 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5364 " bar */",
5365 format("int b =256>>1 ; /* foo\n"
5366 " bar */"));
5367}
5368
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005369TEST_F(FormatTest, UnderstandsBinaryOperators) {
5370 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005371 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005372}
5373
5374TEST_F(FormatTest, UnderstandsPointersToMembers) {
5375 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005376 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005377 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005378 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005379 verifyFormat("void f() {\n"
5380 " (a->*f)();\n"
5381 " a->*x;\n"
5382 " (a.*f)();\n"
5383 " ((*a).*f)();\n"
5384 " a.*x;\n"
5385 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005386 verifyFormat("void f() {\n"
5387 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5388 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5389 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005390 verifyFormat(
5391 "(aaaaaaaaaa->*bbbbbbb)(\n"
5392 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005393 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005394 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005395 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005396}
5397
Daniel Jasper8dd40472012-12-21 09:41:31 +00005398TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005399 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005400 verifyFormat("f(-1, -2, -3);");
5401 verifyFormat("a[-1] = 5;");
5402 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005403 verifyFormat("if (i == -1) {\n}");
5404 verifyFormat("if (i != -1) {\n}");
5405 verifyFormat("if (i > -1) {\n}");
5406 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005407 verifyFormat("++(a->f());");
5408 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005409 verifyFormat("(a->f())++;");
5410 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005411 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005412
5413 verifyFormat("a-- > b;");
5414 verifyFormat("b ? -a : c;");
5415 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005416 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005417 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005418 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005419
5420 verifyFormat("return -1;");
5421 verifyFormat("switch (a) {\n"
5422 "case -1:\n"
5423 " break;\n"
5424 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005425 verifyFormat("#define X -1");
5426 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005427
Chandler Carruthf8b72662014-03-02 12:37:31 +00005428 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5429 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005430
5431 verifyFormat("int a = /* confusing comment */ -1;");
5432 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5433 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005434}
5435
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005436TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005437 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005438 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005439 "}");
5440 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005441 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005442 verifyFormat("*aaa = aaaaaaa( // break\n"
5443 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005444}
5445
Daniel Jasper8863ada2013-08-26 08:10:17 +00005446TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005447 verifyFormat("bool operator<();");
5448 verifyFormat("bool operator>();");
5449 verifyFormat("bool operator=();");
5450 verifyFormat("bool operator==();");
5451 verifyFormat("bool operator!=();");
5452 verifyFormat("int operator+();");
5453 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005454 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005455 verifyFormat("bool operator();");
5456 verifyFormat("bool operator()();");
5457 verifyFormat("bool operator[]();");
5458 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005459 verifyFormat("operator int();");
5460 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005461 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005462 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005463 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005464 verifyFormat("void *operator new(std::size_t size);");
5465 verifyFormat("void *operator new[](std::size_t size);");
5466 verifyFormat("void operator delete(void *ptr);");
5467 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005468 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5469 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005470 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005471 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005472
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005473 verifyFormat(
5474 "ostream &operator<<(ostream &OutputStream,\n"
5475 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005476 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5477 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5478 " return left.group < right.group;\n"
5479 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005480 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005481 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005482
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005483 verifyGoogleFormat("operator void*();");
5484 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005485 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005486
5487 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005488 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5489 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005490}
5491
Daniel Jasper1c220482015-02-25 10:30:06 +00005492TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005493 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5494 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5495 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5496 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5497 verifyFormat("Deleted &operator=(const Deleted &) &;");
5498 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5499 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5500 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5501 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5502 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5503 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005504 verifyFormat("void Fn(T const &) const &;");
5505 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005506 verifyFormat("template <typename T>\n"
5507 "void F(T) && = delete;",
5508 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005509
Daniel Jasperaf642c62015-08-25 13:40:51 +00005510 FormatStyle AlignLeft = getLLVMStyle();
5511 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005512 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005513 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5514 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5515 AlignLeft);
5516 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5517 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005518 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5519 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5520 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5521 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005522 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5523 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005524
5525 FormatStyle Spaces = getLLVMStyle();
5526 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005527 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5528 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5529 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5530 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005531
5532 Spaces.SpacesInCStyleCastParentheses = false;
5533 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005534 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5535 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5536 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5537 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005538}
5539
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005540TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005541 verifyFormat("void f() {\n"
5542 " A *a = new A;\n"
5543 " A *a = new (placement) A;\n"
5544 " delete a;\n"
5545 " delete (A *)a;\n"
5546 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005547 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5548 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005549 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5550 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5551 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005552 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005553}
5554
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005555TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005556 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005557 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005558 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005559 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005560 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005561 verifyIndependentOfContext("int a = b * 10;");
5562 verifyIndependentOfContext("int a = 10 * b;");
5563 verifyIndependentOfContext("int a = b * c;");
5564 verifyIndependentOfContext("int a += b * c;");
5565 verifyIndependentOfContext("int a -= b * c;");
5566 verifyIndependentOfContext("int a *= b * c;");
5567 verifyIndependentOfContext("int a /= b * c;");
5568 verifyIndependentOfContext("int a = *b;");
5569 verifyIndependentOfContext("int a = *b * c;");
5570 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005571 verifyIndependentOfContext("int a = b * (10);");
5572 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005573 verifyIndependentOfContext("return 10 * b;");
5574 verifyIndependentOfContext("return *b * *c;");
5575 verifyIndependentOfContext("return a & ~b;");
5576 verifyIndependentOfContext("f(b ? *c : *d);");
5577 verifyIndependentOfContext("int a = b ? *c : *d;");
5578 verifyIndependentOfContext("*b = a;");
5579 verifyIndependentOfContext("a * ~b;");
5580 verifyIndependentOfContext("a * !b;");
5581 verifyIndependentOfContext("a * +b;");
5582 verifyIndependentOfContext("a * -b;");
5583 verifyIndependentOfContext("a * ++b;");
5584 verifyIndependentOfContext("a * --b;");
5585 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005586 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005587 verifyIndependentOfContext("f() * b;");
5588 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005589 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005590 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005591 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005592 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005593 verifyIndependentOfContext("return sizeof(int **);");
5594 verifyIndependentOfContext("return sizeof(int ******);");
5595 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005596 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005597 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005598 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005599 verifyGoogleFormat("return sizeof(int**);");
5600 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5601 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005602 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005603 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005604 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005605 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005606 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005607 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005608 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005609 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005610 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005611 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005612 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005613 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005614 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005615 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005616 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005617 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005618 verifyFormat("void f(const MyOverride &override);");
5619 verifyFormat("void f(const MyFinal &final);");
5620 verifyIndependentOfContext("bool a = f() && override.f();");
5621 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005622
Daniel Jasper5b49f472013-01-23 12:10:53 +00005623 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005624
Daniel Jasper5b49f472013-01-23 12:10:53 +00005625 verifyIndependentOfContext("A<int *> a;");
5626 verifyIndependentOfContext("A<int **> a;");
5627 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005628 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005629 verifyIndependentOfContext(
5630 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005631 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005632 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005633 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005634 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005635 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005636
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005637 verifyFormat(
5638 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5640
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005641 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005642 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005643 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005644 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005645 verifyGoogleFormat("A<int*> a;");
5646 verifyGoogleFormat("A<int**> a;");
5647 verifyGoogleFormat("A<int*, int*> a;");
5648 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005649 verifyGoogleFormat("f(b ? *c : *d);");
5650 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005651 verifyGoogleFormat("Type* t = **x;");
5652 verifyGoogleFormat("Type* t = *++*x;");
5653 verifyGoogleFormat("*++*x;");
5654 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5655 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005656 verifyGoogleFormat(
5657 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005658 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005659 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5660 verifyGoogleFormat("template <typename T>\n"
5661 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005662
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005663 FormatStyle Left = getLLVMStyle();
5664 Left.PointerAlignment = FormatStyle::PAS_Left;
5665 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005666 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005667 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005668 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005669 verifyFormat("delete *x;", Left);
5670 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5671 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5672 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005673
Daniel Jasper5b49f472013-01-23 12:10:53 +00005674 verifyIndependentOfContext("a = *(x + y);");
5675 verifyIndependentOfContext("a = &(x + y);");
5676 verifyIndependentOfContext("*(x + y).call();");
5677 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005678 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005679
Daniel Jasper5b49f472013-01-23 12:10:53 +00005680 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005681 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005682 "int *MyValues = {\n"
5683 " *A, // Operator detection might be confused by the '{'\n"
5684 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005685 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005686
Daniel Jasper5b49f472013-01-23 12:10:53 +00005687 verifyIndependentOfContext("if (int *a = &b)");
5688 verifyIndependentOfContext("if (int &a = *b)");
5689 verifyIndependentOfContext("if (a & b[i])");
5690 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5691 verifyIndependentOfContext("if (*b[i])");
5692 verifyIndependentOfContext("if (int *a = (&b))");
5693 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005694 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005695 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005696 verifyFormat("void f() {\n"
5697 " for (const int &v : Values) {\n"
5698 " }\n"
5699 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005700 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5701 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005702 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005703
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005704 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005705 verifyFormat("#define MACRO \\\n"
5706 " int *i = a * b; \\\n"
5707 " void f(a *b);",
5708 getLLVMStyleWithColumns(19));
5709
Daniel Jasper97b89482013-03-13 07:49:51 +00005710 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005711 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005712 verifyIndependentOfContext("T **t = new T *;");
5713 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005714 verifyGoogleFormat("A = new SomeType*[Length]();");
5715 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005716 verifyGoogleFormat("T** t = new T*;");
5717 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005718
Daniel Jaspera65e8872014-03-25 10:52:45 +00005719 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5720 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005721 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005722 "typename t::if<x && y>::type f() {}");
5723 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005724 verifyFormat("vector<int *> v;");
5725 verifyFormat("vector<int *const> v;");
5726 verifyFormat("vector<int *const **const *> v;");
5727 verifyFormat("vector<int *volatile> v;");
5728 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005729 verifyFormat("foo<b && false>();");
5730 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005731 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005732 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005733 "template <class T, class = typename std::enable_if<\n"
5734 " std::is_integral<T>::value &&\n"
5735 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5736 "void F();",
5737 getLLVMStyleWithColumns(70));
5738 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005739 "template <class T,\n"
5740 " class = typename std::enable_if<\n"
5741 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005742 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5743 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005744 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005745 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005746 verifyFormat(
5747 "template <class T,\n"
5748 " class = typename ::std::enable_if<\n"
5749 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5750 "void F();",
5751 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005752
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005753 verifyIndependentOfContext("MACRO(int *i);");
5754 verifyIndependentOfContext("MACRO(auto *a);");
5755 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005756 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005757 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005758 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005759 // FIXME: Is there a way to make this work?
5760 // verifyIndependentOfContext("MACRO(A *a);");
5761
Daniel Jasper32ccb032014-06-23 07:36:18 +00005762 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005763 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005764
Daniel Jasper866468a2014-04-14 13:15:29 +00005765 EXPECT_EQ("#define OP(x) \\\n"
5766 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5767 " return s << a.DebugString(); \\\n"
5768 " }",
5769 format("#define OP(x) \\\n"
5770 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5771 " return s << a.DebugString(); \\\n"
5772 " }",
5773 getLLVMStyleWithColumns(50)));
5774
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005775 // FIXME: We cannot handle this case yet; we might be able to figure out that
5776 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005777 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005778
5779 FormatStyle PointerMiddle = getLLVMStyle();
5780 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5781 verifyFormat("delete *x;", PointerMiddle);
5782 verifyFormat("int * x;", PointerMiddle);
5783 verifyFormat("template <int * y> f() {}", PointerMiddle);
5784 verifyFormat("int * f(int * a) {}", PointerMiddle);
5785 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5786 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5787 verifyFormat("A<int *> a;", PointerMiddle);
5788 verifyFormat("A<int **> a;", PointerMiddle);
5789 verifyFormat("A<int *, int *> a;", PointerMiddle);
5790 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005791 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5792 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005793 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005794
5795 // Member function reference qualifiers aren't binary operators.
5796 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005797 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005798 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005799 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005800 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005801 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005802}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005803
Daniel Jasperee6d6502013-07-17 20:25:02 +00005804TEST_F(FormatTest, UnderstandsAttributes) {
5805 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005806 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5807 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005808 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005809 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005810 verifyFormat("__attribute__((nodebug)) void\n"
5811 "foo() {}\n",
5812 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005813}
5814
Daniel Jasper10cd5812013-05-06 06:35:44 +00005815TEST_F(FormatTest, UnderstandsEllipsis) {
5816 verifyFormat("int printf(const char *fmt, ...);");
5817 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005818 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5819
5820 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005821 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005822 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005823}
5824
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005825TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005826 EXPECT_EQ("int *a;\n"
5827 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005828 "int *a;",
5829 format("int *a;\n"
5830 "int* a;\n"
5831 "int *a;",
5832 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005833 EXPECT_EQ("int* a;\n"
5834 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005835 "int* a;",
5836 format("int* a;\n"
5837 "int* a;\n"
5838 "int *a;",
5839 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005840 EXPECT_EQ("int *a;\n"
5841 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005842 "int *a;",
5843 format("int *a;\n"
5844 "int * a;\n"
5845 "int * a;",
5846 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005847 EXPECT_EQ("auto x = [] {\n"
5848 " int *a;\n"
5849 " int *a;\n"
5850 " int *a;\n"
5851 "};",
5852 format("auto x=[]{int *a;\n"
5853 "int * a;\n"
5854 "int * a;};",
5855 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005856}
5857
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005858TEST_F(FormatTest, UnderstandsRvalueReferences) {
5859 verifyFormat("int f(int &&a) {}");
5860 verifyFormat("int f(int a, char &&b) {}");
5861 verifyFormat("void f() { int &&a = b; }");
5862 verifyGoogleFormat("int f(int a, char&& b) {}");
5863 verifyGoogleFormat("void f() { int&& a = b; }");
5864
Daniel Jasper1eff9082013-05-27 16:36:33 +00005865 verifyIndependentOfContext("A<int &&> a;");
5866 verifyIndependentOfContext("A<int &&, int &&> a;");
5867 verifyGoogleFormat("A<int&&> a;");
5868 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005869
5870 // Not rvalue references:
5871 verifyFormat("template <bool B, bool C> class A {\n"
5872 " static_assert(B && C, \"Something is wrong\");\n"
5873 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005874 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5875 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005876 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005877}
5878
Manuel Klimekc1237a82013-01-23 14:08:21 +00005879TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5880 verifyFormat("void f() {\n"
5881 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005882 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005883 "}",
5884 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005885}
5886
Daniel Jasperef906a92013-01-13 08:01:36 +00005887TEST_F(FormatTest, FormatsCasts) {
5888 verifyFormat("Type *A = static_cast<Type *>(P);");
5889 verifyFormat("Type *A = (Type *)P;");
5890 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5891 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005892 verifyFormat("int a = (int)2.0f;");
5893 verifyFormat("x[(int32)y];");
5894 verifyFormat("x = (int32)y;");
5895 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5896 verifyFormat("int a = (int)*b;");
5897 verifyFormat("int a = (int)2.0f;");
5898 verifyFormat("int a = (int)~0;");
5899 verifyFormat("int a = (int)++a;");
5900 verifyFormat("int a = (int)sizeof(int);");
5901 verifyFormat("int a = (int)+2;");
5902 verifyFormat("my_int a = (my_int)2.0f;");
5903 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005904 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005905 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005906 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005907 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005908 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005909
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005910 verifyFormat("void f() { my_int a = (my_int)*b; }");
5911 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5912 verifyFormat("my_int a = (my_int)~0;");
5913 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005914 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005915 verifyFormat("my_int a = (my_int)1;");
5916 verifyFormat("my_int a = (my_int *)1;");
5917 verifyFormat("my_int a = (const my_int)-1;");
5918 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005919 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005920 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005921 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005922 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005923
5924 // FIXME: single value wrapped with paren will be treated as cast.
5925 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005926
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005927 verifyFormat("{ (void)F; }");
5928
Daniel Jasper998cabc2013-07-18 14:46:07 +00005929 // Don't break after a cast's
5930 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5931 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5932 " bbbbbbbbbbbbbbbbbbbbbb);");
5933
Daniel Jasperef906a92013-01-13 08:01:36 +00005934 // These are not casts.
5935 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005936 verifyFormat("f(foo)->b;");
5937 verifyFormat("f(foo).b;");
5938 verifyFormat("f(foo)(b);");
5939 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005940 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005941 verifyFormat("(*funptr)(foo)[4];");
5942 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005943 verifyFormat("void f(int *);");
5944 verifyFormat("void f(int *) = 0;");
5945 verifyFormat("void f(SmallVector<int>) {}");
5946 verifyFormat("void f(SmallVector<int>);");
5947 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005948 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005949 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005950 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005951 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5952 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005953 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005954
Daniel Jasperba0bda92013-02-23 08:07:18 +00005955 // These are not casts, but at some point were confused with casts.
5956 verifyFormat("virtual void foo(int *) override;");
5957 verifyFormat("virtual void foo(char &) const;");
5958 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005959 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005960 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005961 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005962 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005963
5964 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5965 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005966 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005967 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005968 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5969 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5970 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005971}
5972
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005973TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005974 verifyFormat("A<bool()> a;");
5975 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005976 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005977 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005978 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005979 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005980 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005981 verifyFormat("template <class CallbackClass>\n"
5982 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005983
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005984 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5985 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005986 verifyGoogleFormat(
5987 "template <class CallbackClass>\n"
5988 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005989
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005990 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005991 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005992 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005993 verifyFormat("some_var = function(*some_pointer_var)[0];");
5994 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005995 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005996 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00005997 verifyFormat("std::function<\n"
5998 " LooooooooooongTemplatedType<\n"
5999 " SomeType>*(\n"
6000 " LooooooooooooooooongType type)>\n"
6001 " function;",
6002 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006003}
6004
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006005TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6006 verifyFormat("A (*foo_)[6];");
6007 verifyFormat("vector<int> (*foo_)[6];");
6008}
6009
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006010TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6011 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6012 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6013 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6014 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006015 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6016 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006017
6018 // Different ways of ()-initializiation.
6019 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6020 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6021 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6022 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6023 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6024 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006025 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6026 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006027
6028 // Lambdas should not confuse the variable declaration heuristic.
6029 verifyFormat("LooooooooooooooooongType\n"
6030 " variable(nullptr, [](A *a) {});",
6031 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006032}
6033
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006034TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006035 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006036 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006037 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006039 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006040 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006041 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6042 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006043 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6044 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006045 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6046 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006047 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6048 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006049 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6050 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006051 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6052 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6053 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6054 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006055 FormatStyle Indented = getLLVMStyle();
6056 Indented.IndentWrappedFunctionNames = true;
6057 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6058 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6059 Indented);
6060 verifyFormat(
6061 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6062 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6063 Indented);
6064 verifyFormat(
6065 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6066 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6067 Indented);
6068 verifyFormat(
6069 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6070 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6071 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006072
6073 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006074 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6075 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6076 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006077
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006078 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006079 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006080 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006081 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6082 " SourceLocation L, IdentifierIn *II,\n"
6083 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006084 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006085 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006086 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006087 " const SomeType<string, SomeOtherTemplateParameter>\n"
6088 " &ReallyReallyLongParameterName,\n"
6089 " const SomeType<string, SomeOtherTemplateParameter>\n"
6090 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006091 verifyFormat("template <typename A>\n"
6092 "SomeLoooooooooooooooooooooongType<\n"
6093 " typename some_namespace::SomeOtherType<A>::Type>\n"
6094 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006095
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006096 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006097 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6098 " aaaaaaaaaaaaaaaaaaaaaaa;");
6099 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006100 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6101 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006102 verifyGoogleFormat(
6103 "some_namespace::LongReturnType\n"
6104 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006105 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006106
6107 verifyGoogleFormat("template <typename T>\n"
6108 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006109 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006110 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6111 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006112
6113 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006114 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6115 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006116 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6117 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6118 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6119 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6120 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006123
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006124 verifyFormat("template <typename T> // Templates on own line.\n"
6125 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006126 "MyFunction(int a);",
6127 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006128}
6129
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006130TEST_F(FormatTest, FormatsArrays) {
6131 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6132 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006133 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6134 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006135 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6136 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006137 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6138 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6139 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6140 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6141 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6142 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6143 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6144 verifyFormat(
6145 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6146 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6147 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006148 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6149 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006150
6151 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006153 verifyFormat(
6154 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6155 " .aaaaaaa[0]\n"
6156 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006157 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006158
6159 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006160
6161 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6162 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006163}
6164
Daniel Jaspere9de2602012-12-06 09:56:08 +00006165TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6166 verifyFormat("(a)->b();");
6167 verifyFormat("--a;");
6168}
6169
Daniel Jasper8b529712012-12-04 13:02:32 +00006170TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006171 verifyFormat("#include <string>\n"
6172 "#include <a/b/c.h>\n"
6173 "#include \"a/b/string\"\n"
6174 "#include \"string.h\"\n"
6175 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006176 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006177 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006178 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006179 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006180 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006181 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6182 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006183 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6184 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006185
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006186 verifyFormat("#import <string>");
6187 verifyFormat("#import <a/b/c.h>");
6188 verifyFormat("#import \"a/b/string\"");
6189 verifyFormat("#import \"string.h\"");
6190 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006191 verifyFormat("#if __has_include(<strstream>)\n"
6192 "#include <strstream>\n"
6193 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006194
Daniel Jasper343643b2014-08-13 08:29:18 +00006195 verifyFormat("#define MY_IMPORT <a/b>");
6196
Nico Weber21088802017-02-10 19:36:52 +00006197 verifyFormat("#if __has_include(<a/b>)");
6198 verifyFormat("#if __has_include_next(<a/b>)");
6199 verifyFormat("#define F __has_include(<a/b>)");
6200 verifyFormat("#define F __has_include_next(<a/b>)");
6201
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006202 // Protocol buffer definition or missing "#".
6203 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6204 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006205
6206 FormatStyle Style = getLLVMStyle();
6207 Style.AlwaysBreakBeforeMultilineStrings = true;
6208 Style.ColumnLimit = 0;
6209 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006210
6211 // But 'import' might also be a regular C++ namespace.
6212 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006214}
6215
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006216//===----------------------------------------------------------------------===//
6217// Error recovery tests.
6218//===----------------------------------------------------------------------===//
6219
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006220TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006221 FormatStyle NoBinPacking = getLLVMStyle();
6222 NoBinPacking.BinPackParameters = false;
6223 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6224 " double *min_x,\n"
6225 " double *max_x,\n"
6226 " double *min_y,\n"
6227 " double *max_y,\n"
6228 " double *min_z,\n"
6229 " double *max_z, ) {}",
6230 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006231}
6232
Daniel Jasper83a54d22013-01-10 09:26:47 +00006233TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006234 verifyFormat("void f() { return; }\n42");
6235 verifyFormat("void f() {\n"
6236 " if (0)\n"
6237 " return;\n"
6238 "}\n"
6239 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006240 verifyFormat("void f() { return }\n42");
6241 verifyFormat("void f() {\n"
6242 " if (0)\n"
6243 " return\n"
6244 "}\n"
6245 "42");
6246}
6247
6248TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6249 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6250 EXPECT_EQ("void f() {\n"
6251 " if (a)\n"
6252 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006253 "}",
6254 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006255 EXPECT_EQ("namespace N {\n"
6256 "void f()\n"
6257 "}",
6258 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006259 EXPECT_EQ("namespace N {\n"
6260 "void f() {}\n"
6261 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006262 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006263 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006264}
6265
Daniel Jasper2df93312013-01-09 10:16:05 +00006266TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6267 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006268 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006269 " b;",
6270 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006271 verifyFormat("function(\n"
6272 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006273 " LoooooooooooongArgument);\n",
6274 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006275}
6276
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006277TEST_F(FormatTest, IncorrectAccessSpecifier) {
6278 verifyFormat("public:");
6279 verifyFormat("class A {\n"
6280 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006281 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006282 "};");
6283 verifyFormat("public\n"
6284 "int qwerty;");
6285 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006286 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006287 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006288 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006289 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006290 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006291}
Daniel Jasperf7935112012-12-03 18:12:45 +00006292
Daniel Jasper291f9362013-03-20 15:58:10 +00006293TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6294 verifyFormat("{");
6295 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006296 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006297}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006298
6299TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006300 verifyFormat("do {\n}");
6301 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006302 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006303 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006304 "wheeee(fun);");
6305 verifyFormat("do {\n"
6306 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006307 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006308}
6309
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006310TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006311 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006312 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006313 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006314 verifyFormat("while {\n foo;\n foo();\n}");
6315 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006316}
6317
Daniel Jasperc0880a92013-01-04 18:52:56 +00006318TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006319 verifyIncompleteFormat("namespace {\n"
6320 "class Foo { Foo (\n"
6321 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006322 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006323}
6324
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006325TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006326 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006327 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6328 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006329 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006330
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006331 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006332 " {\n"
6333 " breakme(\n"
6334 " qwe);\n"
6335 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006336 format("{\n"
6337 " {\n"
6338 " breakme(qwe);\n"
6339 "}\n",
6340 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006341}
6342
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006343TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006344 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006345 " avariable,\n"
6346 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006347 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006348}
6349
Manuel Klimek762dd182013-01-21 10:07:49 +00006350TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006351 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006352}
6353
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006354TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006355 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006356 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006357 " 1,\n"
6358 " 2,\n"
6359 " 3,\n"
6360 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006361 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006362 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6363 verifyFormat("f({1, 2});");
6364 verifyFormat("auto v = Foo{-1};");
6365 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6366 verifyFormat("Class::Class : member{1, 2, 3} {}");
6367 verifyFormat("new vector<int>{1, 2, 3};");
6368 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006369 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006370 verifyFormat("return {arg1, arg2};");
6371 verifyFormat("return {arg1, SomeType{parameter}};");
6372 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6373 verifyFormat("new T{arg1, arg2};");
6374 verifyFormat("f(MyMap[{composite, key}]);");
6375 verifyFormat("class Class {\n"
6376 " T member = {arg1, arg2};\n"
6377 "};");
6378 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006379 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6380 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006381 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6382 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006383
Daniel Jasper438059e2014-05-22 12:11:13 +00006384 verifyFormat("int foo(int i) { return fo1{}(i); }");
6385 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006386 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006387 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006388 verifyFormat("Node n{1, Node{1000}, //\n"
6389 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006390 verifyFormat("Aaaa aaaaaaa{\n"
6391 " {\n"
6392 " aaaa,\n"
6393 " },\n"
6394 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006395 verifyFormat("class C : public D {\n"
6396 " SomeClass SC{2};\n"
6397 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006398 verifyFormat("class C : public A {\n"
6399 " class D : public B {\n"
6400 " void f() { int i{2}; }\n"
6401 " };\n"
6402 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006403 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006404
Francois Ferrandd2130f52017-06-30 20:00:02 +00006405 // Binpacking only if there is no trailing comma
6406 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6407 " cccccccccc, dddddddddd};",
6408 getLLVMStyleWithColumns(50));
6409 verifyFormat("const Aaaaaa aaaaa = {\n"
6410 " aaaaaaaaaaa,\n"
6411 " bbbbbbbbbbb,\n"
6412 " ccccccccccc,\n"
6413 " ddddddddddd,\n"
6414 "};", getLLVMStyleWithColumns(50));
6415
Daniel Jaspere4ada022016-12-13 10:05:03 +00006416 // Cases where distinguising braced lists and blocks is hard.
6417 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6418 verifyFormat("void f() {\n"
6419 " return; // comment\n"
6420 "}\n"
6421 "SomeType t;");
6422 verifyFormat("void f() {\n"
6423 " if (a) {\n"
6424 " f();\n"
6425 " }\n"
6426 "}\n"
6427 "SomeType t;");
6428
Daniel Jasper08434342015-05-26 07:26:26 +00006429 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006430 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006431 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006432 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6433 " bbbbb,\n"
6434 " ccccc,\n"
6435 " ddddd,\n"
6436 " eeeee,\n"
6437 " ffffff,\n"
6438 " ggggg,\n"
6439 " hhhhhh,\n"
6440 " iiiiii,\n"
6441 " jjjjjj,\n"
6442 " kkkkkk};",
6443 NoBinPacking);
6444 verifyFormat("const Aaaaaa aaaaa = {\n"
6445 " aaaaa,\n"
6446 " bbbbb,\n"
6447 " ccccc,\n"
6448 " ddddd,\n"
6449 " eeeee,\n"
6450 " ffffff,\n"
6451 " ggggg,\n"
6452 " hhhhhh,\n"
6453 " iiiiii,\n"
6454 " jjjjjj,\n"
6455 " kkkkkk,\n"
6456 "};",
6457 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006458 verifyFormat(
6459 "const Aaaaaa aaaaa = {\n"
6460 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6461 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6462 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6463 "};",
6464 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006465
Chandler Carruthf8b72662014-03-02 12:37:31 +00006466 // FIXME: The alignment of these trailing comments might be bad. Then again,
6467 // this might be utterly useless in real code.
6468 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006469 " : some_value{ //\n"
6470 " aaaaaaa, //\n"
6471 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006472
Chandler Carruthf8b72662014-03-02 12:37:31 +00006473 // In braced lists, the first comment is always assumed to belong to the
6474 // first element. Thus, it can be moved to the next or previous line as
6475 // appropriate.
6476 EXPECT_EQ("function({// First element:\n"
6477 " 1,\n"
6478 " // Second element:\n"
6479 " 2});",
6480 format("function({\n"
6481 " // First element:\n"
6482 " 1,\n"
6483 " // Second element:\n"
6484 " 2});"));
6485 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6486 " // First element:\n"
6487 " 1,\n"
6488 " // Second element:\n"
6489 " 2};",
6490 format("std::vector<int> MyNumbers{// First element:\n"
6491 " 1,\n"
6492 " // Second element:\n"
6493 " 2};",
6494 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006495 // A trailing comma should still lead to an enforced line break and no
6496 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006497 EXPECT_EQ("vector<int> SomeVector = {\n"
6498 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006499 " 1,\n"
6500 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006501 "};",
6502 format("vector<int> SomeVector = { // aaa\n"
6503 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006504
Chandler Carruthf8b72662014-03-02 12:37:31 +00006505 FormatStyle ExtraSpaces = getLLVMStyle();
6506 ExtraSpaces.Cpp11BracedListStyle = false;
6507 ExtraSpaces.ColumnLimit = 75;
6508 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6509 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6510 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6511 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6512 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6513 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6514 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6515 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6516 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6517 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6518 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6519 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6520 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6521 verifyFormat("class Class {\n"
6522 " T member = { arg1, arg2 };\n"
6523 "};",
6524 ExtraSpaces);
6525 verifyFormat(
6526 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6527 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6528 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6529 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6530 ExtraSpaces);
6531 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006532 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006533 ExtraSpaces);
6534 verifyFormat(
6535 "someFunction(OtherParam,\n"
6536 " BracedList{ // comment 1 (Forcing interesting break)\n"
6537 " param1, param2,\n"
6538 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006539 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006540 ExtraSpaces);
6541 verifyFormat(
6542 "std::this_thread::sleep_for(\n"
6543 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6544 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006545 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006546 " aaaaaaa,\n"
6547 " aaaaaaaaaa,\n"
6548 " aaaaa,\n"
6549 " aaaaaaaaaaaaaaa,\n"
6550 " aaa,\n"
6551 " aaaaaaaaaa,\n"
6552 " a,\n"
6553 " aaaaaaaaaaaaaaaaaaaaa,\n"
6554 " aaaaaaaaaaaa,\n"
6555 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6556 " aaaaaaa,\n"
6557 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006558 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006559 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6560 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006561}
6562
Daniel Jasper33b909c2013-10-25 14:29:37 +00006563TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006564 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6565 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6566 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6567 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6568 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6569 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006570 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006571 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006572 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006573 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6574 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006575 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006576 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6577 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6578 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6579 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6580 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6581 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6582 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006583 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006584 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6585 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006586 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6587 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6588 " // Separating comment.\n"
6589 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6590 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6591 " // Leading comment\n"
6592 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6593 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006594 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6595 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006596 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006597 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6598 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006599 getLLVMStyleWithColumns(38));
6600 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006601 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6602 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006603 verifyFormat(
6604 "static unsigned SomeValues[10][3] = {\n"
6605 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6606 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6607 verifyFormat("static auto fields = new vector<string>{\n"
6608 " \"aaaaaaaaaaaaa\",\n"
6609 " \"aaaaaaaaaaaaa\",\n"
6610 " \"aaaaaaaaaaaa\",\n"
6611 " \"aaaaaaaaaaaaaa\",\n"
6612 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6613 " \"aaaaaaaaaaaa\",\n"
6614 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6615 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006616 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6617 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6618 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6619 " 3, cccccccccccccccccccccc};",
6620 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006621
6622 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006623 verifyFormat("vector<int> x = {\n"
6624 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6625 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006626 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006627 verifyFormat("vector<int> x = {\n"
6628 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006629 "};",
6630 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006631 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6632 " 1, 1, 1, 1,\n"
6633 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006634 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006635
Daniel Jasper60c27072015-05-13 08:16:00 +00006636 // Trailing comment in the first line.
6637 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6638 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6639 " 111111111, 222222222, 3333333333, 444444444, //\n"
6640 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006641 // Trailing comment in the last line.
6642 verifyFormat("int aaaaa[] = {\n"
6643 " 1, 2, 3, // comment\n"
6644 " 4, 5, 6 // comment\n"
6645 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006646
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006647 // With nested lists, we should either format one item per line or all nested
6648 // lists one on line.
6649 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006650 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6651 " {aaaaaaaaaaaaaaaaaaa},\n"
6652 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6653 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006654 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006655 verifyFormat(
6656 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006657 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6658 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6659 " {aaa, aaa},\n"
6660 " {aaa, aaa},\n"
6661 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6662 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6663 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006664
6665 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006666 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006667 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006668
6669 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006670
Daniel Jaspereb65e912015-12-21 18:31:15 +00006671 // No braced initializer here.
6672 verifyFormat("void f() {\n"
6673 " struct Dummy {};\n"
6674 " f(v);\n"
6675 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006676
6677 // Long lists should be formatted in columns even if they are nested.
6678 verifyFormat(
6679 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6680 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6681 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6682 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6683 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6684 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006685
6686 // Allow "single-column" layout even if that violates the column limit. There
6687 // isn't going to be a better way.
6688 verifyFormat("std::vector<int> a = {\n"
6689 " aaaaaaaa,\n"
6690 " aaaaaaaa,\n"
6691 " aaaaaaaa,\n"
6692 " aaaaaaaa,\n"
6693 " aaaaaaaaaa,\n"
6694 " aaaaaaaa,\n"
6695 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6696 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006697 verifyFormat("vector<int> aaaa = {\n"
6698 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6699 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6700 " aaaaaa.aaaaaaa,\n"
6701 " aaaaaa.aaaaaaa,\n"
6702 " aaaaaa.aaaaaaa,\n"
6703 " aaaaaa.aaaaaaa,\n"
6704 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006705
6706 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006707 verifyFormat("someFunction(Param, {List1, List2,\n"
6708 " List3});",
6709 getLLVMStyleWithColumns(35));
6710 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006711 " {List1, List2,\n"
6712 " List3});",
6713 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006714 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6715 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006716}
6717
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006718TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006719 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006720 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006721
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006722 verifyFormat("void f() { return 42; }");
6723 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006724 " return 42;\n"
6725 "}",
6726 DoNotMerge);
6727 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006728 " // Comment\n"
6729 "}");
6730 verifyFormat("{\n"
6731 "#error {\n"
6732 " int a;\n"
6733 "}");
6734 verifyFormat("{\n"
6735 " int a;\n"
6736 "#error {\n"
6737 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006738 verifyFormat("void f() {} // comment");
6739 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006740 verifyFormat("void f() {\n"
6741 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006742 DoNotMerge);
6743 verifyFormat("void f() {\n"
6744 " int a;\n"
6745 "} // comment",
6746 DoNotMerge);
6747 verifyFormat("void f() {\n"
6748 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006749 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006750
6751 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6752 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6753
6754 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6755 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006756 verifyFormat("class C {\n"
6757 " C()\n"
6758 " : iiiiiiii(nullptr),\n"
6759 " kkkkkkk(nullptr),\n"
6760 " mmmmmmm(nullptr),\n"
6761 " nnnnnnn(nullptr) {}\n"
6762 "};",
6763 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006764
6765 FormatStyle NoColumnLimit = getLLVMStyle();
6766 NoColumnLimit.ColumnLimit = 0;
6767 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6768 EXPECT_EQ("class C {\n"
6769 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006770 "};",
6771 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006772 EXPECT_EQ("A()\n"
6773 " : b(0) {\n"
6774 "}",
6775 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6776
6777 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006778 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6779 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006780 EXPECT_EQ("A()\n"
6781 " : b(0) {\n"
6782 "}",
6783 format("A():b(0){}", DoNotMergeNoColumnLimit));
6784 EXPECT_EQ("A()\n"
6785 " : b(0) {\n"
6786 "}",
6787 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006788
6789 verifyFormat("#define A \\\n"
6790 " void f() { \\\n"
6791 " int i; \\\n"
6792 " }",
6793 getLLVMStyleWithColumns(20));
6794 verifyFormat("#define A \\\n"
6795 " void f() { int i; }",
6796 getLLVMStyleWithColumns(21));
6797 verifyFormat("#define A \\\n"
6798 " void f() { \\\n"
6799 " int i; \\\n"
6800 " } \\\n"
6801 " int j;",
6802 getLLVMStyleWithColumns(22));
6803 verifyFormat("#define A \\\n"
6804 " void f() { int i; } \\\n"
6805 " int j;",
6806 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006807}
6808
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006809TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6810 FormatStyle MergeEmptyOnly = getLLVMStyle();
6811 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6812 verifyFormat("class C {\n"
6813 " int f() {}\n"
6814 "};",
6815 MergeEmptyOnly);
6816 verifyFormat("class C {\n"
6817 " int f() {\n"
6818 " return 42;\n"
6819 " }\n"
6820 "};",
6821 MergeEmptyOnly);
6822 verifyFormat("int f() {}", MergeEmptyOnly);
6823 verifyFormat("int f() {\n"
6824 " return 42;\n"
6825 "}",
6826 MergeEmptyOnly);
6827
6828 // Also verify behavior when BraceWrapping.AfterFunction = true
6829 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6830 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6831 verifyFormat("int f() {}", MergeEmptyOnly);
6832 verifyFormat("class C {\n"
6833 " int f() {}\n"
6834 "};",
6835 MergeEmptyOnly);
6836}
6837
Daniel Jasperd74cf402014-04-08 12:46:38 +00006838TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6839 FormatStyle MergeInlineOnly = getLLVMStyle();
6840 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6841 verifyFormat("class C {\n"
6842 " int f() { return 42; }\n"
6843 "};",
6844 MergeInlineOnly);
6845 verifyFormat("int f() {\n"
6846 " return 42;\n"
6847 "}",
6848 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006849
6850 // SFS_Inline implies SFS_Empty
6851 verifyFormat("class C {\n"
6852 " int f() {}\n"
6853 "};",
6854 MergeInlineOnly);
6855 verifyFormat("int f() {}", MergeInlineOnly);
6856
6857 // Also verify behavior when BraceWrapping.AfterFunction = true
6858 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6859 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6860 verifyFormat("class C {\n"
6861 " int f() { return 42; }\n"
6862 "};",
6863 MergeInlineOnly);
6864 verifyFormat("int f()\n"
6865 "{\n"
6866 " return 42;\n"
6867 "}",
6868 MergeInlineOnly);
6869
6870 // SFS_Inline implies SFS_Empty
6871 verifyFormat("int f() {}", MergeInlineOnly);
6872 verifyFormat("class C {\n"
6873 " int f() {}\n"
6874 "};",
6875 MergeInlineOnly);
6876}
6877
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00006878TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6879 FormatStyle MergeInlineOnly = getLLVMStyle();
6880 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6881 FormatStyle::SFS_InlineOnly;
6882 verifyFormat("class C {\n"
6883 " int f() { return 42; }\n"
6884 "};",
6885 MergeInlineOnly);
6886 verifyFormat("int f() {\n"
6887 " return 42;\n"
6888 "}",
6889 MergeInlineOnly);
6890
6891 // SFS_InlineOnly does not imply SFS_Empty
6892 verifyFormat("class C {\n"
6893 " int f() {}\n"
6894 "};",
6895 MergeInlineOnly);
6896 verifyFormat("int f() {\n"
6897 "}",
6898 MergeInlineOnly);
6899
6900 // Also verify behavior when BraceWrapping.AfterFunction = true
6901 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6902 MergeInlineOnly.BraceWrapping.AfterFunction = true;
6903 verifyFormat("class C {\n"
6904 " int f() { return 42; }\n"
6905 "};",
6906 MergeInlineOnly);
6907 verifyFormat("int f()\n"
6908 "{\n"
6909 " return 42;\n"
6910 "}",
6911 MergeInlineOnly);
6912
6913 // SFS_InlineOnly does not imply SFS_Empty
6914 verifyFormat("int f()\n"
6915 "{\n"
6916 "}",
6917 MergeInlineOnly);
6918 verifyFormat("class C {\n"
6919 " int f() {}\n"
6920 "};",
6921 MergeInlineOnly);
6922}
6923
Francois Ferrandad722562017-06-30 20:25:55 +00006924TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006925 FormatStyle Style = getLLVMStyle();
6926 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6927 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6928 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00006929 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006930 Style.ColumnLimit = 40;
6931
6932 verifyFormat("int f()\n"
6933 "{}",
6934 Style);
6935 verifyFormat("int f()\n"
6936 "{\n"
6937 " return 42;\n"
6938 "}",
6939 Style);
6940 verifyFormat("int f()\n"
6941 "{\n"
6942 " // some comment\n"
6943 "}",
6944 Style);
6945
6946 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6947 verifyFormat("int f() {}", Style);
6948 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6949 "{}",
6950 Style);
6951 verifyFormat("int f()\n"
6952 "{\n"
6953 " return 0;\n"
6954 "}",
6955 Style);
6956
6957 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6958 verifyFormat("class Foo {\n"
6959 " int f() {}\n"
6960 "};\n",
6961 Style);
6962 verifyFormat("class Foo {\n"
6963 " int f() { return 0; }\n"
6964 "};\n",
6965 Style);
6966 verifyFormat("class Foo {\n"
6967 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6968 " {}\n"
6969 "};\n",
6970 Style);
6971 verifyFormat("class Foo {\n"
6972 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6973 " {\n"
6974 " return 0;\n"
6975 " }\n"
6976 "};\n",
6977 Style);
6978
6979 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
6980 verifyFormat("int f() {}", Style);
6981 verifyFormat("int f() { return 0; }", Style);
6982 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6983 "{}",
6984 Style);
6985 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
6986 "{\n"
6987 " return 0;\n"
6988 "}",
6989 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00006990}
6991
Francois Ferrandad722562017-06-30 20:25:55 +00006992TEST_F(FormatTest, SplitEmptyClass) {
6993 FormatStyle Style = getLLVMStyle();
6994 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
6995 Style.BraceWrapping.AfterClass = true;
6996 Style.BraceWrapping.SplitEmptyRecord = false;
6997
6998 verifyFormat("class Foo\n"
6999 "{};",
7000 Style);
7001 verifyFormat("/* something */ class Foo\n"
7002 "{};",
7003 Style);
7004 verifyFormat("template <typename X> class Foo\n"
7005 "{};",
7006 Style);
7007 verifyFormat("class Foo\n"
7008 "{\n"
7009 " Foo();\n"
7010 "};",
7011 Style);
7012 verifyFormat("typedef class Foo\n"
7013 "{\n"
7014 "} Foo_t;",
7015 Style);
7016}
7017
7018TEST_F(FormatTest, SplitEmptyStruct) {
7019 FormatStyle Style = getLLVMStyle();
7020 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7021 Style.BraceWrapping.AfterStruct = true;
7022 Style.BraceWrapping.SplitEmptyRecord = false;
7023
7024 verifyFormat("struct Foo\n"
7025 "{};",
7026 Style);
7027 verifyFormat("/* something */ struct Foo\n"
7028 "{};",
7029 Style);
7030 verifyFormat("template <typename X> struct Foo\n"
7031 "{};",
7032 Style);
7033 verifyFormat("struct Foo\n"
7034 "{\n"
7035 " Foo();\n"
7036 "};",
7037 Style);
7038 verifyFormat("typedef struct Foo\n"
7039 "{\n"
7040 "} Foo_t;",
7041 Style);
7042 //typedef struct Bar {} Bar_t;
7043}
7044
7045TEST_F(FormatTest, SplitEmptyUnion) {
7046 FormatStyle Style = getLLVMStyle();
7047 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7048 Style.BraceWrapping.AfterUnion = true;
7049 Style.BraceWrapping.SplitEmptyRecord = false;
7050
7051 verifyFormat("union Foo\n"
7052 "{};",
7053 Style);
7054 verifyFormat("/* something */ union Foo\n"
7055 "{};",
7056 Style);
7057 verifyFormat("union Foo\n"
7058 "{\n"
7059 " A,\n"
7060 "};",
7061 Style);
7062 verifyFormat("typedef union Foo\n"
7063 "{\n"
7064 "} Foo_t;",
7065 Style);
7066}
7067
7068TEST_F(FormatTest, SplitEmptyNamespace) {
7069 FormatStyle Style = getLLVMStyle();
7070 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7071 Style.BraceWrapping.AfterNamespace = true;
7072 Style.BraceWrapping.SplitEmptyNamespace = false;
7073
7074 verifyFormat("namespace Foo\n"
7075 "{};",
7076 Style);
7077 verifyFormat("/* something */ namespace Foo\n"
7078 "{};",
7079 Style);
7080 verifyFormat("inline namespace Foo\n"
7081 "{};",
7082 Style);
7083 verifyFormat("namespace Foo\n"
7084 "{\n"
7085 "void Bar();\n"
7086 "};",
7087 Style);
7088}
7089
7090TEST_F(FormatTest, NeverMergeShortRecords) {
7091 FormatStyle Style = getLLVMStyle();
7092
7093 verifyFormat("class Foo {\n"
7094 " Foo();\n"
7095 "};",
7096 Style);
7097 verifyFormat("typedef class Foo {\n"
7098 " Foo();\n"
7099 "} Foo_t;",
7100 Style);
7101 verifyFormat("struct Foo {\n"
7102 " Foo();\n"
7103 "};",
7104 Style);
7105 verifyFormat("typedef struct Foo {\n"
7106 " Foo();\n"
7107 "} Foo_t;",
7108 Style);
7109 verifyFormat("union Foo {\n"
7110 " A,\n"
7111 "};",
7112 Style);
7113 verifyFormat("typedef union Foo {\n"
7114 " A,\n"
7115 "} Foo_t;",
7116 Style);
7117 verifyFormat("namespace Foo {\n"
7118 "void Bar();\n"
7119 "};",
7120 Style);
7121
7122 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7123 Style.BraceWrapping.AfterClass = true;
7124 Style.BraceWrapping.AfterStruct = true;
7125 Style.BraceWrapping.AfterUnion = true;
7126 Style.BraceWrapping.AfterNamespace = true;
7127 verifyFormat("class Foo\n"
7128 "{\n"
7129 " Foo();\n"
7130 "};",
7131 Style);
7132 verifyFormat("typedef class Foo\n"
7133 "{\n"
7134 " Foo();\n"
7135 "} Foo_t;",
7136 Style);
7137 verifyFormat("struct Foo\n"
7138 "{\n"
7139 " Foo();\n"
7140 "};",
7141 Style);
7142 verifyFormat("typedef struct Foo\n"
7143 "{\n"
7144 " Foo();\n"
7145 "} Foo_t;",
7146 Style);
7147 verifyFormat("union Foo\n"
7148 "{\n"
7149 " A,\n"
7150 "};",
7151 Style);
7152 verifyFormat("typedef union Foo\n"
7153 "{\n"
7154 " A,\n"
7155 "} Foo_t;",
7156 Style);
7157 verifyFormat("namespace Foo\n"
7158 "{\n"
7159 "void Bar();\n"
7160 "};",
7161 Style);
7162}
7163
Manuel Klimeke01bab52013-01-15 13:38:33 +00007164TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7165 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007166 verifyFormat("struct foo a = {bar};\nint n;");
7167 verifyFormat("class foo a = {bar};\nint n;");
7168 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007169
7170 // Elaborate types inside function definitions.
7171 verifyFormat("struct foo f() {}\nint n;");
7172 verifyFormat("class foo f() {}\nint n;");
7173 verifyFormat("union foo f() {}\nint n;");
7174
7175 // Templates.
7176 verifyFormat("template <class X> void f() {}\nint n;");
7177 verifyFormat("template <struct X> void f() {}\nint n;");
7178 verifyFormat("template <union X> void f() {}\nint n;");
7179
7180 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007181 verifyFormat("struct {\n} n;");
7182 verifyFormat(
7183 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007184 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007185 verifyFormat("class MACRO Z {\n} n;");
7186 verifyFormat("class MACRO(X) Z {\n} n;");
7187 verifyFormat("class __attribute__(X) Z {\n} n;");
7188 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007189 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007190 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007191 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7192 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007193
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007194 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007195 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007196
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007197 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007198 verifyFormat(
7199 "template <typename F>\n"
7200 "Matcher(const Matcher<F> &Other,\n"
7201 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7202 " !is_same<F, T>::value>::type * = 0)\n"
7203 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7204
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007205 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007206 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007207 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007208
7209 // FIXME:
7210 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007211 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007212
Manuel Klimeke01bab52013-01-15 13:38:33 +00007213 // Elaborate types where incorrectly parsing the structural element would
7214 // break the indent.
7215 verifyFormat("if (true)\n"
7216 " class X x;\n"
7217 "else\n"
7218 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007219
7220 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007221 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007222}
7223
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007224TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007225 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7226 format("#error Leave all white!!!!! space* alone!\n"));
7227 EXPECT_EQ(
7228 "#warning Leave all white!!!!! space* alone!\n",
7229 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007230 EXPECT_EQ("#error 1", format(" # error 1"));
7231 EXPECT_EQ("#warning 1", format(" # warning 1"));
7232}
7233
Daniel Jasper4431aa92013-04-23 13:54:04 +00007234TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007235 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007236 verifyFormat("#if (AAAA && BBBB)");
7237 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007238 // FIXME: Come up with a better indentation for #elif.
7239 verifyFormat(
7240 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7241 " defined(BBBBBBBB)\n"
7242 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7243 " defined(BBBBBBBB)\n"
7244 "#endif",
7245 getLLVMStyleWithColumns(65));
7246}
7247
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007248TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7249 FormatStyle AllowsMergedIf = getGoogleStyle();
7250 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7251 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7252 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007253 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7254 EXPECT_EQ("if (true) return 42;",
7255 format("if (true)\nreturn 42;", AllowsMergedIf));
7256 FormatStyle ShortMergedIf = AllowsMergedIf;
7257 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007258 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007259 " if (true) return 42;",
7260 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007261 verifyFormat("#define A \\\n"
7262 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007263 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007264 "#define B",
7265 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007266 verifyFormat("#define A \\\n"
7267 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007268 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007269 "g();",
7270 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007271 verifyFormat("{\n"
7272 "#ifdef A\n"
7273 " // Comment\n"
7274 " if (true) continue;\n"
7275 "#endif\n"
7276 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007277 " if (true) continue;\n"
7278 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007279 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007280 ShortMergedIf.ColumnLimit = 33;
7281 verifyFormat("#define A \\\n"
7282 " if constexpr (true) return 42;",
7283 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007284 ShortMergedIf.ColumnLimit = 29;
7285 verifyFormat("#define A \\\n"
7286 " if (aaaaaaaaaa) return 1; \\\n"
7287 " return 2;",
7288 ShortMergedIf);
7289 ShortMergedIf.ColumnLimit = 28;
7290 verifyFormat("#define A \\\n"
7291 " if (aaaaaaaaaa) \\\n"
7292 " return 1; \\\n"
7293 " return 2;",
7294 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007295 verifyFormat("#define A \\\n"
7296 " if constexpr (aaaaaaa) \\\n"
7297 " return 1; \\\n"
7298 " return 2;",
7299 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007300}
7301
Manuel Klimekd33516e2013-01-23 10:09:28 +00007302TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007303 verifyFormat("void f(int *a);");
7304 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007305 verifyFormat("class A {\n void f(int *a);\n};");
7306 verifyFormat("class A {\n int *a;\n};");
7307 verifyFormat("namespace a {\n"
7308 "namespace b {\n"
7309 "class A {\n"
7310 " void f() {}\n"
7311 " int *a;\n"
7312 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007313 "} // namespace b\n"
7314 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007315}
7316
Manuel Klimekd33516e2013-01-23 10:09:28 +00007317TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7318 verifyFormat("while");
7319 verifyFormat("operator");
7320}
7321
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007322TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7323 // This code would be painfully slow to format if we didn't skip it.
7324 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
7325 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7326 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7327 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7328 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7329 "A(1, 1)\n"
7330 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7331 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7332 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7333 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7334 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7335 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7336 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7337 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7338 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7339 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7340 // Deeply nested part is untouched, rest is formatted.
7341 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7342 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007343 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007344}
7345
Nico Weber7e6a7a12013-01-08 17:56:31 +00007346//===----------------------------------------------------------------------===//
7347// Objective-C tests.
7348//===----------------------------------------------------------------------===//
7349
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007350TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7351 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7352 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7353 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007354 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007355 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7356 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7357 format("-(NSInteger)Method3:(id)anObject;"));
7358 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7359 format("-(NSInteger)Method4:(id)anObject;"));
7360 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7361 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7362 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7363 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007364 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7365 "forAllCells:(BOOL)flag;",
7366 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7367 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007368
7369 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007370 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7371 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007372 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7373 " inRange:(NSRange)range\n"
7374 " outRange:(NSRange)out_range\n"
7375 " outRange1:(NSRange)out_range1\n"
7376 " outRange2:(NSRange)out_range2\n"
7377 " outRange3:(NSRange)out_range3\n"
7378 " outRange4:(NSRange)out_range4\n"
7379 " outRange5:(NSRange)out_range5\n"
7380 " outRange6:(NSRange)out_range6\n"
7381 " outRange7:(NSRange)out_range7\n"
7382 " outRange8:(NSRange)out_range8\n"
7383 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007384
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007385 // When the function name has to be wrapped.
7386 FormatStyle Style = getLLVMStyle();
7387 Style.IndentWrappedFunctionNames = false;
7388 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7389 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7390 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7391 "}",
7392 Style);
7393 Style.IndentWrappedFunctionNames = true;
7394 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7395 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7396 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7397 "}",
7398 Style);
7399
Nico Weberd6f962f2013-01-10 20:18:33 +00007400 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007401 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007402 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7403 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007404 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007405
Daniel Jasper37194282013-05-28 08:33:00 +00007406 verifyFormat("- (int (*)())foo:(int (*)())f;");
7407 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007408
7409 // If there's no return type (very rare in practice!), LLVM and Google style
7410 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007411 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007412 verifyFormat("- foo:(int)f;");
7413 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007414}
7415
Nico Weber0588b502013-02-07 00:19:29 +00007416
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007417TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007418 EXPECT_EQ("\"some text \"\n"
7419 "\"other\";",
7420 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007421 EXPECT_EQ("\"some text \"\n"
7422 "\"other\";",
7423 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007424 EXPECT_EQ(
7425 "#define A \\\n"
7426 " \"some \" \\\n"
7427 " \"text \" \\\n"
7428 " \"other\";",
7429 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7430 EXPECT_EQ(
7431 "#define A \\\n"
7432 " \"so \" \\\n"
7433 " \"text \" \\\n"
7434 " \"other\";",
7435 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7436
7437 EXPECT_EQ("\"some text\"",
7438 format("\"some text\"", getLLVMStyleWithColumns(1)));
7439 EXPECT_EQ("\"some text\"",
7440 format("\"some text\"", getLLVMStyleWithColumns(11)));
7441 EXPECT_EQ("\"some \"\n"
7442 "\"text\"",
7443 format("\"some text\"", getLLVMStyleWithColumns(10)));
7444 EXPECT_EQ("\"some \"\n"
7445 "\"text\"",
7446 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007447 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007448 "\" tex\"\n"
7449 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007450 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007451 EXPECT_EQ("\"some\"\n"
7452 "\" tex\"\n"
7453 "\" and\"",
7454 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7455 EXPECT_EQ("\"some\"\n"
7456 "\"/tex\"\n"
7457 "\"/and\"",
7458 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007459
7460 EXPECT_EQ("variable =\n"
7461 " \"long string \"\n"
7462 " \"literal\";",
7463 format("variable = \"long string literal\";",
7464 getLLVMStyleWithColumns(20)));
7465
7466 EXPECT_EQ("variable = f(\n"
7467 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007468 " \"literal\",\n"
7469 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007470 " loooooooooooooooooooong);",
7471 format("variable = f(\"long string literal\", short, "
7472 "loooooooooooooooooooong);",
7473 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007474
Daniel Jaspera44991332015-04-29 13:06:49 +00007475 EXPECT_EQ(
7476 "f(g(\"long string \"\n"
7477 " \"literal\"),\n"
7478 " b);",
7479 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007480 EXPECT_EQ("f(g(\"long string \"\n"
7481 " \"literal\",\n"
7482 " a),\n"
7483 " b);",
7484 format("f(g(\"long string literal\", a), b);",
7485 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007486 EXPECT_EQ(
7487 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007488 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007489 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7490 EXPECT_EQ("f(\"one two three four five six \"\n"
7491 " \"seven\".split(\n"
7492 " really_looooong_variable));",
7493 format("f(\"one two three four five six seven\"."
7494 "split(really_looooong_variable));",
7495 getLLVMStyleWithColumns(33)));
7496
7497 EXPECT_EQ("f(\"some \"\n"
7498 " \"text\",\n"
7499 " other);",
7500 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007501
7502 // Only break as a last resort.
7503 verifyFormat(
7504 "aaaaaaaaaaaaaaaaaaaa(\n"
7505 " aaaaaaaaaaaaaaaaaaaa,\n"
7506 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007507
Daniel Jaspera44991332015-04-29 13:06:49 +00007508 EXPECT_EQ("\"splitmea\"\n"
7509 "\"trandomp\"\n"
7510 "\"oint\"",
7511 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007512
Daniel Jaspera44991332015-04-29 13:06:49 +00007513 EXPECT_EQ("\"split/\"\n"
7514 "\"pathat/\"\n"
7515 "\"slashes\"",
7516 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007517
Daniel Jaspera44991332015-04-29 13:06:49 +00007518 EXPECT_EQ("\"split/\"\n"
7519 "\"pathat/\"\n"
7520 "\"slashes\"",
7521 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007522 EXPECT_EQ("\"split at \"\n"
7523 "\"spaces/at/\"\n"
7524 "\"slashes.at.any$\"\n"
7525 "\"non-alphanumeric%\"\n"
7526 "\"1111111111characte\"\n"
7527 "\"rs\"",
7528 format("\"split at "
7529 "spaces/at/"
7530 "slashes.at."
7531 "any$non-"
7532 "alphanumeric%"
7533 "1111111111characte"
7534 "rs\"",
7535 getLLVMStyleWithColumns(20)));
7536
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007537 // Verify that splitting the strings understands
7538 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007539 EXPECT_EQ(
7540 "aaaaaaaaaaaa(\n"
7541 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7542 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7543 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7544 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7545 "aaaaaaaaaaaaaaaaaaaaaa\");",
7546 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007547 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7548 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7549 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7550 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7551 "aaaaaaaaaaaaaaaaaaaaaa\";",
7552 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007553 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7554 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7555 format("llvm::outs() << "
7556 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7557 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007558 EXPECT_EQ("ffff(\n"
7559 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7560 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7561 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7562 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7563 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007564
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007565 FormatStyle Style = getLLVMStyleWithColumns(12);
7566 Style.BreakStringLiterals = false;
7567 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7568
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007569 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007570 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007571 EXPECT_EQ("#define A \\\n"
7572 " \"some \" \\\n"
7573 " \"text \" \\\n"
7574 " \"other\";",
7575 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007576}
7577
Manuel Klimek9e321992015-07-28 15:50:24 +00007578TEST_F(FormatTest, FullyRemoveEmptyLines) {
7579 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7580 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7581 EXPECT_EQ("int i = a(b());",
7582 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7583}
7584
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007585TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7586 EXPECT_EQ(
7587 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7588 "(\n"
7589 " \"x\t\");",
7590 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7591 "aaaaaaa("
7592 "\"x\t\");"));
7593}
7594
Daniel Jasper174b0122014-01-09 14:18:12 +00007595TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007596 EXPECT_EQ(
7597 "u8\"utf8 string \"\n"
7598 "u8\"literal\";",
7599 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7600 EXPECT_EQ(
7601 "u\"utf16 string \"\n"
7602 "u\"literal\";",
7603 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7604 EXPECT_EQ(
7605 "U\"utf32 string \"\n"
7606 "U\"literal\";",
7607 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7608 EXPECT_EQ("L\"wide string \"\n"
7609 "L\"literal\";",
7610 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007611 EXPECT_EQ("@\"NSString \"\n"
7612 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007613 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007614 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007615
7616 // This input makes clang-format try to split the incomplete unicode escape
7617 // sequence, which used to lead to a crasher.
7618 verifyNoCrash(
7619 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7620 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007621}
7622
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007623TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7624 FormatStyle Style = getGoogleStyleWithColumns(15);
7625 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7626 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7627 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7628 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7629 EXPECT_EQ("u8R\"x(raw literal)x\";",
7630 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007631}
7632
7633TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7634 FormatStyle Style = getLLVMStyleWithColumns(20);
7635 EXPECT_EQ(
7636 "_T(\"aaaaaaaaaaaaaa\")\n"
7637 "_T(\"aaaaaaaaaaaaaa\")\n"
7638 "_T(\"aaaaaaaaaaaa\")",
7639 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007640 EXPECT_EQ("f(x,\n"
7641 " _T(\"aaaaaaaaaaaa\")\n"
7642 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007643 " z);",
7644 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7645
7646 // FIXME: Handle embedded spaces in one iteration.
7647 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7648 // "_T(\"aaaaaaaaaaaaa\")\n"
7649 // "_T(\"aaaaaaaaaaaaa\")\n"
7650 // "_T(\"a\")",
7651 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7652 // getLLVMStyleWithColumns(20)));
7653 EXPECT_EQ(
7654 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7655 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007656 EXPECT_EQ("f(\n"
7657 "#if !TEST\n"
7658 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7659 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007660 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007661 format("f(\n"
7662 "#if !TEST\n"
7663 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7664 "#endif\n"
7665 ");"));
7666 EXPECT_EQ("f(\n"
7667 "\n"
7668 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7669 format("f(\n"
7670 "\n"
7671 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007672}
7673
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007674TEST_F(FormatTest, BreaksStringLiteralOperands) {
7675 // In a function call with two operands, the second can be broken with no line
7676 // break before it.
7677 EXPECT_EQ("func(a, \"long long \"\n"
7678 " \"long long\");",
7679 format("func(a, \"long long long long\");",
7680 getLLVMStyleWithColumns(24)));
7681 // In a function call with three operands, the second must be broken with a
7682 // line break before it.
7683 EXPECT_EQ("func(a,\n"
7684 " \"long long long \"\n"
7685 " \"long\",\n"
7686 " c);",
7687 format("func(a, \"long long long long\", c);",
7688 getLLVMStyleWithColumns(24)));
7689 // In a function call with three operands, the third must be broken with a
7690 // line break before it.
7691 EXPECT_EQ("func(a, b,\n"
7692 " \"long long long \"\n"
7693 " \"long\");",
7694 format("func(a, b, \"long long long long\");",
7695 getLLVMStyleWithColumns(24)));
7696 // In a function call with three operands, both the second and the third must
7697 // be broken with a line break before them.
7698 EXPECT_EQ("func(a,\n"
7699 " \"long long long \"\n"
7700 " \"long\",\n"
7701 " \"long long long \"\n"
7702 " \"long\");",
7703 format("func(a, \"long long long long\", \"long long long long\");",
7704 getLLVMStyleWithColumns(24)));
7705 // In a chain of << with two operands, the second can be broken with no line
7706 // break before it.
7707 EXPECT_EQ("a << \"line line \"\n"
7708 " \"line\";",
7709 format("a << \"line line line\";",
7710 getLLVMStyleWithColumns(20)));
7711 // In a chain of << with three operands, the second can be broken with no line
7712 // break before it.
7713 EXPECT_EQ("abcde << \"line \"\n"
7714 " \"line line\"\n"
7715 " << c;",
7716 format("abcde << \"line line line\" << c;",
7717 getLLVMStyleWithColumns(20)));
7718 // In a chain of << with three operands, the third must be broken with a line
7719 // break before it.
7720 EXPECT_EQ("a << b\n"
7721 " << \"line line \"\n"
7722 " \"line\";",
7723 format("a << b << \"line line line\";",
7724 getLLVMStyleWithColumns(20)));
7725 // In a chain of << with three operands, the second can be broken with no line
7726 // break before it and the third must be broken with a line break before it.
7727 EXPECT_EQ("abcd << \"line line \"\n"
7728 " \"line\"\n"
7729 " << \"line line \"\n"
7730 " \"line\";",
7731 format("abcd << \"line line line\" << \"line line line\";",
7732 getLLVMStyleWithColumns(20)));
7733 // In a chain of binary operators with two operands, the second can be broken
7734 // with no line break before it.
7735 EXPECT_EQ("abcd + \"line line \"\n"
7736 " \"line line\";",
7737 format("abcd + \"line line line line\";",
7738 getLLVMStyleWithColumns(20)));
7739 // In a chain of binary operators with three operands, the second must be
7740 // broken with a line break before it.
7741 EXPECT_EQ("abcd +\n"
7742 " \"line line \"\n"
7743 " \"line line\" +\n"
7744 " e;",
7745 format("abcd + \"line line line line\" + e;",
7746 getLLVMStyleWithColumns(20)));
7747 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7748 // the first must be broken with a line break before it.
7749 FormatStyle Style = getLLVMStyleWithColumns(25);
7750 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7751 EXPECT_EQ("someFunction(\n"
7752 " \"long long long \"\n"
7753 " \"long\",\n"
7754 " a);",
7755 format("someFunction(\"long long long long\", a);", Style));
7756}
7757
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007758TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007759 EXPECT_EQ(
7760 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7763 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7766}
7767
7768TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7769 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007770 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007771 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7772 "multiline raw string literal xxxxxxxxxxxxxx\n"
7773 ")x\",\n"
7774 " a),\n"
7775 " b);",
7776 format("fffffffffff(g(R\"x(\n"
7777 "multiline raw string literal xxxxxxxxxxxxxx\n"
7778 ")x\", a), b);",
7779 getGoogleStyleWithColumns(20)));
7780 EXPECT_EQ("fffffffffff(\n"
7781 " g(R\"x(qqq\n"
7782 "multiline raw string literal xxxxxxxxxxxxxx\n"
7783 ")x\",\n"
7784 " a),\n"
7785 " b);",
7786 format("fffffffffff(g(R\"x(qqq\n"
7787 "multiline raw string literal xxxxxxxxxxxxxx\n"
7788 ")x\", a), b);",
7789 getGoogleStyleWithColumns(20)));
7790
7791 EXPECT_EQ("fffffffffff(R\"x(\n"
7792 "multiline raw string literal xxxxxxxxxxxxxx\n"
7793 ")x\");",
7794 format("fffffffffff(R\"x(\n"
7795 "multiline raw string literal xxxxxxxxxxxxxx\n"
7796 ")x\");",
7797 getGoogleStyleWithColumns(20)));
7798 EXPECT_EQ("fffffffffff(R\"x(\n"
7799 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007800 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007801 format("fffffffffff(R\"x(\n"
7802 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007803 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007804 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007805 EXPECT_EQ("fffffffffff(\n"
7806 " R\"x(\n"
7807 "multiline raw string literal xxxxxxxxxxxxxx\n"
7808 ")x\" +\n"
7809 " bbbbbb);",
7810 format("fffffffffff(\n"
7811 " R\"x(\n"
7812 "multiline raw string literal xxxxxxxxxxxxxx\n"
7813 ")x\" + bbbbbb);",
7814 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007815}
7816
Alexander Kornienkobe633902013-06-14 11:46:10 +00007817TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007818 verifyFormat("string a = \"unterminated;");
7819 EXPECT_EQ("function(\"unterminated,\n"
7820 " OtherParameter);",
7821 format("function( \"unterminated,\n"
7822 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007823}
7824
7825TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007826 FormatStyle Style = getLLVMStyle();
7827 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007828 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007829 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007830}
7831
Daniel Jaspera44991332015-04-29 13:06:49 +00007832TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007833
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007834TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7835 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7836 " \"ddeeefff\");",
7837 format("someFunction(\"aaabbbcccdddeeefff\");",
7838 getLLVMStyleWithColumns(25)));
7839 EXPECT_EQ("someFunction1234567890(\n"
7840 " \"aaabbbcccdddeeefff\");",
7841 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7842 getLLVMStyleWithColumns(26)));
7843 EXPECT_EQ("someFunction1234567890(\n"
7844 " \"aaabbbcccdddeeeff\"\n"
7845 " \"f\");",
7846 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7847 getLLVMStyleWithColumns(25)));
7848 EXPECT_EQ("someFunction1234567890(\n"
7849 " \"aaabbbcccdddeeeff\"\n"
7850 " \"f\");",
7851 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7852 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007853 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7854 " \"ddde \"\n"
7855 " \"efff\");",
7856 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007857 getLLVMStyleWithColumns(25)));
7858 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7859 " \"ddeeefff\");",
7860 format("someFunction(\"aaabbbccc ddeeefff\");",
7861 getLLVMStyleWithColumns(25)));
7862 EXPECT_EQ("someFunction1234567890(\n"
7863 " \"aaabb \"\n"
7864 " \"cccdddeeefff\");",
7865 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7866 getLLVMStyleWithColumns(25)));
7867 EXPECT_EQ("#define A \\\n"
7868 " string s = \\\n"
7869 " \"123456789\" \\\n"
7870 " \"0\"; \\\n"
7871 " int i;",
7872 format("#define A string s = \"1234567890\"; int i;",
7873 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007874 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7875 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7876 " \"dddeeeff\"\n"
7877 " \"f\");",
7878 format("someFunction(\"aaabbbcc dddeeefff\");",
7879 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007880}
7881
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007882TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007883 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7884 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007885 EXPECT_EQ("\"test\"\n"
7886 "\"\\n\"",
7887 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7888 EXPECT_EQ("\"tes\\\\\"\n"
7889 "\"n\"",
7890 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7891 EXPECT_EQ("\"\\\\\\\\\"\n"
7892 "\"\\n\"",
7893 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007894 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007895 EXPECT_EQ("\"\\uff01\"\n"
7896 "\"test\"",
7897 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7898 EXPECT_EQ("\"\\Uff01ff02\"",
7899 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7900 EXPECT_EQ("\"\\x000000000001\"\n"
7901 "\"next\"",
7902 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7903 EXPECT_EQ("\"\\x000000000001next\"",
7904 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7905 EXPECT_EQ("\"\\x000000000001\"",
7906 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7907 EXPECT_EQ("\"test\"\n"
7908 "\"\\000000\"\n"
7909 "\"000001\"",
7910 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7911 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007912 "\"00000000\"\n"
7913 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007914 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007915}
7916
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007917TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7918 verifyFormat("void f() {\n"
7919 " return g() {}\n"
7920 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007921 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007922 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007923 "}");
7924}
7925
Manuel Klimek421147e2014-01-24 09:25:23 +00007926TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7927 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007928 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007929}
7930
Manuel Klimek13b97d82013-05-13 08:42:42 +00007931TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7932 verifyFormat("class X {\n"
7933 " void f() {\n"
7934 " }\n"
7935 "};",
7936 getLLVMStyleWithColumns(12));
7937}
7938
7939TEST_F(FormatTest, ConfigurableIndentWidth) {
7940 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7941 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007942 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007943 verifyFormat("void f() {\n"
7944 " someFunction();\n"
7945 " if (true) {\n"
7946 " f();\n"
7947 " }\n"
7948 "}",
7949 EightIndent);
7950 verifyFormat("class X {\n"
7951 " void f() {\n"
7952 " }\n"
7953 "};",
7954 EightIndent);
7955 verifyFormat("int x[] = {\n"
7956 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007957 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007958 EightIndent);
7959}
7960
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007961TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007962 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007963 "f();",
7964 getLLVMStyleWithColumns(8));
7965}
7966
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007967TEST_F(FormatTest, ConfigurableUseOfTab) {
7968 FormatStyle Tab = getLLVMStyleWithColumns(42);
7969 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007970 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007971 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007972
7973 EXPECT_EQ("if (aaaaaaaa && // q\n"
7974 " bb)\t\t// w\n"
7975 "\t;",
7976 format("if (aaaaaaaa &&// q\n"
7977 "bb)// w\n"
7978 ";",
7979 Tab));
7980 EXPECT_EQ("if (aaa && bbb) // w\n"
7981 "\t;",
7982 format("if(aaa&&bbb)// w\n"
7983 ";",
7984 Tab));
7985
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007986 verifyFormat("class X {\n"
7987 "\tvoid f() {\n"
7988 "\t\tsomeFunction(parameter1,\n"
7989 "\t\t\t parameter2);\n"
7990 "\t}\n"
7991 "};",
7992 Tab);
7993 verifyFormat("#define A \\\n"
7994 "\tvoid f() { \\\n"
7995 "\t\tsomeFunction( \\\n"
7996 "\t\t parameter1, \\\n"
7997 "\t\t parameter2); \\\n"
7998 "\t}",
7999 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008000
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008001 Tab.TabWidth = 4;
8002 Tab.IndentWidth = 8;
8003 verifyFormat("class TabWidth4Indent8 {\n"
8004 "\t\tvoid f() {\n"
8005 "\t\t\t\tsomeFunction(parameter1,\n"
8006 "\t\t\t\t\t\t\t parameter2);\n"
8007 "\t\t}\n"
8008 "};",
8009 Tab);
8010
8011 Tab.TabWidth = 4;
8012 Tab.IndentWidth = 4;
8013 verifyFormat("class TabWidth4Indent4 {\n"
8014 "\tvoid f() {\n"
8015 "\t\tsomeFunction(parameter1,\n"
8016 "\t\t\t\t\t parameter2);\n"
8017 "\t}\n"
8018 "};",
8019 Tab);
8020
8021 Tab.TabWidth = 8;
8022 Tab.IndentWidth = 4;
8023 verifyFormat("class TabWidth8Indent4 {\n"
8024 " void f() {\n"
8025 "\tsomeFunction(parameter1,\n"
8026 "\t\t parameter2);\n"
8027 " }\n"
8028 "};",
8029 Tab);
8030
Alexander Kornienko39856b72013-09-10 09:38:25 +00008031 Tab.TabWidth = 8;
8032 Tab.IndentWidth = 8;
8033 EXPECT_EQ("/*\n"
8034 "\t a\t\tcomment\n"
8035 "\t in multiple lines\n"
8036 " */",
8037 format(" /*\t \t \n"
8038 " \t \t a\t\tcomment\t \t\n"
8039 " \t \t in multiple lines\t\n"
8040 " \t */",
8041 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008042
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008043 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008044 verifyFormat("{\n"
8045 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8046 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8047 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8048 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8049 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8050 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008051 "};",
8052 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008053 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008054 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008055 "\ta2,\n"
8056 "\ta3\n"
8057 "};",
8058 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008059 EXPECT_EQ("if (aaaaaaaa && // q\n"
8060 " bb) // w\n"
8061 "\t;",
8062 format("if (aaaaaaaa &&// q\n"
8063 "bb)// w\n"
8064 ";",
8065 Tab));
8066 verifyFormat("class X {\n"
8067 "\tvoid f() {\n"
8068 "\t\tsomeFunction(parameter1,\n"
8069 "\t\t parameter2);\n"
8070 "\t}\n"
8071 "};",
8072 Tab);
8073 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008074 "\tQ(\n"
8075 "\t {\n"
8076 "\t\t int a;\n"
8077 "\t\t someFunction(aaaaaaaa,\n"
8078 "\t\t bbbbbbb);\n"
8079 "\t },\n"
8080 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008081 "}",
8082 Tab);
8083 EXPECT_EQ("{\n"
8084 "\t/* aaaa\n"
8085 "\t bbbb */\n"
8086 "}",
8087 format("{\n"
8088 "/* aaaa\n"
8089 " bbbb */\n"
8090 "}",
8091 Tab));
8092 EXPECT_EQ("{\n"
8093 "\t/*\n"
8094 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8095 "\t bbbbbbbbbbbbb\n"
8096 "\t*/\n"
8097 "}",
8098 format("{\n"
8099 "/*\n"
8100 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8101 "*/\n"
8102 "}",
8103 Tab));
8104 EXPECT_EQ("{\n"
8105 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8106 "\t// bbbbbbbbbbbbb\n"
8107 "}",
8108 format("{\n"
8109 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8110 "}",
8111 Tab));
8112 EXPECT_EQ("{\n"
8113 "\t/*\n"
8114 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8115 "\t bbbbbbbbbbbbb\n"
8116 "\t*/\n"
8117 "}",
8118 format("{\n"
8119 "\t/*\n"
8120 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8121 "\t*/\n"
8122 "}",
8123 Tab));
8124 EXPECT_EQ("{\n"
8125 "\t/*\n"
8126 "\n"
8127 "\t*/\n"
8128 "}",
8129 format("{\n"
8130 "\t/*\n"
8131 "\n"
8132 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008133 "}",
8134 Tab));
8135 EXPECT_EQ("{\n"
8136 "\t/*\n"
8137 " asdf\n"
8138 "\t*/\n"
8139 "}",
8140 format("{\n"
8141 "\t/*\n"
8142 " asdf\n"
8143 "\t*/\n"
8144 "}",
8145 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008146
8147 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008148 EXPECT_EQ("/*\n"
8149 " a\t\tcomment\n"
8150 " in multiple lines\n"
8151 " */",
8152 format(" /*\t \t \n"
8153 " \t \t a\t\tcomment\t \t\n"
8154 " \t \t in multiple lines\t\n"
8155 " \t */",
8156 Tab));
8157 EXPECT_EQ("/* some\n"
8158 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008159 format(" \t \t /* some\n"
8160 " \t \t comment */",
8161 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008162 EXPECT_EQ("int a; /* some\n"
8163 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008164 format(" \t \t int a; /* some\n"
8165 " \t \t comment */",
8166 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008167
Alexander Kornienko39856b72013-09-10 09:38:25 +00008168 EXPECT_EQ("int a; /* some\n"
8169 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008170 format(" \t \t int\ta; /* some\n"
8171 " \t \t comment */",
8172 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008173 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8174 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008175 format(" \t \t f(\"\t\t\"); /* some\n"
8176 " \t \t comment */",
8177 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008178 EXPECT_EQ("{\n"
8179 " /*\n"
8180 " * Comment\n"
8181 " */\n"
8182 " int i;\n"
8183 "}",
8184 format("{\n"
8185 "\t/*\n"
8186 "\t * Comment\n"
8187 "\t */\n"
8188 "\t int i;\n"
8189 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008190
8191 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8192 Tab.TabWidth = 8;
8193 Tab.IndentWidth = 8;
8194 EXPECT_EQ("if (aaaaaaaa && // q\n"
8195 " bb) // w\n"
8196 "\t;",
8197 format("if (aaaaaaaa &&// q\n"
8198 "bb)// w\n"
8199 ";",
8200 Tab));
8201 EXPECT_EQ("if (aaa && bbb) // w\n"
8202 "\t;",
8203 format("if(aaa&&bbb)// w\n"
8204 ";",
8205 Tab));
8206 verifyFormat("class X {\n"
8207 "\tvoid f() {\n"
8208 "\t\tsomeFunction(parameter1,\n"
8209 "\t\t\t parameter2);\n"
8210 "\t}\n"
8211 "};",
8212 Tab);
8213 verifyFormat("#define A \\\n"
8214 "\tvoid f() { \\\n"
8215 "\t\tsomeFunction( \\\n"
8216 "\t\t parameter1, \\\n"
8217 "\t\t parameter2); \\\n"
8218 "\t}",
8219 Tab);
8220 Tab.TabWidth = 4;
8221 Tab.IndentWidth = 8;
8222 verifyFormat("class TabWidth4Indent8 {\n"
8223 "\t\tvoid f() {\n"
8224 "\t\t\t\tsomeFunction(parameter1,\n"
8225 "\t\t\t\t\t\t\t parameter2);\n"
8226 "\t\t}\n"
8227 "};",
8228 Tab);
8229 Tab.TabWidth = 4;
8230 Tab.IndentWidth = 4;
8231 verifyFormat("class TabWidth4Indent4 {\n"
8232 "\tvoid f() {\n"
8233 "\t\tsomeFunction(parameter1,\n"
8234 "\t\t\t\t\t parameter2);\n"
8235 "\t}\n"
8236 "};",
8237 Tab);
8238 Tab.TabWidth = 8;
8239 Tab.IndentWidth = 4;
8240 verifyFormat("class TabWidth8Indent4 {\n"
8241 " void f() {\n"
8242 "\tsomeFunction(parameter1,\n"
8243 "\t\t parameter2);\n"
8244 " }\n"
8245 "};",
8246 Tab);
8247 Tab.TabWidth = 8;
8248 Tab.IndentWidth = 8;
8249 EXPECT_EQ("/*\n"
8250 "\t a\t\tcomment\n"
8251 "\t in multiple lines\n"
8252 " */",
8253 format(" /*\t \t \n"
8254 " \t \t a\t\tcomment\t \t\n"
8255 " \t \t in multiple lines\t\n"
8256 " \t */",
8257 Tab));
8258 verifyFormat("{\n"
8259 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8260 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8261 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8262 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8263 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8264 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8265 "};",
8266 Tab);
8267 verifyFormat("enum AA {\n"
8268 "\ta1, // Force multiple lines\n"
8269 "\ta2,\n"
8270 "\ta3\n"
8271 "};",
8272 Tab);
8273 EXPECT_EQ("if (aaaaaaaa && // q\n"
8274 " bb) // w\n"
8275 "\t;",
8276 format("if (aaaaaaaa &&// q\n"
8277 "bb)// w\n"
8278 ";",
8279 Tab));
8280 verifyFormat("class X {\n"
8281 "\tvoid f() {\n"
8282 "\t\tsomeFunction(parameter1,\n"
8283 "\t\t\t parameter2);\n"
8284 "\t}\n"
8285 "};",
8286 Tab);
8287 verifyFormat("{\n"
8288 "\tQ(\n"
8289 "\t {\n"
8290 "\t\t int a;\n"
8291 "\t\t someFunction(aaaaaaaa,\n"
8292 "\t\t\t\t bbbbbbb);\n"
8293 "\t },\n"
8294 "\t p);\n"
8295 "}",
8296 Tab);
8297 EXPECT_EQ("{\n"
8298 "\t/* aaaa\n"
8299 "\t bbbb */\n"
8300 "}",
8301 format("{\n"
8302 "/* aaaa\n"
8303 " bbbb */\n"
8304 "}",
8305 Tab));
8306 EXPECT_EQ("{\n"
8307 "\t/*\n"
8308 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8309 "\t bbbbbbbbbbbbb\n"
8310 "\t*/\n"
8311 "}",
8312 format("{\n"
8313 "/*\n"
8314 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8315 "*/\n"
8316 "}",
8317 Tab));
8318 EXPECT_EQ("{\n"
8319 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8320 "\t// bbbbbbbbbbbbb\n"
8321 "}",
8322 format("{\n"
8323 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8324 "}",
8325 Tab));
8326 EXPECT_EQ("{\n"
8327 "\t/*\n"
8328 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8329 "\t bbbbbbbbbbbbb\n"
8330 "\t*/\n"
8331 "}",
8332 format("{\n"
8333 "\t/*\n"
8334 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8335 "\t*/\n"
8336 "}",
8337 Tab));
8338 EXPECT_EQ("{\n"
8339 "\t/*\n"
8340 "\n"
8341 "\t*/\n"
8342 "}",
8343 format("{\n"
8344 "\t/*\n"
8345 "\n"
8346 "\t*/\n"
8347 "}",
8348 Tab));
8349 EXPECT_EQ("{\n"
8350 "\t/*\n"
8351 " asdf\n"
8352 "\t*/\n"
8353 "}",
8354 format("{\n"
8355 "\t/*\n"
8356 " asdf\n"
8357 "\t*/\n"
8358 "}",
8359 Tab));
8360 EXPECT_EQ("/*\n"
8361 "\t a\t\tcomment\n"
8362 "\t in multiple lines\n"
8363 " */",
8364 format(" /*\t \t \n"
8365 " \t \t a\t\tcomment\t \t\n"
8366 " \t \t in multiple lines\t\n"
8367 " \t */",
8368 Tab));
8369 EXPECT_EQ("/* some\n"
8370 " comment */",
8371 format(" \t \t /* some\n"
8372 " \t \t comment */",
8373 Tab));
8374 EXPECT_EQ("int a; /* some\n"
8375 " comment */",
8376 format(" \t \t int a; /* some\n"
8377 " \t \t comment */",
8378 Tab));
8379 EXPECT_EQ("int a; /* some\n"
8380 "comment */",
8381 format(" \t \t int\ta; /* some\n"
8382 " \t \t comment */",
8383 Tab));
8384 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8385 " comment */",
8386 format(" \t \t f(\"\t\t\"); /* some\n"
8387 " \t \t comment */",
8388 Tab));
8389 EXPECT_EQ("{\n"
8390 " /*\n"
8391 " * Comment\n"
8392 " */\n"
8393 " int i;\n"
8394 "}",
8395 format("{\n"
8396 "\t/*\n"
8397 "\t * Comment\n"
8398 "\t */\n"
8399 "\t int i;\n"
8400 "}"));
8401 Tab.AlignConsecutiveAssignments = true;
8402 Tab.AlignConsecutiveDeclarations = true;
8403 Tab.TabWidth = 4;
8404 Tab.IndentWidth = 4;
8405 verifyFormat("class Assign {\n"
8406 "\tvoid f() {\n"
8407 "\t\tint x = 123;\n"
8408 "\t\tint random = 4;\n"
8409 "\t\tstd::string alphabet =\n"
8410 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8411 "\t}\n"
8412 "};",
8413 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008414}
8415
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008416TEST_F(FormatTest, CalculatesOriginalColumn) {
8417 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8418 "q\"; /* some\n"
8419 " comment */",
8420 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8421 "q\"; /* some\n"
8422 " comment */",
8423 getLLVMStyle()));
8424 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8425 "/* some\n"
8426 " comment */",
8427 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8428 " /* some\n"
8429 " comment */",
8430 getLLVMStyle()));
8431 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8432 "qqq\n"
8433 "/* some\n"
8434 " comment */",
8435 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8436 "qqq\n"
8437 " /* some\n"
8438 " comment */",
8439 getLLVMStyle()));
8440 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8441 "wwww; /* some\n"
8442 " comment */",
8443 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8444 "wwww; /* some\n"
8445 " comment */",
8446 getLLVMStyle()));
8447}
8448
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008449TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008450 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008451 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008452
8453 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008454 " continue;",
8455 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008456 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008457 " continue;",
8458 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008459 verifyFormat("if(true)\n"
8460 " f();\n"
8461 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008462 " f();",
8463 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008464 verifyFormat("do {\n"
8465 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008466 "} while(something());",
8467 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008468 verifyFormat("switch(x) {\n"
8469 "default:\n"
8470 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008471 "}",
8472 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008473 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008474 verifyFormat("size_t x = sizeof(x);", NoSpace);
8475 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8476 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8477 verifyFormat("alignas(128) char a[128];", NoSpace);
8478 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8479 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8480 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008481 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008482 verifyFormat("T A::operator()();", NoSpace);
8483 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008484
8485 FormatStyle Space = getLLVMStyle();
8486 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8487
8488 verifyFormat("int f ();", Space);
8489 verifyFormat("void f (int a, T b) {\n"
8490 " while (true)\n"
8491 " continue;\n"
8492 "}",
8493 Space);
8494 verifyFormat("if (true)\n"
8495 " f ();\n"
8496 "else if (true)\n"
8497 " f ();",
8498 Space);
8499 verifyFormat("do {\n"
8500 " do_something ();\n"
8501 "} while (something ());",
8502 Space);
8503 verifyFormat("switch (x) {\n"
8504 "default:\n"
8505 " break;\n"
8506 "}",
8507 Space);
8508 verifyFormat("A::A () : a (1) {}", Space);
8509 verifyFormat("void f () __attribute__ ((asdf));", Space);
8510 verifyFormat("*(&a + 1);\n"
8511 "&((&a)[1]);\n"
8512 "a[(b + c) * d];\n"
8513 "(((a + 1) * 2) + 3) * 4;",
8514 Space);
8515 verifyFormat("#define A(x) x", Space);
8516 verifyFormat("#define A (x) x", Space);
8517 verifyFormat("#if defined(x)\n"
8518 "#endif",
8519 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008520 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008521 verifyFormat("size_t x = sizeof (x);", Space);
8522 verifyFormat("auto f (int x) -> decltype (x);", Space);
8523 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8524 verifyFormat("alignas (128) char a[128];", Space);
8525 verifyFormat("size_t x = alignof (MyType);", Space);
8526 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8527 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008528 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008529 verifyFormat("T A::operator() ();", Space);
8530 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008531}
8532
8533TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8534 FormatStyle Spaces = getLLVMStyle();
8535
8536 Spaces.SpacesInParentheses = true;
8537 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008538 verifyFormat("call();", Spaces);
8539 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008540 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8541 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008542 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008543 " continue;",
8544 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008545 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008546 " continue;",
8547 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008548 verifyFormat("if ( true )\n"
8549 " f();\n"
8550 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008551 " f();",
8552 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008553 verifyFormat("do {\n"
8554 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008555 "} while ( something() );",
8556 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008557 verifyFormat("switch ( x ) {\n"
8558 "default:\n"
8559 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008560 "}",
8561 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008562
8563 Spaces.SpacesInParentheses = false;
8564 Spaces.SpacesInCStyleCastParentheses = true;
8565 verifyFormat("Type *A = ( Type * )P;", Spaces);
8566 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8567 verifyFormat("x = ( int32 )y;", Spaces);
8568 verifyFormat("int a = ( int )(2.0f);", Spaces);
8569 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8570 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8571 verifyFormat("#define x (( int )-1)", Spaces);
8572
Daniel Jasper92e09822015-03-18 12:59:19 +00008573 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008574 Spaces.SpacesInParentheses = false;
8575 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008576 Spaces.SpacesInCStyleCastParentheses = true;
8577 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008578 verifyFormat("call( );", Spaces);
8579 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008580 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008581 " continue;",
8582 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008583 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008584 " continue;",
8585 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008586 verifyFormat("if (true)\n"
8587 " f( );\n"
8588 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008589 " f( );",
8590 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008591 verifyFormat("do {\n"
8592 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008593 "} while (something( ));",
8594 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008595 verifyFormat("switch (x) {\n"
8596 "default:\n"
8597 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008598 "}",
8599 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008600
Daniel Jasper92e09822015-03-18 12:59:19 +00008601 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008602 Spaces.SpaceAfterCStyleCast = true;
8603 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008604 verifyFormat("call( );", Spaces);
8605 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008606 verifyFormat("while (( bool ) 1)\n"
8607 " continue;",
8608 Spaces);
8609 verifyFormat("for (;;)\n"
8610 " continue;",
8611 Spaces);
8612 verifyFormat("if (true)\n"
8613 " f( );\n"
8614 "else if (true)\n"
8615 " f( );",
8616 Spaces);
8617 verifyFormat("do {\n"
8618 " do_something(( int ) i);\n"
8619 "} while (something( ));",
8620 Spaces);
8621 verifyFormat("switch (x) {\n"
8622 "default:\n"
8623 " break;\n"
8624 "}",
8625 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008626
8627 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008628 Spaces.SpacesInCStyleCastParentheses = false;
8629 Spaces.SpaceAfterCStyleCast = true;
8630 verifyFormat("while ((bool) 1)\n"
8631 " continue;",
8632 Spaces);
8633 verifyFormat("do {\n"
8634 " do_something((int) i);\n"
8635 "} while (something( ));",
8636 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008637}
8638
Daniel Jasperad981f82014-08-26 11:41:14 +00008639TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8640 verifyFormat("int a[5];");
8641 verifyFormat("a[3] += 42;");
8642
8643 FormatStyle Spaces = getLLVMStyle();
8644 Spaces.SpacesInSquareBrackets = true;
8645 // Lambdas unchanged.
8646 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8647 verifyFormat("return [i, args...] {};", Spaces);
8648
8649 // Not lambdas.
8650 verifyFormat("int a[ 5 ];", Spaces);
8651 verifyFormat("a[ 3 ] += 42;", Spaces);
8652 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8653 verifyFormat("double &operator[](int i) { return 0; }\n"
8654 "int i;",
8655 Spaces);
8656 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8657 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8658 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8659}
8660
Daniel Jasperd94bff32013-09-25 15:15:02 +00008661TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8662 verifyFormat("int a = 5;");
8663 verifyFormat("a += 42;");
8664 verifyFormat("a or_eq 8;");
8665
8666 FormatStyle Spaces = getLLVMStyle();
8667 Spaces.SpaceBeforeAssignmentOperators = false;
8668 verifyFormat("int a= 5;", Spaces);
8669 verifyFormat("a+= 42;", Spaces);
8670 verifyFormat("a or_eq 8;", Spaces);
8671}
8672
Daniel Jaspera44991332015-04-29 13:06:49 +00008673TEST_F(FormatTest, AlignConsecutiveAssignments) {
8674 FormatStyle Alignment = getLLVMStyle();
8675 Alignment.AlignConsecutiveAssignments = false;
8676 verifyFormat("int a = 5;\n"
8677 "int oneTwoThree = 123;",
8678 Alignment);
8679 verifyFormat("int a = 5;\n"
8680 "int oneTwoThree = 123;",
8681 Alignment);
8682
8683 Alignment.AlignConsecutiveAssignments = true;
8684 verifyFormat("int a = 5;\n"
8685 "int oneTwoThree = 123;",
8686 Alignment);
8687 verifyFormat("int a = method();\n"
8688 "int oneTwoThree = 133;",
8689 Alignment);
8690 verifyFormat("a &= 5;\n"
8691 "bcd *= 5;\n"
8692 "ghtyf += 5;\n"
8693 "dvfvdb -= 5;\n"
8694 "a /= 5;\n"
8695 "vdsvsv %= 5;\n"
8696 "sfdbddfbdfbb ^= 5;\n"
8697 "dvsdsv |= 5;\n"
8698 "int dsvvdvsdvvv = 123;",
8699 Alignment);
8700 verifyFormat("int i = 1, j = 10;\n"
8701 "something = 2000;",
8702 Alignment);
8703 verifyFormat("something = 2000;\n"
8704 "int i = 1, j = 10;\n",
8705 Alignment);
8706 verifyFormat("something = 2000;\n"
8707 "another = 911;\n"
8708 "int i = 1, j = 10;\n"
8709 "oneMore = 1;\n"
8710 "i = 2;",
8711 Alignment);
8712 verifyFormat("int a = 5;\n"
8713 "int one = 1;\n"
8714 "method();\n"
8715 "int oneTwoThree = 123;\n"
8716 "int oneTwo = 12;",
8717 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008718 verifyFormat("int oneTwoThree = 123;\n"
8719 "int oneTwo = 12;\n"
8720 "method();\n",
8721 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008722 verifyFormat("int oneTwoThree = 123; // comment\n"
8723 "int oneTwo = 12; // comment",
8724 Alignment);
8725 EXPECT_EQ("int a = 5;\n"
8726 "\n"
8727 "int oneTwoThree = 123;",
8728 format("int a = 5;\n"
8729 "\n"
8730 "int oneTwoThree= 123;",
8731 Alignment));
8732 EXPECT_EQ("int a = 5;\n"
8733 "int one = 1;\n"
8734 "\n"
8735 "int oneTwoThree = 123;",
8736 format("int a = 5;\n"
8737 "int one = 1;\n"
8738 "\n"
8739 "int oneTwoThree = 123;",
8740 Alignment));
8741 EXPECT_EQ("int a = 5;\n"
8742 "int one = 1;\n"
8743 "\n"
8744 "int oneTwoThree = 123;\n"
8745 "int oneTwo = 12;",
8746 format("int a = 5;\n"
8747 "int one = 1;\n"
8748 "\n"
8749 "int oneTwoThree = 123;\n"
8750 "int oneTwo = 12;",
8751 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008752 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8753 verifyFormat("#define A \\\n"
8754 " int aaaa = 12; \\\n"
8755 " int b = 23; \\\n"
8756 " int ccc = 234; \\\n"
8757 " int dddddddddd = 2345;",
8758 Alignment);
8759 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008760 verifyFormat("#define A \\\n"
8761 " int aaaa = 12; \\\n"
8762 " int b = 23; \\\n"
8763 " int ccc = 234; \\\n"
8764 " int dddddddddd = 2345;",
8765 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008766 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008767 verifyFormat("#define A "
8768 " \\\n"
8769 " int aaaa = 12; "
8770 " \\\n"
8771 " int b = 23; "
8772 " \\\n"
8773 " int ccc = 234; "
8774 " \\\n"
8775 " int dddddddddd = 2345;",
8776 Alignment);
8777 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8778 "k = 4, int l = 5,\n"
8779 " int m = 6) {\n"
8780 " int j = 10;\n"
8781 " otherThing = 1;\n"
8782 "}",
8783 Alignment);
8784 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8785 " int i = 1;\n"
8786 " int j = 2;\n"
8787 " int big = 10000;\n"
8788 "}",
8789 Alignment);
8790 verifyFormat("class C {\n"
8791 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008792 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008793 " virtual void f() = 0;\n"
8794 "};",
8795 Alignment);
8796 verifyFormat("int i = 1;\n"
8797 "if (SomeType t = getSomething()) {\n"
8798 "}\n"
8799 "int j = 2;\n"
8800 "int big = 10000;",
8801 Alignment);
8802 verifyFormat("int j = 7;\n"
8803 "for (int k = 0; k < N; ++k) {\n"
8804 "}\n"
8805 "int j = 2;\n"
8806 "int big = 10000;\n"
8807 "}",
8808 Alignment);
8809 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8810 verifyFormat("int i = 1;\n"
8811 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8812 " = someLooooooooooooooooongFunction();\n"
8813 "int j = 2;",
8814 Alignment);
8815 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8816 verifyFormat("int i = 1;\n"
8817 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8818 " someLooooooooooooooooongFunction();\n"
8819 "int j = 2;",
8820 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008821
8822 verifyFormat("auto lambda = []() {\n"
8823 " auto i = 0;\n"
8824 " return 0;\n"
8825 "};\n"
8826 "int i = 0;\n"
8827 "auto v = type{\n"
8828 " i = 1, //\n"
8829 " (i = 2), //\n"
8830 " i = 3 //\n"
8831 "};",
8832 Alignment);
8833
Daniel Jaspera44991332015-04-29 13:06:49 +00008834 verifyFormat(
8835 "int i = 1;\n"
8836 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8837 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008838 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00008839 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008840
8841 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8842 " typename B = very_long_type_name_1,\n"
8843 " typename T_2 = very_long_type_name_2>\n"
8844 "auto foo() {}\n",
8845 Alignment);
8846 verifyFormat("int a, b = 1;\n"
8847 "int c = 2;\n"
8848 "int dd = 3;\n",
8849 Alignment);
8850 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8851 "float b[1][] = {{3.f}};\n",
8852 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008853 verifyFormat("for (int i = 0; i < 1; i++)\n"
8854 " int x = 1;\n",
8855 Alignment);
8856 verifyFormat("for (i = 0; i < 1; i++)\n"
8857 " x = 1;\n"
8858 "y = 1;\n",
8859 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008860}
8861
Daniel Jaspere12597c2015-10-01 10:06:54 +00008862TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8863 FormatStyle Alignment = getLLVMStyle();
8864 Alignment.AlignConsecutiveDeclarations = false;
8865 verifyFormat("float const a = 5;\n"
8866 "int oneTwoThree = 123;",
8867 Alignment);
8868 verifyFormat("int a = 5;\n"
8869 "float const oneTwoThree = 123;",
8870 Alignment);
8871
8872 Alignment.AlignConsecutiveDeclarations = true;
8873 verifyFormat("float const a = 5;\n"
8874 "int oneTwoThree = 123;",
8875 Alignment);
8876 verifyFormat("int a = method();\n"
8877 "float const oneTwoThree = 133;",
8878 Alignment);
8879 verifyFormat("int i = 1, j = 10;\n"
8880 "something = 2000;",
8881 Alignment);
8882 verifyFormat("something = 2000;\n"
8883 "int i = 1, j = 10;\n",
8884 Alignment);
8885 verifyFormat("float something = 2000;\n"
8886 "double another = 911;\n"
8887 "int i = 1, j = 10;\n"
8888 "const int *oneMore = 1;\n"
8889 "unsigned i = 2;",
8890 Alignment);
8891 verifyFormat("float a = 5;\n"
8892 "int one = 1;\n"
8893 "method();\n"
8894 "const double oneTwoThree = 123;\n"
8895 "const unsigned int oneTwo = 12;",
8896 Alignment);
8897 verifyFormat("int oneTwoThree{0}; // comment\n"
8898 "unsigned oneTwo; // comment",
8899 Alignment);
8900 EXPECT_EQ("float const a = 5;\n"
8901 "\n"
8902 "int oneTwoThree = 123;",
8903 format("float const a = 5;\n"
8904 "\n"
8905 "int oneTwoThree= 123;",
8906 Alignment));
8907 EXPECT_EQ("float a = 5;\n"
8908 "int one = 1;\n"
8909 "\n"
8910 "unsigned oneTwoThree = 123;",
8911 format("float a = 5;\n"
8912 "int one = 1;\n"
8913 "\n"
8914 "unsigned oneTwoThree = 123;",
8915 Alignment));
8916 EXPECT_EQ("float a = 5;\n"
8917 "int one = 1;\n"
8918 "\n"
8919 "unsigned oneTwoThree = 123;\n"
8920 "int oneTwo = 12;",
8921 format("float a = 5;\n"
8922 "int one = 1;\n"
8923 "\n"
8924 "unsigned oneTwoThree = 123;\n"
8925 "int oneTwo = 12;",
8926 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008927 // Function prototype alignment
8928 verifyFormat("int a();\n"
8929 "double b();",
8930 Alignment);
8931 verifyFormat("int a(int x);\n"
8932 "double b();",
8933 Alignment);
8934 unsigned OldColumnLimit = Alignment.ColumnLimit;
8935 // We need to set ColumnLimit to zero, in order to stress nested alignments,
8936 // otherwise the function parameters will be re-flowed onto a single line.
8937 Alignment.ColumnLimit = 0;
8938 EXPECT_EQ("int a(int x,\n"
8939 " float y);\n"
8940 "double b(int x,\n"
8941 " double y);",
8942 format("int a(int x,\n"
8943 " float y);\n"
8944 "double b(int x,\n"
8945 " double y);",
8946 Alignment));
8947 // This ensures that function parameters of function declarations are
8948 // correctly indented when their owning functions are indented.
8949 // The failure case here is for 'double y' to not be indented enough.
8950 EXPECT_EQ("double a(int x);\n"
8951 "int b(int y,\n"
8952 " double z);",
8953 format("double a(int x);\n"
8954 "int b(int y,\n"
8955 " double z);",
8956 Alignment));
8957 // Set ColumnLimit low so that we induce wrapping immediately after
8958 // the function name and opening paren.
8959 Alignment.ColumnLimit = 13;
8960 verifyFormat("int function(\n"
8961 " int x,\n"
8962 " bool y);",
8963 Alignment);
8964 Alignment.ColumnLimit = OldColumnLimit;
8965 // Ensure function pointers don't screw up recursive alignment
8966 verifyFormat("int a(int x, void (*fp)(int y));\n"
8967 "double b();",
8968 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008969 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008970 // Ensure recursive alignment is broken by function braces, so that the
8971 // "a = 1" does not align with subsequent assignments inside the function
8972 // body.
8973 verifyFormat("int func(int a = 1) {\n"
8974 " int b = 2;\n"
8975 " int cc = 3;\n"
8976 "}",
8977 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008978 verifyFormat("float something = 2000;\n"
8979 "double another = 911;\n"
8980 "int i = 1, j = 10;\n"
8981 "const int *oneMore = 1;\n"
8982 "unsigned i = 2;",
8983 Alignment);
8984 verifyFormat("int oneTwoThree = {0}; // comment\n"
8985 "unsigned oneTwo = 0; // comment",
8986 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00008987 // Make sure that scope is correctly tracked, in the absence of braces
8988 verifyFormat("for (int i = 0; i < n; i++)\n"
8989 " j = i;\n"
8990 "double x = 1;\n",
8991 Alignment);
8992 verifyFormat("if (int i = 0)\n"
8993 " j = i;\n"
8994 "double x = 1;\n",
8995 Alignment);
8996 // Ensure operator[] and operator() are comprehended
8997 verifyFormat("struct test {\n"
8998 " long long int foo();\n"
8999 " int operator[](int a);\n"
9000 " double bar();\n"
9001 "};\n",
9002 Alignment);
9003 verifyFormat("struct test {\n"
9004 " long long int foo();\n"
9005 " int operator()(int a);\n"
9006 " double bar();\n"
9007 "};\n",
9008 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009009 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9010 " int const i = 1;\n"
9011 " int * j = 2;\n"
9012 " int big = 10000;\n"
9013 "\n"
9014 " unsigned oneTwoThree = 123;\n"
9015 " int oneTwo = 12;\n"
9016 " method();\n"
9017 " float k = 2;\n"
9018 " int ll = 10000;\n"
9019 "}",
9020 format("void SomeFunction(int parameter= 0) {\n"
9021 " int const i= 1;\n"
9022 " int *j=2;\n"
9023 " int big = 10000;\n"
9024 "\n"
9025 "unsigned oneTwoThree =123;\n"
9026 "int oneTwo = 12;\n"
9027 " method();\n"
9028 "float k= 2;\n"
9029 "int ll=10000;\n"
9030 "}",
9031 Alignment));
9032 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009033 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9034 verifyFormat("#define A \\\n"
9035 " int aaaa = 12; \\\n"
9036 " float b = 23; \\\n"
9037 " const int ccc = 234; \\\n"
9038 " unsigned dddddddddd = 2345;",
9039 Alignment);
9040 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009041 verifyFormat("#define A \\\n"
9042 " int aaaa = 12; \\\n"
9043 " float b = 23; \\\n"
9044 " const int ccc = 234; \\\n"
9045 " unsigned dddddddddd = 2345;",
9046 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009047 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009048 Alignment.ColumnLimit = 30;
9049 verifyFormat("#define A \\\n"
9050 " int aaaa = 12; \\\n"
9051 " float b = 23; \\\n"
9052 " const int ccc = 234; \\\n"
9053 " int dddddddddd = 2345;",
9054 Alignment);
9055 Alignment.ColumnLimit = 80;
9056 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9057 "k = 4, int l = 5,\n"
9058 " int m = 6) {\n"
9059 " const int j = 10;\n"
9060 " otherThing = 1;\n"
9061 "}",
9062 Alignment);
9063 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9064 " int const i = 1;\n"
9065 " int * j = 2;\n"
9066 " int big = 10000;\n"
9067 "}",
9068 Alignment);
9069 verifyFormat("class C {\n"
9070 "public:\n"
9071 " int i = 1;\n"
9072 " virtual void f() = 0;\n"
9073 "};",
9074 Alignment);
9075 verifyFormat("float i = 1;\n"
9076 "if (SomeType t = getSomething()) {\n"
9077 "}\n"
9078 "const unsigned j = 2;\n"
9079 "int big = 10000;",
9080 Alignment);
9081 verifyFormat("float j = 7;\n"
9082 "for (int k = 0; k < N; ++k) {\n"
9083 "}\n"
9084 "unsigned j = 2;\n"
9085 "int big = 10000;\n"
9086 "}",
9087 Alignment);
9088 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9089 verifyFormat("float i = 1;\n"
9090 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9091 " = someLooooooooooooooooongFunction();\n"
9092 "int j = 2;",
9093 Alignment);
9094 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9095 verifyFormat("int i = 1;\n"
9096 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9097 " someLooooooooooooooooongFunction();\n"
9098 "int j = 2;",
9099 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009100
9101 Alignment.AlignConsecutiveAssignments = true;
9102 verifyFormat("auto lambda = []() {\n"
9103 " auto ii = 0;\n"
9104 " float j = 0;\n"
9105 " return 0;\n"
9106 "};\n"
9107 "int i = 0;\n"
9108 "float i2 = 0;\n"
9109 "auto v = type{\n"
9110 " i = 1, //\n"
9111 " (i = 2), //\n"
9112 " i = 3 //\n"
9113 "};",
9114 Alignment);
9115 Alignment.AlignConsecutiveAssignments = false;
9116
Daniel Jaspere12597c2015-10-01 10:06:54 +00009117 verifyFormat(
9118 "int i = 1;\n"
9119 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9120 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009121 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009122 Alignment);
9123
9124 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9125 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009126 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009127 // happens.
9128 Alignment.AlignConsecutiveAssignments = true;
9129 Alignment.ColumnLimit = 30;
9130 verifyFormat("float ii = 1;\n"
9131 "unsigned j = 2;\n"
9132 "int someVerylongVariable = 1;\n"
9133 "AnotherLongType ll = 123456;\n"
9134 "VeryVeryLongType k = 2;\n"
9135 "int myvar = 1;",
9136 Alignment);
9137 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009138 Alignment.AlignConsecutiveAssignments = false;
9139
9140 verifyFormat(
9141 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9142 " typename LongType, typename B>\n"
9143 "auto foo() {}\n",
9144 Alignment);
9145 verifyFormat("float a, b = 1;\n"
9146 "int c = 2;\n"
9147 "int dd = 3;\n",
9148 Alignment);
9149 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9150 "float b[1][] = {{3.f}};\n",
9151 Alignment);
9152 Alignment.AlignConsecutiveAssignments = true;
9153 verifyFormat("float a, b = 1;\n"
9154 "int c = 2;\n"
9155 "int dd = 3;\n",
9156 Alignment);
9157 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9158 "float b[1][] = {{3.f}};\n",
9159 Alignment);
9160 Alignment.AlignConsecutiveAssignments = false;
9161
9162 Alignment.ColumnLimit = 30;
9163 Alignment.BinPackParameters = false;
9164 verifyFormat("void foo(float a,\n"
9165 " float b,\n"
9166 " int c,\n"
9167 " uint32_t *d) {\n"
9168 " int * e = 0;\n"
9169 " float f = 0;\n"
9170 " double g = 0;\n"
9171 "}\n"
9172 "void bar(ino_t a,\n"
9173 " int b,\n"
9174 " uint32_t *c,\n"
9175 " bool d) {}\n",
9176 Alignment);
9177 Alignment.BinPackParameters = true;
9178 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009179
9180 // Bug 33507
9181 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9182 verifyFormat(
9183 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9184 " static const Version verVs2017;\n"
9185 " return true;\n"
9186 "});\n",
9187 Alignment);
9188 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009189}
9190
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009191TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009192 FormatStyle LinuxBraceStyle = getLLVMStyle();
9193 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009194 verifyFormat("namespace a\n"
9195 "{\n"
9196 "class A\n"
9197 "{\n"
9198 " void f()\n"
9199 " {\n"
9200 " if (true) {\n"
9201 " a();\n"
9202 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009203 " } else {\n"
9204 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009205 " }\n"
9206 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009207 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009208 "};\n"
9209 "struct B {\n"
9210 " int x;\n"
9211 "};\n"
9212 "}\n",
9213 LinuxBraceStyle);
9214 verifyFormat("enum X {\n"
9215 " Y = 0,\n"
9216 "}\n",
9217 LinuxBraceStyle);
9218 verifyFormat("struct S {\n"
9219 " int Type;\n"
9220 " union {\n"
9221 " int x;\n"
9222 " double y;\n"
9223 " } Value;\n"
9224 " class C\n"
9225 " {\n"
9226 " MyFavoriteType Value;\n"
9227 " } Class;\n"
9228 "}\n",
9229 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009230}
9231
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009232TEST_F(FormatTest, MozillaBraceBreaking) {
9233 FormatStyle MozillaBraceStyle = getLLVMStyle();
9234 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009235 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009236 verifyFormat("namespace a {\n"
9237 "class A\n"
9238 "{\n"
9239 " void f()\n"
9240 " {\n"
9241 " if (true) {\n"
9242 " a();\n"
9243 " b();\n"
9244 " }\n"
9245 " }\n"
9246 " void g() { return; }\n"
9247 "};\n"
9248 "enum E\n"
9249 "{\n"
9250 " A,\n"
9251 " // foo\n"
9252 " B,\n"
9253 " C\n"
9254 "};\n"
9255 "struct B\n"
9256 "{\n"
9257 " int x;\n"
9258 "};\n"
9259 "}\n",
9260 MozillaBraceStyle);
9261 verifyFormat("struct S\n"
9262 "{\n"
9263 " int Type;\n"
9264 " union\n"
9265 " {\n"
9266 " int x;\n"
9267 " double y;\n"
9268 " } Value;\n"
9269 " class C\n"
9270 " {\n"
9271 " MyFavoriteType Value;\n"
9272 " } Class;\n"
9273 "}\n",
9274 MozillaBraceStyle);
9275}
9276
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009277TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009278 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9279 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009280 verifyFormat("namespace a {\n"
9281 "class A {\n"
9282 " void f()\n"
9283 " {\n"
9284 " if (true) {\n"
9285 " a();\n"
9286 " b();\n"
9287 " }\n"
9288 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009289 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009290 "};\n"
9291 "struct B {\n"
9292 " int x;\n"
9293 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009294 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009295 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009296
Daniel Jasperd9670872014-08-05 12:06:20 +00009297 verifyFormat("void foo()\n"
9298 "{\n"
9299 " if (a) {\n"
9300 " a();\n"
9301 " }\n"
9302 " else {\n"
9303 " b();\n"
9304 " }\n"
9305 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009306 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009307
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009308 verifyFormat("#ifdef _DEBUG\n"
9309 "int foo(int i = 0)\n"
9310 "#else\n"
9311 "int foo(int i = 5)\n"
9312 "#endif\n"
9313 "{\n"
9314 " return i;\n"
9315 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009316 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009317
9318 verifyFormat("void foo() {}\n"
9319 "void bar()\n"
9320 "#ifdef _DEBUG\n"
9321 "{\n"
9322 " foo();\n"
9323 "}\n"
9324 "#else\n"
9325 "{\n"
9326 "}\n"
9327 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009328 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009329
9330 verifyFormat("void foobar() { int i = 5; }\n"
9331 "#ifdef _DEBUG\n"
9332 "void bar() {}\n"
9333 "#else\n"
9334 "void bar() { foobar(); }\n"
9335 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009336 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009337}
9338
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009339TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009340 FormatStyle AllmanBraceStyle = getLLVMStyle();
9341 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009342 verifyFormat("namespace a\n"
9343 "{\n"
9344 "class A\n"
9345 "{\n"
9346 " void f()\n"
9347 " {\n"
9348 " if (true)\n"
9349 " {\n"
9350 " a();\n"
9351 " b();\n"
9352 " }\n"
9353 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009354 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009355 "};\n"
9356 "struct B\n"
9357 "{\n"
9358 " int x;\n"
9359 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009360 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009361 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009362
9363 verifyFormat("void f()\n"
9364 "{\n"
9365 " if (true)\n"
9366 " {\n"
9367 " a();\n"
9368 " }\n"
9369 " else if (false)\n"
9370 " {\n"
9371 " b();\n"
9372 " }\n"
9373 " else\n"
9374 " {\n"
9375 " c();\n"
9376 " }\n"
9377 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009378 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009379
9380 verifyFormat("void f()\n"
9381 "{\n"
9382 " for (int i = 0; i < 10; ++i)\n"
9383 " {\n"
9384 " a();\n"
9385 " }\n"
9386 " while (false)\n"
9387 " {\n"
9388 " b();\n"
9389 " }\n"
9390 " do\n"
9391 " {\n"
9392 " c();\n"
9393 " } while (false)\n"
9394 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009395 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009396
9397 verifyFormat("void f(int a)\n"
9398 "{\n"
9399 " switch (a)\n"
9400 " {\n"
9401 " case 0:\n"
9402 " break;\n"
9403 " case 1:\n"
9404 " {\n"
9405 " break;\n"
9406 " }\n"
9407 " case 2:\n"
9408 " {\n"
9409 " }\n"
9410 " break;\n"
9411 " default:\n"
9412 " break;\n"
9413 " }\n"
9414 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009415 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009416
9417 verifyFormat("enum X\n"
9418 "{\n"
9419 " Y = 0,\n"
9420 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009421 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009422 verifyFormat("enum X\n"
9423 "{\n"
9424 " Y = 0\n"
9425 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009426 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009427
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009428 verifyFormat("@interface BSApplicationController ()\n"
9429 "{\n"
9430 "@private\n"
9431 " id _extraIvar;\n"
9432 "}\n"
9433 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009434 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009435
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009436 verifyFormat("#ifdef _DEBUG\n"
9437 "int foo(int i = 0)\n"
9438 "#else\n"
9439 "int foo(int i = 5)\n"
9440 "#endif\n"
9441 "{\n"
9442 " return i;\n"
9443 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009444 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009445
9446 verifyFormat("void foo() {}\n"
9447 "void bar()\n"
9448 "#ifdef _DEBUG\n"
9449 "{\n"
9450 " foo();\n"
9451 "}\n"
9452 "#else\n"
9453 "{\n"
9454 "}\n"
9455 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009456 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009457
9458 verifyFormat("void foobar() { int i = 5; }\n"
9459 "#ifdef _DEBUG\n"
9460 "void bar() {}\n"
9461 "#else\n"
9462 "void bar() { foobar(); }\n"
9463 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009464 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009465
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009466 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009467 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009468 " // ...\n"
9469 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009470 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009471 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009472 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009473 " // ...\n"
9474 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009475 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009476 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009477 // .. or dict literals.
9478 verifyFormat("void f()\n"
9479 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009480 " // ...\n"
9481 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9482 "}",
9483 AllmanBraceStyle);
9484 verifyFormat("void f()\n"
9485 "{\n"
9486 " // ...\n"
9487 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009488 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009489 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009490 verifyFormat("int f()\n"
9491 "{ // comment\n"
9492 " return 42;\n"
9493 "}",
9494 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009495
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009496 AllmanBraceStyle.ColumnLimit = 19;
9497 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9498 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009499 verifyFormat("void f()\n"
9500 "{\n"
9501 " int i;\n"
9502 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009503 AllmanBraceStyle);
9504 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009505
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009506 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009507 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9508 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9509 verifyFormat("void f(bool b)\n"
9510 "{\n"
9511 " if (b)\n"
9512 " {\n"
9513 " return;\n"
9514 " }\n"
9515 "}\n",
9516 BreakBeforeBraceShortIfs);
9517 verifyFormat("void f(bool b)\n"
9518 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009519 " if constexpr (b)\n"
9520 " {\n"
9521 " return;\n"
9522 " }\n"
9523 "}\n",
9524 BreakBeforeBraceShortIfs);
9525 verifyFormat("void f(bool b)\n"
9526 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009527 " if (b) return;\n"
9528 "}\n",
9529 BreakBeforeBraceShortIfs);
9530 verifyFormat("void f(bool b)\n"
9531 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009532 " if constexpr (b) return;\n"
9533 "}\n",
9534 BreakBeforeBraceShortIfs);
9535 verifyFormat("void f(bool b)\n"
9536 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009537 " while (b)\n"
9538 " {\n"
9539 " return;\n"
9540 " }\n"
9541 "}\n",
9542 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009543}
9544
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009545TEST_F(FormatTest, GNUBraceBreaking) {
9546 FormatStyle GNUBraceStyle = getLLVMStyle();
9547 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9548 verifyFormat("namespace a\n"
9549 "{\n"
9550 "class A\n"
9551 "{\n"
9552 " void f()\n"
9553 " {\n"
9554 " int a;\n"
9555 " {\n"
9556 " int b;\n"
9557 " }\n"
9558 " if (true)\n"
9559 " {\n"
9560 " a();\n"
9561 " b();\n"
9562 " }\n"
9563 " }\n"
9564 " void g() { return; }\n"
9565 "}\n"
9566 "}",
9567 GNUBraceStyle);
9568
9569 verifyFormat("void f()\n"
9570 "{\n"
9571 " if (true)\n"
9572 " {\n"
9573 " a();\n"
9574 " }\n"
9575 " else if (false)\n"
9576 " {\n"
9577 " b();\n"
9578 " }\n"
9579 " else\n"
9580 " {\n"
9581 " c();\n"
9582 " }\n"
9583 "}\n",
9584 GNUBraceStyle);
9585
9586 verifyFormat("void f()\n"
9587 "{\n"
9588 " for (int i = 0; i < 10; ++i)\n"
9589 " {\n"
9590 " a();\n"
9591 " }\n"
9592 " while (false)\n"
9593 " {\n"
9594 " b();\n"
9595 " }\n"
9596 " do\n"
9597 " {\n"
9598 " c();\n"
9599 " }\n"
9600 " while (false);\n"
9601 "}\n",
9602 GNUBraceStyle);
9603
9604 verifyFormat("void f(int a)\n"
9605 "{\n"
9606 " switch (a)\n"
9607 " {\n"
9608 " case 0:\n"
9609 " break;\n"
9610 " case 1:\n"
9611 " {\n"
9612 " break;\n"
9613 " }\n"
9614 " case 2:\n"
9615 " {\n"
9616 " }\n"
9617 " break;\n"
9618 " default:\n"
9619 " break;\n"
9620 " }\n"
9621 "}\n",
9622 GNUBraceStyle);
9623
9624 verifyFormat("enum X\n"
9625 "{\n"
9626 " Y = 0,\n"
9627 "}\n",
9628 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009629
9630 verifyFormat("@interface BSApplicationController ()\n"
9631 "{\n"
9632 "@private\n"
9633 " id _extraIvar;\n"
9634 "}\n"
9635 "@end\n",
9636 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009637
9638 verifyFormat("#ifdef _DEBUG\n"
9639 "int foo(int i = 0)\n"
9640 "#else\n"
9641 "int foo(int i = 5)\n"
9642 "#endif\n"
9643 "{\n"
9644 " return i;\n"
9645 "}",
9646 GNUBraceStyle);
9647
9648 verifyFormat("void foo() {}\n"
9649 "void bar()\n"
9650 "#ifdef _DEBUG\n"
9651 "{\n"
9652 " foo();\n"
9653 "}\n"
9654 "#else\n"
9655 "{\n"
9656 "}\n"
9657 "#endif",
9658 GNUBraceStyle);
9659
9660 verifyFormat("void foobar() { int i = 5; }\n"
9661 "#ifdef _DEBUG\n"
9662 "void bar() {}\n"
9663 "#else\n"
9664 "void bar() { foobar(); }\n"
9665 "#endif",
9666 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009667}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009668
9669TEST_F(FormatTest, WebKitBraceBreaking) {
9670 FormatStyle WebKitBraceStyle = getLLVMStyle();
9671 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009672 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009673 verifyFormat("namespace a {\n"
9674 "class A {\n"
9675 " void f()\n"
9676 " {\n"
9677 " if (true) {\n"
9678 " a();\n"
9679 " b();\n"
9680 " }\n"
9681 " }\n"
9682 " void g() { return; }\n"
9683 "};\n"
9684 "enum E {\n"
9685 " A,\n"
9686 " // foo\n"
9687 " B,\n"
9688 " C\n"
9689 "};\n"
9690 "struct B {\n"
9691 " int x;\n"
9692 "};\n"
9693 "}\n",
9694 WebKitBraceStyle);
9695 verifyFormat("struct S {\n"
9696 " int Type;\n"
9697 " union {\n"
9698 " int x;\n"
9699 " double y;\n"
9700 " } Value;\n"
9701 " class C {\n"
9702 " MyFavoriteType Value;\n"
9703 " } Class;\n"
9704 "};\n",
9705 WebKitBraceStyle);
9706}
9707
Manuel Klimekd5735502013-08-12 03:51:17 +00009708TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9709 verifyFormat("void f() {\n"
9710 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009711 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009712 " }\n"
9713 "}\n",
9714 getLLVMStyle());
9715}
9716
Daniel Jasper9613c812013-08-07 16:29:23 +00009717TEST_F(FormatTest, UnderstandsPragmas) {
9718 verifyFormat("#pragma omp reduction(| : var)");
9719 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009720
9721 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9722 "(including parentheses).",
9723 format("#pragma mark Any non-hyphenated or hyphenated string "
9724 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009725}
9726
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009727TEST_F(FormatTest, UnderstandPragmaOption) {
9728 verifyFormat("#pragma option -C -A");
9729
9730 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9731}
9732
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009733#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9734 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009735 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9736 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009737
9738TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009739 SmallVector<FormatStyle, 3> Styles;
9740 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009741
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009742 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009743 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9744 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9745 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009746
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009747 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009748 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9749 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9750 EXPECT_ALL_STYLES_EQUAL(Styles);
9751
Nico Weber514ecc82014-02-02 20:50:45 +00009752 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009753 EXPECT_TRUE(
9754 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9755 EXPECT_TRUE(
9756 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9757 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009758
Nico Weber514ecc82014-02-02 20:50:45 +00009759 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009760 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9761 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9762 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009763
9764 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009765 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9766 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9767 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009768
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009769 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009770 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9771 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9772 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009773
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009774 Styles[0] = getGNUStyle();
9775 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9776 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9777 EXPECT_ALL_STYLES_EQUAL(Styles);
9778
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009779 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9780}
9781
9782TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9783 SmallVector<FormatStyle, 8> Styles;
9784 Styles.resize(2);
9785
9786 Styles[0] = getGoogleStyle();
9787 Styles[1] = getLLVMStyle();
9788 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9789 EXPECT_ALL_STYLES_EQUAL(Styles);
9790
9791 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009792 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009793 Styles[1] = getLLVMStyle();
9794 Styles[1].Language = FormatStyle::LK_JavaScript;
9795 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9796
9797 Styles[2] = getLLVMStyle();
9798 Styles[2].Language = FormatStyle::LK_JavaScript;
9799 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9800 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009801 &Styles[2])
9802 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009803
9804 Styles[3] = getLLVMStyle();
9805 Styles[3].Language = FormatStyle::LK_JavaScript;
9806 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9807 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009808 &Styles[3])
9809 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009810
9811 Styles[4] = getLLVMStyle();
9812 Styles[4].Language = FormatStyle::LK_JavaScript;
9813 EXPECT_EQ(0, parseConfiguration("---\n"
9814 "BasedOnStyle: LLVM\n"
9815 "IndentWidth: 123\n"
9816 "---\n"
9817 "BasedOnStyle: Google\n"
9818 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009819 &Styles[4])
9820 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009821 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009822}
9823
Daniel Jasper91881d92014-09-29 08:07:46 +00009824#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009825 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009826 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009827 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009828 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009829 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009830
Daniel Jasper91881d92014-09-29 08:07:46 +00009831#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9832
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009833#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9834 Style.STRUCT.FIELD = false; \
9835 EXPECT_EQ(0, \
9836 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9837 .value()); \
9838 EXPECT_TRUE(Style.STRUCT.FIELD); \
9839 EXPECT_EQ(0, \
9840 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9841 .value()); \
9842 EXPECT_FALSE(Style.STRUCT.FIELD);
9843
9844#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9845 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9846
Daniel Jasper00853002014-09-16 16:22:30 +00009847#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9848 EXPECT_NE(VALUE, Style.FIELD); \
9849 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9850 EXPECT_EQ(VALUE, Style.FIELD)
9851
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009852TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009853 FormatStyle Style = {};
9854 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +00009855 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009856 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009857 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009858 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009859 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009860 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009861 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009862 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009863 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009864 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009865 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009866 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009867 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009868 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009869 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00009870 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +00009871 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009872 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009873 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009874 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009875 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009876 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009877 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009878 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009879 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009880 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009881 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009882 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009883 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +00009884 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009885 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009886 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009887 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009888 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009889 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009890 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009891 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009892 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009893 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009894
9895 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9896 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9897 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9898 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9899 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9900 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9901 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9902 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9903 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9904 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9905 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +00009906 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
9907 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
9908 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009909}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009910
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009911#undef CHECK_PARSE_BOOL
9912
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009913TEST_F(FormatTest, ParsesConfiguration) {
9914 FormatStyle Style = {};
9915 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009916 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009917 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9918 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009919 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009920 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9921 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +00009922 CHECK_PARSE("PenaltyBreakAssignment: 1234",
9923 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009924 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9925 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009926 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9927 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9928 PenaltyReturnTypeOnItsOwnLine, 1234u);
9929 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9930 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009931 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009932 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009933 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009934
Daniel Jasper553d4872014-06-17 12:40:34 +00009935 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009936 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9937 FormatStyle::PAS_Left);
9938 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9939 FormatStyle::PAS_Right);
9940 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9941 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009942 // For backward compatibility:
9943 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9944 FormatStyle::PAS_Left);
9945 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9946 FormatStyle::PAS_Right);
9947 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9948 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009949
Alexander Kornienkod6538332013-05-07 15:32:14 +00009950 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009951 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9952 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009953 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9954 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9955 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9956
Daniel Jasperac043c92014-09-15 11:11:00 +00009957 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009958 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9959 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009960 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9961 FormatStyle::BOS_None);
9962 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9963 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009964 // For backward compatibility:
9965 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9966 FormatStyle::BOS_None);
9967 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9968 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009969
Francois Ferranda6b6d512017-05-24 11:36:58 +00009970 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
9971 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
9972 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9973 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
9974 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
9975 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
9976 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
9977 // For backward compatibility:
9978 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
9979 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
9980
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009981 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9982 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9983 FormatStyle::BAS_Align);
9984 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9985 FormatStyle::BAS_DontAlign);
9986 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9987 FormatStyle::BAS_AlwaysBreak);
9988 // For backward compatibility:
9989 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9990 FormatStyle::BAS_DontAlign);
9991 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9992 FormatStyle::BAS_Align);
9993
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009994 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9995 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
9996 FormatStyle::ENAS_DontAlign);
9997 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
9998 FormatStyle::ENAS_Left);
9999 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10000 FormatStyle::ENAS_Right);
10001 // For backward compatibility:
10002 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10003 FormatStyle::ENAS_Left);
10004 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10005 FormatStyle::ENAS_Right);
10006
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010007 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010008 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10009 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10010 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010011 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10012 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010013 // For backward compatibility:
10014 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10015 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010016
Daniel Jasperd74cf402014-04-08 12:46:38 +000010017 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010018 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10019 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10020 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10021 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010022 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10023 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010024 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10025 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010026 // For backward compatibility:
10027 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10028 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10029 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10030 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010031
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010032 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10033 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10034 FormatStyle::SBPO_Never);
10035 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10036 FormatStyle::SBPO_Always);
10037 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10038 FormatStyle::SBPO_ControlStatements);
10039 // For backward compatibility:
10040 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10041 FormatStyle::SBPO_Never);
10042 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10043 FormatStyle::SBPO_ControlStatements);
10044
Alexander Kornienkod6538332013-05-07 15:32:14 +000010045 Style.ColumnLimit = 123;
10046 FormatStyle BaseStyle = getLLVMStyle();
10047 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10048 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10049
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010050 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10051 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10052 FormatStyle::BS_Attach);
10053 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10054 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010055 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10056 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010057 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10058 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010059 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10060 FormatStyle::BS_Allman);
10061 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010062 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10063 FormatStyle::BS_WebKit);
10064 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10065 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010066
Zachary Turner448592e2015-12-18 22:20:15 +000010067 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10068 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10069 FormatStyle::RTBS_None);
10070 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10071 FormatStyle::RTBS_All);
10072 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010073 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010074 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10075 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10076 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10077 AlwaysBreakAfterReturnType,
10078 FormatStyle::RTBS_TopLevelDefinitions);
10079
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010080 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10081 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10082 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10083 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10084 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10085 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10086 AlwaysBreakAfterDefinitionReturnType,
10087 FormatStyle::DRTBS_TopLevel);
10088
Daniel Jasper65ee3472013-07-31 23:16:02 +000010089 Style.NamespaceIndentation = FormatStyle::NI_All;
10090 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10091 FormatStyle::NI_None);
10092 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10093 FormatStyle::NI_Inner);
10094 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10095 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010096
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010097 // FIXME: This is required because parsing a configuration simply overwrites
10098 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010099 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010100 std::vector<std::string> BoostForeach;
10101 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010102 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010103 std::vector<std::string> BoostAndQForeach;
10104 BoostAndQForeach.push_back("BOOST_FOREACH");
10105 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010106 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10107 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010108
10109 Style.IncludeCategories.clear();
10110 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10111 {".*", 1}};
10112 CHECK_PARSE("IncludeCategories:\n"
10113 " - Regex: abc/.*\n"
10114 " Priority: 2\n"
10115 " - Regex: .*\n"
10116 " Priority: 1",
10117 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010118 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010119}
10120
10121TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10122 FormatStyle Style = {};
10123 Style.Language = FormatStyle::LK_Cpp;
10124 CHECK_PARSE("Language: Cpp\n"
10125 "IndentWidth: 12",
10126 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010127 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10128 "IndentWidth: 34",
10129 &Style),
10130 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010131 EXPECT_EQ(12u, Style.IndentWidth);
10132 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10133 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10134
10135 Style.Language = FormatStyle::LK_JavaScript;
10136 CHECK_PARSE("Language: JavaScript\n"
10137 "IndentWidth: 12",
10138 IndentWidth, 12u);
10139 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010140 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10141 "IndentWidth: 34",
10142 &Style),
10143 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010144 EXPECT_EQ(23u, Style.IndentWidth);
10145 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10146 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10147
10148 CHECK_PARSE("BasedOnStyle: LLVM\n"
10149 "IndentWidth: 67",
10150 IndentWidth, 67u);
10151
10152 CHECK_PARSE("---\n"
10153 "Language: JavaScript\n"
10154 "IndentWidth: 12\n"
10155 "---\n"
10156 "Language: Cpp\n"
10157 "IndentWidth: 34\n"
10158 "...\n",
10159 IndentWidth, 12u);
10160
10161 Style.Language = FormatStyle::LK_Cpp;
10162 CHECK_PARSE("---\n"
10163 "Language: JavaScript\n"
10164 "IndentWidth: 12\n"
10165 "---\n"
10166 "Language: Cpp\n"
10167 "IndentWidth: 34\n"
10168 "...\n",
10169 IndentWidth, 34u);
10170 CHECK_PARSE("---\n"
10171 "IndentWidth: 78\n"
10172 "---\n"
10173 "Language: JavaScript\n"
10174 "IndentWidth: 56\n"
10175 "...\n",
10176 IndentWidth, 78u);
10177
10178 Style.ColumnLimit = 123;
10179 Style.IndentWidth = 234;
10180 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10181 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010182 EXPECT_FALSE(parseConfiguration("---\n"
10183 "IndentWidth: 456\n"
10184 "BreakBeforeBraces: Allman\n"
10185 "---\n"
10186 "Language: JavaScript\n"
10187 "IndentWidth: 111\n"
10188 "TabWidth: 111\n"
10189 "---\n"
10190 "Language: Cpp\n"
10191 "BreakBeforeBraces: Stroustrup\n"
10192 "TabWidth: 789\n"
10193 "...\n",
10194 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010195 EXPECT_EQ(123u, Style.ColumnLimit);
10196 EXPECT_EQ(456u, Style.IndentWidth);
10197 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10198 EXPECT_EQ(789u, Style.TabWidth);
10199
Rafael Espindola1f243172014-06-12 11:35:17 +000010200 EXPECT_EQ(parseConfiguration("---\n"
10201 "Language: JavaScript\n"
10202 "IndentWidth: 56\n"
10203 "---\n"
10204 "IndentWidth: 78\n"
10205 "...\n",
10206 &Style),
10207 ParseError::Error);
10208 EXPECT_EQ(parseConfiguration("---\n"
10209 "Language: JavaScript\n"
10210 "IndentWidth: 56\n"
10211 "---\n"
10212 "Language: JavaScript\n"
10213 "IndentWidth: 78\n"
10214 "...\n",
10215 &Style),
10216 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010217
10218 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10219}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010220
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010221#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010222
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010223TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10224 FormatStyle Style = {};
10225 Style.Language = FormatStyle::LK_JavaScript;
10226 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010227 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010228 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010229
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010230 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010231 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010232 "BasedOnStyle: Google\n"
10233 "---\n"
10234 "Language: JavaScript\n"
10235 "IndentWidth: 76\n"
10236 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010237 &Style)
10238 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010239 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010240 EXPECT_EQ(76u, Style.IndentWidth);
10241 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10242}
10243
Alexander Kornienkod6538332013-05-07 15:32:14 +000010244TEST_F(FormatTest, ConfigurationRoundTripTest) {
10245 FormatStyle Style = getLLVMStyle();
10246 std::string YAML = configurationAsText(Style);
10247 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010248 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010249 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10250 EXPECT_EQ(Style, ParsedStyle);
10251}
10252
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010253TEST_F(FormatTest, WorksFor8bitEncodings) {
10254 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10255 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10256 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10257 "\"\xef\xee\xf0\xf3...\"",
10258 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10259 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10260 "\xef\xee\xf0\xf3...\"",
10261 getLLVMStyleWithColumns(12)));
10262}
10263
Alexander Kornienko393e3082013-11-13 14:04:17 +000010264TEST_F(FormatTest, HandlesUTF8BOM) {
10265 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10266 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10267 format("\xef\xbb\xbf#include <iostream>"));
10268 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10269 format("\xef\xbb\xbf\n#include <iostream>"));
10270}
10271
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010272// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10273#if !defined(_MSC_VER)
10274
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010275TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10276 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10277 getLLVMStyleWithColumns(35));
10278 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010279 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010280 verifyFormat("// Однажды в студёную зимнюю пору...",
10281 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010282 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010283 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10284 getLLVMStyleWithColumns(39));
10285 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010286 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010287}
10288
10289TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010290 // Non-printable characters' width is currently considered to be the length in
10291 // bytes in UTF8. The characters can be displayed in very different manner
10292 // (zero-width, single width with a substitution glyph, expanded to their code
10293 // (e.g. "<8d>"), so there's no single correct way to handle them.
10294 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010295 "\"\xc2\x8d\";",
10296 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010297 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010298 "\"\xc2\x8d\";",
10299 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010300 EXPECT_EQ("\"Однажды, в \"\n"
10301 "\"студёную \"\n"
10302 "\"зимнюю \"\n"
10303 "\"пору,\"",
10304 format("\"Однажды, в студёную зимнюю пору,\"",
10305 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010306 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010307 "\"一 二 三 \"\n"
10308 "\"四 五六 \"\n"
10309 "\"七 八 九 \"\n"
10310 "\"十\"",
10311 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010312 EXPECT_EQ("\"一\t二 \"\n"
10313 "\"\t三 \"\n"
10314 "\"四 五\t六 \"\n"
10315 "\"\t七 \"\n"
10316 "\"八九十\tqq\"",
10317 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10318 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010319
10320 // UTF8 character in an escape sequence.
10321 EXPECT_EQ("\"aaaaaa\"\n"
10322 "\"\\\xC2\x8D\"",
10323 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010324}
10325
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010326TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10327 EXPECT_EQ("const char *sssss =\n"
10328 " \"一二三四五六七八\\\n"
10329 " 九 十\";",
10330 format("const char *sssss = \"一二三四五六七八\\\n"
10331 " 九 十\";",
10332 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010333}
10334
10335TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010336 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10337 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010338 EXPECT_EQ("// Я из лесу\n"
10339 "// вышел; был\n"
10340 "// сильный\n"
10341 "// мороз.",
10342 format("// Я из лесу вышел; был сильный мороз.",
10343 getLLVMStyleWithColumns(13)));
10344 EXPECT_EQ("// 一二三\n"
10345 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010346 "// 八 九\n"
10347 "// 十",
10348 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010349}
10350
10351TEST_F(FormatTest, SplitsUTF8BlockComments) {
10352 EXPECT_EQ("/* Гляжу,\n"
10353 " * поднимается\n"
10354 " * медленно в\n"
10355 " * гору\n"
10356 " * Лошадка,\n"
10357 " * везущая\n"
10358 " * хворосту\n"
10359 " * воз. */",
10360 format("/* Гляжу, поднимается медленно в гору\n"
10361 " * Лошадка, везущая хворосту воз. */",
10362 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010363 EXPECT_EQ(
10364 "/* 一二三\n"
10365 " * 四五六七\n"
10366 " * 八 九\n"
10367 " * 十 */",
10368 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010369 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10370 " * 𝕓𝕪𝕥𝕖\n"
10371 " * 𝖀𝕿𝕱-𝟠 */",
10372 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010373}
10374
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010375#endif // _MSC_VER
10376
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010377TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10378 FormatStyle Style = getLLVMStyle();
10379
10380 Style.ConstructorInitializerIndentWidth = 4;
10381 verifyFormat(
10382 "SomeClass::Constructor()\n"
10383 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10384 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10385 Style);
10386
10387 Style.ConstructorInitializerIndentWidth = 2;
10388 verifyFormat(
10389 "SomeClass::Constructor()\n"
10390 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10391 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10392 Style);
10393
10394 Style.ConstructorInitializerIndentWidth = 0;
10395 verifyFormat(
10396 "SomeClass::Constructor()\n"
10397 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10398 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10399 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010400 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10401 verifyFormat(
10402 "SomeLongTemplateVariableName<\n"
10403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10404 Style);
10405 verifyFormat(
10406 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10408 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010409}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010410
Daniel Jasper00853002014-09-16 16:22:30 +000010411TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10412 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010413 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010414 Style.ConstructorInitializerIndentWidth = 4;
10415 verifyFormat("SomeClass::Constructor()\n"
10416 " : a(a)\n"
10417 " , b(b)\n"
10418 " , c(c) {}",
10419 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010420 verifyFormat("SomeClass::Constructor()\n"
10421 " : a(a) {}",
10422 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010423
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010424 Style.ColumnLimit = 0;
10425 verifyFormat("SomeClass::Constructor()\n"
10426 " : a(a) {}",
10427 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010428 verifyFormat("SomeClass::Constructor() noexcept\n"
10429 " : a(a) {}",
10430 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010431 verifyFormat("SomeClass::Constructor()\n"
10432 " : a(a)\n"
10433 " , b(b)\n"
10434 " , c(c) {}",
10435 Style);
10436 verifyFormat("SomeClass::Constructor()\n"
10437 " : a(a) {\n"
10438 " foo();\n"
10439 " bar();\n"
10440 "}",
10441 Style);
10442
Daniel Jasperd74cf402014-04-08 12:46:38 +000010443 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010444 verifyFormat("SomeClass::Constructor()\n"
10445 " : a(a)\n"
10446 " , b(b)\n"
10447 " , c(c) {\n}",
10448 Style);
10449 verifyFormat("SomeClass::Constructor()\n"
10450 " : a(a) {\n}",
10451 Style);
10452
10453 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010454 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010455 Style.ConstructorInitializerIndentWidth = 2;
10456 verifyFormat("SomeClass::Constructor()\n"
10457 " : a(a)\n"
10458 " , b(b)\n"
10459 " , c(c) {}",
10460 Style);
10461
10462 Style.ConstructorInitializerIndentWidth = 0;
10463 verifyFormat("SomeClass::Constructor()\n"
10464 ": a(a)\n"
10465 ", b(b)\n"
10466 ", c(c) {}",
10467 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010468
10469 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10470 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010471 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10472 verifyFormat(
10473 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10474 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010475 verifyFormat(
10476 "SomeClass::Constructor()\n"
10477 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10478 Style);
10479 Style.ConstructorInitializerIndentWidth = 4;
10480 Style.ColumnLimit = 60;
10481 verifyFormat("SomeClass::Constructor()\n"
10482 " : aaaaaaaa(aaaaaaaa)\n"
10483 " , aaaaaaaa(aaaaaaaa)\n"
10484 " , aaaaaaaa(aaaaaaaa) {}",
10485 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010486}
10487
Daniel Jasper38efc132014-10-21 07:51:54 +000010488TEST_F(FormatTest, Destructors) {
10489 verifyFormat("void F(int &i) { i.~int(); }");
10490 verifyFormat("void F(int &i) { i->~int(); }");
10491}
10492
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010493TEST_F(FormatTest, FormatsWithWebKitStyle) {
10494 FormatStyle Style = getWebKitStyle();
10495
10496 // Don't indent in outer namespaces.
10497 verifyFormat("namespace outer {\n"
10498 "int i;\n"
10499 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010500 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010501 "} // namespace inner\n"
10502 "} // namespace outer\n"
10503 "namespace other_outer {\n"
10504 "int i;\n"
10505 "}",
10506 Style);
10507
10508 // Don't indent case labels.
10509 verifyFormat("switch (variable) {\n"
10510 "case 1:\n"
10511 "case 2:\n"
10512 " doSomething();\n"
10513 " break;\n"
10514 "default:\n"
10515 " ++variable;\n"
10516 "}",
10517 Style);
10518
10519 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010520 EXPECT_EQ("void f()\n"
10521 "{\n"
10522 " if (aaaaaaaaaaaaaaaa\n"
10523 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10524 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10525 " return;\n"
10526 "}",
10527 format("void f() {\n"
10528 "if (aaaaaaaaaaaaaaaa\n"
10529 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10530 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10531 "return;\n"
10532 "}",
10533 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010534
Daniel Jasper35995672014-04-29 14:05:20 +000010535 // Allow functions on a single line.
10536 verifyFormat("void f() { return; }", Style);
10537
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010538 // Constructor initializers are formatted one per line with the "," on the
10539 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010540 verifyFormat("Constructor()\n"
10541 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10542 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010543 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010544 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10545 "{\n"
10546 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010547 Style);
10548 verifyFormat("SomeClass::Constructor()\n"
10549 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010550 "{\n"
10551 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010552 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010553 EXPECT_EQ("SomeClass::Constructor()\n"
10554 " : a(a)\n"
10555 "{\n"
10556 "}",
10557 format("SomeClass::Constructor():a(a){}", Style));
10558 verifyFormat("SomeClass::Constructor()\n"
10559 " : a(a)\n"
10560 " , b(b)\n"
10561 " , c(c)\n"
10562 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010563 "}",
10564 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010565 verifyFormat("SomeClass::Constructor()\n"
10566 " : a(a)\n"
10567 "{\n"
10568 " foo();\n"
10569 " bar();\n"
10570 "}",
10571 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010572
Daniel Jasper65ee3472013-07-31 23:16:02 +000010573 // Access specifiers should be aligned left.
10574 verifyFormat("class C {\n"
10575 "public:\n"
10576 " int i;\n"
10577 "};",
10578 Style);
10579
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010580 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010581 verifyFormat("int a; // Do not\n"
10582 "double b; // align comments.",
10583 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010584
Daniel Jasper3219e432014-12-02 13:24:51 +000010585 // Do not align operands.
10586 EXPECT_EQ("ASSERT(aaaa\n"
10587 " || bbbb);",
10588 format("ASSERT ( aaaa\n||bbbb);", Style));
10589
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010590 // Accept input's line breaks.
10591 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10592 " || bbbbbbbbbbbbbbb) {\n"
10593 " i++;\n"
10594 "}",
10595 format("if (aaaaaaaaaaaaaaa\n"
10596 "|| bbbbbbbbbbbbbbb) { i++; }",
10597 Style));
10598 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10599 " i++;\n"
10600 "}",
10601 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010602
10603 // Don't automatically break all macro definitions (llvm.org/PR17842).
10604 verifyFormat("#define aNumber 10", Style);
10605 // However, generally keep the line breaks that the user authored.
10606 EXPECT_EQ("#define aNumber \\\n"
10607 " 10",
10608 format("#define aNumber \\\n"
10609 " 10",
10610 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010611
10612 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010613 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10614 " copyItems:YES];",
10615 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10616 "copyItems:YES];",
10617 Style));
10618 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10619 " copyItems:YES];",
10620 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10621 " copyItems:YES];",
10622 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010623 // FIXME: This does not seem right, there should be more indentation before
10624 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010625 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010626 " @\"a\",\n"
10627 " @\"a\"\n"
10628 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010629 " copyItems:YES];",
10630 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10631 " @\"a\",\n"
10632 " @\"a\"\n"
10633 " ]\n"
10634 " copyItems:YES];",
10635 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010636 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010637 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10638 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010639 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10640 " copyItems:YES];",
10641 Style));
10642
10643 verifyFormat("[self.a b:c c:d];", Style);
10644 EXPECT_EQ("[self.a b:c\n"
10645 " c:d];",
10646 format("[self.a b:c\n"
10647 "c:d];",
10648 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010649}
10650
Manuel Klimekffdeb592013-09-03 15:10:01 +000010651TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010652 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10653 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10654 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10655 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10656 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010657 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010658 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010659 verifyFormat("void f() {\n"
10660 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10661 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010662 verifyFormat("void f() {\n"
10663 " other(x.begin(), //\n"
10664 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010665 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010666 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010667 verifyFormat("SomeFunction([]() { // A cool function...\n"
10668 " return 43;\n"
10669 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010670 EXPECT_EQ("SomeFunction([]() {\n"
10671 "#define A a\n"
10672 " return 43;\n"
10673 "});",
10674 format("SomeFunction([](){\n"
10675 "#define A a\n"
10676 "return 43;\n"
10677 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010678 verifyFormat("void f() {\n"
10679 " SomeFunction([](decltype(x), A *a) {});\n"
10680 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010681 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10682 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010683 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10684 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10685 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010686 verifyFormat("Constructor()\n"
10687 " : Field([] { // comment\n"
10688 " int i;\n"
10689 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010690 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10691 " return some_parameter.size();\n"
10692 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010693 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10694 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010695 verifyFormat("int i = aaaaaa ? 1 //\n"
10696 " : [] {\n"
10697 " return 2; //\n"
10698 " }();");
10699 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10700 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10701 " return x == 2; // force break\n"
10702 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010703 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10704 " [=](int iiiiiiiiiiii) {\n"
10705 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10706 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
10707 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010708 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010709 verifyFormat("SomeFunction({[&] {\n"
10710 " // comment\n"
10711 " },\n"
10712 " [&] {\n"
10713 " // comment\n"
10714 " }});");
10715 verifyFormat("SomeFunction({[&] {\n"
10716 " // comment\n"
10717 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010718 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10719 " [&]() { return true; },\n"
10720 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010721
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010722 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010723 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010724 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010725 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10726 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010727 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010728 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010729 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10730 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010731 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010732 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10733 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010734 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010735 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010736 verifyFormat(
10737 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10738 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10739 " return aaaaaaaaaaaaaaaaa;\n"
10740 " });",
10741 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010742 verifyFormat("[]() //\n"
10743 " -> int {\n"
10744 " return 1; //\n"
10745 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010746
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010747 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010748 verifyFormat("SomeFunction(\n"
10749 " []() {\n"
10750 " int i = 42;\n"
10751 " return i;\n"
10752 " },\n"
10753 " []() {\n"
10754 " int j = 43;\n"
10755 " return j;\n"
10756 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010757
Daniel Jasperda18fd82014-06-10 06:39:03 +000010758 // More complex introducers.
10759 verifyFormat("return [i, args...] {};");
10760
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010761 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010762 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010763 verifyFormat("double &operator[](int i) { return 0; }\n"
10764 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010765 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010766 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010767 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010768
10769 // Other corner cases.
10770 verifyFormat("void f() {\n"
10771 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000010772 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000010773 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010774
10775 // Lambdas created through weird macros.
10776 verifyFormat("void f() {\n"
10777 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010778 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010779 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010780
10781 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10782 " doo_dah();\n"
10783 " doo_dah();\n"
10784 " })) {\n"
10785 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010786 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10787 " doo_dah();\n"
10788 " doo_dah();\n"
10789 " })) {\n"
10790 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010791 verifyFormat("auto lambda = []() {\n"
10792 " int a = 2\n"
10793 "#if A\n"
10794 " + 2\n"
10795 "#endif\n"
10796 " ;\n"
10797 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000010798
10799 // Lambdas with complex multiline introducers.
10800 verifyFormat(
10801 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10802 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10803 " -> ::std::unordered_set<\n"
10804 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10805 " //\n"
10806 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010807}
10808
Manuel Klimek516e0542013-09-04 13:25:30 +000010809TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010810 FormatStyle ShortBlocks = getLLVMStyle();
10811 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10812 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10813 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10814 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10815 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10816 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10817 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010818
Daniel Jasper76284682014-10-22 09:12:44 +000010819 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10820 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10821 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010822
Daniel Jasper76284682014-10-22 09:12:44 +000010823 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010824 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010825 "}];");
10826 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010827 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010828 "}]};");
10829 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010830 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010831 "}];");
10832 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010833 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010834 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010835 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010836 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010837 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010838 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010839 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010840
10841 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010842 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010843 "}];",
10844 getLLVMStyleWithColumns(60));
10845 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010846 " NSString *path = [self sessionFilePath];\n"
10847 " if (path) {\n"
10848 " // ...\n"
10849 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010850 "});");
10851 verifyFormat("[[SessionService sharedService]\n"
10852 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010853 " if (window) {\n"
10854 " [self windowDidLoad:window];\n"
10855 " } else {\n"
10856 " [self errorLoadingWindow];\n"
10857 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010858 " }];");
10859 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010860 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010861 "};\n",
10862 getLLVMStyleWithColumns(40));
10863 verifyFormat("[[SessionService sharedService]\n"
10864 " loadWindowWithCompletionBlock: //\n"
10865 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010866 " if (window) {\n"
10867 " [self windowDidLoad:window];\n"
10868 " } else {\n"
10869 " [self errorLoadingWindow];\n"
10870 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010871 " }];",
10872 getLLVMStyleWithColumns(60));
10873 verifyFormat("[myObject doSomethingWith:arg1\n"
10874 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010875 " // ...\n"
10876 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010877 " }\n"
10878 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010879 " // ...\n"
10880 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010881 " }\n"
10882 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010883 " // ...\n"
10884 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010885 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010886 verifyFormat("[myObject doSomethingWith:arg1\n"
10887 " firstBlock:-1\n"
10888 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010889 " // ...\n"
10890 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010891 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010892
10893 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010894 " @autoreleasepool {\n"
10895 " if (a) {\n"
10896 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010897 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010898 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010899 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010900 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010901 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10902 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010903
10904 FormatStyle FourIndent = getLLVMStyle();
10905 FourIndent.ObjCBlockIndentWidth = 4;
10906 verifyFormat("[operation setCompletionBlock:^{\n"
10907 " [self onOperationDone];\n"
10908 "}];",
10909 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010910}
10911
Daniel Jasper289afc02015-04-23 09:23:17 +000010912TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10913 FormatStyle ZeroColumn = getLLVMStyle();
10914 ZeroColumn.ColumnLimit = 0;
10915
10916 verifyFormat("[[SessionService sharedService] "
10917 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10918 " if (window) {\n"
10919 " [self windowDidLoad:window];\n"
10920 " } else {\n"
10921 " [self errorLoadingWindow];\n"
10922 " }\n"
10923 "}];",
10924 ZeroColumn);
10925 EXPECT_EQ("[[SessionService sharedService]\n"
10926 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10927 " if (window) {\n"
10928 " [self windowDidLoad:window];\n"
10929 " } else {\n"
10930 " [self errorLoadingWindow];\n"
10931 " }\n"
10932 " }];",
10933 format("[[SessionService sharedService]\n"
10934 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10935 " if (window) {\n"
10936 " [self windowDidLoad:window];\n"
10937 " } else {\n"
10938 " [self errorLoadingWindow];\n"
10939 " }\n"
10940 "}];",
10941 ZeroColumn));
10942 verifyFormat("[myObject doSomethingWith:arg1\n"
10943 " firstBlock:^(Foo *a) {\n"
10944 " // ...\n"
10945 " int i;\n"
10946 " }\n"
10947 " secondBlock:^(Bar *b) {\n"
10948 " // ...\n"
10949 " int i;\n"
10950 " }\n"
10951 " thirdBlock:^Foo(Bar *b) {\n"
10952 " // ...\n"
10953 " int i;\n"
10954 " }];",
10955 ZeroColumn);
10956 verifyFormat("f(^{\n"
10957 " @autoreleasepool {\n"
10958 " if (a) {\n"
10959 " g();\n"
10960 " }\n"
10961 " }\n"
10962 "});",
10963 ZeroColumn);
10964 verifyFormat("void (^largeBlock)(void) = ^{\n"
10965 " // ...\n"
10966 "};",
10967 ZeroColumn);
10968
10969 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10970 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010971 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010972 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10973 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10974 " int i;\n"
10975 "};",
10976 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10977}
10978
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010979TEST_F(FormatTest, SupportsCRLF) {
10980 EXPECT_EQ("int a;\r\n"
10981 "int b;\r\n"
10982 "int c;\r\n",
10983 format("int a;\r\n"
10984 " int b;\r\n"
10985 " int c;\r\n",
10986 getLLVMStyle()));
10987 EXPECT_EQ("int a;\r\n"
10988 "int b;\r\n"
10989 "int c;\r\n",
10990 format("int a;\r\n"
10991 " int b;\n"
10992 " int c;\r\n",
10993 getLLVMStyle()));
10994 EXPECT_EQ("int a;\n"
10995 "int b;\n"
10996 "int c;\n",
10997 format("int a;\r\n"
10998 " int b;\n"
10999 " int c;\n",
11000 getLLVMStyle()));
11001 EXPECT_EQ("\"aaaaaaa \"\r\n"
11002 "\"bbbbbbb\";\r\n",
11003 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11004 EXPECT_EQ("#define A \\\r\n"
11005 " b; \\\r\n"
11006 " c; \\\r\n"
11007 " d;\r\n",
11008 format("#define A \\\r\n"
11009 " b; \\\r\n"
11010 " c; d; \r\n",
11011 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011012
11013 EXPECT_EQ("/*\r\n"
11014 "multi line block comments\r\n"
11015 "should not introduce\r\n"
11016 "an extra carriage return\r\n"
11017 "*/\r\n",
11018 format("/*\r\n"
11019 "multi line block comments\r\n"
11020 "should not introduce\r\n"
11021 "an extra carriage return\r\n"
11022 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011023}
11024
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011025TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11026 verifyFormat("MY_CLASS(C) {\n"
11027 " int i;\n"
11028 " int j;\n"
11029 "};");
11030}
11031
Daniel Jasper6633ab82013-10-18 10:38:14 +000011032TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11033 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11034 TwoIndent.ContinuationIndentWidth = 2;
11035
11036 EXPECT_EQ("int i =\n"
11037 " longFunction(\n"
11038 " arg);",
11039 format("int i = longFunction(arg);", TwoIndent));
11040
11041 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11042 SixIndent.ContinuationIndentWidth = 6;
11043
11044 EXPECT_EQ("int i =\n"
11045 " longFunction(\n"
11046 " arg);",
11047 format("int i = longFunction(arg);", SixIndent));
11048}
11049
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011050TEST_F(FormatTest, SpacesInAngles) {
11051 FormatStyle Spaces = getLLVMStyle();
11052 Spaces.SpacesInAngles = true;
11053
11054 verifyFormat("static_cast< int >(arg);", Spaces);
11055 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11056 verifyFormat("f< int, float >();", Spaces);
11057 verifyFormat("template <> g() {}", Spaces);
11058 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011059 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11060 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11061 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011062
11063 Spaces.Standard = FormatStyle::LS_Cpp03;
11064 Spaces.SpacesInAngles = true;
11065 verifyFormat("A< A< int > >();", Spaces);
11066
11067 Spaces.SpacesInAngles = false;
11068 verifyFormat("A<A<int> >();", Spaces);
11069
11070 Spaces.Standard = FormatStyle::LS_Cpp11;
11071 Spaces.SpacesInAngles = true;
11072 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011073
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011074 Spaces.SpacesInAngles = false;
11075 verifyFormat("A<A<int>>();", Spaces);
11076}
11077
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011078TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11079 FormatStyle Style = getLLVMStyle();
11080 Style.SpaceAfterTemplateKeyword = false;
11081 verifyFormat("template<int> void foo();", Style);
11082}
11083
Jacques Pienaarfc275112015-02-18 23:48:37 +000011084TEST_F(FormatTest, TripleAngleBrackets) {
11085 verifyFormat("f<<<1, 1>>>();");
11086 verifyFormat("f<<<1, 1, 1, s>>>();");
11087 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011088 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011089 verifyFormat("f<param><<<1, 1>>>();");
11090 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011091 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011092 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11093 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011094 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11095 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011096}
11097
11098TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011099 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011100 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011101 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11102 "aaallvm::outs() <<");
11103 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11104 "aaaallvm::outs()\n <<");
11105}
11106
Manuel Klimek819788d2014-03-18 11:22:45 +000011107TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11108 std::string code = "#if A\n"
11109 "#if B\n"
11110 "a.\n"
11111 "#endif\n"
11112 " a = 1;\n"
11113 "#else\n"
11114 "#endif\n"
11115 "#if C\n"
11116 "#else\n"
11117 "#endif\n";
11118 EXPECT_EQ(code, format(code));
11119}
11120
Manuel Klimek68b03042014-04-14 09:14:11 +000011121TEST_F(FormatTest, HandleConflictMarkers) {
11122 // Git/SVN conflict markers.
11123 EXPECT_EQ("int a;\n"
11124 "void f() {\n"
11125 " callme(some(parameter1,\n"
11126 "<<<<<<< text by the vcs\n"
11127 " parameter2),\n"
11128 "||||||| text by the vcs\n"
11129 " parameter2),\n"
11130 " parameter3,\n"
11131 "======= text by the vcs\n"
11132 " parameter2, parameter3),\n"
11133 ">>>>>>> text by the vcs\n"
11134 " otherparameter);\n",
11135 format("int a;\n"
11136 "void f() {\n"
11137 " callme(some(parameter1,\n"
11138 "<<<<<<< text by the vcs\n"
11139 " parameter2),\n"
11140 "||||||| text by the vcs\n"
11141 " parameter2),\n"
11142 " parameter3,\n"
11143 "======= text by the vcs\n"
11144 " parameter2,\n"
11145 " parameter3),\n"
11146 ">>>>>>> text by the vcs\n"
11147 " otherparameter);\n"));
11148
11149 // Perforce markers.
11150 EXPECT_EQ("void f() {\n"
11151 " function(\n"
11152 ">>>> text by the vcs\n"
11153 " parameter,\n"
11154 "==== text by the vcs\n"
11155 " parameter,\n"
11156 "==== text by the vcs\n"
11157 " parameter,\n"
11158 "<<<< text by the vcs\n"
11159 " parameter);\n",
11160 format("void f() {\n"
11161 " function(\n"
11162 ">>>> text by the vcs\n"
11163 " parameter,\n"
11164 "==== text by the vcs\n"
11165 " parameter,\n"
11166 "==== text by the vcs\n"
11167 " parameter,\n"
11168 "<<<< text by the vcs\n"
11169 " parameter);\n"));
11170
11171 EXPECT_EQ("<<<<<<<\n"
11172 "|||||||\n"
11173 "=======\n"
11174 ">>>>>>>",
11175 format("<<<<<<<\n"
11176 "|||||||\n"
11177 "=======\n"
11178 ">>>>>>>"));
11179
11180 EXPECT_EQ("<<<<<<<\n"
11181 "|||||||\n"
11182 "int i;\n"
11183 "=======\n"
11184 ">>>>>>>",
11185 format("<<<<<<<\n"
11186 "|||||||\n"
11187 "int i;\n"
11188 "=======\n"
11189 ">>>>>>>"));
11190
11191 // FIXME: Handle parsing of macros around conflict markers correctly:
11192 EXPECT_EQ("#define Macro \\\n"
11193 "<<<<<<<\n"
11194 "Something \\\n"
11195 "|||||||\n"
11196 "Else \\\n"
11197 "=======\n"
11198 "Other \\\n"
11199 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011200 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011201 format("#define Macro \\\n"
11202 "<<<<<<<\n"
11203 " Something \\\n"
11204 "|||||||\n"
11205 " Else \\\n"
11206 "=======\n"
11207 " Other \\\n"
11208 ">>>>>>>\n"
11209 " End\n"
11210 "int i;\n"));
11211}
11212
Daniel Jasper471894432014-08-06 13:40:26 +000011213TEST_F(FormatTest, DisableRegions) {
11214 EXPECT_EQ("int i;\n"
11215 "// clang-format off\n"
11216 " int j;\n"
11217 "// clang-format on\n"
11218 "int k;",
11219 format(" int i;\n"
11220 " // clang-format off\n"
11221 " int j;\n"
11222 " // clang-format on\n"
11223 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011224 EXPECT_EQ("int i;\n"
11225 "/* clang-format off */\n"
11226 " int j;\n"
11227 "/* clang-format on */\n"
11228 "int k;",
11229 format(" int i;\n"
11230 " /* clang-format off */\n"
11231 " int j;\n"
11232 " /* clang-format on */\n"
11233 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011234
11235 // Don't reflow comments within disabled regions.
11236 EXPECT_EQ(
11237 "// clang-format off\n"
11238 "// long long long long long long line\n"
11239 "/* clang-format on */\n"
11240 "/* long long long\n"
11241 " * long long long\n"
11242 " * line */\n"
11243 "int i;\n"
11244 "/* clang-format off */\n"
11245 "/* long long long long long long line */\n",
11246 format("// clang-format off\n"
11247 "// long long long long long long line\n"
11248 "/* clang-format on */\n"
11249 "/* long long long long long long line */\n"
11250 "int i;\n"
11251 "/* clang-format off */\n"
11252 "/* long long long long long long line */\n",
11253 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011254}
11255
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011256TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11257 format("? ) =");
11258 verifyNoCrash("#define a\\\n /**/}");
11259}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011260
Daniel Jasper498f5582015-12-25 08:53:31 +000011261TEST_F(FormatTest, FormatsTableGenCode) {
11262 FormatStyle Style = getLLVMStyle();
11263 Style.Language = FormatStyle::LK_TableGen;
11264 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11265}
11266
Nico Weberb2673a12016-11-10 21:49:25 +000011267TEST_F(FormatTest, ArrayOfTemplates) {
11268 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11269 format("auto a = new unique_ptr<int > [ 10];"));
11270
11271 FormatStyle Spaces = getLLVMStyle();
11272 Spaces.SpacesInSquareBrackets = true;
11273 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11274 format("auto a = new unique_ptr<int > [10];", Spaces));
11275}
11276
11277TEST_F(FormatTest, ArrayAsTemplateType) {
11278 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11279 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11280
11281 FormatStyle Spaces = getLLVMStyle();
11282 Spaces.SpacesInSquareBrackets = true;
11283 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11284 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11285}
11286
Martin Probstc9c51c42017-03-16 10:21:35 +000011287TEST_F(FormatTest, NoSpaceAfterSuper) {
11288 verifyFormat("__super::FooBar();");
11289}
11290
Eric Liu547d8792016-03-24 13:22:42 +000011291TEST(FormatStyle, GetStyleOfFile) {
11292 vfs::InMemoryFileSystem FS;
11293 // Test 1: format file in the same directory.
11294 ASSERT_TRUE(
11295 FS.addFile("/a/.clang-format", 0,
11296 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11297 ASSERT_TRUE(
11298 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011299 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011300 ASSERT_TRUE((bool)Style1);
11301 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011302
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011303 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011304 ASSERT_TRUE(
11305 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011306 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011307 ASSERT_TRUE((bool)Style2);
11308 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011309
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011310 // Test 2.2: no format on 'none' fallback style.
11311 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11312 ASSERT_TRUE((bool)Style2);
11313 ASSERT_EQ(*Style2, getNoStyle());
11314
11315 // Test 2.3: format if config is found with no based style while fallback is
11316 // 'none'.
11317 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11318 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11319 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11320 ASSERT_TRUE((bool)Style2);
11321 ASSERT_EQ(*Style2, getLLVMStyle());
11322
11323 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11324 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11325 ASSERT_TRUE((bool)Style2);
11326 ASSERT_EQ(*Style2, getLLVMStyle());
11327
Eric Liu547d8792016-03-24 13:22:42 +000011328 // Test 3: format file in parent directory.
11329 ASSERT_TRUE(
11330 FS.addFile("/c/.clang-format", 0,
11331 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11332 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11333 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011334 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011335 ASSERT_TRUE((bool)Style3);
11336 ASSERT_EQ(*Style3, getGoogleStyle());
11337
11338 // Test 4: error on invalid fallback style
11339 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11340 ASSERT_FALSE((bool)Style4);
11341 llvm::consumeError(Style4.takeError());
11342
11343 // Test 5: error on invalid yaml on command line
11344 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11345 ASSERT_FALSE((bool)Style5);
11346 llvm::consumeError(Style5.takeError());
11347
11348 // Test 6: error on invalid style
11349 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11350 ASSERT_FALSE((bool)Style6);
11351 llvm::consumeError(Style6.takeError());
11352
11353 // Test 7: found config file, error on parsing it
11354 ASSERT_TRUE(
11355 FS.addFile("/d/.clang-format", 0,
11356 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11357 "InvalidKey: InvalidValue")));
11358 ASSERT_TRUE(
11359 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11360 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11361 ASSERT_FALSE((bool)Style7);
11362 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011363}
11364
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011365TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11366 // Column limit is 20.
11367 std::string Code = "Type *a =\n"
11368 " new Type();\n"
11369 "g(iiiii, 0, jjjjj,\n"
11370 " 0, kkkkk, 0, mm);\n"
11371 "int bad = format ;";
11372 std::string Expected = "auto a = new Type();\n"
11373 "g(iiiii, nullptr,\n"
11374 " jjjjj, nullptr,\n"
11375 " kkkkk, nullptr,\n"
11376 " mm);\n"
11377 "int bad = format ;";
11378 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011379 tooling::Replacements Replaces = toReplacements(
11380 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11381 "auto "),
11382 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11383 "nullptr"),
11384 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11385 "nullptr"),
11386 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11387 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011388
11389 format::FormatStyle Style = format::getLLVMStyle();
11390 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011391 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11392 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11393 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11394 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11395 EXPECT_TRUE(static_cast<bool>(Result));
11396 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011397}
11398
Eric Liubaf58c22016-05-18 13:43:48 +000011399TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11400 std::string Code = "#include \"a.h\"\n"
11401 "#include \"c.h\"\n"
11402 "\n"
11403 "int main() {\n"
11404 " return 0;\n"
11405 "}";
11406 std::string Expected = "#include \"a.h\"\n"
11407 "#include \"b.h\"\n"
11408 "#include \"c.h\"\n"
11409 "\n"
11410 "int main() {\n"
11411 " return 0;\n"
11412 "}";
11413 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011414 tooling::Replacements Replaces = toReplacements(
11415 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11416 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011417
11418 format::FormatStyle Style = format::getLLVMStyle();
11419 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011420 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11421 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11422 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11423 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11424 EXPECT_TRUE(static_cast<bool>(Result));
11425 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011426}
11427
Krasimir Georgievac16a202017-06-23 11:46:03 +000011428TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11429 EXPECT_EQ("using std::cin;\n"
11430 "using std::cout;",
11431 format("using std::cout;\n"
11432 "using std::cin;", getGoogleStyle()));
11433}
11434
Nico Weberdc065182017-04-05 18:10:42 +000011435TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11436 format::FormatStyle Style = format::getLLVMStyle();
11437 Style.Standard = FormatStyle::LS_Cpp03;
11438 // cpp03 recognize this string as identifier u8 and literal character 'a'
11439 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11440}
11441
11442TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11443 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11444 // all modes, including C++11, C++14 and C++17
11445 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11446}
11447
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000011448TEST_F(FormatTest, DoNotFormatLikelyXml) {
11449 EXPECT_EQ("<!-- ;> -->",
11450 format("<!-- ;> -->", getGoogleStyle()));
11451 EXPECT_EQ(" <!-- >; -->",
11452 format(" <!-- >; -->", getGoogleStyle()));
11453}
11454
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011455} // end namespace
11456} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011457} // end namespace clang