blob: 61973c621c7b18af7a397100f3b94d3dd9e60787 [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
Martin Probsta004b3f2017-11-17 18:06:33 +000073 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
Manuel Klimekb69e3c62013-01-02 18:33:23 +000074 const FormatStyle &Style = getLLVMStyle()) {
Martin Probsta004b3f2017-11-17 18:06:33 +000075 EXPECT_EQ(Expected.str(), format(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;
Martin Probsta004b3f2017-11-17 18:06:33 +000081 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
Nico Weberd96ae862017-02-24 19:10:12 +000082 }
Daniel Jasperf7935112012-12-03 18:12:45 +000083 }
84
Martin Probsta004b3f2017-11-17 18:06:33 +000085 void verifyFormat(llvm::StringRef Code,
86 const FormatStyle &Style = getLLVMStyle()) {
87 verifyFormat(Code, test::messUp(Code), Style);
88 }
89
Manuel Klimekec5c3db2015-05-07 12:26:30 +000090 void verifyIncompleteFormat(llvm::StringRef Code,
91 const FormatStyle &Style = getLLVMStyle()) {
92 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000093 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 }
95
Daniel Jasperf7935112012-12-03 18:12:45 +000096 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000097 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000098 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000099
100 void verifyIndependentOfContext(llvm::StringRef text) {
101 verifyFormat(text);
102 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
103 }
Daniel Jasper7b038a22013-01-30 09:46:12 +0000104
Daniel Jasper675b4f82015-01-19 10:51:23 +0000105 /// \brief Verify that clang-format does not crash on the given input.
106 void verifyNoCrash(llvm::StringRef Code,
107 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000108 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000109 }
110
Daniel Jasper7b038a22013-01-30 09:46:12 +0000111 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000112};
113
Manuel Klimek52b15152013-01-09 15:25:02 +0000114TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000115 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
116 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
117 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
118 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
119 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000120}
121
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000122//===----------------------------------------------------------------------===//
123// Basic function tests.
124//===----------------------------------------------------------------------===//
125
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000126TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000127 EXPECT_EQ(";", format(";"));
128}
129
130TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
131 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000132 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000133 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
134 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
135}
136
137TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
138 EXPECT_EQ("int i;", format("int\ni;"));
139}
140
141TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000142 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000143}
144
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000145TEST_F(FormatTest, FormatsNestedCall) {
146 verifyFormat("Method(f1, f2(f3));");
147 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000148 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000149}
150
Daniel Jasper14556742013-02-07 21:08:36 +0000151TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000152 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000153 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000154 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000155 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000156 verifyFormat("ALWAYS_INLINE ::std::string getName();");
157 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000158}
159
Daniel Jasper7b038a22013-01-30 09:46:12 +0000160TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
161 EXPECT_EQ("if (a) {\n"
162 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000163 "}",
164 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000165 EXPECT_EQ(4, ReplacementCount);
166 EXPECT_EQ("if (a) {\n"
167 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000168 "}",
169 format("if (a) {\n"
170 " f();\n"
171 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000172 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000173 EXPECT_EQ("/*\r\n"
174 "\r\n"
175 "*/\r\n",
176 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000177 "\r\n"
178 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000179 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000180}
181
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000182TEST_F(FormatTest, RemovesEmptyLines) {
183 EXPECT_EQ("class C {\n"
184 " int i;\n"
185 "};",
186 format("class C {\n"
187 " int i;\n"
188 "\n"
189 "};"));
190
Nico Weber34272652014-11-13 16:25:37 +0000191 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000192 EXPECT_EQ("namespace N {\n"
193 "\n"
194 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000195 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000196 format("namespace N {\n"
197 "\n"
198 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000199 "}",
200 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000201 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
202 "\n"
203 "int i;\n"
204 "}",
205 format("extern /**/ \"C\" /**/ {\n"
206 "\n"
207 "int i;\n"
208 "}",
209 getGoogleStyle()));
210
211 // ...but do keep inlining and removing empty lines for non-block extern "C"
212 // functions.
213 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
214 EXPECT_EQ("extern \"C\" int f() {\n"
215 " int i = 42;\n"
216 " return i;\n"
217 "}",
218 format("extern \"C\" int f() {\n"
219 "\n"
220 " int i = 42;\n"
221 " return i;\n"
222 "}",
223 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000224
Daniel Jasper11164bd2014-03-21 12:58:53 +0000225 // Remove empty lines at the beginning and end of blocks.
226 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000227 "\n"
228 " if (a) {\n"
229 "\n"
230 " f();\n"
231 " }\n"
232 "}",
233 format("void f() {\n"
234 "\n"
235 " if (a) {\n"
236 "\n"
237 " f();\n"
238 "\n"
239 " }\n"
240 "\n"
241 "}",
242 getLLVMStyle()));
243 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000244 " if (a) {\n"
245 " f();\n"
246 " }\n"
247 "}",
248 format("void f() {\n"
249 "\n"
250 " if (a) {\n"
251 "\n"
252 " f();\n"
253 "\n"
254 " }\n"
255 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000256 "}",
257 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000258
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000259 // Don't remove empty lines in more complex control statements.
260 EXPECT_EQ("void f() {\n"
261 " if (a) {\n"
262 " f();\n"
263 "\n"
264 " } else if (b) {\n"
265 " f();\n"
266 " }\n"
267 "}",
268 format("void f() {\n"
269 " if (a) {\n"
270 " f();\n"
271 "\n"
272 " } else if (b) {\n"
273 " f();\n"
274 "\n"
275 " }\n"
276 "\n"
277 "}"));
278
279 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000280 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
281 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000282 EXPECT_EQ("namespace {\n"
283 "int i;\n"
284 "}",
285 format("namespace {\n"
286 "int i;\n"
287 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000288 "}", LLVMWithNoNamespaceFix));
289 EXPECT_EQ("namespace {\n"
290 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000291 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000292 format("namespace {\n"
293 "int i;\n"
294 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000295 "}"));
296 EXPECT_EQ("namespace {\n"
297 "int i;\n"
298 "\n"
299 "} // namespace",
300 format("namespace {\n"
301 "int i;\n"
302 "\n"
303 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000304
305 FormatStyle Style = getLLVMStyle();
306 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
307 Style.MaxEmptyLinesToKeep = 2;
308 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
309 Style.BraceWrapping.AfterClass = true;
310 Style.BraceWrapping.AfterFunction = true;
311 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
312
313 EXPECT_EQ("class Foo\n"
314 "{\n"
315 " Foo() {}\n"
316 "\n"
317 " void funk() {}\n"
318 "};",
319 format("class Foo\n"
320 "{\n"
321 " Foo()\n"
322 " {\n"
323 " }\n"
324 "\n"
325 " void funk() {}\n"
326 "};",
327 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000328}
329
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000330TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000331 verifyFormat("x = (a) and (b);");
332 verifyFormat("x = (a) or (b);");
333 verifyFormat("x = (a) bitand (b);");
334 verifyFormat("x = (a) bitor (b);");
335 verifyFormat("x = (a) not_eq (b);");
336 verifyFormat("x = (a) and_eq (b);");
337 verifyFormat("x = (a) or_eq (b);");
338 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000339}
340
Olivier Goffart90f981b2017-07-14 09:23:40 +0000341TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
342 verifyFormat("x = compl(a);");
343 verifyFormat("x = not(a);");
344 verifyFormat("x = bitand(a);");
345 // Unary operator must not be merged with the next identifier
346 verifyFormat("x = compl a;");
347 verifyFormat("x = not a;");
348 verifyFormat("x = bitand a;");
349}
350
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000351//===----------------------------------------------------------------------===//
352// Tests for control statements.
353//===----------------------------------------------------------------------===//
354
Daniel Jaspercdd06622013-05-14 10:31:09 +0000355TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000356 verifyFormat("if (true)\n f();\ng();");
357 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000358 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000359 verifyFormat("if constexpr (true)\n"
360 " f();\ng();");
361 verifyFormat("if constexpr (a)\n"
362 " if constexpr (b)\n"
363 " if constexpr (c)\n"
364 " g();\n"
365 "h();");
366 verifyFormat("if constexpr (a)\n"
367 " if constexpr (b) {\n"
368 " f();\n"
369 " }\n"
370 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000371
Daniel Jasper3a685df2013-05-16 12:12:21 +0000372 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000373 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000374 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
375 verifyFormat("if (a)\n"
376 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000377 " f();",
378 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000379 verifyFormat("{\n"
380 " if (a)\n"
381 " label:\n"
382 " f();\n"
383 "}",
384 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000385 verifyFormat("#define A \\\n"
386 " if (a) \\\n"
387 " label: \\\n"
388 " f()",
389 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000390 verifyFormat("if (a)\n"
391 " ;",
392 AllowsMergedIf);
393 verifyFormat("if (a)\n"
394 " if (b) return;",
395 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000396
Daniel Jasper3a685df2013-05-16 12:12:21 +0000397 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000398 " f();\n",
399 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000400 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000401 " f();",
402 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000403 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000404 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000405 "}",
406 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000407 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000408 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000409 "}",
410 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000411
412 AllowsMergedIf.ColumnLimit = 14;
413 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000414 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000415 " return;",
416 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000417
418 AllowsMergedIf.ColumnLimit = 13;
419 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000420}
421
Daniel Jasper3a685df2013-05-16 12:12:21 +0000422TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
423 FormatStyle AllowsMergedLoops = getLLVMStyle();
424 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
425 verifyFormat("while (true) continue;", AllowsMergedLoops);
426 verifyFormat("for (;;) continue;", AllowsMergedLoops);
427 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
428 verifyFormat("while (true)\n"
429 " ;",
430 AllowsMergedLoops);
431 verifyFormat("for (;;)\n"
432 " ;",
433 AllowsMergedLoops);
434 verifyFormat("for (;;)\n"
435 " for (;;) continue;",
436 AllowsMergedLoops);
437 verifyFormat("for (;;) // Can't merge this\n"
438 " continue;",
439 AllowsMergedLoops);
440 verifyFormat("for (;;) /* still don't merge */\n"
441 " continue;",
442 AllowsMergedLoops);
443}
444
Daniel Jasper17605d32014-05-14 09:33:35 +0000445TEST_F(FormatTest, FormatShortBracedStatements) {
446 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000447 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000448 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
449
450 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
451 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
452
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000453 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
454 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
455 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
456
Daniel Jasper17605d32014-05-14 09:33:35 +0000457 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000458 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000459 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
460 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
461 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000462 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000463 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
464 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000465 verifyFormat("if (true) {\n"
466 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
467 "}",
468 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000469 verifyFormat("if (true) { //\n"
470 " f();\n"
471 "}",
472 AllowSimpleBracedStatements);
473 verifyFormat("if (true) {\n"
474 " f();\n"
475 " f();\n"
476 "}",
477 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000478 verifyFormat("if (true) {\n"
479 " f();\n"
480 "} else {\n"
481 " f();\n"
482 "}",
483 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000484
Daniel Jasperf92659e2017-06-19 07:45:41 +0000485 verifyFormat("struct A2 {\n"
486 " int X;\n"
487 "};",
488 AllowSimpleBracedStatements);
489 verifyFormat("typedef struct A2 {\n"
490 " int X;\n"
491 "} A2_t;",
492 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000493 verifyFormat("template <int> struct A2 {\n"
494 " struct B {};\n"
495 "};",
496 AllowSimpleBracedStatements);
497
Daniel Jasper17605d32014-05-14 09:33:35 +0000498 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000499 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000500 verifyFormat("if (true) {\n"
501 " f();\n"
502 "}",
503 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000504 verifyFormat("if (true) {\n"
505 " f();\n"
506 "} else {\n"
507 " f();\n"
508 "}",
509 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000510
511 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000512 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000513 verifyFormat("while (true) {\n"
514 " f();\n"
515 "}",
516 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000517 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000518 verifyFormat("for (;;) {\n"
519 " f();\n"
520 "}",
521 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000522
523 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
524 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
525 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
526
527 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
528 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
529 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
530 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
531 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
532 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
533 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
534 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
535 verifyFormat("if (true)\n"
536 "{\n"
537 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
538 "}",
539 AllowSimpleBracedStatements);
540 verifyFormat("if (true)\n"
541 "{ //\n"
542 " f();\n"
543 "}",
544 AllowSimpleBracedStatements);
545 verifyFormat("if (true)\n"
546 "{\n"
547 " f();\n"
548 " f();\n"
549 "}",
550 AllowSimpleBracedStatements);
551 verifyFormat("if (true)\n"
552 "{\n"
553 " f();\n"
554 "} else\n"
555 "{\n"
556 " f();\n"
557 "}",
558 AllowSimpleBracedStatements);
559
560 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
561 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
562 verifyFormat("if (true)\n"
563 "{\n"
564 " f();\n"
565 "}",
566 AllowSimpleBracedStatements);
567 verifyFormat("if (true)\n"
568 "{\n"
569 " f();\n"
570 "} else\n"
571 "{\n"
572 " f();\n"
573 "}",
574 AllowSimpleBracedStatements);
575
576 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
577 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
578 verifyFormat("while (true)\n"
579 "{\n"
580 " f();\n"
581 "}",
582 AllowSimpleBracedStatements);
583 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
584 verifyFormat("for (;;)\n"
585 "{\n"
586 " f();\n"
587 "}",
588 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000589}
590
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000591TEST_F(FormatTest, ParseIfElse) {
592 verifyFormat("if (true)\n"
593 " if (true)\n"
594 " if (true)\n"
595 " f();\n"
596 " else\n"
597 " g();\n"
598 " else\n"
599 " h();\n"
600 "else\n"
601 " i();");
602 verifyFormat("if (true)\n"
603 " if (true)\n"
604 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000605 " if (true)\n"
606 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000607 " } else {\n"
608 " g();\n"
609 " }\n"
610 " else\n"
611 " h();\n"
612 "else {\n"
613 " i();\n"
614 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000615 verifyFormat("if (true)\n"
616 " if constexpr (true)\n"
617 " if (true) {\n"
618 " if constexpr (true)\n"
619 " f();\n"
620 " } else {\n"
621 " g();\n"
622 " }\n"
623 " else\n"
624 " h();\n"
625 "else {\n"
626 " i();\n"
627 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000628 verifyFormat("void f() {\n"
629 " if (a) {\n"
630 " } else {\n"
631 " }\n"
632 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000633}
634
635TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000636 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637 verifyFormat("if (a)\n"
638 " f();\n"
639 "else if (b)\n"
640 " g();\n"
641 "else\n"
642 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000643 verifyFormat("if constexpr (a)\n"
644 " f();\n"
645 "else if constexpr (b)\n"
646 " g();\n"
647 "else\n"
648 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000649 verifyFormat("if (a) {\n"
650 " f();\n"
651 "}\n"
652 "// or else ..\n"
653 "else {\n"
654 " g()\n"
655 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000656
657 verifyFormat("if (a) {\n"
658 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
659 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
660 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000661 verifyFormat("if (a) {\n"
662 "} else if (\n"
663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
664 "}",
665 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000666 verifyFormat("if (a) {\n"
667 "} else if constexpr (\n"
668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
669 "}",
670 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000671}
672
Daniel Jasperf7935112012-12-03 18:12:45 +0000673TEST_F(FormatTest, FormatsForLoop) {
674 verifyFormat(
675 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000676 " ++VeryVeryLongLoopVariable)\n"
677 " ;");
678 verifyFormat("for (;;)\n"
679 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000680 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000681 verifyFormat("for (;;) {\n"
682 " f();\n"
683 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000684 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000685
686 verifyFormat(
687 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
688 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000689 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000690
691 verifyFormat(
692 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000693 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000694 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
695 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000696 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000697 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
698 " I = FD->getDeclsInPrototypeScope().begin(),\n"
699 " E = FD->getDeclsInPrototypeScope().end();\n"
700 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000701 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
702 " I = Container.begin(),\n"
703 " E = Container.end();\n"
704 " I != E; ++I) {\n}",
705 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000706
Daniel Jasper48c62f92013-01-28 17:30:17 +0000707 verifyFormat(
708 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000712 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000713 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
714 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
715 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000716 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
717 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
718 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000719 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
720 " aaaaaaaaaa);\n"
721 " iter; ++iter) {\n"
722 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000723 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
725 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
726 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000727
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000728 FormatStyle NoBinPacking = getLLVMStyle();
729 NoBinPacking.BinPackParameters = false;
730 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
731 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
732 " aaaaaaaaaaaaaaaa,\n"
733 " aaaaaaaaaaaaaaaa,\n"
734 " aaaaaaaaaaaaaaaa);\n"
735 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
736 "}",
737 NoBinPacking);
738 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000739 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
740 " E = UnwrappedLines.end();\n"
741 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000742 " ++I) {\n}",
743 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000744
745 FormatStyle AlignLeft = getLLVMStyle();
746 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
747 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000748}
749
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000750TEST_F(FormatTest, RangeBasedForLoops) {
751 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
753 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
754 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000755 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000757 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
758 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000759}
760
Daniel Jaspere1e43192014-04-01 12:55:11 +0000761TEST_F(FormatTest, ForEachLoops) {
762 verifyFormat("void f() {\n"
763 " foreach (Item *item, itemlist) {}\n"
764 " Q_FOREACH (Item *item, itemlist) {}\n"
765 " BOOST_FOREACH (Item *item, itemlist) {}\n"
766 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
767 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000768
769 // As function-like macros.
770 verifyFormat("#define foreach(x, y)\n"
771 "#define Q_FOREACH(x, y)\n"
772 "#define BOOST_FOREACH(x, y)\n"
773 "#define UNKNOWN_FOREACH(x, y)\n");
774
775 // Not as function-like macros.
776 verifyFormat("#define foreach (x, y)\n"
777 "#define Q_FOREACH (x, y)\n"
778 "#define BOOST_FOREACH (x, y)\n"
779 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000780}
781
Daniel Jasperf7935112012-12-03 18:12:45 +0000782TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000783 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000784 verifyFormat("while (true)\n"
785 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000786 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000787 verifyFormat("while () {\n"
788 " f();\n"
789 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000790}
791
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000792TEST_F(FormatTest, FormatsDoWhile) {
793 verifyFormat("do {\n"
794 " do_something();\n"
795 "} while (something());");
796 verifyFormat("do\n"
797 " do_something();\n"
798 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000799}
800
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000801TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000802 verifyFormat("switch (x) {\n"
803 "case 1:\n"
804 " f();\n"
805 " break;\n"
806 "case kFoo:\n"
807 "case ns::kBar:\n"
808 "case kBaz:\n"
809 " break;\n"
810 "default:\n"
811 " g();\n"
812 " break;\n"
813 "}");
814 verifyFormat("switch (x) {\n"
815 "case 1: {\n"
816 " f();\n"
817 " break;\n"
818 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000819 "case 2: {\n"
820 " break;\n"
821 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000822 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000823 verifyFormat("switch (x) {\n"
824 "case 1: {\n"
825 " f();\n"
826 " {\n"
827 " g();\n"
828 " h();\n"
829 " }\n"
830 " break;\n"
831 "}\n"
832 "}");
833 verifyFormat("switch (x) {\n"
834 "case 1: {\n"
835 " f();\n"
836 " if (foo) {\n"
837 " g();\n"
838 " h();\n"
839 " }\n"
840 " break;\n"
841 "}\n"
842 "}");
843 verifyFormat("switch (x) {\n"
844 "case 1: {\n"
845 " f();\n"
846 " g();\n"
847 "} break;\n"
848 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000849 verifyFormat("switch (test)\n"
850 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000851 verifyFormat("switch (x) {\n"
852 "default: {\n"
853 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000854 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000855 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000856 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000857 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000858 "// if 1, do f()\n"
859 "case 1:\n"
860 " f();\n"
861 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000862 verifyFormat("switch (x) {\n"
863 "case 1:\n"
864 " // Do amazing stuff\n"
865 " {\n"
866 " f();\n"
867 " g();\n"
868 " }\n"
869 " break;\n"
870 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000871 verifyFormat("#define A \\\n"
872 " switch (x) { \\\n"
873 " case a: \\\n"
874 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000875 " }",
876 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000877 verifyFormat("#define OPERATION_CASE(name) \\\n"
878 " case OP_name: \\\n"
879 " return operations::Operation##name\n",
880 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000881 verifyFormat("switch (x) {\n"
882 "case 1:;\n"
883 "default:;\n"
884 " int i;\n"
885 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000886
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000887 verifyGoogleFormat("switch (x) {\n"
888 " case 1:\n"
889 " f();\n"
890 " break;\n"
891 " case kFoo:\n"
892 " case ns::kBar:\n"
893 " case kBaz:\n"
894 " break;\n"
895 " default:\n"
896 " g();\n"
897 " break;\n"
898 "}");
899 verifyGoogleFormat("switch (x) {\n"
900 " case 1: {\n"
901 " f();\n"
902 " break;\n"
903 " }\n"
904 "}");
905 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000906 " ;");
907
908 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
909 " case OP_name: \\\n"
910 " return operations::Operation##name\n");
911 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
912 " // Get the correction operation class.\n"
913 " switch (OpCode) {\n"
914 " CASE(Add);\n"
915 " CASE(Subtract);\n"
916 " default:\n"
917 " return operations::Unknown;\n"
918 " }\n"
919 "#undef OPERATION_CASE\n"
920 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000921 verifyFormat("DEBUG({\n"
922 " switch (x) {\n"
923 " case A:\n"
924 " f();\n"
925 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000926 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000927 " case B:\n"
928 " g();\n"
929 " break;\n"
930 " }\n"
931 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000932 EXPECT_EQ("DEBUG({\n"
933 " switch (x) {\n"
934 " case A:\n"
935 " f();\n"
936 " break;\n"
937 " // On B:\n"
938 " case B:\n"
939 " g();\n"
940 " break;\n"
941 " }\n"
942 "});",
943 format("DEBUG({\n"
944 " switch (x) {\n"
945 " case A:\n"
946 " f();\n"
947 " break;\n"
948 " // On B:\n"
949 " case B:\n"
950 " g();\n"
951 " break;\n"
952 " }\n"
953 "});",
954 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000955 verifyFormat("switch (a) {\n"
956 "case (b):\n"
957 " return;\n"
958 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000959
960 verifyFormat("switch (a) {\n"
961 "case some_namespace::\n"
962 " some_constant:\n"
963 " return;\n"
964 "}",
965 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000966}
967
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000968TEST_F(FormatTest, CaseRanges) {
969 verifyFormat("switch (x) {\n"
970 "case 'A' ... 'Z':\n"
971 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000972 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000973 " break;\n"
974 "}");
975}
976
Daniel Jasperb87899b2014-09-10 13:11:45 +0000977TEST_F(FormatTest, ShortCaseLabels) {
978 FormatStyle Style = getLLVMStyle();
979 Style.AllowShortCaseLabelsOnASingleLine = true;
980 verifyFormat("switch (a) {\n"
981 "case 1: x = 1; break;\n"
982 "case 2: return;\n"
983 "case 3:\n"
984 "case 4:\n"
985 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000986 "case 6: // comment\n"
987 " return;\n"
988 "case 7:\n"
989 " // comment\n"
990 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000991 "case 8:\n"
992 " x = 8; // comment\n"
993 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000994 "default: y = 1; break;\n"
995 "}",
996 Style);
997 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +0000998 "case 0: return; // comment\n"
999 "case 1: break; // comment\n"
1000 "case 2: return;\n"
1001 "// comment\n"
1002 "case 3: return;\n"
1003 "// comment 1\n"
1004 "// comment 2\n"
1005 "// comment 3\n"
1006 "case 4: break; /* comment */\n"
1007 "case 5:\n"
1008 " // comment\n"
1009 " break;\n"
1010 "case 6: /* comment */ x = 1; break;\n"
1011 "case 7: x = /* comment */ 1; break;\n"
1012 "case 8:\n"
1013 " x = 1; /* comment */\n"
1014 " break;\n"
1015 "case 9:\n"
1016 " break; // comment line 1\n"
1017 " // comment line 2\n"
1018 "}",
1019 Style);
1020 EXPECT_EQ("switch (a) {\n"
1021 "case 1:\n"
1022 " x = 8;\n"
1023 " // fall through\n"
1024 "case 2: x = 8;\n"
1025 "// comment\n"
1026 "case 3:\n"
1027 " return; /* comment line 1\n"
1028 " * comment line 2 */\n"
1029 "case 4: i = 8;\n"
1030 "// something else\n"
1031 "#if FOO\n"
1032 "case 5: break;\n"
1033 "#endif\n"
1034 "}",
1035 format("switch (a) {\n"
1036 "case 1: x = 8;\n"
1037 " // fall through\n"
1038 "case 2:\n"
1039 " x = 8;\n"
1040 "// comment\n"
1041 "case 3:\n"
1042 " return; /* comment line 1\n"
1043 " * comment line 2 */\n"
1044 "case 4:\n"
1045 " i = 8;\n"
1046 "// something else\n"
1047 "#if FOO\n"
1048 "case 5: break;\n"
1049 "#endif\n"
1050 "}",
1051 Style));
1052 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1053 " return; // long long long long long long long long long long long long comment\n"
1054 " // line\n" "}",
1055 format("switch (a) {\n"
1056 "case 0: return; // long long long long long long long long long long long long comment line\n"
1057 "}",
1058 Style));
1059 EXPECT_EQ("switch (a) {\n"
1060 "case 0:\n"
1061 " return; /* long long long long long long long long long long long long comment\n"
1062 " line */\n"
1063 "}",
1064 format("switch (a) {\n"
1065 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1066 "}",
1067 Style));
1068 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001069 "#if FOO\n"
1070 "case 0: return 0;\n"
1071 "#endif\n"
1072 "}",
1073 Style);
1074 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001075 "case 1: {\n"
1076 "}\n"
1077 "case 2: {\n"
1078 " return;\n"
1079 "}\n"
1080 "case 3: {\n"
1081 " x = 1;\n"
1082 " return;\n"
1083 "}\n"
1084 "case 4:\n"
1085 " if (x)\n"
1086 " return;\n"
1087 "}",
1088 Style);
1089 Style.ColumnLimit = 21;
1090 verifyFormat("switch (a) {\n"
1091 "case 1: x = 1; break;\n"
1092 "case 2: return;\n"
1093 "case 3:\n"
1094 "case 4:\n"
1095 "case 5: return;\n"
1096 "default:\n"
1097 " y = 1;\n"
1098 " break;\n"
1099 "}",
1100 Style);
1101}
1102
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001103TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001104 verifyFormat("void f() {\n"
1105 " some_code();\n"
1106 "test_label:\n"
1107 " some_other_code();\n"
1108 " {\n"
1109 " some_more_code();\n"
1110 " another_label:\n"
1111 " some_more_code();\n"
1112 " }\n"
1113 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001114 verifyFormat("{\n"
1115 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001116 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001117 " some_other_code();\n"
1118 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001119 verifyFormat("{\n"
1120 " some_code();\n"
1121 "test_label:;\n"
1122 " int i = 0;\n"
1123 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001124}
1125
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001126//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001127// Tests for classes, namespaces, etc.
1128//===----------------------------------------------------------------------===//
1129
1130TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001131 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001132}
1133
1134TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1135 verifyFormat("class A {\n"
1136 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001137 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001138 "protected:\n"
1139 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001140 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001141 "};");
1142 verifyGoogleFormat("class A {\n"
1143 " public:\n"
1144 " protected:\n"
1145 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001146 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001147 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001148 verifyFormat("class A {\n"
1149 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001150 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001151 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001152 " void f2() {}\n"
1153 "protected slots:\n"
1154 " void f3() {}\n"
1155 "protected Q_SLOTS:\n"
1156 " void f4() {}\n"
1157 "private slots:\n"
1158 " void f5() {}\n"
1159 "private Q_SLOTS:\n"
1160 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001161 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001162 " void g1();\n"
1163 "Q_SIGNALS:\n"
1164 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001165 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001166
1167 // Don't interpret 'signals' the wrong way.
1168 verifyFormat("signals.set();");
1169 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001170 verifyFormat("{\n"
1171 " signals.set(); // This needs indentation.\n"
1172 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001173 verifyFormat("void f() {\n"
1174 "label:\n"
1175 " signals.baz();\n"
1176 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001177}
1178
Alexander Kornienkofd433362013-03-27 17:08:02 +00001179TEST_F(FormatTest, SeparatesLogicalBlocks) {
1180 EXPECT_EQ("class A {\n"
1181 "public:\n"
1182 " void f();\n"
1183 "\n"
1184 "private:\n"
1185 " void g() {}\n"
1186 " // test\n"
1187 "protected:\n"
1188 " int h;\n"
1189 "};",
1190 format("class A {\n"
1191 "public:\n"
1192 "void f();\n"
1193 "private:\n"
1194 "void g() {}\n"
1195 "// test\n"
1196 "protected:\n"
1197 "int h;\n"
1198 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001199 EXPECT_EQ("class A {\n"
1200 "protected:\n"
1201 "public:\n"
1202 " void f();\n"
1203 "};",
1204 format("class A {\n"
1205 "protected:\n"
1206 "\n"
1207 "public:\n"
1208 "\n"
1209 " void f();\n"
1210 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001211
1212 // Even ensure proper spacing inside macros.
1213 EXPECT_EQ("#define B \\\n"
1214 " class A { \\\n"
1215 " protected: \\\n"
1216 " public: \\\n"
1217 " void f(); \\\n"
1218 " };",
1219 format("#define B \\\n"
1220 " class A { \\\n"
1221 " protected: \\\n"
1222 " \\\n"
1223 " public: \\\n"
1224 " \\\n"
1225 " void f(); \\\n"
1226 " };",
1227 getGoogleStyle()));
1228 // But don't remove empty lines after macros ending in access specifiers.
1229 EXPECT_EQ("#define A private:\n"
1230 "\n"
1231 "int i;",
1232 format("#define A private:\n"
1233 "\n"
1234 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001235}
1236
Daniel Jasper83193602013-04-05 17:22:09 +00001237TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001238 verifyFormat("class A : public B {};");
1239 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001240
1241 verifyFormat(
1242 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001243 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001244 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1245 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001246 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001247 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001248 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001249 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1250 " public C,\n"
1251 " public D,\n"
1252 " public E,\n"
1253 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001254 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001255
1256 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001257 " ReallyReallyLongClassName {\n"
1258 " int i;\n"
1259 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001260 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001261 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1262 " aaaaaaaaaaaaaaaa> {};");
1263 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1264 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1265 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001266 verifyFormat("template <class R, class C>\n"
1267 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1268 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001269 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001270}
1271
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001272TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1273 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1274 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1275
1276 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1277 verifyFormat("class MyClass\n"
1278 " : public X\n"
1279 " , public Y {};",
1280 StyleWithInheritanceBreak);
1281}
1282
Manuel Klimek28cacc72013-01-07 18:10:23 +00001283TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001284 verifyFormat("class A {\n} a, b;");
1285 verifyFormat("struct A {\n} a, b;");
1286 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001287}
1288
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001289TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001290 verifyFormat("enum {\n"
1291 " Zero,\n"
1292 " One = 1,\n"
1293 " Two = One + 1,\n"
1294 " Three = (One + Two),\n"
1295 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1296 " Five = (One, Two, Three, Four, 5)\n"
1297 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001298 verifyGoogleFormat("enum {\n"
1299 " Zero,\n"
1300 " One = 1,\n"
1301 " Two = One + 1,\n"
1302 " Three = (One + Two),\n"
1303 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1304 " Five = (One, Two, Three, Four, 5)\n"
1305 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001306 verifyFormat("enum Enum {};");
1307 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001308 verifyFormat("enum X E {} d;");
1309 verifyFormat("enum __attribute__((...)) E {} d;");
1310 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001311 verifyFormat("enum {\n"
1312 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001313 "};",
1314 getLLVMStyleWithColumns(30));
1315
1316 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001317 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001318
1319 EXPECT_EQ("enum KeepEmptyLines {\n"
1320 " ONE,\n"
1321 "\n"
1322 " TWO,\n"
1323 "\n"
1324 " THREE\n"
1325 "}",
1326 format("enum KeepEmptyLines {\n"
1327 " ONE,\n"
1328 "\n"
1329 " TWO,\n"
1330 "\n"
1331 "\n"
1332 " THREE\n"
1333 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001334 verifyFormat("enum E { // comment\n"
1335 " ONE,\n"
1336 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001337 "};\n"
1338 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001339 // Not enums.
1340 verifyFormat("enum X f() {\n"
1341 " a();\n"
1342 " return 42;\n"
1343 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001344 verifyFormat("enum X Type::f() {\n"
1345 " a();\n"
1346 " return 42;\n"
1347 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001348 verifyFormat("enum ::X f() {\n"
1349 " a();\n"
1350 " return 42;\n"
1351 "}");
1352 verifyFormat("enum ns::X f() {\n"
1353 " a();\n"
1354 " return 42;\n"
1355 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001356}
1357
Daniel Jasperb7150872013-08-30 10:10:19 +00001358TEST_F(FormatTest, FormatsEnumsWithErrors) {
1359 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001360 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001361 " Two = 1;\n"
1362 "};");
1363 verifyFormat("namespace n {\n"
1364 "enum Type {\n"
1365 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001366 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001367 " int i;\n"
1368 "}\n"
1369 "void g() {}");
1370}
1371
Daniel Jasper2b41a822013-08-20 12:42:50 +00001372TEST_F(FormatTest, FormatsEnumStruct) {
1373 verifyFormat("enum struct {\n"
1374 " Zero,\n"
1375 " One = 1,\n"
1376 " Two = One + 1,\n"
1377 " Three = (One + Two),\n"
1378 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1379 " Five = (One, Two, Three, Four, 5)\n"
1380 "};");
1381 verifyFormat("enum struct Enum {};");
1382 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001383 verifyFormat("enum struct X E {} d;");
1384 verifyFormat("enum struct __attribute__((...)) E {} d;");
1385 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001386 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1387}
1388
1389TEST_F(FormatTest, FormatsEnumClass) {
1390 verifyFormat("enum class {\n"
1391 " Zero,\n"
1392 " One = 1,\n"
1393 " Two = One + 1,\n"
1394 " Three = (One + Two),\n"
1395 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1396 " Five = (One, Two, Three, Four, 5)\n"
1397 "};");
1398 verifyFormat("enum class Enum {};");
1399 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001400 verifyFormat("enum class X E {} d;");
1401 verifyFormat("enum class __attribute__((...)) E {} d;");
1402 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001403 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1404}
1405
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001406TEST_F(FormatTest, FormatsEnumTypes) {
1407 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001408 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001409 " B\n"
1410 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001411 verifyFormat("enum X : int { A, B };");
1412 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001413}
1414
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001415TEST_F(FormatTest, FormatsTypedefEnum) {
1416 FormatStyle Style = getLLVMStyle();
1417 Style.ColumnLimit = 40;
1418 verifyFormat("typedef enum {} EmptyEnum;");
1419 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1420 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001421 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001422 " ONE = 1,\n"
1423 " TWO = 2,\n"
1424 " THREE = 3\n"
1425 "} LongEnum;",
1426 Style);
1427 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1428 Style.BraceWrapping.AfterEnum = true;
1429 verifyFormat("typedef enum {} EmptyEnum;");
1430 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1431 verifyFormat("typedef enum\n"
1432 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001433 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001434 " ONE = 1,\n"
1435 " TWO = 2,\n"
1436 " THREE = 3\n"
1437 "} LongEnum;",
1438 Style);
1439}
1440
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001441TEST_F(FormatTest, FormatsNSEnums) {
1442 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1443 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1444 " // Information about someDecentlyLongValue.\n"
1445 " someDecentlyLongValue,\n"
1446 " // Information about anotherDecentlyLongValue.\n"
1447 " anotherDecentlyLongValue,\n"
1448 " // Information about aThirdDecentlyLongValue.\n"
1449 " aThirdDecentlyLongValue\n"
1450 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001451 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1452 " a = 1,\n"
1453 " b = 2,\n"
1454 " c = 3,\n"
1455 "};");
1456 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1457 " a = 1,\n"
1458 " b = 2,\n"
1459 " c = 3,\n"
1460 "};");
1461 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1462 " a = 1,\n"
1463 " b = 2,\n"
1464 " c = 3,\n"
1465 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001466}
1467
Nico Weber7769a902013-01-14 05:49:49 +00001468TEST_F(FormatTest, FormatsBitfields) {
1469 verifyFormat("struct Bitfields {\n"
1470 " unsigned sClass : 8;\n"
1471 " unsigned ValueKind : 2;\n"
1472 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001473 verifyFormat("struct A {\n"
1474 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1475 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1476 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001477 verifyFormat("struct MyStruct {\n"
1478 " uchar data;\n"
1479 " uchar : 8;\n"
1480 " uchar : 8;\n"
1481 " uchar other;\n"
1482 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001483}
1484
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001485TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001486 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1487 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1488
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001489 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001490 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001491 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001492 "}",
1493 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001494 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001495 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001496 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001497 "}",
1498 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001499 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001500 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001501 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001502 "}",
1503 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001504 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001505 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001506 "void f() { f(); }",
1507 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001508
1509 // This code is more common than we thought; if we
1510 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001511 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001512 verifyFormat("namespace {};",
1513 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001514 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001515 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001516 "};",
1517 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001518
1519 verifyFormat("namespace {\n"
1520 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001521 "} // namespace",
1522 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001523 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1524 "#define HEADER_GUARD\n"
1525 "namespace my_namespace {\n"
1526 "int i;\n"
1527 "} // my_namespace\n"
1528 "#endif // HEADER_GUARD",
1529 format("#ifndef HEADER_GUARD\n"
1530 " #define HEADER_GUARD\n"
1531 " namespace my_namespace {\n"
1532 "int i;\n"
1533 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001534 "#endif // HEADER_GUARD",
1535 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001536
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001537 EXPECT_EQ("namespace A::B {\n"
1538 "class C {};\n"
1539 "}",
1540 format("namespace A::B {\n"
1541 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001542 "}",
1543 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001544
Daniel Jasper65ee3472013-07-31 23:16:02 +00001545 FormatStyle Style = getLLVMStyle();
1546 Style.NamespaceIndentation = FormatStyle::NI_All;
1547 EXPECT_EQ("namespace out {\n"
1548 " int i;\n"
1549 " namespace in {\n"
1550 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001551 " } // namespace in\n"
1552 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001553 format("namespace out {\n"
1554 "int i;\n"
1555 "namespace in {\n"
1556 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001557 "} // namespace in\n"
1558 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001559 Style));
1560
1561 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1562 EXPECT_EQ("namespace out {\n"
1563 "int i;\n"
1564 "namespace in {\n"
1565 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001566 "} // namespace in\n"
1567 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001568 format("namespace out {\n"
1569 "int i;\n"
1570 "namespace in {\n"
1571 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001572 "} // namespace in\n"
1573 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001574 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001575}
1576
Francois Ferrande56a8292017-06-14 12:29:47 +00001577TEST_F(FormatTest, FormatsCompactNamespaces) {
1578 FormatStyle Style = getLLVMStyle();
1579 Style.CompactNamespaces = true;
1580
1581 verifyFormat("namespace A { namespace B {\n"
1582 "}} // namespace A::B",
1583 Style);
1584
1585 EXPECT_EQ("namespace out { namespace in {\n"
1586 "}} // namespace out::in",
1587 format("namespace out {\n"
1588 "namespace in {\n"
1589 "} // namespace in\n"
1590 "} // namespace out",
1591 Style));
1592
1593 // Only namespaces which have both consecutive opening and end get compacted
1594 EXPECT_EQ("namespace out {\n"
1595 "namespace in1 {\n"
1596 "} // namespace in1\n"
1597 "namespace in2 {\n"
1598 "} // namespace in2\n"
1599 "} // namespace out",
1600 format("namespace out {\n"
1601 "namespace in1 {\n"
1602 "} // namespace in1\n"
1603 "namespace in2 {\n"
1604 "} // namespace in2\n"
1605 "} // namespace out",
1606 Style));
1607
1608 EXPECT_EQ("namespace out {\n"
1609 "int i;\n"
1610 "namespace in {\n"
1611 "int j;\n"
1612 "} // namespace in\n"
1613 "int k;\n"
1614 "} // namespace out",
1615 format("namespace out { int i;\n"
1616 "namespace in { int j; } // namespace in\n"
1617 "int k; } // namespace out",
1618 Style));
1619
1620 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1621 "}}} // namespace A::B::C\n",
1622 format("namespace A { namespace B {\n"
1623 "namespace C {\n"
1624 "}} // namespace B::C\n"
1625 "} // namespace A\n",
1626 Style));
1627
1628 Style.ColumnLimit = 40;
1629 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1630 "namespace bbbbbbbbbb {\n"
1631 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1632 format("namespace aaaaaaaaaa {\n"
1633 "namespace bbbbbbbbbb {\n"
1634 "} // namespace bbbbbbbbbb\n"
1635 "} // namespace aaaaaaaaaa",
1636 Style));
1637
1638 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1639 "namespace cccccc {\n"
1640 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1641 format("namespace aaaaaa {\n"
1642 "namespace bbbbbb {\n"
1643 "namespace cccccc {\n"
1644 "} // namespace cccccc\n"
1645 "} // namespace bbbbbb\n"
1646 "} // namespace aaaaaa",
1647 Style));
1648 Style.ColumnLimit = 80;
1649
1650 // Extra semicolon after 'inner' closing brace prevents merging
1651 EXPECT_EQ("namespace out { namespace in {\n"
1652 "}; } // namespace out::in",
1653 format("namespace out {\n"
1654 "namespace in {\n"
1655 "}; // namespace in\n"
1656 "} // namespace out",
1657 Style));
1658
1659 // Extra semicolon after 'outer' closing brace is conserved
1660 EXPECT_EQ("namespace out { namespace in {\n"
1661 "}}; // namespace out::in",
1662 format("namespace out {\n"
1663 "namespace in {\n"
1664 "} // namespace in\n"
1665 "}; // namespace out",
1666 Style));
1667
1668 Style.NamespaceIndentation = FormatStyle::NI_All;
1669 EXPECT_EQ("namespace out { namespace in {\n"
1670 " int i;\n"
1671 "}} // namespace out::in",
1672 format("namespace out {\n"
1673 "namespace in {\n"
1674 "int i;\n"
1675 "} // namespace in\n"
1676 "} // namespace out",
1677 Style));
1678 EXPECT_EQ("namespace out { namespace mid {\n"
1679 " namespace in {\n"
1680 " int j;\n"
1681 " } // namespace in\n"
1682 " int k;\n"
1683 "}} // namespace out::mid",
1684 format("namespace out { namespace mid {\n"
1685 "namespace in { int j; } // namespace in\n"
1686 "int k; }} // namespace out::mid",
1687 Style));
1688
1689 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1690 EXPECT_EQ("namespace out { namespace in {\n"
1691 " int i;\n"
1692 "}} // namespace out::in",
1693 format("namespace out {\n"
1694 "namespace in {\n"
1695 "int i;\n"
1696 "} // namespace in\n"
1697 "} // namespace out",
1698 Style));
1699 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1700 " int i;\n"
1701 "}}} // namespace out::mid::in",
1702 format("namespace out {\n"
1703 "namespace mid {\n"
1704 "namespace in {\n"
1705 "int i;\n"
1706 "} // namespace in\n"
1707 "} // namespace mid\n"
1708 "} // namespace out",
1709 Style));
1710}
1711
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001712TEST_F(FormatTest, FormatsExternC) {
1713 verifyFormat("extern \"C\" {\nint a;");
1714 verifyFormat("extern \"C\" {}");
1715 verifyFormat("extern \"C\" {\n"
1716 "int foo();\n"
1717 "}");
1718 verifyFormat("extern \"C\" int foo() {}");
1719 verifyFormat("extern \"C\" int foo();");
1720 verifyFormat("extern \"C\" int foo() {\n"
1721 " int i = 42;\n"
1722 " return i;\n"
1723 "}");
1724
1725 FormatStyle Style = getLLVMStyle();
1726 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1727 Style.BraceWrapping.AfterFunction = true;
1728 verifyFormat("extern \"C\" int foo() {}", Style);
1729 verifyFormat("extern \"C\" int foo();", Style);
1730 verifyFormat("extern \"C\" int foo()\n"
1731 "{\n"
1732 " int i = 42;\n"
1733 " return i;\n"
1734 "}",
1735 Style);
1736
1737 Style.BraceWrapping.AfterExternBlock = true;
1738 Style.BraceWrapping.SplitEmptyRecord = false;
1739 verifyFormat("extern \"C\"\n"
1740 "{}",
1741 Style);
1742 verifyFormat("extern \"C\"\n"
1743 "{\n"
1744 " int foo();\n"
1745 "}",
1746 Style);
1747}
Manuel Klimekae610d12013-01-21 14:32:05 +00001748
Daniel Jasper40aacf42013-03-14 13:45:21 +00001749TEST_F(FormatTest, FormatsInlineASM) {
1750 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001751 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001752 verifyFormat(
1753 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1754 " \"cpuid\\n\\t\"\n"
1755 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001756 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001757 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001758 EXPECT_EQ(
1759 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001760 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001761 " mov edx,[that] // vtable in edx\n"
1762 " mov eax,methodIndex\n"
1763 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001764 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001765 "}",
1766 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1767 " __asm {\n"
1768 " mov edx,[that] // vtable in edx\n"
1769 " mov eax,methodIndex\n"
1770 " call [edx][eax*4] // stdcall\n"
1771 " }\n"
1772 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001773 EXPECT_EQ("_asm {\n"
1774 " xor eax, eax;\n"
1775 " cpuid;\n"
1776 "}",
1777 format("_asm {\n"
1778 " xor eax, eax;\n"
1779 " cpuid;\n"
1780 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001781 verifyFormat("void function() {\n"
1782 " // comment\n"
1783 " asm(\"\");\n"
1784 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001785 EXPECT_EQ("__asm {\n"
1786 "}\n"
1787 "int i;",
1788 format("__asm {\n"
1789 "}\n"
1790 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001791}
1792
Nico Weberd5650bd2013-01-07 16:36:17 +00001793TEST_F(FormatTest, FormatTryCatch) {
1794 verifyFormat("try {\n"
1795 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001796 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001797 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001798 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001799 " exit(42);\n"
1800 "}");
1801
1802 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001803 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001804 " return 5;\n"
1805 "}");
1806 verifyFormat("class A {\n"
1807 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001808 " A() try : a(0) {\n"
1809 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001810 " throw;\n"
1811 " }\n"
1812 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001813
1814 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001815 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001816}
1817
Nico Weberfac23712015-02-04 15:26:27 +00001818TEST_F(FormatTest, FormatSEHTryCatch) {
1819 verifyFormat("__try {\n"
1820 " int a = b * c;\n"
1821 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1822 " // Do nothing.\n"
1823 "}");
1824
1825 verifyFormat("__try {\n"
1826 " int a = b * c;\n"
1827 "} __finally {\n"
1828 " // Do nothing.\n"
1829 "}");
1830
1831 verifyFormat("DEBUG({\n"
1832 " __try {\n"
1833 " } __finally {\n"
1834 " }\n"
1835 "});\n");
1836}
1837
Daniel Jasper04a71a42014-05-08 11:58:24 +00001838TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1839 verifyFormat("try {\n"
1840 " f();\n"
1841 "} catch {\n"
1842 " g();\n"
1843 "}");
1844 verifyFormat("try {\n"
1845 " f();\n"
1846 "} catch (A a) MACRO(x) {\n"
1847 " g();\n"
1848 "} catch (B b) MACRO(x) {\n"
1849 " g();\n"
1850 "}");
1851}
1852
1853TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1854 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001855 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1856 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001857 Style.BreakBeforeBraces = BraceStyle;
1858 verifyFormat("try {\n"
1859 " // something\n"
1860 "} catch (...) {\n"
1861 " // something\n"
1862 "}",
1863 Style);
1864 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001865 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1866 verifyFormat("try {\n"
1867 " // something\n"
1868 "}\n"
1869 "catch (...) {\n"
1870 " // something\n"
1871 "}",
1872 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001873 verifyFormat("__try {\n"
1874 " // something\n"
1875 "}\n"
1876 "__finally {\n"
1877 " // something\n"
1878 "}",
1879 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001880 verifyFormat("@try {\n"
1881 " // something\n"
1882 "}\n"
1883 "@finally {\n"
1884 " // something\n"
1885 "}",
1886 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001887 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1888 verifyFormat("try\n"
1889 "{\n"
1890 " // something\n"
1891 "}\n"
1892 "catch (...)\n"
1893 "{\n"
1894 " // something\n"
1895 "}",
1896 Style);
1897 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1898 verifyFormat("try\n"
1899 " {\n"
1900 " // something\n"
1901 " }\n"
1902 "catch (...)\n"
1903 " {\n"
1904 " // something\n"
1905 " }",
1906 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001907 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1908 Style.BraceWrapping.BeforeCatch = true;
1909 verifyFormat("try {\n"
1910 " // something\n"
1911 "}\n"
1912 "catch (...) {\n"
1913 " // something\n"
1914 "}",
1915 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001916}
1917
Daniel Jaspere25509f2012-12-17 11:29:41 +00001918TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001919 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001920
Daniel Jaspera44991332015-04-29 13:06:49 +00001921 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1922 " 100000000, "
1923 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001924
Daniel Jasper473c62c2013-05-17 09:35:01 +00001925 // Here, everything other than the "}" would fit on a line.
1926 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001927 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001928 EXPECT_EQ("S s = {a,\n"
1929 "\n"
1930 " b};",
1931 format("S s = {\n"
1932 " a,\n"
1933 "\n"
1934 " b\n"
1935 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001936
1937 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1938 // line. However, the formatting looks a bit off and this probably doesn't
1939 // happen often in practice.
1940 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001941 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001942 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001943}
1944
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001945TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001946 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1947 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1948 " .bbbbbbbbbb = 2,\n"
1949 " .cccccccccc = 3,\n"
1950 " .dddddddddd = 4,\n"
1951 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001952 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001953 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1954 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1955 " .ccccccccccccccccccccccccccc = 3,\n"
1956 " .ddddddddddddddddddddddddddd = 4,\n"
1957 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001958
1959 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001960
1961 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1962 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1963 " [2] = bbbbbbbbbb,\n"
1964 " [3] = cccccccccc,\n"
1965 " [4] = dddddddddd,\n"
1966 " [5] = eeeeeeeeee};");
1967 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1968 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1969 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1970 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1971 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1972 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001973}
1974
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001975TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001976 verifyFormat("static A x = {{{}}};\n");
1977 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1978 " {init1, init2, init3, init4}}};",
1979 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001980
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001981 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001982 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1983 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1984 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1985 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001986 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001987 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1988 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1989 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001990 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1991 " {rect.fRight - rect.fLeft, rect.fBottom - "
1992 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001993
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001994 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001995 "SomeArrayOfSomeType a = {\n"
1996 " {{1, 2, 3},\n"
1997 " {1, 2, 3},\n"
1998 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1999 " 333333333333333333333333333333},\n"
2000 " {1, 2, 3},\n"
2001 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002002 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002003 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002004 " {{1, 2, 3}},\n"
2005 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002006 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2007 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002008 " {{1, 2, 3}},\n"
2009 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002010
Daniel Jaspera44991332015-04-29 13:06:49 +00002011 verifyFormat("struct {\n"
2012 " unsigned bit;\n"
2013 " const char *const name;\n"
2014 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2015 " {kOsWin, \"Windows\"},\n"
2016 " {kOsLinux, \"Linux\"},\n"
2017 " {kOsCrOS, \"Chrome OS\"}};");
2018 verifyFormat("struct {\n"
2019 " unsigned bit;\n"
2020 " const char *const name;\n"
2021 "} kBitsToOs[] = {\n"
2022 " {kOsMac, \"Mac\"},\n"
2023 " {kOsWin, \"Windows\"},\n"
2024 " {kOsLinux, \"Linux\"},\n"
2025 " {kOsCrOS, \"Chrome OS\"},\n"
2026 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002027}
2028
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002029TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2030 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2031 " \\\n"
2032 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2033}
2034
Daniel Jasperda16db32013-01-07 10:48:50 +00002035TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002036 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2037 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002038
2039 // Do break defaulted and deleted functions.
2040 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2041 " default;",
2042 getLLVMStyleWithColumns(40));
2043 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2044 " delete;",
2045 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002046}
2047
2048TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2049 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2050 getLLVMStyleWithColumns(40));
2051 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2052 getLLVMStyleWithColumns(40));
2053 EXPECT_EQ("#define Q \\\n"
2054 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2055 " \"aaaaaaaa.cpp\"",
2056 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2057 getLLVMStyleWithColumns(40)));
2058}
2059
2060TEST_F(FormatTest, UnderstandsLinePPDirective) {
2061 EXPECT_EQ("# 123 \"A string literal\"",
2062 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002063}
2064
Manuel Klimek591b5802013-01-31 15:58:48 +00002065TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002066 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002067 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002068}
2069
2070TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2071 EXPECT_EQ("#line 42 \"test\"\n",
2072 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002073 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2074 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002075}
2076
2077TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2078 EXPECT_EQ("#line 42 \"test\"",
2079 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002080 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002081}
2082
Daniel Jasper877615c2013-10-11 19:45:02 +00002083TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2084 verifyFormat("#define A \\x20");
2085 verifyFormat("#define A \\ x20");
2086 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2087 verifyFormat("#define A ''");
2088 verifyFormat("#define A ''qqq");
2089 verifyFormat("#define A `qqq");
2090 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002091 EXPECT_EQ("const char *c = STRINGIFY(\n"
2092 "\\na : b);",
2093 format("const char * c = STRINGIFY(\n"
2094 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002095
2096 verifyFormat("a\r\\");
2097 verifyFormat("a\v\\");
2098 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002099}
2100
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002101TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002102 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2103 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002104 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002105 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002106 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002107
2108 verifyFormat("#define A A\n#define A A");
2109 verifyFormat("#define A(X) A\n#define A A");
2110
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002111 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2112 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002113}
2114
2115TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002116 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002117 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002118 "#define A( \\\n"
2119 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002120 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002121 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002122 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002123 " #include \"a.h\"\n"
2124 "#define A(A,\\\n"
2125 " B)\n"
2126 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002127 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002128 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002129}
2130
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002131TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002132
2133TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2134 EXPECT_EQ("#define A \\\n"
2135 " c; \\\n"
2136 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002137 "f;",
2138 format("#define A c; e;\n"
2139 "f;",
2140 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002141}
2142
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002143TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002144
Manuel Klimek1abf7892013-01-04 23:34:14 +00002145TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002146 EXPECT_EQ("int x,\n"
2147 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002148 " y;",
2149 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002150}
2151
Manuel Klimek09e07972013-01-05 21:34:55 +00002152TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002153 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002154 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002155 verifyFormat("#define A \\\n"
2156 " { \\\n"
2157 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002158 " }",
2159 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002160
2161 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002162 " void function##X()",
2163 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002164
2165 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002166 " void a##b##c()",
2167 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002168
Daniel Jasper39825ea2013-01-14 15:40:57 +00002169 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002170}
2171
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002172TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002173 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2174 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002175}
2176
Manuel Klimek0c137952013-02-11 12:33:24 +00002177TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2178 EXPECT_EQ("#define A b;", format("#define A \\\n"
2179 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002180 " b;",
2181 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002182 EXPECT_EQ("#define A \\\n"
2183 " \\\n"
2184 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002185 " b;",
2186 format("#define A \\\n"
2187 " \\\n"
2188 " a; \\\n"
2189 " b;",
2190 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002191 EXPECT_EQ("#define A \\\n"
2192 " a; \\\n"
2193 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002194 " b;",
2195 format("#define A \\\n"
2196 " a; \\\n"
2197 " \\\n"
2198 " b;",
2199 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002200}
2201
Daniel Jasper00475962013-02-19 17:14:38 +00002202TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002203 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002204 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002205 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002206 " case 2\n",
2207 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002208 verifyFormat("#define MACRO(a) \\\n"
2209 " if (a) \\\n"
2210 " f(); \\\n"
2211 " else \\\n"
2212 " g()",
2213 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002214 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002215 verifyIncompleteFormat("#define STR(x) #x\n"
2216 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002217 verifyFormat("#pragma omp threadprivate( \\\n"
2218 " y)), // expected-warning",
2219 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002220 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002221 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002222 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002223 "#define b \\\n"
2224 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002225 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002226 "a",
2227 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002228 verifyFormat("#define A \\\n"
2229 " { \\\n"
2230 " {\n"
2231 "#define B \\\n"
2232 " } \\\n"
2233 " }",
2234 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002235 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002236 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002237 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002238 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002239}
2240
Daniel Jasper40e19212013-05-29 13:16:10 +00002241TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2242 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2243 EXPECT_EQ("class A : public QObject {\n"
2244 " Q_OBJECT\n"
2245 "\n"
2246 " A() {}\n"
2247 "};",
2248 format("class A : public QObject {\n"
2249 " Q_OBJECT\n"
2250 "\n"
2251 " A() {\n}\n"
2252 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002253 EXPECT_EQ("MACRO\n"
2254 "/*static*/ int i;",
2255 format("MACRO\n"
2256 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002257 EXPECT_EQ("SOME_MACRO\n"
2258 "namespace {\n"
2259 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002260 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002261 format("SOME_MACRO\n"
2262 " namespace {\n"
2263 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002264 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002265 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002266 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2267 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002268 // Only if everything is upper case.
2269 EXPECT_EQ("class A : public QObject {\n"
2270 " Q_Object A() {}\n"
2271 "};",
2272 format("class A : public QObject {\n"
2273 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002274 " A() {\n}\n"
2275 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002276
2277 // Only if the next line can actually start an unwrapped line.
2278 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2279 format("SOME_WEIRD_LOG_MACRO\n"
2280 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002281
2282 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002283 "(n, buffers))\n",
2284 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002285}
2286
Alexander Kornienkode644272013-04-08 22:16:06 +00002287TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2288 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2289 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2290 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002291 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002292 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2293 "int *createScopDetectionPass() { return 0; }",
2294 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2295 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2296 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2297 " class X {};\n"
2298 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2299 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002300 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2301 // braces, so that inner block is indented one level more.
2302 EXPECT_EQ("int q() {\n"
2303 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2304 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2305 " IPC_END_MESSAGE_MAP()\n"
2306 "}",
2307 format("int q() {\n"
2308 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2309 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2310 " IPC_END_MESSAGE_MAP()\n"
2311 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002312
Daniel Jasper352dae12014-01-03 11:50:46 +00002313 // Same inside macros.
2314 EXPECT_EQ("#define LIST(L) \\\n"
2315 " L(A) \\\n"
2316 " L(B) \\\n"
2317 " L(C)",
2318 format("#define LIST(L) \\\n"
2319 " L(A) \\\n"
2320 " L(B) \\\n"
2321 " L(C)",
2322 getGoogleStyle()));
2323
Daniel Jasper545c6522013-09-17 09:26:07 +00002324 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002325 EXPECT_EQ("int q() {\n"
2326 " f(x);\n"
2327 " f(x) {}\n"
2328 " f(x)->g();\n"
2329 " f(x)->*g();\n"
2330 " f(x).g();\n"
2331 " f(x) = x;\n"
2332 " f(x) += x;\n"
2333 " f(x) -= x;\n"
2334 " f(x) *= x;\n"
2335 " f(x) /= x;\n"
2336 " f(x) %= x;\n"
2337 " f(x) &= x;\n"
2338 " f(x) |= x;\n"
2339 " f(x) ^= x;\n"
2340 " f(x) >>= x;\n"
2341 " f(x) <<= x;\n"
2342 " f(x)[y].z();\n"
2343 " LOG(INFO) << x;\n"
2344 " ifstream(x) >> x;\n"
2345 "}\n",
2346 format("int q() {\n"
2347 " f(x)\n;\n"
2348 " f(x)\n {}\n"
2349 " f(x)\n->g();\n"
2350 " f(x)\n->*g();\n"
2351 " f(x)\n.g();\n"
2352 " f(x)\n = x;\n"
2353 " f(x)\n += x;\n"
2354 " f(x)\n -= x;\n"
2355 " f(x)\n *= x;\n"
2356 " f(x)\n /= x;\n"
2357 " f(x)\n %= x;\n"
2358 " f(x)\n &= x;\n"
2359 " f(x)\n |= x;\n"
2360 " f(x)\n ^= x;\n"
2361 " f(x)\n >>= x;\n"
2362 " f(x)\n <<= x;\n"
2363 " f(x)\n[y].z();\n"
2364 " LOG(INFO)\n << x;\n"
2365 " ifstream(x)\n >> x;\n"
2366 "}\n"));
2367 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002368 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002369 " if (1) {\n"
2370 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002371 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002372 " while (1) {\n"
2373 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002374 " F(x)\n"
2375 " G(x);\n"
2376 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002377 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002378 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002379 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002380 " }\n"
2381 "}\n",
2382 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002383 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002384 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002385 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002386 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002387 "F(x)\n"
2388 "G(x);\n"
2389 "F(x)\n"
2390 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002391 "}\n"));
2392 EXPECT_EQ("class A {\n"
2393 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002394 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002395 " A(X x)\n" // FIXME: function-level try blocks are broken.
2396 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002397 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002398 " }\n"
2399 "};",
2400 format("class A {\n"
2401 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002402 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002403 " A(X x)\n"
2404 " try : t(0) {} catch (...) {}\n"
2405 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002406 EXPECT_EQ("class SomeClass {\n"
2407 "public:\n"
2408 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2409 "};",
2410 format("class SomeClass {\n"
2411 "public:\n"
2412 " SomeClass()\n"
2413 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2414 "};"));
2415 EXPECT_EQ("class SomeClass {\n"
2416 "public:\n"
2417 " SomeClass()\n"
2418 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2419 "};",
2420 format("class SomeClass {\n"
2421 "public:\n"
2422 " SomeClass()\n"
2423 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2424 "};",
2425 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002426
2427 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002428}
2429
Manuel Klimek4fe43002013-05-22 12:51:29 +00002430TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2431 verifyFormat("#define A \\\n"
2432 " f({ \\\n"
2433 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002434 " });",
2435 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002436}
2437
Krasimir Georgievad47c902017-08-30 14:34:57 +00002438TEST_F(FormatTest, IndentPreprocessorDirectives) {
2439 FormatStyle Style = getLLVMStyle();
2440 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2441 Style.ColumnLimit = 40;
2442 verifyFormat("#ifdef _WIN32\n"
2443 "#define A 0\n"
2444 "#ifdef VAR2\n"
2445 "#define B 1\n"
2446 "#include <someheader.h>\n"
2447 "#define MACRO \\\n"
2448 " some_very_long_func_aaaaaaaaaa();\n"
2449 "#endif\n"
2450 "#else\n"
2451 "#define A 1\n"
2452 "#endif",
2453 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002454 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2455 verifyFormat("#ifdef _WIN32\n"
2456 "# define A 0\n"
2457 "# ifdef VAR2\n"
2458 "# define B 1\n"
2459 "# include <someheader.h>\n"
2460 "# define MACRO \\\n"
2461 " some_very_long_func_aaaaaaaaaa();\n"
2462 "# endif\n"
2463 "#else\n"
2464 "# define A 1\n"
2465 "#endif",
2466 Style);
2467 verifyFormat("#if A\n"
2468 "# define MACRO \\\n"
2469 " void a(int x) { \\\n"
2470 " b(); \\\n"
2471 " c(); \\\n"
2472 " d(); \\\n"
2473 " e(); \\\n"
2474 " f(); \\\n"
2475 " }\n"
2476 "#endif",
2477 Style);
2478 // Comments before include guard.
2479 verifyFormat("// file comment\n"
2480 "// file comment\n"
2481 "#ifndef HEADER_H\n"
2482 "#define HEADER_H\n"
2483 "code();\n"
2484 "#endif",
2485 Style);
2486 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002487 verifyFormat("#ifndef HEADER_H\n"
2488 "#define HEADER_H\n"
2489 "code();\n"
2490 "#endif",
2491 Style);
2492 // Include guards must have a #define with the same variable immediately
2493 // after #ifndef.
2494 verifyFormat("#ifndef NOT_GUARD\n"
2495 "# define FOO\n"
2496 "code();\n"
2497 "#endif",
2498 Style);
2499
2500 // Include guards must cover the entire file.
2501 verifyFormat("code();\n"
2502 "code();\n"
2503 "#ifndef NOT_GUARD\n"
2504 "# define NOT_GUARD\n"
2505 "code();\n"
2506 "#endif",
2507 Style);
2508 verifyFormat("#ifndef NOT_GUARD\n"
2509 "# define NOT_GUARD\n"
2510 "code();\n"
2511 "#endif\n"
2512 "code();",
2513 Style);
2514 // Test with trailing blank lines.
2515 verifyFormat("#ifndef HEADER_H\n"
2516 "#define HEADER_H\n"
2517 "code();\n"
2518 "#endif\n",
2519 Style);
2520 // Include guards don't have #else.
2521 verifyFormat("#ifndef NOT_GUARD\n"
2522 "# define NOT_GUARD\n"
2523 "code();\n"
2524 "#else\n"
2525 "#endif",
2526 Style);
2527 verifyFormat("#ifndef NOT_GUARD\n"
2528 "# define NOT_GUARD\n"
2529 "code();\n"
2530 "#elif FOO\n"
2531 "#endif",
2532 Style);
2533 // FIXME: This doesn't handle the case where there's code between the
2534 // #ifndef and #define but all other conditions hold. This is because when
2535 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2536 // previous code line yet, so we can't detect it.
2537 EXPECT_EQ("#ifndef NOT_GUARD\n"
2538 "code();\n"
2539 "#define NOT_GUARD\n"
2540 "code();\n"
2541 "#endif",
2542 format("#ifndef NOT_GUARD\n"
2543 "code();\n"
2544 "# define NOT_GUARD\n"
2545 "code();\n"
2546 "#endif",
2547 Style));
2548 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2549 // be outside an include guard. Examples are #pragma once and
2550 // #pragma GCC diagnostic, or anything else that does not change the meaning
2551 // of the file if it's included multiple times.
2552 EXPECT_EQ("#ifdef WIN32\n"
2553 "# pragma once\n"
2554 "#endif\n"
2555 "#ifndef HEADER_H\n"
2556 "# define HEADER_H\n"
2557 "code();\n"
2558 "#endif",
2559 format("#ifdef WIN32\n"
2560 "# pragma once\n"
2561 "#endif\n"
2562 "#ifndef HEADER_H\n"
2563 "#define HEADER_H\n"
2564 "code();\n"
2565 "#endif",
2566 Style));
2567 // FIXME: This does not detect when there is a single non-preprocessor line
2568 // in front of an include-guard-like structure where other conditions hold
2569 // because ScopedLineState hides the line.
2570 EXPECT_EQ("code();\n"
2571 "#ifndef HEADER_H\n"
2572 "#define HEADER_H\n"
2573 "code();\n"
2574 "#endif",
2575 format("code();\n"
2576 "#ifndef HEADER_H\n"
2577 "# define HEADER_H\n"
2578 "code();\n"
2579 "#endif",
2580 Style));
2581 // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
2582 // preprocessor indentation.
2583 EXPECT_EQ("#if 1\n"
2584 " // comment\n"
2585 "# define A 0\n"
2586 "// comment\n"
2587 "# define B 0\n"
2588 "#endif",
2589 format("#if 1\n"
2590 "// comment\n"
2591 "# define A 0\n"
2592 " // comment\n"
2593 "# define B 0\n"
2594 "#endif",
2595 Style));
2596 // Test with tabs.
2597 Style.UseTab = FormatStyle::UT_Always;
2598 Style.IndentWidth = 8;
2599 Style.TabWidth = 8;
2600 verifyFormat("#ifdef _WIN32\n"
2601 "#\tdefine A 0\n"
2602 "#\tifdef VAR2\n"
2603 "#\t\tdefine B 1\n"
2604 "#\t\tinclude <someheader.h>\n"
2605 "#\t\tdefine MACRO \\\n"
2606 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2607 "#\tendif\n"
2608 "#else\n"
2609 "#\tdefine A 1\n"
2610 "#endif",
2611 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002612
2613 // Regression test: Multiline-macro inside include guards.
2614 verifyFormat("#ifndef HEADER_H\n"
2615 "#define HEADER_H\n"
2616 "#define A() \\\n"
2617 " int i; \\\n"
2618 " int j;\n"
2619 "#endif // HEADER_H",
2620 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002621}
2622
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002623TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002624 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002625}
2626
Manuel Klimek1058d982013-01-06 20:07:31 +00002627TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2628 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2629 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2630 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2631 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2632}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002633
Daniel Jaspere2408e32015-05-06 11:16:43 +00002634TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002635 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2636 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2637 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002638 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002639 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002640 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002641 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002642
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002643 FormatStyle AlignLeft = getLLVMStyle();
2644 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2645 EXPECT_EQ("#define MACRO(x) \\\n"
2646 "private: \\\n"
2647 " int x(int a);\n",
2648 format("#define MACRO(x) \\\n"
2649 "private: \\\n"
2650 " int x(int a);\n",
2651 AlignLeft));
2652
2653 // CRLF line endings
2654 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2655 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2656 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2657 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2658 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2659 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2660 EXPECT_EQ("#define MACRO(x) \\\r\n"
2661 "private: \\\r\n"
2662 " int x(int a);\r\n",
2663 format("#define MACRO(x) \\\r\n"
2664 "private: \\\r\n"
2665 " int x(int a);\r\n",
2666 AlignLeft));
2667
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002668 FormatStyle DontAlign = getLLVMStyle();
2669 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2670 DontAlign.MaxEmptyLinesToKeep = 3;
2671 // FIXME: can't use verifyFormat here because the newline before
2672 // "public:" is not inserted the first time it's reformatted
2673 EXPECT_EQ("#define A \\\n"
2674 " class Foo { \\\n"
2675 " void bar(); \\\n"
2676 "\\\n"
2677 "\\\n"
2678 "\\\n"
2679 " public: \\\n"
2680 " void baz(); \\\n"
2681 " };",
2682 format("#define A \\\n"
2683 " class Foo { \\\n"
2684 " void bar(); \\\n"
2685 "\\\n"
2686 "\\\n"
2687 "\\\n"
2688 " public: \\\n"
2689 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002690 " };",
2691 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002692}
2693
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002694TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2695 verifyFormat("#define A \\\n"
2696 " int v( \\\n"
2697 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002698 " int i;",
2699 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002700}
2701
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002702TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002703 EXPECT_EQ(
2704 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2705 " \\\n"
2706 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2707 "\n"
2708 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2709 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2710 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2711 "\\\n"
2712 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2713 " \n"
2714 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2715 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002716}
2717
Manuel Klimek52b15152013-01-09 15:25:02 +00002718TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2719 EXPECT_EQ("int\n"
2720 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002721 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002722 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002723 verifyFormat("functionCallTo(\n"
2724 " someOtherFunction(\n"
2725 " withSomeParameters, whichInSequence,\n"
2726 " areLongerThanALine(andAnotherCall,\n"
2727 "#define A B\n"
2728 " withMoreParamters,\n"
2729 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002730 " andMoreParameters),\n"
2731 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002732 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002733 verifyFormat("Foo::Foo()\n"
2734 "#ifdef BAR\n"
2735 " : baz(0)\n"
2736 "#endif\n"
2737 "{\n"
2738 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002739 verifyFormat("void f() {\n"
2740 " if (true)\n"
2741 "#ifdef A\n"
2742 " f(42);\n"
2743 " x();\n"
2744 "#else\n"
2745 " g();\n"
2746 " x();\n"
2747 "#endif\n"
2748 "}");
2749 verifyFormat("void f(param1, param2,\n"
2750 " param3,\n"
2751 "#ifdef A\n"
2752 " param4(param5,\n"
2753 "#ifdef A1\n"
2754 " param6,\n"
2755 "#ifdef A2\n"
2756 " param7),\n"
2757 "#else\n"
2758 " param8),\n"
2759 " param9,\n"
2760 "#endif\n"
2761 " param10,\n"
2762 "#endif\n"
2763 " param11)\n"
2764 "#else\n"
2765 " param12)\n"
2766 "#endif\n"
2767 "{\n"
2768 " x();\n"
2769 "}",
2770 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002771 verifyFormat("#if 1\n"
2772 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002773 verifyFormat("#if 1\n"
2774 "#endif\n"
2775 "#if 1\n"
2776 "#else\n"
2777 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002778 verifyFormat("DEBUG({\n"
2779 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2781 "});\n"
2782 "#if a\n"
2783 "#else\n"
2784 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002785
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002786 verifyIncompleteFormat("void f(\n"
2787 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002788 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002789 "#else\n"
2790 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002791}
2792
Manuel Klimek14bd9172014-01-29 08:49:02 +00002793TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2794 verifyFormat("#endif\n"
2795 "#if B");
2796}
2797
Manuel Klimek88033d72013-10-21 08:11:15 +00002798TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2799 FormatStyle SingleLine = getLLVMStyle();
2800 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002801 verifyFormat("#if 0\n"
2802 "#elif 1\n"
2803 "#endif\n"
2804 "void foo() {\n"
2805 " if (test) foo2();\n"
2806 "}",
2807 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002808}
2809
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002810TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002811 verifyFormat("functionCall({ int i; });");
2812 verifyFormat("functionCall({\n"
2813 " int i;\n"
2814 " int j;\n"
2815 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002816 verifyFormat("functionCall(\n"
2817 " {\n"
2818 " int i;\n"
2819 " int j;\n"
2820 " },\n"
2821 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002822 verifyFormat("functionA(functionB({\n"
2823 " int i;\n"
2824 " int j;\n"
2825 " }),\n"
2826 " aaaa, bbbb, cccc);");
2827 verifyFormat("functionCall(\n"
2828 " {\n"
2829 " int i;\n"
2830 " int j;\n"
2831 " },\n"
2832 " aaaa, bbbb, // comment\n"
2833 " cccc);");
2834 verifyFormat("functionA(functionB({\n"
2835 " int i;\n"
2836 " int j;\n"
2837 " }),\n"
2838 " aaaa, bbbb, // comment\n"
2839 " cccc);");
2840 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2841 verifyFormat("functionCall(aaaa, bbbb, {\n"
2842 " int i;\n"
2843 " int j;\n"
2844 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002845 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002846 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002847 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002848 " int i; // break\n"
2849 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2851 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002852 verifyFormat("DEBUG({\n"
2853 " if (a)\n"
2854 " f();\n"
2855 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002856}
2857
2858TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002859 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002860 "int i;",
2861 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002862}
2863
2864TEST_F(FormatTest, LayoutNestedBlocks) {
2865 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2866 " struct s {\n"
2867 " int i;\n"
2868 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002869 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002870 " for (int i = 0; i < 10; ++i)\n"
2871 " return;\n"
2872 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002873 verifyFormat("call(parameter, {\n"
2874 " something();\n"
2875 " // Comment using all columns.\n"
2876 " somethingelse();\n"
2877 "});",
2878 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002879 verifyFormat("DEBUG( //\n"
2880 " { f(); }, a);");
2881 verifyFormat("DEBUG( //\n"
2882 " {\n"
2883 " f(); //\n"
2884 " },\n"
2885 " a);");
2886
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002887 EXPECT_EQ("call(parameter, {\n"
2888 " something();\n"
2889 " // Comment too\n"
2890 " // looooooooooong.\n"
2891 " somethingElse();\n"
2892 "});",
2893 format("call(parameter, {\n"
2894 " something();\n"
2895 " // Comment too looooooooooong.\n"
2896 " somethingElse();\n"
2897 "});",
2898 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002899 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002900 EXPECT_EQ("DEBUG({ // comment\n"
2901 " int i;\n"
2902 "});",
2903 format("DEBUG({ // comment\n"
2904 "int i;\n"
2905 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002906 EXPECT_EQ("DEBUG({\n"
2907 " int i;\n"
2908 "\n"
2909 " // comment\n"
2910 " int j;\n"
2911 "});",
2912 format("DEBUG({\n"
2913 " int i;\n"
2914 "\n"
2915 " // comment\n"
2916 " int j;\n"
2917 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002918
2919 verifyFormat("DEBUG({\n"
2920 " if (a)\n"
2921 " return;\n"
2922 "});");
2923 verifyGoogleFormat("DEBUG({\n"
2924 " if (a) return;\n"
2925 "});");
2926 FormatStyle Style = getGoogleStyle();
2927 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002928 verifyFormat("Debug(aaaaa,\n"
2929 " {\n"
2930 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2931 " },\n"
2932 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002933 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002934
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002935 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2936
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002937 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002938}
2939
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002940TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2941 EXPECT_EQ("#define MACRO() \\\n"
2942 " Debug(aaa, /* force line break */ \\\n"
2943 " { \\\n"
2944 " int i; \\\n"
2945 " int j; \\\n"
2946 " })",
2947 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2948 " { int i; int j; })",
2949 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002950
2951 EXPECT_EQ("#define A \\\n"
2952 " [] { \\\n"
2953 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2954 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2955 " }",
2956 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2957 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2958 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002959}
2960
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002961TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2962 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002963 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002964 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002965}
2966
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002967TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2968 FormatStyle Style = getLLVMStyle();
2969 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2970 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2971 verifyFormat("FOO_BEGIN\n"
2972 " FOO_ENTRY\n"
2973 "FOO_END", Style);
2974 verifyFormat("FOO_BEGIN\n"
2975 " NESTED_FOO_BEGIN\n"
2976 " NESTED_FOO_ENTRY\n"
2977 " NESTED_FOO_END\n"
2978 "FOO_END", Style);
2979 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2980 " int x;\n"
2981 " x = 1;\n"
2982 "FOO_END(Baz)", Style);
2983}
2984
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002985//===----------------------------------------------------------------------===//
2986// Line break tests.
2987//===----------------------------------------------------------------------===//
2988
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002989TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002990 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002991 "void f() {\n"
2992 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2993 " parameter, parameter, parameter)),\n"
2994 " SecondLongCall(parameter));\n"
2995 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002996 verifyFormat(
2997 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2998 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3000 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3001 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003002 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3003 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3004 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3005 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003006 verifyFormat(
3007 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3008 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3009 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3010 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003011 verifyFormat("int a = bbbb && ccc &&\n"
3012 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003013 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003014 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003015}
3016
Daniel Jasperd69fc772013-05-08 14:12:04 +00003017TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3018 verifyFormat(
3019 "bool aaaaaaa =\n"
3020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3021 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003022 verifyFormat(
3023 "bool aaaaaaa =\n"
3024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3025 " bbbbbbbb();");
3026
Daniel Jasperd69fc772013-05-08 14:12:04 +00003027 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3029 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003030 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3032 " ccccccccc == ddddddddddd;");
3033 verifyFormat(
3034 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3036 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003037
3038 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3039 " aaaaaa) &&\n"
3040 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003041 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3042 " aaaaaa) >>\n"
3043 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003044 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003045 " SourceMgr.getSpellingColumnNumber(\n"
3046 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3047 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003048
Daniel Jasper68d888c2013-06-03 08:42:05 +00003049 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3050 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3051 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003052 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3053 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3054 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003055 verifyFormat("b = a &&\n"
3056 " // Comment\n"
3057 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003058
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003059 // If the LHS of a comparison is not a binary expression itself, the
3060 // additional linebreak confuses many people.
3061 verifyFormat(
3062 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3064 "}");
3065 verifyFormat(
3066 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3068 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003069 verifyFormat(
3070 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3072 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003073 verifyFormat(
3074 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3075 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3076 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003077 // Even explicit parentheses stress the precedence enough to make the
3078 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003079 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3081 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003082 // This cases is borderline, but with the indentation it is still readable.
3083 verifyFormat(
3084 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3085 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3087 "}",
3088 getLLVMStyleWithColumns(75));
3089
3090 // If the LHS is a binary expression, we should still use the additional break
3091 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003092 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3094 " 5) {\n"
3095 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003096 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3098 " 5) {\n"
3099 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003100
Daniel Jasper571f1af2013-05-14 20:39:56 +00003101 FormatStyle OnePerLine = getLLVMStyle();
3102 OnePerLine.BinPackParameters = false;
3103 verifyFormat(
3104 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3107 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003108
3109 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3110 " .aaa(aaaaaaaaaaaaa) *\n"
3111 " aaaaaaa +\n"
3112 " aaaaaaa;",
3113 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003114}
3115
Daniel Jasper6bee6822013-04-08 20:33:42 +00003116TEST_F(FormatTest, ExpressionIndentation) {
3117 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3121 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3122 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3125 " ccccccccccccccccccccccccccccccccccccccccc;");
3126 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3129 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3130 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3133 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3134 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3137 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003138 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003139 "} else if (aaaaa && bbbbb > // break\n"
3140 " ccccc) {\n"
3141 "}");
3142 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003143 "} else if (aaaaa &&\n"
3144 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003145 " ccccc &&\n"
3146 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003147 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003148
3149 // Presence of a trailing comment used to change indentation of b.
3150 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3151 " b;\n"
3152 "return aaaaaaaaaaaaaaaaaaa +\n"
3153 " b; //",
3154 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003155}
3156
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003157TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3158 // Not sure what the best system is here. Like this, the LHS can be found
3159 // immediately above an operator (everything with the same or a higher
3160 // indent). The RHS is aligned right of the operator and so compasses
3161 // everything until something with the same indent as the operator is found.
3162 // FIXME: Is this a good system?
3163 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003164 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003165 verifyFormat(
3166 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003167 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3168 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3169 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3170 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3171 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003172 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003173 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3174 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003175 Style);
3176 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003177 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3178 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003179 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3180 Style);
3181 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003182 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3183 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003184 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3185 Style);
3186 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3187 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003188 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3189 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003190 Style);
3191 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003192 "} else if (aaaaa\n"
3193 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003194 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003195 "}",
3196 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003197 verifyFormat("return (a)\n"
3198 " // comment\n"
3199 " + b;",
3200 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003201 verifyFormat(
3202 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3203 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3204 " + cc;",
3205 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003206
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003207 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3208 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3209 Style);
3210
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003211 // Forced by comments.
3212 verifyFormat(
3213 "unsigned ContentSize =\n"
3214 " sizeof(int16_t) // DWARF ARange version number\n"
3215 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3216 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3217 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003218
3219 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3220 " == boost::fusion::at_c<1>(iiii).second;",
3221 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003222
3223 Style.ColumnLimit = 60;
3224 verifyFormat("zzzzzzzzzz\n"
3225 " = bbbbbbbbbbbbbbbbb\n"
3226 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3227 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003228}
3229
Daniel Jasperb1270392017-02-01 23:27:37 +00003230TEST_F(FormatTest, EnforcedOperatorWraps) {
3231 // Here we'd like to wrap after the || operators, but a comment is forcing an
3232 // earlier wrap.
3233 verifyFormat("bool x = aaaaa //\n"
3234 " || bbbbb\n"
3235 " //\n"
3236 " || cccc;");
3237}
3238
Daniel Jasper3219e432014-12-02 13:24:51 +00003239TEST_F(FormatTest, NoOperandAlignment) {
3240 FormatStyle Style = getLLVMStyle();
3241 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003242 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3245 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003246 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003247 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3248 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3249 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3250 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3251 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3252 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3253 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3254 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3255 " > ccccccccccccccccccccccccccccccccccccccccc;",
3256 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003257
3258 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3259 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3260 " + cc;",
3261 Style);
3262 verifyFormat("int a = aa\n"
3263 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003264 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003265 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003266
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003267 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003268 verifyFormat("return (a > b\n"
3269 " // comment1\n"
3270 " // comment2\n"
3271 " || c);",
3272 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003273}
3274
Daniel Jasperac043c92014-09-15 11:11:00 +00003275TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3276 FormatStyle Style = getLLVMStyle();
3277 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3278 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003280 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3281 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003282}
3283
Daniel Jasper988e7e42017-05-08 15:07:52 +00003284TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3285 FormatStyle Style = getLLVMStyle();
3286 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3287 Style.BinPackArguments = false;
3288 Style.ColumnLimit = 40;
3289 verifyFormat("void test() {\n"
3290 " someFunction(\n"
3291 " this + argument + is + quite\n"
3292 " + long + so + it + gets + wrapped\n"
3293 " + but + remains + bin - packed);\n"
3294 "}",
3295 Style);
3296 verifyFormat("void test() {\n"
3297 " someFunction(arg1,\n"
3298 " this + argument + is\n"
3299 " + quite + long + so\n"
3300 " + it + gets + wrapped\n"
3301 " + but + remains + bin\n"
3302 " - packed,\n"
3303 " arg3);\n"
3304 "}",
3305 Style);
3306 verifyFormat("void test() {\n"
3307 " someFunction(\n"
3308 " arg1,\n"
3309 " this + argument + has\n"
3310 " + anotherFunc(nested,\n"
3311 " calls + whose\n"
3312 " + arguments\n"
3313 " + are + also\n"
3314 " + wrapped,\n"
3315 " in + addition)\n"
3316 " + to + being + bin - packed,\n"
3317 " arg3);\n"
3318 "}",
3319 Style);
3320
3321 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3322 verifyFormat("void test() {\n"
3323 " someFunction(\n"
3324 " arg1,\n"
3325 " this + argument + has +\n"
3326 " anotherFunc(nested,\n"
3327 " calls + whose +\n"
3328 " arguments +\n"
3329 " are + also +\n"
3330 " wrapped,\n"
3331 " in + addition) +\n"
3332 " to + being + bin - packed,\n"
3333 " arg3);\n"
3334 "}",
3335 Style);
3336}
3337
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003338TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003339 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003340 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3341 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003342 verifyFormat("Constructor()\n"
3343 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003344 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003345 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003346 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003347 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003348
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003349 verifyFormat("template <typename T>\n"
3350 "Constructor() : Initializer(FitsOnTheLine) {}",
3351 getLLVMStyleWithColumns(45));
3352
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003353 verifyFormat(
3354 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003355 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003356
3357 verifyFormat(
3358 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003359 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003360 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003361 verifyFormat(
3362 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003363 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003364 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003365 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3366 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3367 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003368
3369 verifyFormat("Constructor()\n"
3370 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3371 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3372 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003373 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003374
Daniel Jasper65585ed2013-01-28 13:31:35 +00003375 verifyFormat("Constructor()\n"
3376 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003378
Daniel Jasper62e68172013-02-25 15:59:54 +00003379 verifyFormat("Constructor(int Parameter = 0)\n"
3380 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3381 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003382 verifyFormat("Constructor()\n"
3383 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3384 "}",
3385 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003386 verifyFormat("Constructor()\n"
3387 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003389
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003390 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003391 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003392 verifyFormat("Constructor()\n"
3393 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3394 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3395 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003396
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003397 FormatStyle OnePerLine = getLLVMStyle();
3398 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003399 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003400 verifyFormat("SomeClass::Constructor()\n"
3401 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3402 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003403 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003404 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003405 verifyFormat("SomeClass::Constructor()\n"
3406 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3407 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003408 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003409 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003410 verifyFormat("MyClass::MyClass(int var)\n"
3411 " : some_var_(var), // 4 space indent\n"
3412 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003413 "}",
3414 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003415 verifyFormat("Constructor()\n"
3416 " : aaaaa(aaaaaa),\n"
3417 " aaaaa(aaaaaa),\n"
3418 " aaaaa(aaaaaa),\n"
3419 " aaaaa(aaaaaa),\n"
3420 " aaaaa(aaaaaa) {}",
3421 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003422 verifyFormat("Constructor()\n"
3423 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3424 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3425 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003426 OnePerLine.BinPackParameters = false;
3427 verifyFormat(
3428 "Constructor()\n"
3429 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3430 " aaaaaaaaaaa().aaa(),\n"
3431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3432 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003433 OnePerLine.ColumnLimit = 60;
3434 verifyFormat("Constructor()\n"
3435 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3436 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3437 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003438
3439 EXPECT_EQ("Constructor()\n"
3440 " : // Comment forcing unwanted break.\n"
3441 " aaaa(aaaa) {}",
3442 format("Constructor() :\n"
3443 " // Comment forcing unwanted break.\n"
3444 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003445}
3446
Francois Ferranda6b6d512017-05-24 11:36:58 +00003447TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3448 FormatStyle Style = getLLVMStyle();
3449 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3450
3451 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3452 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3453 getStyleWithColumns(Style, 45));
3454 verifyFormat("Constructor() :\n"
3455 " Initializer(FitsOnTheLine) {}",
3456 getStyleWithColumns(Style, 44));
3457 verifyFormat("Constructor() :\n"
3458 " Initializer(FitsOnTheLine) {}",
3459 getStyleWithColumns(Style, 43));
3460
3461 verifyFormat("template <typename T>\n"
3462 "Constructor() : Initializer(FitsOnTheLine) {}",
3463 getStyleWithColumns(Style, 50));
3464
3465 verifyFormat(
3466 "SomeClass::Constructor() :\n"
3467 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3468 Style);
3469
3470 verifyFormat(
3471 "SomeClass::Constructor() :\n"
3472 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3473 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3474 Style);
3475 verifyFormat(
3476 "SomeClass::Constructor() :\n"
3477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3478 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3479 Style);
3480 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3481 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3482 " aaaaaaaaaa(aaaaaa) {}",
3483 Style);
3484
3485 verifyFormat("Constructor() :\n"
3486 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3487 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3488 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3489 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3490 Style);
3491
3492 verifyFormat("Constructor() :\n"
3493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3495 Style);
3496
3497 verifyFormat("Constructor(int Parameter = 0) :\n"
3498 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3499 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3500 Style);
3501 verifyFormat("Constructor() :\n"
3502 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3503 "}",
3504 getStyleWithColumns(Style, 60));
3505 verifyFormat("Constructor() :\n"
3506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3507 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3508 Style);
3509
3510 // Here a line could be saved by splitting the second initializer onto two
3511 // lines, but that is not desirable.
3512 verifyFormat("Constructor() :\n"
3513 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3514 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3515 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3516 Style);
3517
3518 FormatStyle OnePerLine = Style;
3519 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3520 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3521 verifyFormat("SomeClass::Constructor() :\n"
3522 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3523 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3524 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3525 OnePerLine);
3526 verifyFormat("SomeClass::Constructor() :\n"
3527 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3528 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3529 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3530 OnePerLine);
3531 verifyFormat("MyClass::MyClass(int var) :\n"
3532 " some_var_(var), // 4 space indent\n"
3533 " some_other_var_(var + 1) { // lined up\n"
3534 "}",
3535 OnePerLine);
3536 verifyFormat("Constructor() :\n"
3537 " aaaaa(aaaaaa),\n"
3538 " aaaaa(aaaaaa),\n"
3539 " aaaaa(aaaaaa),\n"
3540 " aaaaa(aaaaaa),\n"
3541 " aaaaa(aaaaaa) {}",
3542 OnePerLine);
3543 verifyFormat("Constructor() :\n"
3544 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3545 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3546 OnePerLine);
3547 OnePerLine.BinPackParameters = false;
3548 verifyFormat(
3549 "Constructor() :\n"
3550 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3551 " aaaaaaaaaaa().aaa(),\n"
3552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3553 OnePerLine);
3554 OnePerLine.ColumnLimit = 60;
3555 verifyFormat("Constructor() :\n"
3556 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3557 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3558 OnePerLine);
3559
3560 EXPECT_EQ("Constructor() :\n"
3561 " // Comment forcing unwanted break.\n"
3562 " aaaa(aaaa) {}",
3563 format("Constructor() :\n"
3564 " // Comment forcing unwanted break.\n"
3565 " aaaa(aaaa) {}",
3566 Style));
3567
3568 Style.ColumnLimit = 0;
3569 verifyFormat("SomeClass::Constructor() :\n"
3570 " a(a) {}",
3571 Style);
3572 verifyFormat("SomeClass::Constructor() noexcept :\n"
3573 " a(a) {}",
3574 Style);
3575 verifyFormat("SomeClass::Constructor() :\n"
3576 " a(a), b(b), c(c) {}",
3577 Style);
3578 verifyFormat("SomeClass::Constructor() :\n"
3579 " a(a) {\n"
3580 " foo();\n"
3581 " bar();\n"
3582 "}",
3583 Style);
3584
3585 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3586 verifyFormat("SomeClass::Constructor() :\n"
3587 " a(a), b(b), c(c) {\n"
3588 "}",
3589 Style);
3590 verifyFormat("SomeClass::Constructor() :\n"
3591 " a(a) {\n"
3592 "}",
3593 Style);
3594
3595 Style.ColumnLimit = 80;
3596 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3597 Style.ConstructorInitializerIndentWidth = 2;
3598 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3599 Style);
3600 verifyFormat("SomeClass::Constructor() :\n"
3601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3602 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3603 Style);
3604}
3605
David Blaikieea95dd72017-08-31 18:49:34 +00003606#ifndef EXPENSIVE_CHECKS
3607// Expensive checks enables libstdc++ checking which includes validating the
3608// state of ranges used in std::priority_queue - this blows out the
3609// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003610TEST_F(FormatTest, MemoizationTests) {
3611 // This breaks if the memoization lookup does not take \c Indent and
3612 // \c LastSpace into account.
3613 verifyFormat(
3614 "extern CFRunLoopTimerRef\n"
3615 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3616 " CFTimeInterval interval, CFOptionFlags flags,\n"
3617 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003618 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003619
3620 // Deep nesting somewhat works around our memoization.
3621 verifyFormat(
3622 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3623 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3624 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3625 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3626 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3627 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003628 verifyFormat(
3629 "aaaaa(\n"
3630 " aaaaa,\n"
3631 " aaaaa(\n"
3632 " aaaaa,\n"
3633 " aaaaa(\n"
3634 " aaaaa,\n"
3635 " aaaaa(\n"
3636 " aaaaa,\n"
3637 " aaaaa(\n"
3638 " aaaaa,\n"
3639 " aaaaa(\n"
3640 " aaaaa,\n"
3641 " aaaaa(\n"
3642 " aaaaa,\n"
3643 " aaaaa(\n"
3644 " aaaaa,\n"
3645 " aaaaa(\n"
3646 " aaaaa,\n"
3647 " aaaaa(\n"
3648 " aaaaa,\n"
3649 " aaaaa(\n"
3650 " aaaaa,\n"
3651 " aaaaa(\n"
3652 " aaaaa,\n"
3653 " aaaaa))))))))))));",
3654 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003655 verifyFormat(
3656 "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"
3657 " a),\n"
3658 " a),\n"
3659 " a),\n"
3660 " a),\n"
3661 " a),\n"
3662 " a),\n"
3663 " a),\n"
3664 " a),\n"
3665 " a),\n"
3666 " a),\n"
3667 " a),\n"
3668 " a),\n"
3669 " a),\n"
3670 " a),\n"
3671 " a),\n"
3672 " a),\n"
3673 " a)",
3674 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003675
3676 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003677 FormatStyle OnePerLine = getLLVMStyle();
3678 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003679 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003680 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003681 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003682 for (unsigned i = 0, e = 80; i != e; ++i) {
3683 input += " a,\n";
3684 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003685 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003686 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003687}
David Blaikieea95dd72017-08-31 18:49:34 +00003688#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003689
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003690TEST_F(FormatTest, BreaksAsHighAsPossible) {
3691 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003692 "void f() {\n"
3693 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3694 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3695 " f();\n"
3696 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003697 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003698 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003699}
3700
Daniel Jasper6728fc12013-04-11 14:29:13 +00003701TEST_F(FormatTest, BreaksFunctionDeclarations) {
3702 // Principially, we break function declarations in a certain order:
3703 // 1) break amongst arguments.
3704 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3705 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003706 verifyFormat("template <class TemplateIt>\n"
3707 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3708 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003709
3710 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003711 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003712 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003713 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003714 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003715
3716 // 3) break after (.
3717 verifyFormat(
3718 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003719 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3720 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003721
3722 // 4) break before after nested name specifiers.
3723 verifyFormat(
3724 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003725 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3726 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003727 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003728
3729 // However, there are exceptions, if a sufficient amount of lines can be
3730 // saved.
3731 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3732 // more adjusting.
3733 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3734 " Cccccccccccccc cccccccccc,\n"
3735 " Cccccccccccccc cccccccccc,\n"
3736 " Cccccccccccccc cccccccccc,\n"
3737 " Cccccccccccccc cccccccccc);");
3738 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003739 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003740 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3741 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3742 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003743 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003744 verifyFormat(
3745 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3746 " Cccccccccccccc cccccccccc,\n"
3747 " Cccccccccccccc cccccccccc,\n"
3748 " Cccccccccccccc cccccccccc,\n"
3749 " Cccccccccccccc cccccccccc,\n"
3750 " Cccccccccccccc cccccccccc,\n"
3751 " Cccccccccccccc cccccccccc);");
3752 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3753 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3754 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3755 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3756 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003757
3758 // Break after multi-line parameters.
3759 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3762 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003763 verifyFormat("void SomeLoooooooooooongFunction(\n"
3764 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3765 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3766 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003767
3768 // Treat overloaded operators like other functions.
3769 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3770 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003771 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3772 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003773 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3774 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3775 verifyGoogleFormat(
3776 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3777 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003778 verifyGoogleFormat(
3779 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3780 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003781 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3782 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3783 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3784 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003785 verifyGoogleFormat(
3786 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3787 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3788 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003789 verifyGoogleFormat(
3790 "template <typename T>\n"
3791 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3792 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3793 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003794
3795 FormatStyle Style = getLLVMStyle();
3796 Style.PointerAlignment = FormatStyle::PAS_Left;
3797 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3798 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3799 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003800 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3802 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003803}
3804
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003805TEST_F(FormatTest, TrailingReturnType) {
3806 verifyFormat("auto foo() -> int;\n");
3807 verifyFormat("struct S {\n"
3808 " auto bar() const -> int;\n"
3809 "};");
3810 verifyFormat("template <size_t Order, typename T>\n"
3811 "auto load_img(const std::string &filename)\n"
3812 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003813 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3814 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003815 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003816 verifyFormat("template <typename T>\n"
3817 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3818 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003819
3820 // Not trailing return types.
3821 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003822}
3823
Daniel Jasper5be31f72013-05-21 09:16:31 +00003824TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003825 // Avoid breaking before trailing 'const' or other trailing annotations, if
3826 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003827 FormatStyle Style = getGoogleStyle();
3828 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003829 verifyFormat("void someLongFunction(\n"
3830 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003831 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003832 verifyFormat("LoooooongReturnType\n"
3833 "someLoooooooongFunction() const {}",
3834 getLLVMStyleWithColumns(47));
3835 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3836 " const {}",
3837 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003838 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3839 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3840 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3841 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3842 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3843 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003844 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3845 " aaaaaaaaaaa aaaaa) const override;");
3846 verifyGoogleFormat(
3847 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3848 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003849
Daniel Jasper5550de62014-02-17 07:57:46 +00003850 // Even if the first parameter has to be wrapped.
3851 verifyFormat("void someLongFunction(\n"
3852 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003853 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003854 verifyFormat("void someLongFunction(\n"
3855 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003856 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003857 verifyFormat("void someLongFunction(\n"
3858 " int someLongParameter) override {}",
3859 Style);
3860 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003861 " int someLongParameter) OVERRIDE {}",
3862 Style);
3863 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003864 " int someLongParameter) final {}",
3865 Style);
3866 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003867 " int someLongParameter) FINAL {}",
3868 Style);
3869 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003870 " int parameter) const override {}",
3871 Style);
3872
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003873 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3874 verifyFormat("void someLongFunction(\n"
3875 " int someLongParameter) const\n"
3876 "{\n"
3877 "}",
3878 Style);
3879
Daniel Jasper5550de62014-02-17 07:57:46 +00003880 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003881 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3882 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3883 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003884
3885 // Breaking before function-like trailing annotations is fine to keep them
3886 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003887 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3888 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3889 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3890 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3891 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3892 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003893 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3894 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003895 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003896
3897 verifyFormat(
3898 "void aaaaaaaaaaaaaaaaaa()\n"
3899 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3900 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3901 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3902 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003903 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003904 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003905 " GUARDED_BY(aaaaaaaaaaaa);");
3906 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003907 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003908 " GUARDED_BY(aaaaaaaaaaaa);");
3909 verifyGoogleFormat(
3910 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3911 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003912 verifyGoogleFormat(
3913 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3914 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003915}
3916
Daniel Jasperf090f032015-05-18 09:47:22 +00003917TEST_F(FormatTest, FunctionAnnotations) {
3918 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003919 "int OldFunction(const string &parameter) {}");
3920 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003921 "string OldFunction(const string &parameter) {}");
3922 verifyFormat("template <typename T>\n"
3923 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3924 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003925
3926 // Not function annotations.
3927 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3928 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003929 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3930 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003931 verifyFormat("MACRO(abc).function() // wrap\n"
3932 " << abc;");
3933 verifyFormat("MACRO(abc)->function() // wrap\n"
3934 " << abc;");
3935 verifyFormat("MACRO(abc)::function() // wrap\n"
3936 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003937}
3938
Daniel Jasperf7935112012-12-03 18:12:45 +00003939TEST_F(FormatTest, BreaksDesireably) {
3940 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3941 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003942 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003943 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3945 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003946
3947 verifyFormat(
3948 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003950
3951 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3953 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003954
3955 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003956 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3957 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003959 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3960 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003961
3962 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3963 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3964
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003965 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003966 "void f() {\n"
3967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3969 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003970 verifyFormat(
3971 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3973 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003974 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3976 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003977 "aaaaaa(aaa,\n"
3978 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3980 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003981 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003984
Daniel Jasper739b85f2015-06-29 10:42:59 +00003985 // Indent consistently independent of call expression and unary operator.
3986 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3987 " dddddddddddddddddddddddddddddd));");
3988 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3989 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003990 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003991 " dddddddddddddddddddddddddddddd));");
3992
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003993 // This test case breaks on an incorrect memoization, i.e. an optimization not
3994 // taking into account the StopAt value.
3995 verifyFormat(
3996 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003997 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3998 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3999 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004000
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004001 verifyFormat("{\n {\n {\n"
4002 " Annotation.SpaceRequiredBefore =\n"
4003 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4004 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4005 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004006
4007 // Break on an outer level if there was a break on an inner level.
4008 EXPECT_EQ("f(g(h(a, // comment\n"
4009 " b, c),\n"
4010 " d, e),\n"
4011 " x, y);",
4012 format("f(g(h(a, // comment\n"
4013 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004014
4015 // Prefer breaking similar line breaks.
4016 verifyFormat(
4017 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4018 " NSTrackingMouseEnteredAndExited |\n"
4019 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004020}
4021
Daniel Jasper18210d72014-10-09 09:52:05 +00004022TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4023 FormatStyle NoBinPacking = getGoogleStyle();
4024 NoBinPacking.BinPackParameters = false;
4025 NoBinPacking.BinPackArguments = true;
4026 verifyFormat("void f() {\n"
4027 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4029 "}",
4030 NoBinPacking);
4031 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4032 " int aaaaaaaaaaaaaaaaaaaa,\n"
4033 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4034 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004035
Daniel Jasper00693b082016-01-09 15:56:47 +00004036 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4037 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4038 " vector<int> bbbbbbbbbbbbbbb);",
4039 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004040 // FIXME: This behavior difference is probably not wanted. However, currently
4041 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4042 // template arguments from BreakBeforeParameter being set because of the
4043 // one-per-line formatting.
4044 verifyFormat(
4045 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4046 " aaaaaaaaaa> aaaaaaaaaa);",
4047 NoBinPacking);
4048 verifyFormat(
4049 "void fffffffffff(\n"
4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4051 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004052}
4053
Daniel Jasper9278eb92013-01-16 14:59:02 +00004054TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004055 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004056 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004057 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004058 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4059 " aaaaaaaaaaaaaaaaaaaa,\n"
4060 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4061 NoBinPacking);
4062 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4063 " aaaaaaaaaaaaa,\n"
4064 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4065 NoBinPacking);
4066 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004067 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4068 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4070 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4072 NoBinPacking);
4073 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4074 " .aaaaaaaaaaaaaaaaaa();",
4075 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004076 verifyFormat("void f() {\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4078 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4079 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004080 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004081
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004082 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004083 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4084 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004085 " aaaaaaaaaaaa);",
4086 NoBinPacking);
4087 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004088 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4089 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004090 " test);",
4091 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004092
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004093 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4094 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004095 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4096 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004097 NoBinPacking);
4098 verifyFormat("a(\"a\"\n"
4099 " \"a\",\n"
4100 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004101
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004102 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004103 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004104 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004106 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004107 verifyFormat(
4108 "void f() {\n"
4109 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4110 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004111 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004112 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004113 verifyFormat(
4114 "template <class SomeType, class SomeOtherType>\n"
4115 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4116 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004117}
4118
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004119TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4120 FormatStyle Style = getLLVMStyleWithColumns(15);
4121 Style.ExperimentalAutoDetectBinPacking = true;
4122 EXPECT_EQ("aaa(aaaa,\n"
4123 " aaaa,\n"
4124 " aaaa);\n"
4125 "aaa(aaaa,\n"
4126 " aaaa,\n"
4127 " aaaa);",
4128 format("aaa(aaaa,\n" // one-per-line
4129 " aaaa,\n"
4130 " aaaa );\n"
4131 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4132 Style));
4133 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4134 " aaaa);\n"
4135 "aaa(aaaa, aaaa,\n"
4136 " aaaa);",
4137 format("aaa(aaaa, aaaa,\n" // bin-packed
4138 " aaaa );\n"
4139 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4140 Style));
4141}
4142
Daniel Jasper04468962013-01-18 10:56:38 +00004143TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004144 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4145 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4146 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4147 " .StartsWith(\".init\", ORDER_INIT)\n"
4148 " .StartsWith(\".fini\", ORDER_FINI)\n"
4149 " .StartsWith(\".hash\", ORDER_HASH)\n"
4150 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004151
Daniel Jaspereb50c672013-02-15 20:33:06 +00004152 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004153 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004154 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004155 "aaaaaaa->aaaaaaa\n"
4156 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004158 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004159 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004160 "aaaaaaa->aaaaaaa\n"
4161 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4162 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4163 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004164 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004165 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004166 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004167 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4168 " aaaaaa->aaaaaaaaaaaa()\n"
4169 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004171 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004172 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004173 "void f() {\n"
4174 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004175 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004176 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004177 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004178 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004179 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004180 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004181 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004182 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004183 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004184 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004185 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004186
4187 verifyFormat(
4188 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4189 verifyFormat("aaaaaaaaaaaaaaa()\n"
4190 " .aaaaaaaaaaaaaaa()\n"
4191 " .aaaaaaaaaaaaaaa()\n"
4192 " .aaaaaaaaaaaaaaa()\n"
4193 " .aaaaaaaaaaaaaaa();");
4194 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4195 " .aaaaaaaaaaaaaaa()\n"
4196 " .aaaaaaaaaaaaaaa()\n"
4197 " .aaaaaaaaaaaaaaa();");
4198 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4199 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4200 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004201 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4202 " ->aaaaaaaaaaaaaae(0)\n"
4203 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004204
Daniel Jasper775954b2015-04-24 10:08:09 +00004205 // Don't linewrap after very short segments.
4206 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4207 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4208 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4209 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4210 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4211 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4212 verifyFormat("aaa()\n"
4213 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4214 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4215 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4216
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004217 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4218 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4219 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4220 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4221 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004223
Daniel Jaspera41aa532014-09-19 08:01:25 +00004224 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004225 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4226 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004227
4228 // Prefer not to create "hanging" indents.
4229 verifyFormat(
4230 "return !soooooooooooooome_map\n"
4231 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4232 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004233 verifyFormat(
4234 "return aaaaaaaaaaaaaaaa\n"
4235 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4236 " .aaaa(aaaaaaaaaaaaaa);");
4237 // No hanging indent here.
4238 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4240 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004242 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4243 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4244 getLLVMStyleWithColumns(60));
4245 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4246 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4247 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4248 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004249 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4251 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004252}
4253
Daniel Jasperde5c2072012-12-24 00:13:23 +00004254TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4255 verifyFormat(
4256 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004257 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004258 verifyFormat(
4259 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4260 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4261
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004262 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004263 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004264 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4265 " ccccccccccccccccccccccccc) {\n}");
4266
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004267 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004268 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004269 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4270 " ccccccccccccccccccccccccc) {\n}");
4271
Daniel Jasperde5c2072012-12-24 00:13:23 +00004272 verifyFormat(
4273 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004274 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004275 verifyFormat(
4276 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4277 " ccccccccccccccccccccccccc) {\n}");
4278
Daniel Jasper400adc62013-02-08 15:28:42 +00004279 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4280 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4281 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4282 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004283 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4284 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4285 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4286 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4287
Daniel Jasper400adc62013-02-08 15:28:42 +00004288 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4289 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4290 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004291 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4292 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4293 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004294}
4295
Daniel Jasper43b65482013-01-23 12:27:43 +00004296TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004297 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004298 "unsigned Cost =\n"
4299 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4300 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004301 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004302 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4303 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004304
4305 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004306 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4307 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004308 verifyFormat("unsigned OriginalStartColumn =\n"
4309 " SourceMgr.getSpellingColumnNumber(\n"
4310 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4311 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004312}
4313
Francois Ferrand9976efa2017-05-22 08:28:17 +00004314TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4315 FormatStyle Style = getLLVMStyle();
4316 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4317 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4318 Style);
4319
4320 Style.PenaltyBreakAssignment = 20;
4321 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4322 " cccccccccccccccccccccccccc;",
4323 Style);
4324}
4325
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004326TEST_F(FormatTest, AlignsAfterAssignments) {
4327 verifyFormat(
4328 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004329 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004330 verifyFormat(
4331 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004332 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004333 verifyFormat(
4334 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004335 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004336 verifyFormat(
4337 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004338 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004339 verifyFormat(
4340 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4341 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004343}
4344
4345TEST_F(FormatTest, AlignsAfterReturn) {
4346 verifyFormat(
4347 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4348 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4349 verifyFormat(
4350 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4351 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004352 verifyFormat(
4353 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004354 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004355 verifyFormat(
4356 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004357 " aaaaaaaaaaaaaaaaaaaaaa());");
4358 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4360 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004363 verifyFormat("return\n"
4364 " // true if code is one of a or b.\n"
4365 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004366}
4367
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004368TEST_F(FormatTest, AlignsAfterOpenBracket) {
4369 verifyFormat(
4370 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4371 " aaaaaaaaa aaaaaaa) {}");
4372 verifyFormat(
4373 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4374 " aaaaaaaaaaa aaaaaaaaa);");
4375 verifyFormat(
4376 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4377 " aaaaaaaaaaaaaaaaaaaaa));");
4378 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004379 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004380 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4381 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4382 Style);
4383 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4384 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4385 Style);
4386 verifyFormat("SomeLongVariableName->someFunction(\n"
4387 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4388 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004389 verifyFormat(
4390 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4391 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4392 Style);
4393 verifyFormat(
4394 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4395 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4396 Style);
4397 verifyFormat(
4398 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4399 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4400 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004401
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004402 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4403 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4404 " b));",
4405 Style);
4406
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004407 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4408 Style.BinPackArguments = false;
4409 Style.BinPackParameters = false;
4410 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4411 " aaaaaaaaaaa aaaaaaaa,\n"
4412 " aaaaaaaaa aaaaaaa,\n"
4413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4414 Style);
4415 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4416 " aaaaaaaaaaa aaaaaaaaa,\n"
4417 " aaaaaaaaaaa aaaaaaaaa,\n"
4418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4419 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004420 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4421 " aaaaaaaaaaaaaaa,\n"
4422 " aaaaaaaaaaaaaaaaaaaaa,\n"
4423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004424 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004425 verifyFormat(
4426 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4427 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4428 Style);
4429 verifyFormat(
4430 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4431 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4432 Style);
4433 verifyFormat(
4434 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4435 " aaaaaaaaaaaaaaaaaaaaa(\n"
4436 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4437 " aaaaaaaaaaaaaaaa);",
4438 Style);
4439 verifyFormat(
4440 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4441 " aaaaaaaaaaaaaaaaaaaaa(\n"
4442 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4443 " aaaaaaaaaaaaaaaa);",
4444 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004445}
4446
Daniel Jasper3219e432014-12-02 13:24:51 +00004447TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4448 FormatStyle Style = getLLVMStyleWithColumns(40);
4449 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4450 " bbbbbbbbbbbbbbbbbbbbbb);",
4451 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004452 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004453 Style.AlignOperands = false;
4454 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4455 " bbbbbbbbbbbbbbbbbbbbbb);",
4456 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004457 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004458 Style.AlignOperands = true;
4459 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4460 " bbbbbbbbbbbbbbbbbbbbbb);",
4461 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004462 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004463 Style.AlignOperands = false;
4464 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4465 " bbbbbbbbbbbbbbbbbbbbbb);",
4466 Style);
4467}
4468
Daniel Jasper399d24b2013-01-09 07:06:56 +00004469TEST_F(FormatTest, BreaksConditionalExpressions) {
4470 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004471 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4472 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4473 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4474 verifyFormat(
4475 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004476 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4477 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004478 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004479 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4480 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4481 verifyFormat(
4482 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004483 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4484 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004485 verifyFormat(
4486 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4487 " : aaaaaaaaaaaaa);");
4488 verifyFormat(
4489 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004490 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004491 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4492 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004493 verifyFormat(
4494 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4495 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4496 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004497 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4498 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4500 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4501 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4502 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4504 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4506 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4507 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4508 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004509 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4511 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4513 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004514 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4515 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4516 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004517 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4519 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4520 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004521 verifyFormat(
4522 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4523 " ? aaaaaaaaaaaaaaa\n"
4524 " : aaaaaaaaaaaaaaa;");
4525 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004526 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004527 " ? b\n"
4528 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004529 verifyFormat("return aaaa == bbbb\n"
4530 " // comment\n"
4531 " ? aaaa\n"
4532 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004533 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004534 " format(TheLine.First,\n"
4535 " IndentForLevel[TheLine.Level] >= 0\n"
4536 " ? IndentForLevel[TheLine.Level]\n"
4537 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004538 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004539 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004540 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4541 " ? aaaaaaaaaaaaaaa\n"
4542 " : bbbbbbbbbbbbbbb //\n"
4543 " ? ccccccccccccccc\n"
4544 " : ddddddddddddddd;");
4545 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4546 " ? aaaaaaaaaaaaaaa\n"
4547 " : (bbbbbbbbbbbbbbb //\n"
4548 " ? ccccccccccccccc\n"
4549 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004550 verifyFormat(
4551 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4552 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4553 " aaaaaaaaaaaaaaaaaaaaa +\n"
4554 " aaaaaaaaaaaaaaaaaaaaa\n"
4555 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004556 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004557 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4558 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4559 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004560
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004561 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004562 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004563 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004564 "void f() {\n"
4565 " g(aaa,\n"
4566 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4568 " ? aaaaaaaaaaaaaaa\n"
4569 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004570 "}",
4571 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004572 verifyFormat(
4573 "void f() {\n"
4574 " g(aaa,\n"
4575 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4577 " ?: aaaaaaaaaaaaaaa);\n"
4578 "}",
4579 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004580
4581 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4582 " // comment.\n"
4583 " ccccccccccccccccccccccccccccccccccccccc\n"
4584 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4585 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004586
4587 // Assignments in conditional expressions. Apparently not uncommon :-(.
4588 verifyFormat("return a != b\n"
4589 " // comment\n"
4590 " ? a = b\n"
4591 " : a = b;");
4592 verifyFormat("return a != b\n"
4593 " // comment\n"
4594 " ? a = a != b\n"
4595 " // comment\n"
4596 " ? a = b\n"
4597 " : a\n"
4598 " : a;\n");
4599 verifyFormat("return a != b\n"
4600 " // comment\n"
4601 " ? a\n"
4602 " : a = a != b\n"
4603 " // comment\n"
4604 " ? a = b\n"
4605 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004606}
4607
Daniel Jasper165b29e2013-11-08 00:57:11 +00004608TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4609 FormatStyle Style = getLLVMStyle();
4610 Style.BreakBeforeTernaryOperators = false;
4611 Style.ColumnLimit = 70;
4612 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004613 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4616 Style);
4617 verifyFormat(
4618 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004619 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004621 Style);
4622 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004623 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4625 Style);
4626 verifyFormat(
4627 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004628 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004630 Style);
4631 verifyFormat(
4632 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4633 " aaaaaaaaaaaaa);",
4634 Style);
4635 verifyFormat(
4636 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4637 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4639 " aaaaaaaaaaaaa);",
4640 Style);
4641 verifyFormat(
4642 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4643 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4644 " aaaaaaaaaaaaa);",
4645 Style);
4646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4648 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4651 Style);
4652 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4656 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4657 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4658 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4659 Style);
4660 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4664 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4665 Style);
4666 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4667 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4668 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4669 Style);
4670 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4674 Style);
4675 verifyFormat(
4676 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4677 " aaaaaaaaaaaaaaa :\n"
4678 " aaaaaaaaaaaaaaa;",
4679 Style);
4680 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4681 " aaaaaaaaa ?\n"
4682 " b :\n"
4683 " c);",
4684 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004685 verifyFormat("unsigned Indent =\n"
4686 " format(TheLine.First,\n"
4687 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4688 " IndentForLevel[TheLine.Level] :\n"
4689 " TheLine * 2,\n"
4690 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4691 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004692 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4693 " aaaaaaaaaaaaaaa :\n"
4694 " bbbbbbbbbbbbbbb ? //\n"
4695 " ccccccccccccccc :\n"
4696 " ddddddddddddddd;",
4697 Style);
4698 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4699 " aaaaaaaaaaaaaaa :\n"
4700 " (bbbbbbbbbbbbbbb ? //\n"
4701 " ccccccccccccccc :\n"
4702 " ddddddddddddddd);",
4703 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004704 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4705 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4706 " ccccccccccccccccccccccccccc;",
4707 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004708 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4709 " aaaaa :\n"
4710 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4711 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004712}
4713
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004714TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4715 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4716 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4717 verifyFormat("bool a = true, b = false;");
4718
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004719 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004721 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004722 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004723 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004724 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004725 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004726 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004727 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4728 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4729 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4730 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4731 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4732 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004733
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004734 FormatStyle Style = getGoogleStyle();
4735 Style.PointerAlignment = FormatStyle::PAS_Left;
4736 Style.DerivePointerAlignment = false;
4737 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4738 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4739 " *b = bbbbbbbbbbbbbbbbbbb;",
4740 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004741 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4742 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4743 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004744 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004745 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004746}
4747
Nico Weber4a5030c2013-01-12 01:28:06 +00004748TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4749 verifyFormat("arr[foo ? bar : baz];");
4750 verifyFormat("f()[foo ? bar : baz];");
4751 verifyFormat("(a + b)[foo ? bar : baz];");
4752 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4753}
4754
Daniel Jasperf7935112012-12-03 18:12:45 +00004755TEST_F(FormatTest, AlignsStringLiterals) {
4756 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4757 " \"short literal\");");
4758 verifyFormat(
4759 "looooooooooooooooooooooooongFunction(\n"
4760 " \"short literal\"\n"
4761 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004762 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4763 " \" string literals\",\n"
4764 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004765 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4766 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004767 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004768 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004769 getLLVMStyleWithColumns(28)));
4770 EXPECT_EQ(
4771 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4772 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4773 " \"aaaaaaaaaaaaaaaa\";",
4774 format("aaaaaa ="
4775 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4776 "aaaaaaaaaaaaaaaaaaaaa\" "
4777 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004778 verifyFormat("a = a + \"a\"\n"
4779 " \"a\"\n"
4780 " \"a\";");
4781 verifyFormat("f(\"a\", \"b\"\n"
4782 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004783
4784 verifyFormat(
4785 "#define LL_FORMAT \"ll\"\n"
4786 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4787 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004788
4789 verifyFormat("#define A(X) \\\n"
4790 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4791 " \"ccccc\"",
4792 getLLVMStyleWithColumns(23));
4793 verifyFormat("#define A \"def\"\n"
4794 "f(\"abc\" A \"ghi\"\n"
4795 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004796
4797 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004798 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004799 verifyFormat("#define A(X) \\\n"
4800 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4801 " L\"ccccc\"",
4802 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004803
4804 verifyFormat("f(@\"a\"\n"
4805 " @\"b\");");
4806 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004807 " @\"b\"\n"
4808 " @\"c\";");
4809 verifyFormat("NSString s = @\"a\"\n"
4810 " \"b\"\n"
4811 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004812}
4813
Zachary Turner448592e2015-12-18 22:20:15 +00004814TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004815 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004816 // No declarations or definitions should be moved to own line.
4817 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4818 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004819 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004820 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004821 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004822 "int f() { return 1; }\n"
4823 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004824 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004825
4826 // All declarations and definitions should have the return type moved to its
4827 // own
4828 // line.
4829 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4830 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004831 " int\n"
4832 " f() {\n"
4833 " return 1;\n"
4834 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004835 " int\n"
4836 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004837 "};\n"
4838 "int\n"
4839 "f() {\n"
4840 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004841 "}\n"
4842 "int\n"
4843 "g();\n",
4844 Style);
4845
4846 // Top-level definitions, and no kinds of declarations should have the
4847 // return type moved to its own line.
4848 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4849 verifyFormat("class B {\n"
4850 " int f() { return 1; }\n"
4851 " int g();\n"
4852 "};\n"
4853 "int\n"
4854 "f() {\n"
4855 " return 1;\n"
4856 "}\n"
4857 "int g();\n",
4858 Style);
4859
4860 // Top-level definitions and declarations should have the return type moved
4861 // to its own line.
4862 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4863 verifyFormat("class C {\n"
4864 " int f() { return 1; }\n"
4865 " int g();\n"
4866 "};\n"
4867 "int\n"
4868 "f() {\n"
4869 " return 1;\n"
4870 "}\n"
4871 "int\n"
4872 "g();\n",
4873 Style);
4874
4875 // All definitions should have the return type moved to its own line, but no
4876 // kinds of declarations.
4877 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4878 verifyFormat("class D {\n"
4879 " int\n"
4880 " f() {\n"
4881 " return 1;\n"
4882 " }\n"
4883 " int g();\n"
4884 "};\n"
4885 "int\n"
4886 "f() {\n"
4887 " return 1;\n"
4888 "}\n"
4889 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004890 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004891 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004892 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004893 " return \"\";\n"
4894 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004895 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004896 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004897 verifyFormat("template <class T>\n"
4898 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004899 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004900 " return NULL;\n"
4901 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004902 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004903 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004904 verifyFormat("class C {\n"
4905 " int\n"
4906 " operator+() {\n"
4907 " return 1;\n"
4908 " }\n"
4909 " int\n"
4910 " operator()() {\n"
4911 " return 1;\n"
4912 " }\n"
4913 "};\n",
4914 Style);
4915 verifyFormat("void\n"
4916 "A::operator()() {}\n"
4917 "void\n"
4918 "A::operator>>() {}\n"
4919 "void\n"
4920 "A::operator+() {}\n",
4921 Style);
4922 verifyFormat("void *operator new(std::size_t s);", // No break here.
4923 Style);
4924 verifyFormat("void *\n"
4925 "operator new(std::size_t s) {}",
4926 Style);
4927 verifyFormat("void *\n"
4928 "operator delete[](void *ptr) {}",
4929 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004930 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004931 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004932 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004933 "{\n"
4934 " return \"\";\n"
4935 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004936 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004937 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004938 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004939 "T *\n" // Problem here: no line break
4940 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004941 "{\n"
4942 " return NULL;\n"
4943 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004944 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004945 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004946}
4947
Alexander Kornienko58611712013-07-04 12:02:44 +00004948TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4949 FormatStyle NoBreak = getLLVMStyle();
4950 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4951 FormatStyle Break = getLLVMStyle();
4952 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004953 verifyFormat("aaaa = \"bbbb\"\n"
4954 " \"cccc\";",
4955 NoBreak);
4956 verifyFormat("aaaa =\n"
4957 " \"bbbb\"\n"
4958 " \"cccc\";",
4959 Break);
4960 verifyFormat("aaaa(\"bbbb\"\n"
4961 " \"cccc\");",
4962 NoBreak);
4963 verifyFormat("aaaa(\n"
4964 " \"bbbb\"\n"
4965 " \"cccc\");",
4966 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004967 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4968 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004969 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004970 verifyFormat("aaaa(qqq,\n"
4971 " \"bbbb\"\n"
4972 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004973 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004974 verifyFormat("aaaa(qqq,\n"
4975 " L\"bbbb\"\n"
4976 " L\"cccc\");",
4977 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004978 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4979 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004980 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004981 verifyFormat("string s = someFunction(\n"
4982 " \"abc\"\n"
4983 " \"abc\");",
4984 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004985
Daniel Jasper3251fff2014-06-10 06:27:23 +00004986 // As we break before unary operators, breaking right after them is bad.
4987 verifyFormat("string foo = abc ? \"x\"\n"
4988 " \"blah blah blah blah blah blah\"\n"
4989 " : \"y\";",
4990 Break);
4991
Daniel Jasperc834c702013-07-17 15:38:19 +00004992 // Don't break if there is no column gain.
4993 verifyFormat("f(\"aaaa\"\n"
4994 " \"bbbb\");",
4995 Break);
4996
4997 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004998 EXPECT_EQ("x = \"a\\\n"
4999 "b\\\n"
5000 "c\";",
5001 format("x = \"a\\\n"
5002 "b\\\n"
5003 "c\";",
5004 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005005 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005006 " \"a\\\n"
5007 "b\\\n"
5008 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005009 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005010 "b\\\n"
5011 "c\";",
5012 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005013
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005014 EXPECT_EQ("NSString *const kString =\n"
5015 " @\"aaaa\"\n"
5016 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005017 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005018 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005019 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005020
5021 Break.ColumnLimit = 0;
5022 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005023}
5024
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005025TEST_F(FormatTest, AlignsPipes) {
5026 verifyFormat(
5027 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5028 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5029 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5030 verifyFormat(
5031 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5032 " << aaaaaaaaaaaaaaaaaaaa;");
5033 verifyFormat(
5034 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5035 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5036 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005037 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5038 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5039 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005040 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5041 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5042 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5043 verifyFormat(
5044 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5045 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5046 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005047 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5050 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005051 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5052 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005053 verifyFormat(
5054 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005056 verifyFormat(
5057 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5058 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005059
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005060 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5061 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005062 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5064 " aaaaaaaaaaaaaaaaaaaaa)\n"
5065 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005066 verifyFormat("LOG_IF(aaa == //\n"
5067 " bbb)\n"
5068 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005069
Daniel Jasper467ddb12013-08-12 12:58:05 +00005070 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005071 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5072 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005073 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5074 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5075 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005076 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5077 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005078 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5079 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5081 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5082 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5084 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005085
Daniel Jasperc238c872013-04-02 14:33:13 +00005086 verifyFormat(
5087 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5088 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005089
5090 // Incomplete string literal.
5091 EXPECT_EQ("llvm::errs() << \"\n"
5092 " << a;",
5093 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005094
5095 verifyFormat("void f() {\n"
5096 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5097 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5098 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005099
5100 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005101 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5102 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5103 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005104
5105 // Handle '\n'.
5106 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5107 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5108 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5109 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5110 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5111 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5112 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005113}
5114
Daniel Jasper7209bb92016-12-13 11:16:42 +00005115TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5116 verifyFormat("return out << \"somepacket = {\\n\"\n"
5117 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5118 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5119 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5120 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5121 " << \"}\";");
5122
5123 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5124 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5125 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5126 verifyFormat(
5127 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5128 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5129 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5130 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5131 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5132 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5133 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5134 verifyFormat(
5135 "void f() {\n"
5136 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5137 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5138 "}");
5139
5140 // Breaking before the first "<<" is generally not desirable.
5141 verifyFormat(
5142 "llvm::errs()\n"
5143 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5144 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5145 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5146 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5147 getLLVMStyleWithColumns(70));
5148 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5149 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5150 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5151 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5152 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5153 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5154 getLLVMStyleWithColumns(70));
5155
5156 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5157 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5158 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5159 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5160 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5161 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005162 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5163 " (aaaa + aaaa);",
5164 getLLVMStyleWithColumns(40));
5165 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5166 " (aaaaaaa + aaaaa));",
5167 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005168 verifyFormat(
5169 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5170 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5171 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005172}
5173
Daniel Jasperf7935112012-12-03 18:12:45 +00005174TEST_F(FormatTest, UnderstandsEquals) {
5175 verifyFormat(
5176 "aaaaaaaaaaaaaaaaa =\n"
5177 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5178 verifyFormat(
5179 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005181 verifyFormat(
5182 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005183 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005184 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005185 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5186 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005187
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005188 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5189 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005190}
5191
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005192TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005193 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5194 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005195
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005196 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5197 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005198
5199 verifyFormat(
5200 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5201 " Parameter2);");
5202
5203 verifyFormat(
5204 "ShortObject->shortFunction(\n"
5205 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5206 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5207
5208 verifyFormat("loooooooooooooongFunction(\n"
5209 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5210
5211 verifyFormat(
5212 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5213 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5214
Daniel Jasper687af3b2013-02-14 14:26:07 +00005215 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5216 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005217 verifyFormat("void f() {\n"
5218 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5219 " .Times(2)\n"
5220 " .WillRepeatedly(Return(SomeValue));\n"
5221 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005222 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5223 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005224 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5226 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005227 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005228 verifyFormat("void f() {\n"
5229 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5230 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5231 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005232 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5234 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5235 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5236 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005237 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5238 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5239 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5240 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5241 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005242
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005243 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005244 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005245 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005246 verifyFormat(
5247 "aaaaaaaaaaa->aaaaaaaaa(\n"
5248 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5249 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005250
5251 verifyFormat(
5252 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005254 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5255 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5256 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5257 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005258
Daniel Jasper9b334242013-03-15 14:57:30 +00005259 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5261 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005262
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005263 FormatStyle NoBinPacking = getLLVMStyle();
5264 NoBinPacking.BinPackParameters = false;
5265 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5266 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5267 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5268 " aaaaaaaaaaaaaaaaaaa,\n"
5269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5270 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005271
5272 // If there is a subsequent call, change to hanging indentation.
5273 verifyFormat(
5274 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5275 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5276 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5277 verifyFormat(
5278 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5279 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005280 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5282 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5283 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5285 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005286}
5287
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005288TEST_F(FormatTest, WrapsTemplateDeclarations) {
5289 verifyFormat("template <typename T>\n"
5290 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005291 verifyFormat("template <typename T>\n"
5292 "// T should be one of {A, B}.\n"
5293 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005294 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005295 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005296 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005297 verifyFormat("template <typename T>\n"
5298 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5299 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005300 verifyFormat(
5301 "template <typename T>\n"
5302 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5303 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005304 verifyFormat(
5305 "template <typename T>\n"
5306 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5307 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005309 verifyFormat("template <typename T>\n"
5310 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005311 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005312 verifyFormat(
5313 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5314 " typename T4 = char>\n"
5315 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005316 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5317 " template <typename> class cccccccccccccccccccccc,\n"
5318 " typename ddddddddddddd>\n"
5319 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005320 verifyFormat(
5321 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005323
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005324 verifyFormat("void f() {\n"
5325 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5326 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5327 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005328
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005329 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005330 verifyFormat("template <typename T> void f();");
5331 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005332 verifyFormat(
5333 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5336 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5339 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5340 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005341 EXPECT_EQ("static_cast<A< //\n"
5342 " B> *>(\n"
5343 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005344 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005345 format("static_cast<A<//\n"
5346 " B>*>(\n"
5347 "\n"
5348 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005349 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5350 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005351
5352 FormatStyle AlwaysBreak = getLLVMStyle();
5353 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5354 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5355 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5356 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5357 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5358 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5359 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5360 verifyFormat("template <template <typename> class Fooooooo,\n"
5361 " template <typename> class Baaaaaaar>\n"
5362 "struct C {};",
5363 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005364 verifyFormat("template <typename T> // T can be A, B or C.\n"
5365 "struct C {};",
5366 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005367 verifyFormat("template <enum E> class A {\n"
5368 "public:\n"
5369 " E *f();\n"
5370 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005371}
5372
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005373TEST_F(FormatTest, WrapsTemplateParameters) {
5374 FormatStyle Style = getLLVMStyle();
5375 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5376 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5377 verifyFormat(
5378 "template <typename... a> struct q {};\n"
5379 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5380 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5381 " y;",
5382 Style);
5383 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5384 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5385 verifyFormat(
5386 "template <typename... a> struct r {};\n"
5387 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5388 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5389 " y;",
5390 Style);
5391 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5392 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5393 verifyFormat(
5394 "template <typename... a> struct s {};\n"
5395 "extern s<\n"
5396 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5397 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5398 " y;",
5399 Style);
5400 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5401 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5402 verifyFormat(
5403 "template <typename... a> struct t {};\n"
5404 "extern t<\n"
5405 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5406 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5407 " y;",
5408 Style);
5409}
5410
Daniel Jasper45797022013-01-25 10:57:27 +00005411TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5412 verifyFormat(
5413 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5415 verifyFormat(
5416 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5419
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005420 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005421 verifyFormat(
5422 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005425
Daniel Jasper45797022013-01-25 10:57:27 +00005426 verifyFormat(
5427 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005428 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005429
5430 // Breaking at nested name specifiers is generally not desirable.
5431 verifyFormat(
5432 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005434
5435 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005436 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005439 " aaaaaaaaaaaaaaaaaaaaa);",
5440 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005441
5442 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5443 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5444 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005445}
5446
Daniel Jasperf7935112012-12-03 18:12:45 +00005447TEST_F(FormatTest, UnderstandsTemplateParameters) {
5448 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005449 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005450 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5451 verifyFormat("bool x = a < 1 || 2 > a;");
5452 verifyFormat("bool x = 5 < f<int>();");
5453 verifyFormat("bool x = f<int>() > 5;");
5454 verifyFormat("bool x = 5 < a<int>::x;");
5455 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5456 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5457
5458 verifyGoogleFormat("A<A<int>> a;");
5459 verifyGoogleFormat("A<A<A<int>>> a;");
5460 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005461 verifyGoogleFormat("A<A<int> > a;");
5462 verifyGoogleFormat("A<A<A<int> > > a;");
5463 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005464 verifyGoogleFormat("A<::A<int>> a;");
5465 verifyGoogleFormat("A<::A> a;");
5466 verifyGoogleFormat("A< ::A> a;");
5467 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005468 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5469 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005470 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5471 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005472 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5473 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005474
Nico Weber7533b4d2014-09-24 17:17:32 +00005475 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5476
Daniel Jasperf7935112012-12-03 18:12:45 +00005477 verifyFormat("test >> a >> b;");
5478 verifyFormat("test << a >> b;");
5479
5480 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005481 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005482 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005483 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5484 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005485 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005486 verifyFormat("f(a.operator()<A>());");
5487 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5488 " .template operator()<A>());",
5489 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005490
5491 // Not template parameters.
5492 verifyFormat("return a < b && c > d;");
5493 verifyFormat("void f() {\n"
5494 " while (a < b && c > d) {\n"
5495 " }\n"
5496 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005497 verifyFormat("template <typename... Types>\n"
5498 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005499
5500 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5501 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5502 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005503 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005504 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005505 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005506}
5507
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005508TEST_F(FormatTest, BitshiftOperatorWidth) {
5509 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5510 " bar */",
5511 format("int a=1<<2; /* foo\n"
5512 " bar */"));
5513
5514 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5515 " bar */",
5516 format("int b =256>>1 ; /* foo\n"
5517 " bar */"));
5518}
5519
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005520TEST_F(FormatTest, UnderstandsBinaryOperators) {
5521 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005522 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005523}
5524
5525TEST_F(FormatTest, UnderstandsPointersToMembers) {
5526 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005527 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005528 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005529 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005530 verifyFormat("void f() {\n"
5531 " (a->*f)();\n"
5532 " a->*x;\n"
5533 " (a.*f)();\n"
5534 " ((*a).*f)();\n"
5535 " a.*x;\n"
5536 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005537 verifyFormat("void f() {\n"
5538 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5539 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5540 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005541 verifyFormat(
5542 "(aaaaaaaaaa->*bbbbbbb)(\n"
5543 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005544 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005545 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005546 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005547}
5548
Daniel Jasper8dd40472012-12-21 09:41:31 +00005549TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005550 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005551 verifyFormat("f(-1, -2, -3);");
5552 verifyFormat("a[-1] = 5;");
5553 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005554 verifyFormat("if (i == -1) {\n}");
5555 verifyFormat("if (i != -1) {\n}");
5556 verifyFormat("if (i > -1) {\n}");
5557 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005558 verifyFormat("++(a->f());");
5559 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005560 verifyFormat("(a->f())++;");
5561 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005562 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005563
5564 verifyFormat("a-- > b;");
5565 verifyFormat("b ? -a : c;");
5566 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005567 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005568 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005569 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005570
5571 verifyFormat("return -1;");
5572 verifyFormat("switch (a) {\n"
5573 "case -1:\n"
5574 " break;\n"
5575 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005576 verifyFormat("#define X -1");
5577 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005578
Chandler Carruthf8b72662014-03-02 12:37:31 +00005579 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5580 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005581
5582 verifyFormat("int a = /* confusing comment */ -1;");
5583 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5584 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005585}
5586
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005587TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005588 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005589 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005590 "}");
5591 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005592 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005593 verifyFormat("*aaa = aaaaaaa( // break\n"
5594 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005595}
5596
Daniel Jasper8863ada2013-08-26 08:10:17 +00005597TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005598 verifyFormat("bool operator<();");
5599 verifyFormat("bool operator>();");
5600 verifyFormat("bool operator=();");
5601 verifyFormat("bool operator==();");
5602 verifyFormat("bool operator!=();");
5603 verifyFormat("int operator+();");
5604 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005605 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005606 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005607 verifyFormat("bool operator();");
5608 verifyFormat("bool operator()();");
5609 verifyFormat("bool operator[]();");
5610 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005611 verifyFormat("operator int();");
5612 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005613 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005614 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005615 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005616 verifyFormat("void *operator new(std::size_t size);");
5617 verifyFormat("void *operator new[](std::size_t size);");
5618 verifyFormat("void operator delete(void *ptr);");
5619 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005620 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5621 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005622 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005623 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005624
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005625 verifyFormat(
5626 "ostream &operator<<(ostream &OutputStream,\n"
5627 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005628 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5629 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5630 " return left.group < right.group;\n"
5631 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005632 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005633 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005634
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005635 verifyGoogleFormat("operator void*();");
5636 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005637 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005638
5639 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005640 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5641 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005642}
5643
Daniel Jasper1c220482015-02-25 10:30:06 +00005644TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005645 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5646 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5647 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5648 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5649 verifyFormat("Deleted &operator=(const Deleted &) &;");
5650 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5651 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5652 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5653 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5654 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5655 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005656 verifyFormat("void Fn(T const &) const &;");
5657 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005658 verifyFormat("template <typename T>\n"
5659 "void F(T) && = delete;",
5660 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005661
Daniel Jasperaf642c62015-08-25 13:40:51 +00005662 FormatStyle AlignLeft = getLLVMStyle();
5663 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005664 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005665 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5666 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5667 AlignLeft);
5668 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5669 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005670 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5671 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5672 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5673 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005674 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5675 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005676
5677 FormatStyle Spaces = getLLVMStyle();
5678 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005679 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5680 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5681 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5682 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005683
5684 Spaces.SpacesInCStyleCastParentheses = false;
5685 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005686 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5687 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5688 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5689 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005690}
5691
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005692TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005693 verifyFormat("void f() {\n"
5694 " A *a = new A;\n"
5695 " A *a = new (placement) A;\n"
5696 " delete a;\n"
5697 " delete (A *)a;\n"
5698 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005699 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5700 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005701 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5702 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5703 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005704 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005705}
5706
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005707TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005708 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005709 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005710 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005711 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005712 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005713 verifyIndependentOfContext("int a = b * 10;");
5714 verifyIndependentOfContext("int a = 10 * b;");
5715 verifyIndependentOfContext("int a = b * c;");
5716 verifyIndependentOfContext("int a += b * c;");
5717 verifyIndependentOfContext("int a -= b * c;");
5718 verifyIndependentOfContext("int a *= b * c;");
5719 verifyIndependentOfContext("int a /= b * c;");
5720 verifyIndependentOfContext("int a = *b;");
5721 verifyIndependentOfContext("int a = *b * c;");
5722 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005723 verifyIndependentOfContext("int a = b * (10);");
5724 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005725 verifyIndependentOfContext("return 10 * b;");
5726 verifyIndependentOfContext("return *b * *c;");
5727 verifyIndependentOfContext("return a & ~b;");
5728 verifyIndependentOfContext("f(b ? *c : *d);");
5729 verifyIndependentOfContext("int a = b ? *c : *d;");
5730 verifyIndependentOfContext("*b = a;");
5731 verifyIndependentOfContext("a * ~b;");
5732 verifyIndependentOfContext("a * !b;");
5733 verifyIndependentOfContext("a * +b;");
5734 verifyIndependentOfContext("a * -b;");
5735 verifyIndependentOfContext("a * ++b;");
5736 verifyIndependentOfContext("a * --b;");
5737 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005738 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005739 verifyIndependentOfContext("f() * b;");
5740 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005741 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005742 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005743 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005744 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005745 verifyIndependentOfContext("return sizeof(int **);");
5746 verifyIndependentOfContext("return sizeof(int ******);");
5747 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005748 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005749 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005750 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005751 verifyGoogleFormat("return sizeof(int**);");
5752 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5753 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005754 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005755 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005756 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005757 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005758 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005759 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005760 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005761 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005762 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005763 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005764 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005765 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005766 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005767 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005768 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005769 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005770 verifyFormat("void f(const MyOverride &override);");
5771 verifyFormat("void f(const MyFinal &final);");
5772 verifyIndependentOfContext("bool a = f() && override.f();");
5773 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005774
Daniel Jasper5b49f472013-01-23 12:10:53 +00005775 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005776
Daniel Jasper5b49f472013-01-23 12:10:53 +00005777 verifyIndependentOfContext("A<int *> a;");
5778 verifyIndependentOfContext("A<int **> a;");
5779 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005780 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005781 verifyIndependentOfContext(
5782 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005783 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005784 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005785 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005786 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005787 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005788
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005789 verifyFormat(
5790 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5792
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005793 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005794 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005795 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005796 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005797 verifyGoogleFormat("A<int*> a;");
5798 verifyGoogleFormat("A<int**> a;");
5799 verifyGoogleFormat("A<int*, int*> a;");
5800 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005801 verifyGoogleFormat("f(b ? *c : *d);");
5802 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005803 verifyGoogleFormat("Type* t = **x;");
5804 verifyGoogleFormat("Type* t = *++*x;");
5805 verifyGoogleFormat("*++*x;");
5806 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5807 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005808 verifyGoogleFormat(
5809 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005810 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005811 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5812 verifyGoogleFormat("template <typename T>\n"
5813 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005814
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005815 FormatStyle Left = getLLVMStyle();
5816 Left.PointerAlignment = FormatStyle::PAS_Left;
5817 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005818 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005819 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005820 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005821 verifyFormat("delete *x;", Left);
5822 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5823 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5824 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005825
Daniel Jasper5b49f472013-01-23 12:10:53 +00005826 verifyIndependentOfContext("a = *(x + y);");
5827 verifyIndependentOfContext("a = &(x + y);");
5828 verifyIndependentOfContext("*(x + y).call();");
5829 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005830 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005831
Daniel Jasper5b49f472013-01-23 12:10:53 +00005832 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005833 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005834 "int *MyValues = {\n"
5835 " *A, // Operator detection might be confused by the '{'\n"
5836 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005837 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005838
Daniel Jasper5b49f472013-01-23 12:10:53 +00005839 verifyIndependentOfContext("if (int *a = &b)");
5840 verifyIndependentOfContext("if (int &a = *b)");
5841 verifyIndependentOfContext("if (a & b[i])");
5842 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5843 verifyIndependentOfContext("if (*b[i])");
5844 verifyIndependentOfContext("if (int *a = (&b))");
5845 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005846 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005847 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005848 verifyFormat("void f() {\n"
5849 " for (const int &v : Values) {\n"
5850 " }\n"
5851 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005852 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5853 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005854 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005855
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005856 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005857 verifyFormat("#define MACRO \\\n"
5858 " int *i = a * b; \\\n"
5859 " void f(a *b);",
5860 getLLVMStyleWithColumns(19));
5861
Daniel Jasper97b89482013-03-13 07:49:51 +00005862 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005863 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005864 verifyIndependentOfContext("T **t = new T *;");
5865 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005866 verifyGoogleFormat("A = new SomeType*[Length]();");
5867 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005868 verifyGoogleFormat("T** t = new T*;");
5869 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005870
Daniel Jaspera65e8872014-03-25 10:52:45 +00005871 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5872 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005873 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005874 "typename t::if<x && y>::type f() {}");
5875 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005876 verifyFormat("vector<int *> v;");
5877 verifyFormat("vector<int *const> v;");
5878 verifyFormat("vector<int *const **const *> v;");
5879 verifyFormat("vector<int *volatile> v;");
5880 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005881 verifyFormat("foo<b && false>();");
5882 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005883 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005884 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005885 "template <class T, class = typename std::enable_if<\n"
5886 " std::is_integral<T>::value &&\n"
5887 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5888 "void F();",
5889 getLLVMStyleWithColumns(70));
5890 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005891 "template <class T,\n"
5892 " class = typename std::enable_if<\n"
5893 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005894 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5895 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005896 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005897 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005898 verifyFormat(
5899 "template <class T,\n"
5900 " class = typename ::std::enable_if<\n"
5901 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5902 "void F();",
5903 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005904
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005905 verifyIndependentOfContext("MACRO(int *i);");
5906 verifyIndependentOfContext("MACRO(auto *a);");
5907 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005908 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005909 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005910 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005911 // FIXME: Is there a way to make this work?
5912 // verifyIndependentOfContext("MACRO(A *a);");
5913
Daniel Jasper32ccb032014-06-23 07:36:18 +00005914 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005915 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005916
Daniel Jasper866468a2014-04-14 13:15:29 +00005917 EXPECT_EQ("#define OP(x) \\\n"
5918 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5919 " return s << a.DebugString(); \\\n"
5920 " }",
5921 format("#define OP(x) \\\n"
5922 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5923 " return s << a.DebugString(); \\\n"
5924 " }",
5925 getLLVMStyleWithColumns(50)));
5926
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005927 // FIXME: We cannot handle this case yet; we might be able to figure out that
5928 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005929 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005930
5931 FormatStyle PointerMiddle = getLLVMStyle();
5932 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5933 verifyFormat("delete *x;", PointerMiddle);
5934 verifyFormat("int * x;", PointerMiddle);
5935 verifyFormat("template <int * y> f() {}", PointerMiddle);
5936 verifyFormat("int * f(int * a) {}", PointerMiddle);
5937 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5938 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5939 verifyFormat("A<int *> a;", PointerMiddle);
5940 verifyFormat("A<int **> a;", PointerMiddle);
5941 verifyFormat("A<int *, int *> a;", PointerMiddle);
5942 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005943 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5944 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005945 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005946
5947 // Member function reference qualifiers aren't binary operators.
5948 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005949 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005950 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005951 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005952 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005953 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005954}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005955
Daniel Jasperee6d6502013-07-17 20:25:02 +00005956TEST_F(FormatTest, UnderstandsAttributes) {
5957 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005958 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5959 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005960 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005961 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005962 verifyFormat("__attribute__((nodebug)) void\n"
5963 "foo() {}\n",
5964 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005965}
5966
Daniel Jasper10cd5812013-05-06 06:35:44 +00005967TEST_F(FormatTest, UnderstandsEllipsis) {
5968 verifyFormat("int printf(const char *fmt, ...);");
5969 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005970 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5971
5972 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005973 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005974 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005975}
5976
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005977TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005978 EXPECT_EQ("int *a;\n"
5979 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005980 "int *a;",
5981 format("int *a;\n"
5982 "int* a;\n"
5983 "int *a;",
5984 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005985 EXPECT_EQ("int* a;\n"
5986 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005987 "int* a;",
5988 format("int* a;\n"
5989 "int* a;\n"
5990 "int *a;",
5991 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005992 EXPECT_EQ("int *a;\n"
5993 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005994 "int *a;",
5995 format("int *a;\n"
5996 "int * a;\n"
5997 "int * a;",
5998 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005999 EXPECT_EQ("auto x = [] {\n"
6000 " int *a;\n"
6001 " int *a;\n"
6002 " int *a;\n"
6003 "};",
6004 format("auto x=[]{int *a;\n"
6005 "int * a;\n"
6006 "int * a;};",
6007 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006008}
6009
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006010TEST_F(FormatTest, UnderstandsRvalueReferences) {
6011 verifyFormat("int f(int &&a) {}");
6012 verifyFormat("int f(int a, char &&b) {}");
6013 verifyFormat("void f() { int &&a = b; }");
6014 verifyGoogleFormat("int f(int a, char&& b) {}");
6015 verifyGoogleFormat("void f() { int&& a = b; }");
6016
Daniel Jasper1eff9082013-05-27 16:36:33 +00006017 verifyIndependentOfContext("A<int &&> a;");
6018 verifyIndependentOfContext("A<int &&, int &&> a;");
6019 verifyGoogleFormat("A<int&&> a;");
6020 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006021
6022 // Not rvalue references:
6023 verifyFormat("template <bool B, bool C> class A {\n"
6024 " static_assert(B && C, \"Something is wrong\");\n"
6025 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006026 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6027 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006028 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006029}
6030
Manuel Klimekc1237a82013-01-23 14:08:21 +00006031TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6032 verifyFormat("void f() {\n"
6033 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006034 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006035 "}",
6036 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006037}
6038
Daniel Jasperef906a92013-01-13 08:01:36 +00006039TEST_F(FormatTest, FormatsCasts) {
6040 verifyFormat("Type *A = static_cast<Type *>(P);");
6041 verifyFormat("Type *A = (Type *)P;");
6042 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6043 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006044 verifyFormat("int a = (int)2.0f;");
6045 verifyFormat("x[(int32)y];");
6046 verifyFormat("x = (int32)y;");
6047 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6048 verifyFormat("int a = (int)*b;");
6049 verifyFormat("int a = (int)2.0f;");
6050 verifyFormat("int a = (int)~0;");
6051 verifyFormat("int a = (int)++a;");
6052 verifyFormat("int a = (int)sizeof(int);");
6053 verifyFormat("int a = (int)+2;");
6054 verifyFormat("my_int a = (my_int)2.0f;");
6055 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006056 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006057 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006058 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006059 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006060 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006061
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006062 verifyFormat("void f() { my_int a = (my_int)*b; }");
6063 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6064 verifyFormat("my_int a = (my_int)~0;");
6065 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006066 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006067 verifyFormat("my_int a = (my_int)1;");
6068 verifyFormat("my_int a = (my_int *)1;");
6069 verifyFormat("my_int a = (const my_int)-1;");
6070 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006071 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006072 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006073 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006074 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006075
6076 // FIXME: single value wrapped with paren will be treated as cast.
6077 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006078
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006079 verifyFormat("{ (void)F; }");
6080
Daniel Jasper998cabc2013-07-18 14:46:07 +00006081 // Don't break after a cast's
6082 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6083 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6084 " bbbbbbbbbbbbbbbbbbbbbb);");
6085
Daniel Jasperef906a92013-01-13 08:01:36 +00006086 // These are not casts.
6087 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006088 verifyFormat("f(foo)->b;");
6089 verifyFormat("f(foo).b;");
6090 verifyFormat("f(foo)(b);");
6091 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006092 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006093 verifyFormat("(*funptr)(foo)[4];");
6094 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006095 verifyFormat("void f(int *);");
6096 verifyFormat("void f(int *) = 0;");
6097 verifyFormat("void f(SmallVector<int>) {}");
6098 verifyFormat("void f(SmallVector<int>);");
6099 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006100 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006101 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006102 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006103 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6104 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006105 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006106
Daniel Jasperba0bda92013-02-23 08:07:18 +00006107 // These are not casts, but at some point were confused with casts.
6108 verifyFormat("virtual void foo(int *) override;");
6109 verifyFormat("virtual void foo(char &) const;");
6110 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006111 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006112 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006113 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006114 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006115
6116 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6117 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006118 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006119 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006120 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6121 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6122 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006123}
6124
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006125TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006126 verifyFormat("A<bool()> a;");
6127 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006128 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006129 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006130 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006131 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006132 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006133 verifyFormat("template <class CallbackClass>\n"
6134 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006135
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006136 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6137 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006138 verifyGoogleFormat(
6139 "template <class CallbackClass>\n"
6140 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006141
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006142 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006143 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006144 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006145 verifyFormat("some_var = function(*some_pointer_var)[0];");
6146 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006147 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006148 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006149 verifyFormat("std::function<\n"
6150 " LooooooooooongTemplatedType<\n"
6151 " SomeType>*(\n"
6152 " LooooooooooooooooongType type)>\n"
6153 " function;",
6154 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006155}
6156
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006157TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6158 verifyFormat("A (*foo_)[6];");
6159 verifyFormat("vector<int> (*foo_)[6];");
6160}
6161
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006162TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6163 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6164 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6165 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6166 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006167 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6168 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006169
6170 // Different ways of ()-initializiation.
6171 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6172 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6173 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6174 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6175 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6176 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006177 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6178 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006179
6180 // Lambdas should not confuse the variable declaration heuristic.
6181 verifyFormat("LooooooooooooooooongType\n"
6182 " variable(nullptr, [](A *a) {});",
6183 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006184}
6185
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006186TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006187 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006188 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006189 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006191 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006192 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006193 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6194 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006195 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6196 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006197 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6198 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006199 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6200 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006201 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6202 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006203 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6204 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6205 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6206 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006207 FormatStyle Indented = getLLVMStyle();
6208 Indented.IndentWrappedFunctionNames = true;
6209 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6210 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6211 Indented);
6212 verifyFormat(
6213 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6214 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6215 Indented);
6216 verifyFormat(
6217 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6218 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6219 Indented);
6220 verifyFormat(
6221 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6222 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6223 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006224
6225 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006226 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6227 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6228 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006229
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006230 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006231 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006232 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006233 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6234 " SourceLocation L, IdentifierIn *II,\n"
6235 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006236 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006237 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006238 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006239 " const SomeType<string, SomeOtherTemplateParameter>\n"
6240 " &ReallyReallyLongParameterName,\n"
6241 " const SomeType<string, SomeOtherTemplateParameter>\n"
6242 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006243 verifyFormat("template <typename A>\n"
6244 "SomeLoooooooooooooooooooooongType<\n"
6245 " typename some_namespace::SomeOtherType<A>::Type>\n"
6246 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006247
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006248 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006249 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6250 " aaaaaaaaaaaaaaaaaaaaaaa;");
6251 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006252 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6253 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006254 verifyGoogleFormat(
6255 "some_namespace::LongReturnType\n"
6256 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006257 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006258
6259 verifyGoogleFormat("template <typename T>\n"
6260 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006261 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006262 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6263 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006264
6265 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006266 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6267 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006268 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6269 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6270 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6271 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6272 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006275
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006276 verifyFormat("template <typename T> // Templates on own line.\n"
6277 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006278 "MyFunction(int a);",
6279 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006280}
6281
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006282TEST_F(FormatTest, FormatsArrays) {
6283 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6284 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006285 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6286 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006287 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6288 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006289 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6290 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6291 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6292 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6293 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6294 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6295 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6296 verifyFormat(
6297 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6298 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6299 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6301 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006302
6303 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006305 verifyFormat(
6306 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6307 " .aaaaaaa[0]\n"
6308 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006309 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006310
6311 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006312
6313 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6314 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006315}
6316
Daniel Jaspere9de2602012-12-06 09:56:08 +00006317TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6318 verifyFormat("(a)->b();");
6319 verifyFormat("--a;");
6320}
6321
Daniel Jasper8b529712012-12-04 13:02:32 +00006322TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006323 verifyFormat("#include <string>\n"
6324 "#include <a/b/c.h>\n"
6325 "#include \"a/b/string\"\n"
6326 "#include \"string.h\"\n"
6327 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006328 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006329 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006330 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006331 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006332 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006333 "#include \"some very long include path\"\n"
6334 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006335 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006336 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6337 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006338
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006339 verifyFormat("#import <string>");
6340 verifyFormat("#import <a/b/c.h>");
6341 verifyFormat("#import \"a/b/string\"");
6342 verifyFormat("#import \"string.h\"");
6343 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006344 verifyFormat("#if __has_include(<strstream>)\n"
6345 "#include <strstream>\n"
6346 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006347
Daniel Jasper343643b2014-08-13 08:29:18 +00006348 verifyFormat("#define MY_IMPORT <a/b>");
6349
Nico Weber21088802017-02-10 19:36:52 +00006350 verifyFormat("#if __has_include(<a/b>)");
6351 verifyFormat("#if __has_include_next(<a/b>)");
6352 verifyFormat("#define F __has_include(<a/b>)");
6353 verifyFormat("#define F __has_include_next(<a/b>)");
6354
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006355 // Protocol buffer definition or missing "#".
6356 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6357 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006358
6359 FormatStyle Style = getLLVMStyle();
6360 Style.AlwaysBreakBeforeMultilineStrings = true;
6361 Style.ColumnLimit = 0;
6362 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006363
6364 // But 'import' might also be a regular C++ namespace.
6365 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006367}
6368
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006369//===----------------------------------------------------------------------===//
6370// Error recovery tests.
6371//===----------------------------------------------------------------------===//
6372
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006373TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006374 FormatStyle NoBinPacking = getLLVMStyle();
6375 NoBinPacking.BinPackParameters = false;
6376 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6377 " double *min_x,\n"
6378 " double *max_x,\n"
6379 " double *min_y,\n"
6380 " double *max_y,\n"
6381 " double *min_z,\n"
6382 " double *max_z, ) {}",
6383 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006384}
6385
Daniel Jasper83a54d22013-01-10 09:26:47 +00006386TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006387 verifyFormat("void f() { return; }\n42");
6388 verifyFormat("void f() {\n"
6389 " if (0)\n"
6390 " return;\n"
6391 "}\n"
6392 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006393 verifyFormat("void f() { return }\n42");
6394 verifyFormat("void f() {\n"
6395 " if (0)\n"
6396 " return\n"
6397 "}\n"
6398 "42");
6399}
6400
6401TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6402 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6403 EXPECT_EQ("void f() {\n"
6404 " if (a)\n"
6405 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006406 "}",
6407 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006408 EXPECT_EQ("namespace N {\n"
6409 "void f()\n"
6410 "}",
6411 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006412 EXPECT_EQ("namespace N {\n"
6413 "void f() {}\n"
6414 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006415 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006416 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006417}
6418
Daniel Jasper2df93312013-01-09 10:16:05 +00006419TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6420 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006421 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006422 " b;",
6423 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006424 verifyFormat("function(\n"
6425 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006426 " LoooooooooooongArgument);\n",
6427 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006428}
6429
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006430TEST_F(FormatTest, IncorrectAccessSpecifier) {
6431 verifyFormat("public:");
6432 verifyFormat("class A {\n"
6433 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006434 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006435 "};");
6436 verifyFormat("public\n"
6437 "int qwerty;");
6438 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006439 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006440 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006441 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006442 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006443 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006444}
Daniel Jasperf7935112012-12-03 18:12:45 +00006445
Daniel Jasper291f9362013-03-20 15:58:10 +00006446TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6447 verifyFormat("{");
6448 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006449 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006450}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006451
6452TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006453 verifyFormat("do {\n}");
6454 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006455 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006456 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006457 "wheeee(fun);");
6458 verifyFormat("do {\n"
6459 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006460 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006461}
6462
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006463TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006464 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006465 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006466 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006467 verifyFormat("while {\n foo;\n foo();\n}");
6468 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006469}
6470
Daniel Jasperc0880a92013-01-04 18:52:56 +00006471TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006472 verifyIncompleteFormat("namespace {\n"
6473 "class Foo { Foo (\n"
6474 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006475 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006476}
6477
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006478TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006479 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006480 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6481 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006482 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006483
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006484 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006485 " {\n"
6486 " breakme(\n"
6487 " qwe);\n"
6488 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006489 format("{\n"
6490 " {\n"
6491 " breakme(qwe);\n"
6492 "}\n",
6493 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006494}
6495
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006496TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006497 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006498 " avariable,\n"
6499 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006500 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006501}
6502
Manuel Klimek762dd182013-01-21 10:07:49 +00006503TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006504 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006505}
6506
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006507TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006508 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006509 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006510 " 1,\n"
6511 " 2,\n"
6512 " 3,\n"
6513 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006514 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006515 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6516 verifyFormat("f({1, 2});");
6517 verifyFormat("auto v = Foo{-1};");
6518 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6519 verifyFormat("Class::Class : member{1, 2, 3} {}");
6520 verifyFormat("new vector<int>{1, 2, 3};");
6521 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006522 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006523 verifyFormat("return {arg1, arg2};");
6524 verifyFormat("return {arg1, SomeType{parameter}};");
6525 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6526 verifyFormat("new T{arg1, arg2};");
6527 verifyFormat("f(MyMap[{composite, key}]);");
6528 verifyFormat("class Class {\n"
6529 " T member = {arg1, arg2};\n"
6530 "};");
6531 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006532 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6533 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006534 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6535 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006536
Daniel Jasper438059e2014-05-22 12:11:13 +00006537 verifyFormat("int foo(int i) { return fo1{}(i); }");
6538 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006539 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006540 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006541 verifyFormat("Node n{1, Node{1000}, //\n"
6542 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006543 verifyFormat("Aaaa aaaaaaa{\n"
6544 " {\n"
6545 " aaaa,\n"
6546 " },\n"
6547 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006548 verifyFormat("class C : public D {\n"
6549 " SomeClass SC{2};\n"
6550 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006551 verifyFormat("class C : public A {\n"
6552 " class D : public B {\n"
6553 " void f() { int i{2}; }\n"
6554 " };\n"
6555 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006556 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006557
Francois Ferrandd2130f52017-06-30 20:00:02 +00006558 // Binpacking only if there is no trailing comma
6559 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6560 " cccccccccc, dddddddddd};",
6561 getLLVMStyleWithColumns(50));
6562 verifyFormat("const Aaaaaa aaaaa = {\n"
6563 " aaaaaaaaaaa,\n"
6564 " bbbbbbbbbbb,\n"
6565 " ccccccccccc,\n"
6566 " ddddddddddd,\n"
6567 "};", getLLVMStyleWithColumns(50));
6568
Daniel Jaspere4ada022016-12-13 10:05:03 +00006569 // Cases where distinguising braced lists and blocks is hard.
6570 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6571 verifyFormat("void f() {\n"
6572 " return; // comment\n"
6573 "}\n"
6574 "SomeType t;");
6575 verifyFormat("void f() {\n"
6576 " if (a) {\n"
6577 " f();\n"
6578 " }\n"
6579 "}\n"
6580 "SomeType t;");
6581
Daniel Jasper08434342015-05-26 07:26:26 +00006582 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006583 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006584 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006585 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6586 " bbbbb,\n"
6587 " ccccc,\n"
6588 " ddddd,\n"
6589 " eeeee,\n"
6590 " ffffff,\n"
6591 " ggggg,\n"
6592 " hhhhhh,\n"
6593 " iiiiii,\n"
6594 " jjjjjj,\n"
6595 " kkkkkk};",
6596 NoBinPacking);
6597 verifyFormat("const Aaaaaa aaaaa = {\n"
6598 " aaaaa,\n"
6599 " bbbbb,\n"
6600 " ccccc,\n"
6601 " ddddd,\n"
6602 " eeeee,\n"
6603 " ffffff,\n"
6604 " ggggg,\n"
6605 " hhhhhh,\n"
6606 " iiiiii,\n"
6607 " jjjjjj,\n"
6608 " kkkkkk,\n"
6609 "};",
6610 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006611 verifyFormat(
6612 "const Aaaaaa aaaaa = {\n"
6613 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6614 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6615 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6616 "};",
6617 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006618
Chandler Carruthf8b72662014-03-02 12:37:31 +00006619 // FIXME: The alignment of these trailing comments might be bad. Then again,
6620 // this might be utterly useless in real code.
6621 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006622 " : some_value{ //\n"
6623 " aaaaaaa, //\n"
6624 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006625
Chandler Carruthf8b72662014-03-02 12:37:31 +00006626 // In braced lists, the first comment is always assumed to belong to the
6627 // first element. Thus, it can be moved to the next or previous line as
6628 // appropriate.
6629 EXPECT_EQ("function({// First element:\n"
6630 " 1,\n"
6631 " // Second element:\n"
6632 " 2});",
6633 format("function({\n"
6634 " // First element:\n"
6635 " 1,\n"
6636 " // Second element:\n"
6637 " 2});"));
6638 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6639 " // First element:\n"
6640 " 1,\n"
6641 " // Second element:\n"
6642 " 2};",
6643 format("std::vector<int> MyNumbers{// First element:\n"
6644 " 1,\n"
6645 " // Second element:\n"
6646 " 2};",
6647 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006648 // A trailing comma should still lead to an enforced line break and no
6649 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006650 EXPECT_EQ("vector<int> SomeVector = {\n"
6651 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006652 " 1,\n"
6653 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006654 "};",
6655 format("vector<int> SomeVector = { // aaa\n"
6656 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006657
Chandler Carruthf8b72662014-03-02 12:37:31 +00006658 FormatStyle ExtraSpaces = getLLVMStyle();
6659 ExtraSpaces.Cpp11BracedListStyle = false;
6660 ExtraSpaces.ColumnLimit = 75;
6661 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6662 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6663 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6664 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6665 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6666 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6667 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6668 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6669 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6670 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6671 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6672 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6673 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6674 verifyFormat("class Class {\n"
6675 " T member = { arg1, arg2 };\n"
6676 "};",
6677 ExtraSpaces);
6678 verifyFormat(
6679 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6680 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6681 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6682 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6683 ExtraSpaces);
6684 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006685 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006686 ExtraSpaces);
6687 verifyFormat(
6688 "someFunction(OtherParam,\n"
6689 " BracedList{ // comment 1 (Forcing interesting break)\n"
6690 " param1, param2,\n"
6691 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006692 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006693 ExtraSpaces);
6694 verifyFormat(
6695 "std::this_thread::sleep_for(\n"
6696 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6697 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006698 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006699 " aaaaaaa,\n"
6700 " aaaaaaaaaa,\n"
6701 " aaaaa,\n"
6702 " aaaaaaaaaaaaaaa,\n"
6703 " aaa,\n"
6704 " aaaaaaaaaa,\n"
6705 " a,\n"
6706 " aaaaaaaaaaaaaaaaaaaaa,\n"
6707 " aaaaaaaaaaaa,\n"
6708 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6709 " aaaaaaa,\n"
6710 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006711 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006712 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6713 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006714}
6715
Daniel Jasper33b909c2013-10-25 14:29:37 +00006716TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006717 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6718 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6719 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6720 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6721 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6722 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006723 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006724 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006725 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006726 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6727 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006728 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006729 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6730 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6731 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6732 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6733 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6734 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6735 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006736 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006737 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6738 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006739 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6740 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6741 " // Separating comment.\n"
6742 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6743 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6744 " // Leading comment\n"
6745 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6746 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006747 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6748 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006749 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006750 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6751 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006752 getLLVMStyleWithColumns(38));
6753 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006754 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6755 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006756 verifyFormat(
6757 "static unsigned SomeValues[10][3] = {\n"
6758 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6759 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6760 verifyFormat("static auto fields = new vector<string>{\n"
6761 " \"aaaaaaaaaaaaa\",\n"
6762 " \"aaaaaaaaaaaaa\",\n"
6763 " \"aaaaaaaaaaaa\",\n"
6764 " \"aaaaaaaaaaaaaa\",\n"
6765 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6766 " \"aaaaaaaaaaaa\",\n"
6767 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6768 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006769 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6770 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6771 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6772 " 3, cccccccccccccccccccccc};",
6773 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006774
6775 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006776 verifyFormat("vector<int> x = {\n"
6777 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6778 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006779 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006780 verifyFormat("vector<int> x = {\n"
6781 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006782 "};",
6783 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006784 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6785 " 1, 1, 1, 1,\n"
6786 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006787 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006788
Daniel Jasper60c27072015-05-13 08:16:00 +00006789 // Trailing comment in the first line.
6790 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6791 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6792 " 111111111, 222222222, 3333333333, 444444444, //\n"
6793 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006794 // Trailing comment in the last line.
6795 verifyFormat("int aaaaa[] = {\n"
6796 " 1, 2, 3, // comment\n"
6797 " 4, 5, 6 // comment\n"
6798 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006799
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006800 // With nested lists, we should either format one item per line or all nested
6801 // lists one on line.
6802 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006803 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6804 " {aaaaaaaaaaaaaaaaaaa},\n"
6805 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6806 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006807 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006808 verifyFormat(
6809 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006810 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6811 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6812 " {aaa, aaa},\n"
6813 " {aaa, aaa},\n"
6814 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6815 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6816 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006817
6818 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006819 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006820 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006821
6822 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006823
Daniel Jaspereb65e912015-12-21 18:31:15 +00006824 // No braced initializer here.
6825 verifyFormat("void f() {\n"
6826 " struct Dummy {};\n"
6827 " f(v);\n"
6828 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006829
6830 // Long lists should be formatted in columns even if they are nested.
6831 verifyFormat(
6832 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6833 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6834 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6835 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6836 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6837 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006838
6839 // Allow "single-column" layout even if that violates the column limit. There
6840 // isn't going to be a better way.
6841 verifyFormat("std::vector<int> a = {\n"
6842 " aaaaaaaa,\n"
6843 " aaaaaaaa,\n"
6844 " aaaaaaaa,\n"
6845 " aaaaaaaa,\n"
6846 " aaaaaaaaaa,\n"
6847 " aaaaaaaa,\n"
6848 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6849 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006850 verifyFormat("vector<int> aaaa = {\n"
6851 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6852 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6853 " aaaaaa.aaaaaaa,\n"
6854 " aaaaaa.aaaaaaa,\n"
6855 " aaaaaa.aaaaaaa,\n"
6856 " aaaaaa.aaaaaaa,\n"
6857 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006858
6859 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006860 verifyFormat("someFunction(Param, {List1, List2,\n"
6861 " List3});",
6862 getLLVMStyleWithColumns(35));
6863 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006864 " {List1, List2,\n"
6865 " List3});",
6866 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006867 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6868 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006869}
6870
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006871TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006872 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006873 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006874
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006875 verifyFormat("void f() { return 42; }");
6876 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006877 " return 42;\n"
6878 "}",
6879 DoNotMerge);
6880 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006881 " // Comment\n"
6882 "}");
6883 verifyFormat("{\n"
6884 "#error {\n"
6885 " int a;\n"
6886 "}");
6887 verifyFormat("{\n"
6888 " int a;\n"
6889 "#error {\n"
6890 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006891 verifyFormat("void f() {} // comment");
6892 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006893 verifyFormat("void f() {\n"
6894 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006895 DoNotMerge);
6896 verifyFormat("void f() {\n"
6897 " int a;\n"
6898 "} // comment",
6899 DoNotMerge);
6900 verifyFormat("void f() {\n"
6901 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006902 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006903
6904 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6905 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6906
6907 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6908 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006909 verifyFormat("class C {\n"
6910 " C()\n"
6911 " : iiiiiiii(nullptr),\n"
6912 " kkkkkkk(nullptr),\n"
6913 " mmmmmmm(nullptr),\n"
6914 " nnnnnnn(nullptr) {}\n"
6915 "};",
6916 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006917
6918 FormatStyle NoColumnLimit = getLLVMStyle();
6919 NoColumnLimit.ColumnLimit = 0;
6920 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6921 EXPECT_EQ("class C {\n"
6922 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006923 "};",
6924 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006925 EXPECT_EQ("A()\n"
6926 " : b(0) {\n"
6927 "}",
6928 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6929
6930 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006931 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6932 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006933 EXPECT_EQ("A()\n"
6934 " : b(0) {\n"
6935 "}",
6936 format("A():b(0){}", DoNotMergeNoColumnLimit));
6937 EXPECT_EQ("A()\n"
6938 " : b(0) {\n"
6939 "}",
6940 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006941
6942 verifyFormat("#define A \\\n"
6943 " void f() { \\\n"
6944 " int i; \\\n"
6945 " }",
6946 getLLVMStyleWithColumns(20));
6947 verifyFormat("#define A \\\n"
6948 " void f() { int i; }",
6949 getLLVMStyleWithColumns(21));
6950 verifyFormat("#define A \\\n"
6951 " void f() { \\\n"
6952 " int i; \\\n"
6953 " } \\\n"
6954 " int j;",
6955 getLLVMStyleWithColumns(22));
6956 verifyFormat("#define A \\\n"
6957 " void f() { int i; } \\\n"
6958 " int j;",
6959 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006960}
6961
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006962TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6963 FormatStyle MergeEmptyOnly = getLLVMStyle();
6964 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6965 verifyFormat("class C {\n"
6966 " int f() {}\n"
6967 "};",
6968 MergeEmptyOnly);
6969 verifyFormat("class C {\n"
6970 " int f() {\n"
6971 " return 42;\n"
6972 " }\n"
6973 "};",
6974 MergeEmptyOnly);
6975 verifyFormat("int f() {}", MergeEmptyOnly);
6976 verifyFormat("int f() {\n"
6977 " return 42;\n"
6978 "}",
6979 MergeEmptyOnly);
6980
6981 // Also verify behavior when BraceWrapping.AfterFunction = true
6982 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6983 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6984 verifyFormat("int f() {}", MergeEmptyOnly);
6985 verifyFormat("class C {\n"
6986 " int f() {}\n"
6987 "};",
6988 MergeEmptyOnly);
6989}
6990
Daniel Jasperd74cf402014-04-08 12:46:38 +00006991TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6992 FormatStyle MergeInlineOnly = getLLVMStyle();
6993 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6994 verifyFormat("class C {\n"
6995 " int f() { return 42; }\n"
6996 "};",
6997 MergeInlineOnly);
6998 verifyFormat("int f() {\n"
6999 " return 42;\n"
7000 "}",
7001 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007002
7003 // SFS_Inline implies SFS_Empty
7004 verifyFormat("class C {\n"
7005 " int f() {}\n"
7006 "};",
7007 MergeInlineOnly);
7008 verifyFormat("int f() {}", MergeInlineOnly);
7009
7010 // Also verify behavior when BraceWrapping.AfterFunction = true
7011 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7012 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7013 verifyFormat("class C {\n"
7014 " int f() { return 42; }\n"
7015 "};",
7016 MergeInlineOnly);
7017 verifyFormat("int f()\n"
7018 "{\n"
7019 " return 42;\n"
7020 "}",
7021 MergeInlineOnly);
7022
7023 // SFS_Inline implies SFS_Empty
7024 verifyFormat("int f() {}", MergeInlineOnly);
7025 verifyFormat("class C {\n"
7026 " int f() {}\n"
7027 "};",
7028 MergeInlineOnly);
7029}
7030
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007031TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7032 FormatStyle MergeInlineOnly = getLLVMStyle();
7033 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7034 FormatStyle::SFS_InlineOnly;
7035 verifyFormat("class C {\n"
7036 " int f() { return 42; }\n"
7037 "};",
7038 MergeInlineOnly);
7039 verifyFormat("int f() {\n"
7040 " return 42;\n"
7041 "}",
7042 MergeInlineOnly);
7043
7044 // SFS_InlineOnly does not imply SFS_Empty
7045 verifyFormat("class C {\n"
7046 " int f() {}\n"
7047 "};",
7048 MergeInlineOnly);
7049 verifyFormat("int f() {\n"
7050 "}",
7051 MergeInlineOnly);
7052
7053 // Also verify behavior when BraceWrapping.AfterFunction = true
7054 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7055 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7056 verifyFormat("class C {\n"
7057 " int f() { return 42; }\n"
7058 "};",
7059 MergeInlineOnly);
7060 verifyFormat("int f()\n"
7061 "{\n"
7062 " return 42;\n"
7063 "}",
7064 MergeInlineOnly);
7065
7066 // SFS_InlineOnly does not imply SFS_Empty
7067 verifyFormat("int f()\n"
7068 "{\n"
7069 "}",
7070 MergeInlineOnly);
7071 verifyFormat("class C {\n"
7072 " int f() {}\n"
7073 "};",
7074 MergeInlineOnly);
7075}
7076
Francois Ferrandad722562017-06-30 20:25:55 +00007077TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007078 FormatStyle Style = getLLVMStyle();
7079 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7080 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7081 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007082 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007083 Style.ColumnLimit = 40;
7084
7085 verifyFormat("int f()\n"
7086 "{}",
7087 Style);
7088 verifyFormat("int f()\n"
7089 "{\n"
7090 " return 42;\n"
7091 "}",
7092 Style);
7093 verifyFormat("int f()\n"
7094 "{\n"
7095 " // some comment\n"
7096 "}",
7097 Style);
7098
7099 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7100 verifyFormat("int f() {}", Style);
7101 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7102 "{}",
7103 Style);
7104 verifyFormat("int f()\n"
7105 "{\n"
7106 " return 0;\n"
7107 "}",
7108 Style);
7109
7110 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7111 verifyFormat("class Foo {\n"
7112 " int f() {}\n"
7113 "};\n",
7114 Style);
7115 verifyFormat("class Foo {\n"
7116 " int f() { return 0; }\n"
7117 "};\n",
7118 Style);
7119 verifyFormat("class Foo {\n"
7120 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7121 " {}\n"
7122 "};\n",
7123 Style);
7124 verifyFormat("class Foo {\n"
7125 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7126 " {\n"
7127 " return 0;\n"
7128 " }\n"
7129 "};\n",
7130 Style);
7131
7132 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7133 verifyFormat("int f() {}", Style);
7134 verifyFormat("int f() { return 0; }", Style);
7135 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7136 "{}",
7137 Style);
7138 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7139 "{\n"
7140 " return 0;\n"
7141 "}",
7142 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007143}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007144TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7145 FormatStyle Style = getLLVMStyle();
7146 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7147 verifyFormat("#ifdef A\n"
7148 "int f() {}\n"
7149 "#else\n"
7150 "int g() {}\n"
7151 "#endif",
7152 Style);
7153}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007154
Francois Ferrandad722562017-06-30 20:25:55 +00007155TEST_F(FormatTest, SplitEmptyClass) {
7156 FormatStyle Style = getLLVMStyle();
7157 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7158 Style.BraceWrapping.AfterClass = true;
7159 Style.BraceWrapping.SplitEmptyRecord = false;
7160
7161 verifyFormat("class Foo\n"
7162 "{};",
7163 Style);
7164 verifyFormat("/* something */ class Foo\n"
7165 "{};",
7166 Style);
7167 verifyFormat("template <typename X> class Foo\n"
7168 "{};",
7169 Style);
7170 verifyFormat("class Foo\n"
7171 "{\n"
7172 " Foo();\n"
7173 "};",
7174 Style);
7175 verifyFormat("typedef class Foo\n"
7176 "{\n"
7177 "} Foo_t;",
7178 Style);
7179}
7180
7181TEST_F(FormatTest, SplitEmptyStruct) {
7182 FormatStyle Style = getLLVMStyle();
7183 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7184 Style.BraceWrapping.AfterStruct = true;
7185 Style.BraceWrapping.SplitEmptyRecord = false;
7186
7187 verifyFormat("struct Foo\n"
7188 "{};",
7189 Style);
7190 verifyFormat("/* something */ struct Foo\n"
7191 "{};",
7192 Style);
7193 verifyFormat("template <typename X> struct Foo\n"
7194 "{};",
7195 Style);
7196 verifyFormat("struct Foo\n"
7197 "{\n"
7198 " Foo();\n"
7199 "};",
7200 Style);
7201 verifyFormat("typedef struct Foo\n"
7202 "{\n"
7203 "} Foo_t;",
7204 Style);
7205 //typedef struct Bar {} Bar_t;
7206}
7207
7208TEST_F(FormatTest, SplitEmptyUnion) {
7209 FormatStyle Style = getLLVMStyle();
7210 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7211 Style.BraceWrapping.AfterUnion = true;
7212 Style.BraceWrapping.SplitEmptyRecord = false;
7213
7214 verifyFormat("union Foo\n"
7215 "{};",
7216 Style);
7217 verifyFormat("/* something */ union Foo\n"
7218 "{};",
7219 Style);
7220 verifyFormat("union Foo\n"
7221 "{\n"
7222 " A,\n"
7223 "};",
7224 Style);
7225 verifyFormat("typedef union Foo\n"
7226 "{\n"
7227 "} Foo_t;",
7228 Style);
7229}
7230
7231TEST_F(FormatTest, SplitEmptyNamespace) {
7232 FormatStyle Style = getLLVMStyle();
7233 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7234 Style.BraceWrapping.AfterNamespace = true;
7235 Style.BraceWrapping.SplitEmptyNamespace = false;
7236
7237 verifyFormat("namespace Foo\n"
7238 "{};",
7239 Style);
7240 verifyFormat("/* something */ namespace Foo\n"
7241 "{};",
7242 Style);
7243 verifyFormat("inline namespace Foo\n"
7244 "{};",
7245 Style);
7246 verifyFormat("namespace Foo\n"
7247 "{\n"
7248 "void Bar();\n"
7249 "};",
7250 Style);
7251}
7252
7253TEST_F(FormatTest, NeverMergeShortRecords) {
7254 FormatStyle Style = getLLVMStyle();
7255
7256 verifyFormat("class Foo {\n"
7257 " Foo();\n"
7258 "};",
7259 Style);
7260 verifyFormat("typedef class Foo {\n"
7261 " Foo();\n"
7262 "} Foo_t;",
7263 Style);
7264 verifyFormat("struct Foo {\n"
7265 " Foo();\n"
7266 "};",
7267 Style);
7268 verifyFormat("typedef struct Foo {\n"
7269 " Foo();\n"
7270 "} Foo_t;",
7271 Style);
7272 verifyFormat("union Foo {\n"
7273 " A,\n"
7274 "};",
7275 Style);
7276 verifyFormat("typedef union Foo {\n"
7277 " A,\n"
7278 "} Foo_t;",
7279 Style);
7280 verifyFormat("namespace Foo {\n"
7281 "void Bar();\n"
7282 "};",
7283 Style);
7284
7285 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7286 Style.BraceWrapping.AfterClass = true;
7287 Style.BraceWrapping.AfterStruct = true;
7288 Style.BraceWrapping.AfterUnion = true;
7289 Style.BraceWrapping.AfterNamespace = true;
7290 verifyFormat("class Foo\n"
7291 "{\n"
7292 " Foo();\n"
7293 "};",
7294 Style);
7295 verifyFormat("typedef class Foo\n"
7296 "{\n"
7297 " Foo();\n"
7298 "} Foo_t;",
7299 Style);
7300 verifyFormat("struct Foo\n"
7301 "{\n"
7302 " Foo();\n"
7303 "};",
7304 Style);
7305 verifyFormat("typedef struct Foo\n"
7306 "{\n"
7307 " Foo();\n"
7308 "} Foo_t;",
7309 Style);
7310 verifyFormat("union Foo\n"
7311 "{\n"
7312 " A,\n"
7313 "};",
7314 Style);
7315 verifyFormat("typedef union Foo\n"
7316 "{\n"
7317 " A,\n"
7318 "} Foo_t;",
7319 Style);
7320 verifyFormat("namespace Foo\n"
7321 "{\n"
7322 "void Bar();\n"
7323 "};",
7324 Style);
7325}
7326
Manuel Klimeke01bab52013-01-15 13:38:33 +00007327TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7328 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007329 verifyFormat("struct foo a = {bar};\nint n;");
7330 verifyFormat("class foo a = {bar};\nint n;");
7331 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007332
7333 // Elaborate types inside function definitions.
7334 verifyFormat("struct foo f() {}\nint n;");
7335 verifyFormat("class foo f() {}\nint n;");
7336 verifyFormat("union foo f() {}\nint n;");
7337
7338 // Templates.
7339 verifyFormat("template <class X> void f() {}\nint n;");
7340 verifyFormat("template <struct X> void f() {}\nint n;");
7341 verifyFormat("template <union X> void f() {}\nint n;");
7342
7343 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007344 verifyFormat("struct {\n} n;");
7345 verifyFormat(
7346 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007347 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007348 verifyFormat("class MACRO Z {\n} n;");
7349 verifyFormat("class MACRO(X) Z {\n} n;");
7350 verifyFormat("class __attribute__(X) Z {\n} n;");
7351 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007352 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007353 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007354 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7355 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007356
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007357 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007358 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007359
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007360 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007361 verifyFormat(
7362 "template <typename F>\n"
7363 "Matcher(const Matcher<F> &Other,\n"
7364 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7365 " !is_same<F, T>::value>::type * = 0)\n"
7366 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7367
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007368 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007369 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007370 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007371
7372 // FIXME:
7373 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007374 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007375
Manuel Klimeke01bab52013-01-15 13:38:33 +00007376 // Elaborate types where incorrectly parsing the structural element would
7377 // break the indent.
7378 verifyFormat("if (true)\n"
7379 " class X x;\n"
7380 "else\n"
7381 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007382
7383 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007384 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007385}
7386
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007387TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007388 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7389 format("#error Leave all white!!!!! space* alone!\n"));
7390 EXPECT_EQ(
7391 "#warning Leave all white!!!!! space* alone!\n",
7392 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007393 EXPECT_EQ("#error 1", format(" # error 1"));
7394 EXPECT_EQ("#warning 1", format(" # warning 1"));
7395}
7396
Daniel Jasper4431aa92013-04-23 13:54:04 +00007397TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007398 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007399 verifyFormat("#if (AAAA && BBBB)");
7400 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007401 // FIXME: Come up with a better indentation for #elif.
7402 verifyFormat(
7403 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7404 " defined(BBBBBBBB)\n"
7405 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7406 " defined(BBBBBBBB)\n"
7407 "#endif",
7408 getLLVMStyleWithColumns(65));
7409}
7410
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007411TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7412 FormatStyle AllowsMergedIf = getGoogleStyle();
7413 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7414 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7415 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007416 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7417 EXPECT_EQ("if (true) return 42;",
7418 format("if (true)\nreturn 42;", AllowsMergedIf));
7419 FormatStyle ShortMergedIf = AllowsMergedIf;
7420 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007421 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007422 " if (true) return 42;",
7423 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007424 verifyFormat("#define A \\\n"
7425 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007426 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007427 "#define B",
7428 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007429 verifyFormat("#define A \\\n"
7430 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007431 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007432 "g();",
7433 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007434 verifyFormat("{\n"
7435 "#ifdef A\n"
7436 " // Comment\n"
7437 " if (true) continue;\n"
7438 "#endif\n"
7439 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007440 " if (true) continue;\n"
7441 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007442 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007443 ShortMergedIf.ColumnLimit = 33;
7444 verifyFormat("#define A \\\n"
7445 " if constexpr (true) return 42;",
7446 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007447 ShortMergedIf.ColumnLimit = 29;
7448 verifyFormat("#define A \\\n"
7449 " if (aaaaaaaaaa) return 1; \\\n"
7450 " return 2;",
7451 ShortMergedIf);
7452 ShortMergedIf.ColumnLimit = 28;
7453 verifyFormat("#define A \\\n"
7454 " if (aaaaaaaaaa) \\\n"
7455 " return 1; \\\n"
7456 " return 2;",
7457 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007458 verifyFormat("#define A \\\n"
7459 " if constexpr (aaaaaaa) \\\n"
7460 " return 1; \\\n"
7461 " return 2;",
7462 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007463}
7464
Manuel Klimekd33516e2013-01-23 10:09:28 +00007465TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007466 verifyFormat("void f(int *a);");
7467 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007468 verifyFormat("class A {\n void f(int *a);\n};");
7469 verifyFormat("class A {\n int *a;\n};");
7470 verifyFormat("namespace a {\n"
7471 "namespace b {\n"
7472 "class A {\n"
7473 " void f() {}\n"
7474 " int *a;\n"
7475 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007476 "} // namespace b\n"
7477 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007478}
7479
Manuel Klimekd33516e2013-01-23 10:09:28 +00007480TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7481 verifyFormat("while");
7482 verifyFormat("operator");
7483}
7484
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007485TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7486 // This code would be painfully slow to format if we didn't skip it.
7487 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
7488 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7489 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7490 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7491 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7492 "A(1, 1)\n"
7493 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7494 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7495 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7496 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7497 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7498 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7499 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7500 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7501 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7502 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7503 // Deeply nested part is untouched, rest is formatted.
7504 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7505 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007506 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007507}
7508
Nico Weber7e6a7a12013-01-08 17:56:31 +00007509//===----------------------------------------------------------------------===//
7510// Objective-C tests.
7511//===----------------------------------------------------------------------===//
7512
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007513TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7514 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7515 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7516 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007517 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007518 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7519 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7520 format("-(NSInteger)Method3:(id)anObject;"));
7521 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7522 format("-(NSInteger)Method4:(id)anObject;"));
7523 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7524 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7525 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7526 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007527 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7528 "forAllCells:(BOOL)flag;",
7529 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7530 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007531
7532 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007533 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7534 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007535 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7536 " inRange:(NSRange)range\n"
7537 " outRange:(NSRange)out_range\n"
7538 " outRange1:(NSRange)out_range1\n"
7539 " outRange2:(NSRange)out_range2\n"
7540 " outRange3:(NSRange)out_range3\n"
7541 " outRange4:(NSRange)out_range4\n"
7542 " outRange5:(NSRange)out_range5\n"
7543 " outRange6:(NSRange)out_range6\n"
7544 " outRange7:(NSRange)out_range7\n"
7545 " outRange8:(NSRange)out_range8\n"
7546 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007547
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007548 // When the function name has to be wrapped.
7549 FormatStyle Style = getLLVMStyle();
7550 Style.IndentWrappedFunctionNames = false;
7551 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7552 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7553 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7554 "}",
7555 Style);
7556 Style.IndentWrappedFunctionNames = true;
7557 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7558 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7559 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7560 "}",
7561 Style);
7562
Nico Weberd6f962f2013-01-10 20:18:33 +00007563 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007564 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007565 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7566 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007567 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007568
Daniel Jasper37194282013-05-28 08:33:00 +00007569 verifyFormat("- (int (*)())foo:(int (*)())f;");
7570 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007571
7572 // If there's no return type (very rare in practice!), LLVM and Google style
7573 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007574 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007575 verifyFormat("- foo:(int)f;");
7576 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007577}
7578
Nico Weber0588b502013-02-07 00:19:29 +00007579
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007580TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007581 EXPECT_EQ("\"some text \"\n"
7582 "\"other\";",
7583 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007584 EXPECT_EQ("\"some text \"\n"
7585 "\"other\";",
7586 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007587 EXPECT_EQ(
7588 "#define A \\\n"
7589 " \"some \" \\\n"
7590 " \"text \" \\\n"
7591 " \"other\";",
7592 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7593 EXPECT_EQ(
7594 "#define A \\\n"
7595 " \"so \" \\\n"
7596 " \"text \" \\\n"
7597 " \"other\";",
7598 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7599
7600 EXPECT_EQ("\"some text\"",
7601 format("\"some text\"", getLLVMStyleWithColumns(1)));
7602 EXPECT_EQ("\"some text\"",
7603 format("\"some text\"", getLLVMStyleWithColumns(11)));
7604 EXPECT_EQ("\"some \"\n"
7605 "\"text\"",
7606 format("\"some text\"", getLLVMStyleWithColumns(10)));
7607 EXPECT_EQ("\"some \"\n"
7608 "\"text\"",
7609 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007610 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007611 "\" tex\"\n"
7612 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007613 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007614 EXPECT_EQ("\"some\"\n"
7615 "\" tex\"\n"
7616 "\" and\"",
7617 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7618 EXPECT_EQ("\"some\"\n"
7619 "\"/tex\"\n"
7620 "\"/and\"",
7621 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007622
7623 EXPECT_EQ("variable =\n"
7624 " \"long string \"\n"
7625 " \"literal\";",
7626 format("variable = \"long string literal\";",
7627 getLLVMStyleWithColumns(20)));
7628
7629 EXPECT_EQ("variable = f(\n"
7630 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007631 " \"literal\",\n"
7632 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007633 " loooooooooooooooooooong);",
7634 format("variable = f(\"long string literal\", short, "
7635 "loooooooooooooooooooong);",
7636 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007637
Daniel Jaspera44991332015-04-29 13:06:49 +00007638 EXPECT_EQ(
7639 "f(g(\"long string \"\n"
7640 " \"literal\"),\n"
7641 " b);",
7642 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007643 EXPECT_EQ("f(g(\"long string \"\n"
7644 " \"literal\",\n"
7645 " a),\n"
7646 " b);",
7647 format("f(g(\"long string literal\", a), b);",
7648 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007649 EXPECT_EQ(
7650 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007651 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007652 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7653 EXPECT_EQ("f(\"one two three four five six \"\n"
7654 " \"seven\".split(\n"
7655 " really_looooong_variable));",
7656 format("f(\"one two three four five six seven\"."
7657 "split(really_looooong_variable));",
7658 getLLVMStyleWithColumns(33)));
7659
7660 EXPECT_EQ("f(\"some \"\n"
7661 " \"text\",\n"
7662 " other);",
7663 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007664
7665 // Only break as a last resort.
7666 verifyFormat(
7667 "aaaaaaaaaaaaaaaaaaaa(\n"
7668 " aaaaaaaaaaaaaaaaaaaa,\n"
7669 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007670
Daniel Jaspera44991332015-04-29 13:06:49 +00007671 EXPECT_EQ("\"splitmea\"\n"
7672 "\"trandomp\"\n"
7673 "\"oint\"",
7674 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007675
Daniel Jaspera44991332015-04-29 13:06:49 +00007676 EXPECT_EQ("\"split/\"\n"
7677 "\"pathat/\"\n"
7678 "\"slashes\"",
7679 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007680
Daniel Jaspera44991332015-04-29 13:06:49 +00007681 EXPECT_EQ("\"split/\"\n"
7682 "\"pathat/\"\n"
7683 "\"slashes\"",
7684 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007685 EXPECT_EQ("\"split at \"\n"
7686 "\"spaces/at/\"\n"
7687 "\"slashes.at.any$\"\n"
7688 "\"non-alphanumeric%\"\n"
7689 "\"1111111111characte\"\n"
7690 "\"rs\"",
7691 format("\"split at "
7692 "spaces/at/"
7693 "slashes.at."
7694 "any$non-"
7695 "alphanumeric%"
7696 "1111111111characte"
7697 "rs\"",
7698 getLLVMStyleWithColumns(20)));
7699
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007700 // Verify that splitting the strings understands
7701 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007702 EXPECT_EQ(
7703 "aaaaaaaaaaaa(\n"
7704 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7705 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7706 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7707 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7708 "aaaaaaaaaaaaaaaaaaaaaa\");",
7709 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007710 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7711 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7712 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7713 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7714 "aaaaaaaaaaaaaaaaaaaaaa\";",
7715 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007716 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7717 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7718 format("llvm::outs() << "
7719 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7720 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007721 EXPECT_EQ("ffff(\n"
7722 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7723 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7724 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7725 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7726 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007727
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007728 FormatStyle Style = getLLVMStyleWithColumns(12);
7729 Style.BreakStringLiterals = false;
7730 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7731
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007732 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007733 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007734 EXPECT_EQ("#define A \\\n"
7735 " \"some \" \\\n"
7736 " \"text \" \\\n"
7737 " \"other\";",
7738 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007739}
7740
Manuel Klimek93699f42017-11-29 14:29:43 +00007741TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7742 EXPECT_EQ("C a = \"some more \"\n"
7743 " \"text\";",
7744 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7745}
7746
Manuel Klimek9e321992015-07-28 15:50:24 +00007747TEST_F(FormatTest, FullyRemoveEmptyLines) {
7748 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7749 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7750 EXPECT_EQ("int i = a(b());",
7751 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7752}
7753
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007754TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7755 EXPECT_EQ(
7756 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7757 "(\n"
7758 " \"x\t\");",
7759 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7760 "aaaaaaa("
7761 "\"x\t\");"));
7762}
7763
Daniel Jasper174b0122014-01-09 14:18:12 +00007764TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007765 EXPECT_EQ(
7766 "u8\"utf8 string \"\n"
7767 "u8\"literal\";",
7768 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7769 EXPECT_EQ(
7770 "u\"utf16 string \"\n"
7771 "u\"literal\";",
7772 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7773 EXPECT_EQ(
7774 "U\"utf32 string \"\n"
7775 "U\"literal\";",
7776 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7777 EXPECT_EQ("L\"wide string \"\n"
7778 "L\"literal\";",
7779 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007780 EXPECT_EQ("@\"NSString \"\n"
7781 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007782 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007783 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007784
7785 // This input makes clang-format try to split the incomplete unicode escape
7786 // sequence, which used to lead to a crasher.
7787 verifyNoCrash(
7788 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7789 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007790}
7791
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007792TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7793 FormatStyle Style = getGoogleStyleWithColumns(15);
7794 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7795 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7796 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7797 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7798 EXPECT_EQ("u8R\"x(raw literal)x\";",
7799 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007800}
7801
7802TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7803 FormatStyle Style = getLLVMStyleWithColumns(20);
7804 EXPECT_EQ(
7805 "_T(\"aaaaaaaaaaaaaa\")\n"
7806 "_T(\"aaaaaaaaaaaaaa\")\n"
7807 "_T(\"aaaaaaaaaaaa\")",
7808 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007809 EXPECT_EQ("f(x,\n"
7810 " _T(\"aaaaaaaaaaaa\")\n"
7811 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007812 " z);",
7813 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7814
7815 // FIXME: Handle embedded spaces in one iteration.
7816 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7817 // "_T(\"aaaaaaaaaaaaa\")\n"
7818 // "_T(\"aaaaaaaaaaaaa\")\n"
7819 // "_T(\"a\")",
7820 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7821 // getLLVMStyleWithColumns(20)));
7822 EXPECT_EQ(
7823 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7824 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007825 EXPECT_EQ("f(\n"
7826 "#if !TEST\n"
7827 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7828 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007829 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007830 format("f(\n"
7831 "#if !TEST\n"
7832 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7833 "#endif\n"
7834 ");"));
7835 EXPECT_EQ("f(\n"
7836 "\n"
7837 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7838 format("f(\n"
7839 "\n"
7840 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007841}
7842
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007843TEST_F(FormatTest, BreaksStringLiteralOperands) {
7844 // In a function call with two operands, the second can be broken with no line
7845 // break before it.
7846 EXPECT_EQ("func(a, \"long long \"\n"
7847 " \"long long\");",
7848 format("func(a, \"long long long long\");",
7849 getLLVMStyleWithColumns(24)));
7850 // In a function call with three operands, the second must be broken with a
7851 // line break before it.
7852 EXPECT_EQ("func(a,\n"
7853 " \"long long long \"\n"
7854 " \"long\",\n"
7855 " c);",
7856 format("func(a, \"long long long long\", c);",
7857 getLLVMStyleWithColumns(24)));
7858 // In a function call with three operands, the third must be broken with a
7859 // line break before it.
7860 EXPECT_EQ("func(a, b,\n"
7861 " \"long long long \"\n"
7862 " \"long\");",
7863 format("func(a, b, \"long long long long\");",
7864 getLLVMStyleWithColumns(24)));
7865 // In a function call with three operands, both the second and the third must
7866 // be broken with a line break before them.
7867 EXPECT_EQ("func(a,\n"
7868 " \"long long long \"\n"
7869 " \"long\",\n"
7870 " \"long long long \"\n"
7871 " \"long\");",
7872 format("func(a, \"long long long long\", \"long long long long\");",
7873 getLLVMStyleWithColumns(24)));
7874 // In a chain of << with two operands, the second can be broken with no line
7875 // break before it.
7876 EXPECT_EQ("a << \"line line \"\n"
7877 " \"line\";",
7878 format("a << \"line line line\";",
7879 getLLVMStyleWithColumns(20)));
7880 // In a chain of << with three operands, the second can be broken with no line
7881 // break before it.
7882 EXPECT_EQ("abcde << \"line \"\n"
7883 " \"line line\"\n"
7884 " << c;",
7885 format("abcde << \"line line line\" << c;",
7886 getLLVMStyleWithColumns(20)));
7887 // In a chain of << with three operands, the third must be broken with a line
7888 // break before it.
7889 EXPECT_EQ("a << b\n"
7890 " << \"line line \"\n"
7891 " \"line\";",
7892 format("a << b << \"line line line\";",
7893 getLLVMStyleWithColumns(20)));
7894 // In a chain of << with three operands, the second can be broken with no line
7895 // break before it and the third must be broken with a line break before it.
7896 EXPECT_EQ("abcd << \"line line \"\n"
7897 " \"line\"\n"
7898 " << \"line line \"\n"
7899 " \"line\";",
7900 format("abcd << \"line line line\" << \"line line line\";",
7901 getLLVMStyleWithColumns(20)));
7902 // In a chain of binary operators with two operands, the second can be broken
7903 // with no line break before it.
7904 EXPECT_EQ("abcd + \"line line \"\n"
7905 " \"line line\";",
7906 format("abcd + \"line line line line\";",
7907 getLLVMStyleWithColumns(20)));
7908 // In a chain of binary operators with three operands, the second must be
7909 // broken with a line break before it.
7910 EXPECT_EQ("abcd +\n"
7911 " \"line line \"\n"
7912 " \"line line\" +\n"
7913 " e;",
7914 format("abcd + \"line line line line\" + e;",
7915 getLLVMStyleWithColumns(20)));
7916 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7917 // the first must be broken with a line break before it.
7918 FormatStyle Style = getLLVMStyleWithColumns(25);
7919 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7920 EXPECT_EQ("someFunction(\n"
7921 " \"long long long \"\n"
7922 " \"long\",\n"
7923 " a);",
7924 format("someFunction(\"long long long long\", a);", Style));
7925}
7926
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007927TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007928 EXPECT_EQ(
7929 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7932 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7935}
7936
7937TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7938 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007939 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007940 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7941 "multiline raw string literal xxxxxxxxxxxxxx\n"
7942 ")x\",\n"
7943 " a),\n"
7944 " b);",
7945 format("fffffffffff(g(R\"x(\n"
7946 "multiline raw string literal xxxxxxxxxxxxxx\n"
7947 ")x\", a), b);",
7948 getGoogleStyleWithColumns(20)));
7949 EXPECT_EQ("fffffffffff(\n"
7950 " g(R\"x(qqq\n"
7951 "multiline raw string literal xxxxxxxxxxxxxx\n"
7952 ")x\",\n"
7953 " a),\n"
7954 " b);",
7955 format("fffffffffff(g(R\"x(qqq\n"
7956 "multiline raw string literal xxxxxxxxxxxxxx\n"
7957 ")x\", a), b);",
7958 getGoogleStyleWithColumns(20)));
7959
7960 EXPECT_EQ("fffffffffff(R\"x(\n"
7961 "multiline raw string literal xxxxxxxxxxxxxx\n"
7962 ")x\");",
7963 format("fffffffffff(R\"x(\n"
7964 "multiline raw string literal xxxxxxxxxxxxxx\n"
7965 ")x\");",
7966 getGoogleStyleWithColumns(20)));
7967 EXPECT_EQ("fffffffffff(R\"x(\n"
7968 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007969 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007970 format("fffffffffff(R\"x(\n"
7971 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007972 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007973 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007974 EXPECT_EQ("fffffffffff(\n"
7975 " R\"x(\n"
7976 "multiline raw string literal xxxxxxxxxxxxxx\n"
7977 ")x\" +\n"
7978 " bbbbbb);",
7979 format("fffffffffff(\n"
7980 " R\"x(\n"
7981 "multiline raw string literal xxxxxxxxxxxxxx\n"
7982 ")x\" + bbbbbb);",
7983 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007984}
7985
Alexander Kornienkobe633902013-06-14 11:46:10 +00007986TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007987 verifyFormat("string a = \"unterminated;");
7988 EXPECT_EQ("function(\"unterminated,\n"
7989 " OtherParameter);",
7990 format("function( \"unterminated,\n"
7991 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007992}
7993
7994TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007995 FormatStyle Style = getLLVMStyle();
7996 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007997 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007998 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007999}
8000
Daniel Jaspera44991332015-04-29 13:06:49 +00008001TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008002
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008003TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8004 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8005 " \"ddeeefff\");",
8006 format("someFunction(\"aaabbbcccdddeeefff\");",
8007 getLLVMStyleWithColumns(25)));
8008 EXPECT_EQ("someFunction1234567890(\n"
8009 " \"aaabbbcccdddeeefff\");",
8010 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8011 getLLVMStyleWithColumns(26)));
8012 EXPECT_EQ("someFunction1234567890(\n"
8013 " \"aaabbbcccdddeeeff\"\n"
8014 " \"f\");",
8015 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8016 getLLVMStyleWithColumns(25)));
8017 EXPECT_EQ("someFunction1234567890(\n"
8018 " \"aaabbbcccdddeeeff\"\n"
8019 " \"f\");",
8020 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8021 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008022 EXPECT_EQ("someFunction(\n"
8023 " \"aaabbbcc ddde \"\n"
8024 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008025 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008026 getLLVMStyleWithColumns(25)));
8027 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8028 " \"ddeeefff\");",
8029 format("someFunction(\"aaabbbccc ddeeefff\");",
8030 getLLVMStyleWithColumns(25)));
8031 EXPECT_EQ("someFunction1234567890(\n"
8032 " \"aaabb \"\n"
8033 " \"cccdddeeefff\");",
8034 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8035 getLLVMStyleWithColumns(25)));
8036 EXPECT_EQ("#define A \\\n"
8037 " string s = \\\n"
8038 " \"123456789\" \\\n"
8039 " \"0\"; \\\n"
8040 " int i;",
8041 format("#define A string s = \"1234567890\"; int i;",
8042 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008043 EXPECT_EQ("someFunction(\n"
8044 " \"aaabbbcc \"\n"
8045 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008046 format("someFunction(\"aaabbbcc dddeeefff\");",
8047 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008048}
8049
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008050TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008051 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8052 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008053 EXPECT_EQ("\"test\"\n"
8054 "\"\\n\"",
8055 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8056 EXPECT_EQ("\"tes\\\\\"\n"
8057 "\"n\"",
8058 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8059 EXPECT_EQ("\"\\\\\\\\\"\n"
8060 "\"\\n\"",
8061 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008062 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008063 EXPECT_EQ("\"\\uff01\"\n"
8064 "\"test\"",
8065 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8066 EXPECT_EQ("\"\\Uff01ff02\"",
8067 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8068 EXPECT_EQ("\"\\x000000000001\"\n"
8069 "\"next\"",
8070 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8071 EXPECT_EQ("\"\\x000000000001next\"",
8072 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8073 EXPECT_EQ("\"\\x000000000001\"",
8074 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8075 EXPECT_EQ("\"test\"\n"
8076 "\"\\000000\"\n"
8077 "\"000001\"",
8078 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8079 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008080 "\"00000000\"\n"
8081 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008082 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008083}
8084
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008085TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8086 verifyFormat("void f() {\n"
8087 " return g() {}\n"
8088 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008089 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008090 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008091 "}");
8092}
8093
Manuel Klimek421147e2014-01-24 09:25:23 +00008094TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8095 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008096 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008097}
8098
Manuel Klimek13b97d82013-05-13 08:42:42 +00008099TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8100 verifyFormat("class X {\n"
8101 " void f() {\n"
8102 " }\n"
8103 "};",
8104 getLLVMStyleWithColumns(12));
8105}
8106
8107TEST_F(FormatTest, ConfigurableIndentWidth) {
8108 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8109 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008110 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008111 verifyFormat("void f() {\n"
8112 " someFunction();\n"
8113 " if (true) {\n"
8114 " f();\n"
8115 " }\n"
8116 "}",
8117 EightIndent);
8118 verifyFormat("class X {\n"
8119 " void f() {\n"
8120 " }\n"
8121 "};",
8122 EightIndent);
8123 verifyFormat("int x[] = {\n"
8124 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008125 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008126 EightIndent);
8127}
8128
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008129TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008130 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008131 "f();",
8132 getLLVMStyleWithColumns(8));
8133}
8134
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008135TEST_F(FormatTest, ConfigurableUseOfTab) {
8136 FormatStyle Tab = getLLVMStyleWithColumns(42);
8137 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008138 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008139 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008140
8141 EXPECT_EQ("if (aaaaaaaa && // q\n"
8142 " bb)\t\t// w\n"
8143 "\t;",
8144 format("if (aaaaaaaa &&// q\n"
8145 "bb)// w\n"
8146 ";",
8147 Tab));
8148 EXPECT_EQ("if (aaa && bbb) // w\n"
8149 "\t;",
8150 format("if(aaa&&bbb)// w\n"
8151 ";",
8152 Tab));
8153
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008154 verifyFormat("class X {\n"
8155 "\tvoid f() {\n"
8156 "\t\tsomeFunction(parameter1,\n"
8157 "\t\t\t parameter2);\n"
8158 "\t}\n"
8159 "};",
8160 Tab);
8161 verifyFormat("#define A \\\n"
8162 "\tvoid f() { \\\n"
8163 "\t\tsomeFunction( \\\n"
8164 "\t\t parameter1, \\\n"
8165 "\t\t parameter2); \\\n"
8166 "\t}",
8167 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008168
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008169 Tab.TabWidth = 4;
8170 Tab.IndentWidth = 8;
8171 verifyFormat("class TabWidth4Indent8 {\n"
8172 "\t\tvoid f() {\n"
8173 "\t\t\t\tsomeFunction(parameter1,\n"
8174 "\t\t\t\t\t\t\t parameter2);\n"
8175 "\t\t}\n"
8176 "};",
8177 Tab);
8178
8179 Tab.TabWidth = 4;
8180 Tab.IndentWidth = 4;
8181 verifyFormat("class TabWidth4Indent4 {\n"
8182 "\tvoid f() {\n"
8183 "\t\tsomeFunction(parameter1,\n"
8184 "\t\t\t\t\t parameter2);\n"
8185 "\t}\n"
8186 "};",
8187 Tab);
8188
8189 Tab.TabWidth = 8;
8190 Tab.IndentWidth = 4;
8191 verifyFormat("class TabWidth8Indent4 {\n"
8192 " void f() {\n"
8193 "\tsomeFunction(parameter1,\n"
8194 "\t\t parameter2);\n"
8195 " }\n"
8196 "};",
8197 Tab);
8198
Alexander Kornienko39856b72013-09-10 09:38:25 +00008199 Tab.TabWidth = 8;
8200 Tab.IndentWidth = 8;
8201 EXPECT_EQ("/*\n"
8202 "\t a\t\tcomment\n"
8203 "\t in multiple lines\n"
8204 " */",
8205 format(" /*\t \t \n"
8206 " \t \t a\t\tcomment\t \t\n"
8207 " \t \t in multiple lines\t\n"
8208 " \t */",
8209 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008210
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008211 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008212 verifyFormat("{\n"
8213 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8214 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8215 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8216 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8217 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8218 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008219 "};",
8220 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008221 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008222 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008223 "\ta2,\n"
8224 "\ta3\n"
8225 "};",
8226 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008227 EXPECT_EQ("if (aaaaaaaa && // q\n"
8228 " bb) // w\n"
8229 "\t;",
8230 format("if (aaaaaaaa &&// q\n"
8231 "bb)// w\n"
8232 ";",
8233 Tab));
8234 verifyFormat("class X {\n"
8235 "\tvoid f() {\n"
8236 "\t\tsomeFunction(parameter1,\n"
8237 "\t\t parameter2);\n"
8238 "\t}\n"
8239 "};",
8240 Tab);
8241 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008242 "\tQ(\n"
8243 "\t {\n"
8244 "\t\t int a;\n"
8245 "\t\t someFunction(aaaaaaaa,\n"
8246 "\t\t bbbbbbb);\n"
8247 "\t },\n"
8248 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008249 "}",
8250 Tab);
8251 EXPECT_EQ("{\n"
8252 "\t/* aaaa\n"
8253 "\t bbbb */\n"
8254 "}",
8255 format("{\n"
8256 "/* aaaa\n"
8257 " bbbb */\n"
8258 "}",
8259 Tab));
8260 EXPECT_EQ("{\n"
8261 "\t/*\n"
8262 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8263 "\t bbbbbbbbbbbbb\n"
8264 "\t*/\n"
8265 "}",
8266 format("{\n"
8267 "/*\n"
8268 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8269 "*/\n"
8270 "}",
8271 Tab));
8272 EXPECT_EQ("{\n"
8273 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8274 "\t// bbbbbbbbbbbbb\n"
8275 "}",
8276 format("{\n"
8277 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8278 "}",
8279 Tab));
8280 EXPECT_EQ("{\n"
8281 "\t/*\n"
8282 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8283 "\t bbbbbbbbbbbbb\n"
8284 "\t*/\n"
8285 "}",
8286 format("{\n"
8287 "\t/*\n"
8288 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8289 "\t*/\n"
8290 "}",
8291 Tab));
8292 EXPECT_EQ("{\n"
8293 "\t/*\n"
8294 "\n"
8295 "\t*/\n"
8296 "}",
8297 format("{\n"
8298 "\t/*\n"
8299 "\n"
8300 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008301 "}",
8302 Tab));
8303 EXPECT_EQ("{\n"
8304 "\t/*\n"
8305 " asdf\n"
8306 "\t*/\n"
8307 "}",
8308 format("{\n"
8309 "\t/*\n"
8310 " asdf\n"
8311 "\t*/\n"
8312 "}",
8313 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008314
8315 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008316 EXPECT_EQ("/*\n"
8317 " a\t\tcomment\n"
8318 " in multiple lines\n"
8319 " */",
8320 format(" /*\t \t \n"
8321 " \t \t a\t\tcomment\t \t\n"
8322 " \t \t in multiple lines\t\n"
8323 " \t */",
8324 Tab));
8325 EXPECT_EQ("/* some\n"
8326 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008327 format(" \t \t /* some\n"
8328 " \t \t comment */",
8329 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008330 EXPECT_EQ("int a; /* some\n"
8331 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008332 format(" \t \t int a; /* some\n"
8333 " \t \t comment */",
8334 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008335
Alexander Kornienko39856b72013-09-10 09:38:25 +00008336 EXPECT_EQ("int a; /* some\n"
8337 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008338 format(" \t \t int\ta; /* some\n"
8339 " \t \t comment */",
8340 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008341 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8342 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008343 format(" \t \t f(\"\t\t\"); /* some\n"
8344 " \t \t comment */",
8345 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008346 EXPECT_EQ("{\n"
8347 " /*\n"
8348 " * Comment\n"
8349 " */\n"
8350 " int i;\n"
8351 "}",
8352 format("{\n"
8353 "\t/*\n"
8354 "\t * Comment\n"
8355 "\t */\n"
8356 "\t int i;\n"
8357 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008358
8359 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8360 Tab.TabWidth = 8;
8361 Tab.IndentWidth = 8;
8362 EXPECT_EQ("if (aaaaaaaa && // q\n"
8363 " bb) // w\n"
8364 "\t;",
8365 format("if (aaaaaaaa &&// q\n"
8366 "bb)// w\n"
8367 ";",
8368 Tab));
8369 EXPECT_EQ("if (aaa && bbb) // w\n"
8370 "\t;",
8371 format("if(aaa&&bbb)// w\n"
8372 ";",
8373 Tab));
8374 verifyFormat("class X {\n"
8375 "\tvoid f() {\n"
8376 "\t\tsomeFunction(parameter1,\n"
8377 "\t\t\t parameter2);\n"
8378 "\t}\n"
8379 "};",
8380 Tab);
8381 verifyFormat("#define A \\\n"
8382 "\tvoid f() { \\\n"
8383 "\t\tsomeFunction( \\\n"
8384 "\t\t parameter1, \\\n"
8385 "\t\t parameter2); \\\n"
8386 "\t}",
8387 Tab);
8388 Tab.TabWidth = 4;
8389 Tab.IndentWidth = 8;
8390 verifyFormat("class TabWidth4Indent8 {\n"
8391 "\t\tvoid f() {\n"
8392 "\t\t\t\tsomeFunction(parameter1,\n"
8393 "\t\t\t\t\t\t\t parameter2);\n"
8394 "\t\t}\n"
8395 "};",
8396 Tab);
8397 Tab.TabWidth = 4;
8398 Tab.IndentWidth = 4;
8399 verifyFormat("class TabWidth4Indent4 {\n"
8400 "\tvoid f() {\n"
8401 "\t\tsomeFunction(parameter1,\n"
8402 "\t\t\t\t\t parameter2);\n"
8403 "\t}\n"
8404 "};",
8405 Tab);
8406 Tab.TabWidth = 8;
8407 Tab.IndentWidth = 4;
8408 verifyFormat("class TabWidth8Indent4 {\n"
8409 " void f() {\n"
8410 "\tsomeFunction(parameter1,\n"
8411 "\t\t parameter2);\n"
8412 " }\n"
8413 "};",
8414 Tab);
8415 Tab.TabWidth = 8;
8416 Tab.IndentWidth = 8;
8417 EXPECT_EQ("/*\n"
8418 "\t a\t\tcomment\n"
8419 "\t in multiple lines\n"
8420 " */",
8421 format(" /*\t \t \n"
8422 " \t \t a\t\tcomment\t \t\n"
8423 " \t \t in multiple lines\t\n"
8424 " \t */",
8425 Tab));
8426 verifyFormat("{\n"
8427 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8428 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8429 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8430 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8431 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8432 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8433 "};",
8434 Tab);
8435 verifyFormat("enum AA {\n"
8436 "\ta1, // Force multiple lines\n"
8437 "\ta2,\n"
8438 "\ta3\n"
8439 "};",
8440 Tab);
8441 EXPECT_EQ("if (aaaaaaaa && // q\n"
8442 " bb) // w\n"
8443 "\t;",
8444 format("if (aaaaaaaa &&// q\n"
8445 "bb)// w\n"
8446 ";",
8447 Tab));
8448 verifyFormat("class X {\n"
8449 "\tvoid f() {\n"
8450 "\t\tsomeFunction(parameter1,\n"
8451 "\t\t\t parameter2);\n"
8452 "\t}\n"
8453 "};",
8454 Tab);
8455 verifyFormat("{\n"
8456 "\tQ(\n"
8457 "\t {\n"
8458 "\t\t int a;\n"
8459 "\t\t someFunction(aaaaaaaa,\n"
8460 "\t\t\t\t bbbbbbb);\n"
8461 "\t },\n"
8462 "\t p);\n"
8463 "}",
8464 Tab);
8465 EXPECT_EQ("{\n"
8466 "\t/* aaaa\n"
8467 "\t bbbb */\n"
8468 "}",
8469 format("{\n"
8470 "/* aaaa\n"
8471 " bbbb */\n"
8472 "}",
8473 Tab));
8474 EXPECT_EQ("{\n"
8475 "\t/*\n"
8476 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8477 "\t bbbbbbbbbbbbb\n"
8478 "\t*/\n"
8479 "}",
8480 format("{\n"
8481 "/*\n"
8482 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8483 "*/\n"
8484 "}",
8485 Tab));
8486 EXPECT_EQ("{\n"
8487 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8488 "\t// bbbbbbbbbbbbb\n"
8489 "}",
8490 format("{\n"
8491 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8492 "}",
8493 Tab));
8494 EXPECT_EQ("{\n"
8495 "\t/*\n"
8496 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8497 "\t bbbbbbbbbbbbb\n"
8498 "\t*/\n"
8499 "}",
8500 format("{\n"
8501 "\t/*\n"
8502 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8503 "\t*/\n"
8504 "}",
8505 Tab));
8506 EXPECT_EQ("{\n"
8507 "\t/*\n"
8508 "\n"
8509 "\t*/\n"
8510 "}",
8511 format("{\n"
8512 "\t/*\n"
8513 "\n"
8514 "\t*/\n"
8515 "}",
8516 Tab));
8517 EXPECT_EQ("{\n"
8518 "\t/*\n"
8519 " asdf\n"
8520 "\t*/\n"
8521 "}",
8522 format("{\n"
8523 "\t/*\n"
8524 " asdf\n"
8525 "\t*/\n"
8526 "}",
8527 Tab));
8528 EXPECT_EQ("/*\n"
8529 "\t a\t\tcomment\n"
8530 "\t in multiple lines\n"
8531 " */",
8532 format(" /*\t \t \n"
8533 " \t \t a\t\tcomment\t \t\n"
8534 " \t \t in multiple lines\t\n"
8535 " \t */",
8536 Tab));
8537 EXPECT_EQ("/* some\n"
8538 " comment */",
8539 format(" \t \t /* some\n"
8540 " \t \t comment */",
8541 Tab));
8542 EXPECT_EQ("int a; /* some\n"
8543 " comment */",
8544 format(" \t \t int a; /* some\n"
8545 " \t \t comment */",
8546 Tab));
8547 EXPECT_EQ("int a; /* some\n"
8548 "comment */",
8549 format(" \t \t int\ta; /* some\n"
8550 " \t \t comment */",
8551 Tab));
8552 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8553 " comment */",
8554 format(" \t \t f(\"\t\t\"); /* some\n"
8555 " \t \t comment */",
8556 Tab));
8557 EXPECT_EQ("{\n"
8558 " /*\n"
8559 " * Comment\n"
8560 " */\n"
8561 " int i;\n"
8562 "}",
8563 format("{\n"
8564 "\t/*\n"
8565 "\t * Comment\n"
8566 "\t */\n"
8567 "\t int i;\n"
8568 "}"));
8569 Tab.AlignConsecutiveAssignments = true;
8570 Tab.AlignConsecutiveDeclarations = true;
8571 Tab.TabWidth = 4;
8572 Tab.IndentWidth = 4;
8573 verifyFormat("class Assign {\n"
8574 "\tvoid f() {\n"
8575 "\t\tint x = 123;\n"
8576 "\t\tint random = 4;\n"
8577 "\t\tstd::string alphabet =\n"
8578 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8579 "\t}\n"
8580 "};",
8581 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008582}
8583
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008584TEST_F(FormatTest, CalculatesOriginalColumn) {
8585 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8586 "q\"; /* some\n"
8587 " comment */",
8588 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8589 "q\"; /* some\n"
8590 " comment */",
8591 getLLVMStyle()));
8592 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8593 "/* some\n"
8594 " comment */",
8595 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8596 " /* some\n"
8597 " comment */",
8598 getLLVMStyle()));
8599 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8600 "qqq\n"
8601 "/* some\n"
8602 " comment */",
8603 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8604 "qqq\n"
8605 " /* some\n"
8606 " comment */",
8607 getLLVMStyle()));
8608 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8609 "wwww; /* some\n"
8610 " comment */",
8611 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8612 "wwww; /* some\n"
8613 " comment */",
8614 getLLVMStyle()));
8615}
8616
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008617TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008618 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008619 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008620
8621 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008622 " continue;",
8623 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008624 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008625 " continue;",
8626 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008627 verifyFormat("if(true)\n"
8628 " f();\n"
8629 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008630 " f();",
8631 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008632 verifyFormat("do {\n"
8633 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008634 "} while(something());",
8635 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008636 verifyFormat("switch(x) {\n"
8637 "default:\n"
8638 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008639 "}",
8640 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008641 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008642 verifyFormat("size_t x = sizeof(x);", NoSpace);
8643 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8644 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8645 verifyFormat("alignas(128) char a[128];", NoSpace);
8646 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8647 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8648 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008649 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008650 verifyFormat("T A::operator()();", NoSpace);
8651 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008652
8653 FormatStyle Space = getLLVMStyle();
8654 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8655
8656 verifyFormat("int f ();", Space);
8657 verifyFormat("void f (int a, T b) {\n"
8658 " while (true)\n"
8659 " continue;\n"
8660 "}",
8661 Space);
8662 verifyFormat("if (true)\n"
8663 " f ();\n"
8664 "else if (true)\n"
8665 " f ();",
8666 Space);
8667 verifyFormat("do {\n"
8668 " do_something ();\n"
8669 "} while (something ());",
8670 Space);
8671 verifyFormat("switch (x) {\n"
8672 "default:\n"
8673 " break;\n"
8674 "}",
8675 Space);
8676 verifyFormat("A::A () : a (1) {}", Space);
8677 verifyFormat("void f () __attribute__ ((asdf));", Space);
8678 verifyFormat("*(&a + 1);\n"
8679 "&((&a)[1]);\n"
8680 "a[(b + c) * d];\n"
8681 "(((a + 1) * 2) + 3) * 4;",
8682 Space);
8683 verifyFormat("#define A(x) x", Space);
8684 verifyFormat("#define A (x) x", Space);
8685 verifyFormat("#if defined(x)\n"
8686 "#endif",
8687 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008688 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008689 verifyFormat("size_t x = sizeof (x);", Space);
8690 verifyFormat("auto f (int x) -> decltype (x);", Space);
8691 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8692 verifyFormat("alignas (128) char a[128];", Space);
8693 verifyFormat("size_t x = alignof (MyType);", Space);
8694 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8695 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008696 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008697 verifyFormat("T A::operator() ();", Space);
8698 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008699}
8700
8701TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8702 FormatStyle Spaces = getLLVMStyle();
8703
8704 Spaces.SpacesInParentheses = true;
8705 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008706 verifyFormat("call();", Spaces);
8707 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008708 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8709 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008710 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008711 " continue;",
8712 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008713 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008714 " continue;",
8715 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008716 verifyFormat("if ( true )\n"
8717 " f();\n"
8718 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008719 " f();",
8720 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008721 verifyFormat("do {\n"
8722 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008723 "} while ( something() );",
8724 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008725 verifyFormat("switch ( x ) {\n"
8726 "default:\n"
8727 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008728 "}",
8729 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008730
8731 Spaces.SpacesInParentheses = false;
8732 Spaces.SpacesInCStyleCastParentheses = true;
8733 verifyFormat("Type *A = ( Type * )P;", Spaces);
8734 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8735 verifyFormat("x = ( int32 )y;", Spaces);
8736 verifyFormat("int a = ( int )(2.0f);", Spaces);
8737 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8738 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8739 verifyFormat("#define x (( int )-1)", Spaces);
8740
Daniel Jasper92e09822015-03-18 12:59:19 +00008741 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008742 Spaces.SpacesInParentheses = false;
8743 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008744 Spaces.SpacesInCStyleCastParentheses = true;
8745 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008746 verifyFormat("call( );", Spaces);
8747 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008748 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008749 " continue;",
8750 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008751 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008752 " continue;",
8753 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008754 verifyFormat("if (true)\n"
8755 " f( );\n"
8756 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008757 " f( );",
8758 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008759 verifyFormat("do {\n"
8760 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008761 "} while (something( ));",
8762 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008763 verifyFormat("switch (x) {\n"
8764 "default:\n"
8765 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008766 "}",
8767 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008768
Daniel Jasper92e09822015-03-18 12:59:19 +00008769 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008770 Spaces.SpaceAfterCStyleCast = true;
8771 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008772 verifyFormat("call( );", Spaces);
8773 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008774 verifyFormat("while (( bool ) 1)\n"
8775 " continue;",
8776 Spaces);
8777 verifyFormat("for (;;)\n"
8778 " continue;",
8779 Spaces);
8780 verifyFormat("if (true)\n"
8781 " f( );\n"
8782 "else if (true)\n"
8783 " f( );",
8784 Spaces);
8785 verifyFormat("do {\n"
8786 " do_something(( int ) i);\n"
8787 "} while (something( ));",
8788 Spaces);
8789 verifyFormat("switch (x) {\n"
8790 "default:\n"
8791 " break;\n"
8792 "}",
8793 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008794
8795 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008796 Spaces.SpacesInCStyleCastParentheses = false;
8797 Spaces.SpaceAfterCStyleCast = true;
8798 verifyFormat("while ((bool) 1)\n"
8799 " continue;",
8800 Spaces);
8801 verifyFormat("do {\n"
8802 " do_something((int) i);\n"
8803 "} while (something( ));",
8804 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008805}
8806
Daniel Jasperad981f82014-08-26 11:41:14 +00008807TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8808 verifyFormat("int a[5];");
8809 verifyFormat("a[3] += 42;");
8810
8811 FormatStyle Spaces = getLLVMStyle();
8812 Spaces.SpacesInSquareBrackets = true;
8813 // Lambdas unchanged.
8814 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8815 verifyFormat("return [i, args...] {};", Spaces);
8816
8817 // Not lambdas.
8818 verifyFormat("int a[ 5 ];", Spaces);
8819 verifyFormat("a[ 3 ] += 42;", Spaces);
8820 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8821 verifyFormat("double &operator[](int i) { return 0; }\n"
8822 "int i;",
8823 Spaces);
8824 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8825 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8826 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8827}
8828
Daniel Jasperd94bff32013-09-25 15:15:02 +00008829TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8830 verifyFormat("int a = 5;");
8831 verifyFormat("a += 42;");
8832 verifyFormat("a or_eq 8;");
8833
8834 FormatStyle Spaces = getLLVMStyle();
8835 Spaces.SpaceBeforeAssignmentOperators = false;
8836 verifyFormat("int a= 5;", Spaces);
8837 verifyFormat("a+= 42;", Spaces);
8838 verifyFormat("a or_eq 8;", Spaces);
8839}
8840
Daniel Jaspera44991332015-04-29 13:06:49 +00008841TEST_F(FormatTest, AlignConsecutiveAssignments) {
8842 FormatStyle Alignment = getLLVMStyle();
8843 Alignment.AlignConsecutiveAssignments = false;
8844 verifyFormat("int a = 5;\n"
8845 "int oneTwoThree = 123;",
8846 Alignment);
8847 verifyFormat("int a = 5;\n"
8848 "int oneTwoThree = 123;",
8849 Alignment);
8850
8851 Alignment.AlignConsecutiveAssignments = true;
8852 verifyFormat("int a = 5;\n"
8853 "int oneTwoThree = 123;",
8854 Alignment);
8855 verifyFormat("int a = method();\n"
8856 "int oneTwoThree = 133;",
8857 Alignment);
8858 verifyFormat("a &= 5;\n"
8859 "bcd *= 5;\n"
8860 "ghtyf += 5;\n"
8861 "dvfvdb -= 5;\n"
8862 "a /= 5;\n"
8863 "vdsvsv %= 5;\n"
8864 "sfdbddfbdfbb ^= 5;\n"
8865 "dvsdsv |= 5;\n"
8866 "int dsvvdvsdvvv = 123;",
8867 Alignment);
8868 verifyFormat("int i = 1, j = 10;\n"
8869 "something = 2000;",
8870 Alignment);
8871 verifyFormat("something = 2000;\n"
8872 "int i = 1, j = 10;\n",
8873 Alignment);
8874 verifyFormat("something = 2000;\n"
8875 "another = 911;\n"
8876 "int i = 1, j = 10;\n"
8877 "oneMore = 1;\n"
8878 "i = 2;",
8879 Alignment);
8880 verifyFormat("int a = 5;\n"
8881 "int one = 1;\n"
8882 "method();\n"
8883 "int oneTwoThree = 123;\n"
8884 "int oneTwo = 12;",
8885 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008886 verifyFormat("int oneTwoThree = 123;\n"
8887 "int oneTwo = 12;\n"
8888 "method();\n",
8889 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008890 verifyFormat("int oneTwoThree = 123; // comment\n"
8891 "int oneTwo = 12; // comment",
8892 Alignment);
8893 EXPECT_EQ("int a = 5;\n"
8894 "\n"
8895 "int oneTwoThree = 123;",
8896 format("int a = 5;\n"
8897 "\n"
8898 "int oneTwoThree= 123;",
8899 Alignment));
8900 EXPECT_EQ("int a = 5;\n"
8901 "int one = 1;\n"
8902 "\n"
8903 "int oneTwoThree = 123;",
8904 format("int a = 5;\n"
8905 "int one = 1;\n"
8906 "\n"
8907 "int oneTwoThree = 123;",
8908 Alignment));
8909 EXPECT_EQ("int a = 5;\n"
8910 "int one = 1;\n"
8911 "\n"
8912 "int oneTwoThree = 123;\n"
8913 "int oneTwo = 12;",
8914 format("int a = 5;\n"
8915 "int one = 1;\n"
8916 "\n"
8917 "int oneTwoThree = 123;\n"
8918 "int oneTwo = 12;",
8919 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008920 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8921 verifyFormat("#define A \\\n"
8922 " int aaaa = 12; \\\n"
8923 " int b = 23; \\\n"
8924 " int ccc = 234; \\\n"
8925 " int dddddddddd = 2345;",
8926 Alignment);
8927 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008928 verifyFormat("#define A \\\n"
8929 " int aaaa = 12; \\\n"
8930 " int b = 23; \\\n"
8931 " int ccc = 234; \\\n"
8932 " int dddddddddd = 2345;",
8933 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008934 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008935 verifyFormat("#define A "
8936 " \\\n"
8937 " int aaaa = 12; "
8938 " \\\n"
8939 " int b = 23; "
8940 " \\\n"
8941 " int ccc = 234; "
8942 " \\\n"
8943 " int dddddddddd = 2345;",
8944 Alignment);
8945 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8946 "k = 4, int l = 5,\n"
8947 " int m = 6) {\n"
8948 " int j = 10;\n"
8949 " otherThing = 1;\n"
8950 "}",
8951 Alignment);
8952 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8953 " int i = 1;\n"
8954 " int j = 2;\n"
8955 " int big = 10000;\n"
8956 "}",
8957 Alignment);
8958 verifyFormat("class C {\n"
8959 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008960 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008961 " virtual void f() = 0;\n"
8962 "};",
8963 Alignment);
8964 verifyFormat("int i = 1;\n"
8965 "if (SomeType t = getSomething()) {\n"
8966 "}\n"
8967 "int j = 2;\n"
8968 "int big = 10000;",
8969 Alignment);
8970 verifyFormat("int j = 7;\n"
8971 "for (int k = 0; k < N; ++k) {\n"
8972 "}\n"
8973 "int j = 2;\n"
8974 "int big = 10000;\n"
8975 "}",
8976 Alignment);
8977 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8978 verifyFormat("int i = 1;\n"
8979 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8980 " = someLooooooooooooooooongFunction();\n"
8981 "int j = 2;",
8982 Alignment);
8983 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8984 verifyFormat("int i = 1;\n"
8985 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8986 " someLooooooooooooooooongFunction();\n"
8987 "int j = 2;",
8988 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008989
8990 verifyFormat("auto lambda = []() {\n"
8991 " auto i = 0;\n"
8992 " return 0;\n"
8993 "};\n"
8994 "int i = 0;\n"
8995 "auto v = type{\n"
8996 " i = 1, //\n"
8997 " (i = 2), //\n"
8998 " i = 3 //\n"
8999 "};",
9000 Alignment);
9001
Daniel Jaspera44991332015-04-29 13:06:49 +00009002 verifyFormat(
9003 "int i = 1;\n"
9004 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9005 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009006 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009007 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009008
9009 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9010 " typename B = very_long_type_name_1,\n"
9011 " typename T_2 = very_long_type_name_2>\n"
9012 "auto foo() {}\n",
9013 Alignment);
9014 verifyFormat("int a, b = 1;\n"
9015 "int c = 2;\n"
9016 "int dd = 3;\n",
9017 Alignment);
9018 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9019 "float b[1][] = {{3.f}};\n",
9020 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009021 verifyFormat("for (int i = 0; i < 1; i++)\n"
9022 " int x = 1;\n",
9023 Alignment);
9024 verifyFormat("for (i = 0; i < 1; i++)\n"
9025 " x = 1;\n"
9026 "y = 1;\n",
9027 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009028}
9029
Daniel Jaspere12597c2015-10-01 10:06:54 +00009030TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9031 FormatStyle Alignment = getLLVMStyle();
9032 Alignment.AlignConsecutiveDeclarations = false;
9033 verifyFormat("float const a = 5;\n"
9034 "int oneTwoThree = 123;",
9035 Alignment);
9036 verifyFormat("int a = 5;\n"
9037 "float const oneTwoThree = 123;",
9038 Alignment);
9039
9040 Alignment.AlignConsecutiveDeclarations = true;
9041 verifyFormat("float const a = 5;\n"
9042 "int oneTwoThree = 123;",
9043 Alignment);
9044 verifyFormat("int a = method();\n"
9045 "float const oneTwoThree = 133;",
9046 Alignment);
9047 verifyFormat("int i = 1, j = 10;\n"
9048 "something = 2000;",
9049 Alignment);
9050 verifyFormat("something = 2000;\n"
9051 "int i = 1, j = 10;\n",
9052 Alignment);
9053 verifyFormat("float something = 2000;\n"
9054 "double another = 911;\n"
9055 "int i = 1, j = 10;\n"
9056 "const int *oneMore = 1;\n"
9057 "unsigned i = 2;",
9058 Alignment);
9059 verifyFormat("float a = 5;\n"
9060 "int one = 1;\n"
9061 "method();\n"
9062 "const double oneTwoThree = 123;\n"
9063 "const unsigned int oneTwo = 12;",
9064 Alignment);
9065 verifyFormat("int oneTwoThree{0}; // comment\n"
9066 "unsigned oneTwo; // comment",
9067 Alignment);
9068 EXPECT_EQ("float const a = 5;\n"
9069 "\n"
9070 "int oneTwoThree = 123;",
9071 format("float const a = 5;\n"
9072 "\n"
9073 "int oneTwoThree= 123;",
9074 Alignment));
9075 EXPECT_EQ("float a = 5;\n"
9076 "int one = 1;\n"
9077 "\n"
9078 "unsigned oneTwoThree = 123;",
9079 format("float a = 5;\n"
9080 "int one = 1;\n"
9081 "\n"
9082 "unsigned oneTwoThree = 123;",
9083 Alignment));
9084 EXPECT_EQ("float a = 5;\n"
9085 "int one = 1;\n"
9086 "\n"
9087 "unsigned oneTwoThree = 123;\n"
9088 "int oneTwo = 12;",
9089 format("float a = 5;\n"
9090 "int one = 1;\n"
9091 "\n"
9092 "unsigned oneTwoThree = 123;\n"
9093 "int oneTwo = 12;",
9094 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009095 // Function prototype alignment
9096 verifyFormat("int a();\n"
9097 "double b();",
9098 Alignment);
9099 verifyFormat("int a(int x);\n"
9100 "double b();",
9101 Alignment);
9102 unsigned OldColumnLimit = Alignment.ColumnLimit;
9103 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9104 // otherwise the function parameters will be re-flowed onto a single line.
9105 Alignment.ColumnLimit = 0;
9106 EXPECT_EQ("int a(int x,\n"
9107 " float y);\n"
9108 "double b(int x,\n"
9109 " double y);",
9110 format("int a(int x,\n"
9111 " float y);\n"
9112 "double b(int x,\n"
9113 " double y);",
9114 Alignment));
9115 // This ensures that function parameters of function declarations are
9116 // correctly indented when their owning functions are indented.
9117 // The failure case here is for 'double y' to not be indented enough.
9118 EXPECT_EQ("double a(int x);\n"
9119 "int b(int y,\n"
9120 " double z);",
9121 format("double a(int x);\n"
9122 "int b(int y,\n"
9123 " double z);",
9124 Alignment));
9125 // Set ColumnLimit low so that we induce wrapping immediately after
9126 // the function name and opening paren.
9127 Alignment.ColumnLimit = 13;
9128 verifyFormat("int function(\n"
9129 " int x,\n"
9130 " bool y);",
9131 Alignment);
9132 Alignment.ColumnLimit = OldColumnLimit;
9133 // Ensure function pointers don't screw up recursive alignment
9134 verifyFormat("int a(int x, void (*fp)(int y));\n"
9135 "double b();",
9136 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009137 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009138 // Ensure recursive alignment is broken by function braces, so that the
9139 // "a = 1" does not align with subsequent assignments inside the function
9140 // body.
9141 verifyFormat("int func(int a = 1) {\n"
9142 " int b = 2;\n"
9143 " int cc = 3;\n"
9144 "}",
9145 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009146 verifyFormat("float something = 2000;\n"
9147 "double another = 911;\n"
9148 "int i = 1, j = 10;\n"
9149 "const int *oneMore = 1;\n"
9150 "unsigned i = 2;",
9151 Alignment);
9152 verifyFormat("int oneTwoThree = {0}; // comment\n"
9153 "unsigned oneTwo = 0; // comment",
9154 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009155 // Make sure that scope is correctly tracked, in the absence of braces
9156 verifyFormat("for (int i = 0; i < n; i++)\n"
9157 " j = i;\n"
9158 "double x = 1;\n",
9159 Alignment);
9160 verifyFormat("if (int i = 0)\n"
9161 " j = i;\n"
9162 "double x = 1;\n",
9163 Alignment);
9164 // Ensure operator[] and operator() are comprehended
9165 verifyFormat("struct test {\n"
9166 " long long int foo();\n"
9167 " int operator[](int a);\n"
9168 " double bar();\n"
9169 "};\n",
9170 Alignment);
9171 verifyFormat("struct test {\n"
9172 " long long int foo();\n"
9173 " int operator()(int a);\n"
9174 " double bar();\n"
9175 "};\n",
9176 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009177 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9178 " int const i = 1;\n"
9179 " int * j = 2;\n"
9180 " int big = 10000;\n"
9181 "\n"
9182 " unsigned oneTwoThree = 123;\n"
9183 " int oneTwo = 12;\n"
9184 " method();\n"
9185 " float k = 2;\n"
9186 " int ll = 10000;\n"
9187 "}",
9188 format("void SomeFunction(int parameter= 0) {\n"
9189 " int const i= 1;\n"
9190 " int *j=2;\n"
9191 " int big = 10000;\n"
9192 "\n"
9193 "unsigned oneTwoThree =123;\n"
9194 "int oneTwo = 12;\n"
9195 " method();\n"
9196 "float k= 2;\n"
9197 "int ll=10000;\n"
9198 "}",
9199 Alignment));
9200 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009201 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9202 verifyFormat("#define A \\\n"
9203 " int aaaa = 12; \\\n"
9204 " float b = 23; \\\n"
9205 " const int ccc = 234; \\\n"
9206 " unsigned dddddddddd = 2345;",
9207 Alignment);
9208 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009209 verifyFormat("#define A \\\n"
9210 " int aaaa = 12; \\\n"
9211 " float b = 23; \\\n"
9212 " const int ccc = 234; \\\n"
9213 " unsigned dddddddddd = 2345;",
9214 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009215 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009216 Alignment.ColumnLimit = 30;
9217 verifyFormat("#define A \\\n"
9218 " int aaaa = 12; \\\n"
9219 " float b = 23; \\\n"
9220 " const int ccc = 234; \\\n"
9221 " int dddddddddd = 2345;",
9222 Alignment);
9223 Alignment.ColumnLimit = 80;
9224 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9225 "k = 4, int l = 5,\n"
9226 " int m = 6) {\n"
9227 " const int j = 10;\n"
9228 " otherThing = 1;\n"
9229 "}",
9230 Alignment);
9231 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9232 " int const i = 1;\n"
9233 " int * j = 2;\n"
9234 " int big = 10000;\n"
9235 "}",
9236 Alignment);
9237 verifyFormat("class C {\n"
9238 "public:\n"
9239 " int i = 1;\n"
9240 " virtual void f() = 0;\n"
9241 "};",
9242 Alignment);
9243 verifyFormat("float i = 1;\n"
9244 "if (SomeType t = getSomething()) {\n"
9245 "}\n"
9246 "const unsigned j = 2;\n"
9247 "int big = 10000;",
9248 Alignment);
9249 verifyFormat("float j = 7;\n"
9250 "for (int k = 0; k < N; ++k) {\n"
9251 "}\n"
9252 "unsigned j = 2;\n"
9253 "int big = 10000;\n"
9254 "}",
9255 Alignment);
9256 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9257 verifyFormat("float i = 1;\n"
9258 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9259 " = someLooooooooooooooooongFunction();\n"
9260 "int j = 2;",
9261 Alignment);
9262 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9263 verifyFormat("int i = 1;\n"
9264 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9265 " someLooooooooooooooooongFunction();\n"
9266 "int j = 2;",
9267 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009268
9269 Alignment.AlignConsecutiveAssignments = true;
9270 verifyFormat("auto lambda = []() {\n"
9271 " auto ii = 0;\n"
9272 " float j = 0;\n"
9273 " return 0;\n"
9274 "};\n"
9275 "int i = 0;\n"
9276 "float i2 = 0;\n"
9277 "auto v = type{\n"
9278 " i = 1, //\n"
9279 " (i = 2), //\n"
9280 " i = 3 //\n"
9281 "};",
9282 Alignment);
9283 Alignment.AlignConsecutiveAssignments = false;
9284
Daniel Jaspere12597c2015-10-01 10:06:54 +00009285 verifyFormat(
9286 "int i = 1;\n"
9287 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9288 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009289 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009290 Alignment);
9291
9292 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9293 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009294 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009295 // happens.
9296 Alignment.AlignConsecutiveAssignments = true;
9297 Alignment.ColumnLimit = 30;
9298 verifyFormat("float ii = 1;\n"
9299 "unsigned j = 2;\n"
9300 "int someVerylongVariable = 1;\n"
9301 "AnotherLongType ll = 123456;\n"
9302 "VeryVeryLongType k = 2;\n"
9303 "int myvar = 1;",
9304 Alignment);
9305 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009306 Alignment.AlignConsecutiveAssignments = false;
9307
9308 verifyFormat(
9309 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9310 " typename LongType, typename B>\n"
9311 "auto foo() {}\n",
9312 Alignment);
9313 verifyFormat("float a, b = 1;\n"
9314 "int c = 2;\n"
9315 "int dd = 3;\n",
9316 Alignment);
9317 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9318 "float b[1][] = {{3.f}};\n",
9319 Alignment);
9320 Alignment.AlignConsecutiveAssignments = true;
9321 verifyFormat("float a, b = 1;\n"
9322 "int c = 2;\n"
9323 "int dd = 3;\n",
9324 Alignment);
9325 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9326 "float b[1][] = {{3.f}};\n",
9327 Alignment);
9328 Alignment.AlignConsecutiveAssignments = false;
9329
9330 Alignment.ColumnLimit = 30;
9331 Alignment.BinPackParameters = false;
9332 verifyFormat("void foo(float a,\n"
9333 " float b,\n"
9334 " int c,\n"
9335 " uint32_t *d) {\n"
9336 " int * e = 0;\n"
9337 " float f = 0;\n"
9338 " double g = 0;\n"
9339 "}\n"
9340 "void bar(ino_t a,\n"
9341 " int b,\n"
9342 " uint32_t *c,\n"
9343 " bool d) {}\n",
9344 Alignment);
9345 Alignment.BinPackParameters = true;
9346 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009347
9348 // Bug 33507
9349 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9350 verifyFormat(
9351 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9352 " static const Version verVs2017;\n"
9353 " return true;\n"
9354 "});\n",
9355 Alignment);
9356 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009357}
9358
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009359TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009360 FormatStyle LinuxBraceStyle = getLLVMStyle();
9361 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009362 verifyFormat("namespace a\n"
9363 "{\n"
9364 "class A\n"
9365 "{\n"
9366 " void f()\n"
9367 " {\n"
9368 " if (true) {\n"
9369 " a();\n"
9370 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009371 " } else {\n"
9372 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009373 " }\n"
9374 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009375 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009376 "};\n"
9377 "struct B {\n"
9378 " int x;\n"
9379 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009380 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009381 LinuxBraceStyle);
9382 verifyFormat("enum X {\n"
9383 " Y = 0,\n"
9384 "}\n",
9385 LinuxBraceStyle);
9386 verifyFormat("struct S {\n"
9387 " int Type;\n"
9388 " union {\n"
9389 " int x;\n"
9390 " double y;\n"
9391 " } Value;\n"
9392 " class C\n"
9393 " {\n"
9394 " MyFavoriteType Value;\n"
9395 " } Class;\n"
9396 "}\n",
9397 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009398}
9399
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009400TEST_F(FormatTest, MozillaBraceBreaking) {
9401 FormatStyle MozillaBraceStyle = getLLVMStyle();
9402 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009403 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009404 verifyFormat("namespace a {\n"
9405 "class A\n"
9406 "{\n"
9407 " void f()\n"
9408 " {\n"
9409 " if (true) {\n"
9410 " a();\n"
9411 " b();\n"
9412 " }\n"
9413 " }\n"
9414 " void g() { return; }\n"
9415 "};\n"
9416 "enum E\n"
9417 "{\n"
9418 " A,\n"
9419 " // foo\n"
9420 " B,\n"
9421 " C\n"
9422 "};\n"
9423 "struct B\n"
9424 "{\n"
9425 " int x;\n"
9426 "};\n"
9427 "}\n",
9428 MozillaBraceStyle);
9429 verifyFormat("struct S\n"
9430 "{\n"
9431 " int Type;\n"
9432 " union\n"
9433 " {\n"
9434 " int x;\n"
9435 " double y;\n"
9436 " } Value;\n"
9437 " class C\n"
9438 " {\n"
9439 " MyFavoriteType Value;\n"
9440 " } Class;\n"
9441 "}\n",
9442 MozillaBraceStyle);
9443}
9444
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009445TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009446 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9447 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009448 verifyFormat("namespace a {\n"
9449 "class A {\n"
9450 " void f()\n"
9451 " {\n"
9452 " if (true) {\n"
9453 " a();\n"
9454 " b();\n"
9455 " }\n"
9456 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009457 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009458 "};\n"
9459 "struct B {\n"
9460 " int x;\n"
9461 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009462 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009463 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009464
Daniel Jasperd9670872014-08-05 12:06:20 +00009465 verifyFormat("void foo()\n"
9466 "{\n"
9467 " if (a) {\n"
9468 " a();\n"
9469 " }\n"
9470 " else {\n"
9471 " b();\n"
9472 " }\n"
9473 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009474 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009475
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009476 verifyFormat("#ifdef _DEBUG\n"
9477 "int foo(int i = 0)\n"
9478 "#else\n"
9479 "int foo(int i = 5)\n"
9480 "#endif\n"
9481 "{\n"
9482 " return i;\n"
9483 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009484 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009485
9486 verifyFormat("void foo() {}\n"
9487 "void bar()\n"
9488 "#ifdef _DEBUG\n"
9489 "{\n"
9490 " foo();\n"
9491 "}\n"
9492 "#else\n"
9493 "{\n"
9494 "}\n"
9495 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009496 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009497
9498 verifyFormat("void foobar() { int i = 5; }\n"
9499 "#ifdef _DEBUG\n"
9500 "void bar() {}\n"
9501 "#else\n"
9502 "void bar() { foobar(); }\n"
9503 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009504 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009505}
9506
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009507TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009508 FormatStyle AllmanBraceStyle = getLLVMStyle();
9509 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009510
9511 EXPECT_EQ("namespace a\n"
9512 "{\n"
9513 "void f();\n"
9514 "void g();\n"
9515 "} // namespace a\n",
9516 format("namespace a\n"
9517 "{\n"
9518 "void f();\n"
9519 "void g();\n"
9520 "}\n",
9521 AllmanBraceStyle));
9522
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009523 verifyFormat("namespace a\n"
9524 "{\n"
9525 "class A\n"
9526 "{\n"
9527 " void f()\n"
9528 " {\n"
9529 " if (true)\n"
9530 " {\n"
9531 " a();\n"
9532 " b();\n"
9533 " }\n"
9534 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009535 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009536 "};\n"
9537 "struct B\n"
9538 "{\n"
9539 " int x;\n"
9540 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009541 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009542 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009543
9544 verifyFormat("void f()\n"
9545 "{\n"
9546 " if (true)\n"
9547 " {\n"
9548 " a();\n"
9549 " }\n"
9550 " else if (false)\n"
9551 " {\n"
9552 " b();\n"
9553 " }\n"
9554 " else\n"
9555 " {\n"
9556 " c();\n"
9557 " }\n"
9558 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009559 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009560
9561 verifyFormat("void f()\n"
9562 "{\n"
9563 " for (int i = 0; i < 10; ++i)\n"
9564 " {\n"
9565 " a();\n"
9566 " }\n"
9567 " while (false)\n"
9568 " {\n"
9569 " b();\n"
9570 " }\n"
9571 " do\n"
9572 " {\n"
9573 " c();\n"
9574 " } while (false)\n"
9575 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009576 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009577
9578 verifyFormat("void f(int a)\n"
9579 "{\n"
9580 " switch (a)\n"
9581 " {\n"
9582 " case 0:\n"
9583 " break;\n"
9584 " case 1:\n"
9585 " {\n"
9586 " break;\n"
9587 " }\n"
9588 " case 2:\n"
9589 " {\n"
9590 " }\n"
9591 " break;\n"
9592 " default:\n"
9593 " break;\n"
9594 " }\n"
9595 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009596 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009597
9598 verifyFormat("enum X\n"
9599 "{\n"
9600 " Y = 0,\n"
9601 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009602 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009603 verifyFormat("enum X\n"
9604 "{\n"
9605 " Y = 0\n"
9606 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009607 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009608
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009609 verifyFormat("@interface BSApplicationController ()\n"
9610 "{\n"
9611 "@private\n"
9612 " id _extraIvar;\n"
9613 "}\n"
9614 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009615 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009616
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009617 verifyFormat("#ifdef _DEBUG\n"
9618 "int foo(int i = 0)\n"
9619 "#else\n"
9620 "int foo(int i = 5)\n"
9621 "#endif\n"
9622 "{\n"
9623 " return i;\n"
9624 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009625 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009626
9627 verifyFormat("void foo() {}\n"
9628 "void bar()\n"
9629 "#ifdef _DEBUG\n"
9630 "{\n"
9631 " foo();\n"
9632 "}\n"
9633 "#else\n"
9634 "{\n"
9635 "}\n"
9636 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009637 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009638
9639 verifyFormat("void foobar() { int i = 5; }\n"
9640 "#ifdef _DEBUG\n"
9641 "void bar() {}\n"
9642 "#else\n"
9643 "void bar() { foobar(); }\n"
9644 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009645 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009646
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009647 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009648 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009649 " // ...\n"
9650 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009651 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009652 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009653 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009654 " // ...\n"
9655 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009656 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009657 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009658 // .. or dict literals.
9659 verifyFormat("void f()\n"
9660 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009661 " // ...\n"
9662 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9663 "}",
9664 AllmanBraceStyle);
9665 verifyFormat("void f()\n"
9666 "{\n"
9667 " // ...\n"
9668 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009669 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009670 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009671 verifyFormat("int f()\n"
9672 "{ // comment\n"
9673 " return 42;\n"
9674 "}",
9675 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009676
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009677 AllmanBraceStyle.ColumnLimit = 19;
9678 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9679 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009680 verifyFormat("void f()\n"
9681 "{\n"
9682 " int i;\n"
9683 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009684 AllmanBraceStyle);
9685 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009686
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009687 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009688 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9689 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9690 verifyFormat("void f(bool b)\n"
9691 "{\n"
9692 " if (b)\n"
9693 " {\n"
9694 " return;\n"
9695 " }\n"
9696 "}\n",
9697 BreakBeforeBraceShortIfs);
9698 verifyFormat("void f(bool b)\n"
9699 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009700 " if constexpr (b)\n"
9701 " {\n"
9702 " return;\n"
9703 " }\n"
9704 "}\n",
9705 BreakBeforeBraceShortIfs);
9706 verifyFormat("void f(bool b)\n"
9707 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009708 " if (b) return;\n"
9709 "}\n",
9710 BreakBeforeBraceShortIfs);
9711 verifyFormat("void f(bool b)\n"
9712 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009713 " if constexpr (b) return;\n"
9714 "}\n",
9715 BreakBeforeBraceShortIfs);
9716 verifyFormat("void f(bool b)\n"
9717 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009718 " while (b)\n"
9719 " {\n"
9720 " return;\n"
9721 " }\n"
9722 "}\n",
9723 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009724}
9725
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009726TEST_F(FormatTest, GNUBraceBreaking) {
9727 FormatStyle GNUBraceStyle = getLLVMStyle();
9728 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9729 verifyFormat("namespace a\n"
9730 "{\n"
9731 "class A\n"
9732 "{\n"
9733 " void f()\n"
9734 " {\n"
9735 " int a;\n"
9736 " {\n"
9737 " int b;\n"
9738 " }\n"
9739 " if (true)\n"
9740 " {\n"
9741 " a();\n"
9742 " b();\n"
9743 " }\n"
9744 " }\n"
9745 " void g() { return; }\n"
9746 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009747 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009748 GNUBraceStyle);
9749
9750 verifyFormat("void f()\n"
9751 "{\n"
9752 " if (true)\n"
9753 " {\n"
9754 " a();\n"
9755 " }\n"
9756 " else if (false)\n"
9757 " {\n"
9758 " b();\n"
9759 " }\n"
9760 " else\n"
9761 " {\n"
9762 " c();\n"
9763 " }\n"
9764 "}\n",
9765 GNUBraceStyle);
9766
9767 verifyFormat("void f()\n"
9768 "{\n"
9769 " for (int i = 0; i < 10; ++i)\n"
9770 " {\n"
9771 " a();\n"
9772 " }\n"
9773 " while (false)\n"
9774 " {\n"
9775 " b();\n"
9776 " }\n"
9777 " do\n"
9778 " {\n"
9779 " c();\n"
9780 " }\n"
9781 " while (false);\n"
9782 "}\n",
9783 GNUBraceStyle);
9784
9785 verifyFormat("void f(int a)\n"
9786 "{\n"
9787 " switch (a)\n"
9788 " {\n"
9789 " case 0:\n"
9790 " break;\n"
9791 " case 1:\n"
9792 " {\n"
9793 " break;\n"
9794 " }\n"
9795 " case 2:\n"
9796 " {\n"
9797 " }\n"
9798 " break;\n"
9799 " default:\n"
9800 " break;\n"
9801 " }\n"
9802 "}\n",
9803 GNUBraceStyle);
9804
9805 verifyFormat("enum X\n"
9806 "{\n"
9807 " Y = 0,\n"
9808 "}\n",
9809 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009810
9811 verifyFormat("@interface BSApplicationController ()\n"
9812 "{\n"
9813 "@private\n"
9814 " id _extraIvar;\n"
9815 "}\n"
9816 "@end\n",
9817 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009818
9819 verifyFormat("#ifdef _DEBUG\n"
9820 "int foo(int i = 0)\n"
9821 "#else\n"
9822 "int foo(int i = 5)\n"
9823 "#endif\n"
9824 "{\n"
9825 " return i;\n"
9826 "}",
9827 GNUBraceStyle);
9828
9829 verifyFormat("void foo() {}\n"
9830 "void bar()\n"
9831 "#ifdef _DEBUG\n"
9832 "{\n"
9833 " foo();\n"
9834 "}\n"
9835 "#else\n"
9836 "{\n"
9837 "}\n"
9838 "#endif",
9839 GNUBraceStyle);
9840
9841 verifyFormat("void foobar() { int i = 5; }\n"
9842 "#ifdef _DEBUG\n"
9843 "void bar() {}\n"
9844 "#else\n"
9845 "void bar() { foobar(); }\n"
9846 "#endif",
9847 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009848}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009849
9850TEST_F(FormatTest, WebKitBraceBreaking) {
9851 FormatStyle WebKitBraceStyle = getLLVMStyle();
9852 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009853 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009854 verifyFormat("namespace a {\n"
9855 "class A {\n"
9856 " void f()\n"
9857 " {\n"
9858 " if (true) {\n"
9859 " a();\n"
9860 " b();\n"
9861 " }\n"
9862 " }\n"
9863 " void g() { return; }\n"
9864 "};\n"
9865 "enum E {\n"
9866 " A,\n"
9867 " // foo\n"
9868 " B,\n"
9869 " C\n"
9870 "};\n"
9871 "struct B {\n"
9872 " int x;\n"
9873 "};\n"
9874 "}\n",
9875 WebKitBraceStyle);
9876 verifyFormat("struct S {\n"
9877 " int Type;\n"
9878 " union {\n"
9879 " int x;\n"
9880 " double y;\n"
9881 " } Value;\n"
9882 " class C {\n"
9883 " MyFavoriteType Value;\n"
9884 " } Class;\n"
9885 "};\n",
9886 WebKitBraceStyle);
9887}
9888
Manuel Klimekd5735502013-08-12 03:51:17 +00009889TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9890 verifyFormat("void f() {\n"
9891 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009892 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009893 " }\n"
9894 "}\n",
9895 getLLVMStyle());
9896}
9897
Daniel Jasper9613c812013-08-07 16:29:23 +00009898TEST_F(FormatTest, UnderstandsPragmas) {
9899 verifyFormat("#pragma omp reduction(| : var)");
9900 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009901
9902 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9903 "(including parentheses).",
9904 format("#pragma mark Any non-hyphenated or hyphenated string "
9905 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009906}
9907
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009908TEST_F(FormatTest, UnderstandPragmaOption) {
9909 verifyFormat("#pragma option -C -A");
9910
9911 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9912}
9913
Manuel Klimek77866142017-11-17 11:17:15 +00009914TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
9915 FormatStyle Style = getLLVMStyle();
9916 Style.ColumnLimit = 20;
9917
9918 verifyFormat("int a; // the\n"
9919 " // comment", Style);
9920 EXPECT_EQ("int a; /* first line\n"
9921 " * second\n"
9922 " * line third\n"
9923 " * line\n"
9924 " */",
9925 format("int a; /* first line\n"
9926 " * second\n"
9927 " * line third\n"
9928 " * line\n"
9929 " */",
9930 Style));
9931 EXPECT_EQ("int a; // first line\n"
9932 " // second\n"
9933 " // line third\n"
9934 " // line",
9935 format("int a; // first line\n"
9936 " // second line\n"
9937 " // third line",
9938 Style));
9939
9940 Style.PenaltyExcessCharacter = 90;
9941 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +00009942 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009943 " // aaa",
9944 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +00009945 EXPECT_EQ("int a; /* first line\n"
9946 " * second line\n"
9947 " * third line\n"
9948 " */",
9949 format("int a; /* first line\n"
9950 " * second line\n"
9951 " * third line\n"
9952 " */",
9953 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +00009954 EXPECT_EQ("int a; // first line\n"
9955 " // second line\n"
9956 " // third line",
9957 format("int a; // first line\n"
9958 " // second line\n"
9959 " // third line",
9960 Style));
Manuel Klimek77866142017-11-17 11:17:15 +00009961 // FIXME: Investigate why this is not getting the same layout as the test
9962 // above.
9963 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +00009964 " * second line\n"
9965 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +00009966 " */",
9967 format("int a; /* first line second line third line"
9968 "\n*/",
9969 Style));
9970
9971 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009972 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009973 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009974 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009975 Style));
9976 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009977 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009978 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009979 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009980 Style));
9981
9982 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
9983 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +00009984 EXPECT_EQ("// foo bar baz bazfoo\n"
9985 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009986 format("// foo bar baz bazfoo bar\n"
9987 "// foo bar\n",
9988 Style));
9989
9990 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +00009991 "// foo bar baz bazfoo\n"
9992 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009993 format("// foo bar baz bazfoo\n"
9994 "// foo bar baz bazfoo bar\n"
9995 "// foo bar\n",
9996 Style));
9997
Manuel Klimek77866142017-11-17 11:17:15 +00009998 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +00009999 "// foo bar baz bazfoo\n"
10000 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010001 format("// foo bar baz bazfoo\n"
10002 "// foo bar baz bazfoo bar\n"
10003 "// foo bar\n",
10004 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010005
10006 // Make sure we do not keep protruding characters if strict mode reflow is
10007 // cheaper than keeping protruding characters.
10008 Style.ColumnLimit = 21;
10009 EXPECT_EQ("// foo foo foo foo\n"
10010 "// foo foo foo foo\n"
10011 "// foo foo foo foo\n",
10012 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10013 Style));
10014
10015 EXPECT_EQ("int a = /* long block\n"
10016 " comment */\n"
10017 " 42;",
10018 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010019}
10020
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010021#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10022 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010023 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10024 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010025
10026TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010027 SmallVector<FormatStyle, 3> Styles;
10028 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010029
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010030 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010031 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10032 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10033 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010034
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010035 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010036 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10037 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10038 EXPECT_ALL_STYLES_EQUAL(Styles);
10039
Nico Weber514ecc82014-02-02 20:50:45 +000010040 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010041 EXPECT_TRUE(
10042 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10043 EXPECT_TRUE(
10044 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10045 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010046
Nico Weber514ecc82014-02-02 20:50:45 +000010047 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010048 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10049 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10050 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010051
10052 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010053 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10054 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10055 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010056
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010057 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010058 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10059 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10060 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010061
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010062 Styles[0] = getGNUStyle();
10063 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10064 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10065 EXPECT_ALL_STYLES_EQUAL(Styles);
10066
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010067 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10068}
10069
10070TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10071 SmallVector<FormatStyle, 8> Styles;
10072 Styles.resize(2);
10073
10074 Styles[0] = getGoogleStyle();
10075 Styles[1] = getLLVMStyle();
10076 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10077 EXPECT_ALL_STYLES_EQUAL(Styles);
10078
10079 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010080 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010081 Styles[1] = getLLVMStyle();
10082 Styles[1].Language = FormatStyle::LK_JavaScript;
10083 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10084
10085 Styles[2] = getLLVMStyle();
10086 Styles[2].Language = FormatStyle::LK_JavaScript;
10087 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10088 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010089 &Styles[2])
10090 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010091
10092 Styles[3] = getLLVMStyle();
10093 Styles[3].Language = FormatStyle::LK_JavaScript;
10094 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10095 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010096 &Styles[3])
10097 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010098
10099 Styles[4] = getLLVMStyle();
10100 Styles[4].Language = FormatStyle::LK_JavaScript;
10101 EXPECT_EQ(0, parseConfiguration("---\n"
10102 "BasedOnStyle: LLVM\n"
10103 "IndentWidth: 123\n"
10104 "---\n"
10105 "BasedOnStyle: Google\n"
10106 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010107 &Styles[4])
10108 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010109 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010110}
10111
Daniel Jasper91881d92014-09-29 08:07:46 +000010112#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010113 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010114 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010115 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010116 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010117 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010118
Daniel Jasper91881d92014-09-29 08:07:46 +000010119#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10120
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010121#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10122 Style.STRUCT.FIELD = false; \
10123 EXPECT_EQ(0, \
10124 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10125 .value()); \
10126 EXPECT_TRUE(Style.STRUCT.FIELD); \
10127 EXPECT_EQ(0, \
10128 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10129 .value()); \
10130 EXPECT_FALSE(Style.STRUCT.FIELD);
10131
10132#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10133 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10134
Daniel Jasper00853002014-09-16 16:22:30 +000010135#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10136 EXPECT_NE(VALUE, Style.FIELD); \
10137 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10138 EXPECT_EQ(VALUE, Style.FIELD)
10139
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010140TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010141 FormatStyle Style = {};
10142 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010143 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010144 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010145 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010146 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010147 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010148 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010149 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010150 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010151 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010152 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010153 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010154 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010155 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010156 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010157 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010158 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010159 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010160 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010161 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010162 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010163 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010164 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010165 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010166 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010167 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010168 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010169 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010170 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010171 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010172 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010173 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010174 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010175 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010176 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010177 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010178 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010179 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010180 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010181 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010182
10183 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10184 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10185 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10186 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10187 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10188 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10189 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10190 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010191 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010192 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10193 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10194 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010195 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10196 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10197 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010198}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010199
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010200#undef CHECK_PARSE_BOOL
10201
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010202TEST_F(FormatTest, ParsesConfiguration) {
10203 FormatStyle Style = {};
10204 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010206 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10207 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010208 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010209 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10210 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010211 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10212 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010213 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10214 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010215 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10216 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10217 PenaltyReturnTypeOnItsOwnLine, 1234u);
10218 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10219 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010220 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010221 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010222 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010223
Daniel Jasper553d4872014-06-17 12:40:34 +000010224 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010225 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10226 FormatStyle::PAS_Left);
10227 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10228 FormatStyle::PAS_Right);
10229 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10230 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010231 // For backward compatibility:
10232 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10233 FormatStyle::PAS_Left);
10234 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10235 FormatStyle::PAS_Right);
10236 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10237 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010238
Alexander Kornienkod6538332013-05-07 15:32:14 +000010239 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010240 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10241 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010242 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10243 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10244 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10245
Daniel Jasperac043c92014-09-15 11:11:00 +000010246 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010247 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10248 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010249 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10250 FormatStyle::BOS_None);
10251 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10252 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010253 // For backward compatibility:
10254 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10255 FormatStyle::BOS_None);
10256 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10257 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010258
Francois Ferranda6b6d512017-05-24 11:36:58 +000010259 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10260 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10261 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10262 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10263 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10264 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10265 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10266 // For backward compatibility:
10267 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10268 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10269
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010270 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10271 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10272 FormatStyle::BAS_Align);
10273 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10274 FormatStyle::BAS_DontAlign);
10275 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10276 FormatStyle::BAS_AlwaysBreak);
10277 // For backward compatibility:
10278 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10279 FormatStyle::BAS_DontAlign);
10280 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10281 FormatStyle::BAS_Align);
10282
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010283 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10284 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10285 FormatStyle::ENAS_DontAlign);
10286 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10287 FormatStyle::ENAS_Left);
10288 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10289 FormatStyle::ENAS_Right);
10290 // For backward compatibility:
10291 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10292 FormatStyle::ENAS_Left);
10293 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10294 FormatStyle::ENAS_Right);
10295
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010296 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010297 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10298 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10299 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010300 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10301 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010302 // For backward compatibility:
10303 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10304 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010305
Daniel Jasperd74cf402014-04-08 12:46:38 +000010306 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010307 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10308 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10309 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10310 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010311 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10312 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010313 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10314 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010315 // For backward compatibility:
10316 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10317 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10318 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10319 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010320
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010321 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10322 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10323 FormatStyle::SBPO_Never);
10324 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10325 FormatStyle::SBPO_Always);
10326 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10327 FormatStyle::SBPO_ControlStatements);
10328 // For backward compatibility:
10329 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10330 FormatStyle::SBPO_Never);
10331 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10332 FormatStyle::SBPO_ControlStatements);
10333
Alexander Kornienkod6538332013-05-07 15:32:14 +000010334 Style.ColumnLimit = 123;
10335 FormatStyle BaseStyle = getLLVMStyle();
10336 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10337 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10338
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010339 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10340 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10341 FormatStyle::BS_Attach);
10342 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10343 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010344 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10345 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010346 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10347 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010348 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10349 FormatStyle::BS_Allman);
10350 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010351 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10352 FormatStyle::BS_WebKit);
10353 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10354 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010355
Zachary Turner448592e2015-12-18 22:20:15 +000010356 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10357 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10358 FormatStyle::RTBS_None);
10359 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10360 FormatStyle::RTBS_All);
10361 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010362 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010363 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10364 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10365 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10366 AlwaysBreakAfterReturnType,
10367 FormatStyle::RTBS_TopLevelDefinitions);
10368
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010369 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10370 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10371 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10372 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10373 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10374 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10375 AlwaysBreakAfterDefinitionReturnType,
10376 FormatStyle::DRTBS_TopLevel);
10377
Daniel Jasper65ee3472013-07-31 23:16:02 +000010378 Style.NamespaceIndentation = FormatStyle::NI_All;
10379 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10380 FormatStyle::NI_None);
10381 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10382 FormatStyle::NI_Inner);
10383 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10384 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010385
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010386 // FIXME: This is required because parsing a configuration simply overwrites
10387 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010388 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010389 std::vector<std::string> BoostForeach;
10390 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010391 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010392 std::vector<std::string> BoostAndQForeach;
10393 BoostAndQForeach.push_back("BOOST_FOREACH");
10394 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010395 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10396 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010397
10398 Style.IncludeCategories.clear();
10399 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10400 {".*", 1}};
10401 CHECK_PARSE("IncludeCategories:\n"
10402 " - Regex: abc/.*\n"
10403 " Priority: 2\n"
10404 " - Regex: .*\n"
10405 " Priority: 1",
10406 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010407 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010408
10409 Style.RawStringFormats.clear();
10410 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010411 {
10412 FormatStyle::LK_TextProto,
10413 {"pb", "proto"},
10414 {"PARSE_TEXT_PROTO"},
10415 "llvm",
10416 },
10417 {
10418 FormatStyle::LK_Cpp,
10419 {"cc", "cpp"},
10420 {"C_CODEBLOCK", "CPPEVAL"},
10421 "",
10422 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010423 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010424
10425 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010426 " - Language: TextProto\n"
10427 " Delimiters:\n"
10428 " - 'pb'\n"
10429 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010430 " EnclosingFunctions:\n"
10431 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010432 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010433 " - Language: Cpp\n"
10434 " Delimiters:\n"
10435 " - 'cc'\n"
10436 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010437 " EnclosingFunctions:\n"
10438 " - 'C_CODEBLOCK'\n"
10439 " - 'CPPEVAL'\n",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010440 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010441}
10442
10443TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10444 FormatStyle Style = {};
10445 Style.Language = FormatStyle::LK_Cpp;
10446 CHECK_PARSE("Language: Cpp\n"
10447 "IndentWidth: 12",
10448 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010449 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10450 "IndentWidth: 34",
10451 &Style),
10452 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010453 EXPECT_EQ(12u, Style.IndentWidth);
10454 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10455 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10456
10457 Style.Language = FormatStyle::LK_JavaScript;
10458 CHECK_PARSE("Language: JavaScript\n"
10459 "IndentWidth: 12",
10460 IndentWidth, 12u);
10461 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010462 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10463 "IndentWidth: 34",
10464 &Style),
10465 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010466 EXPECT_EQ(23u, Style.IndentWidth);
10467 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10468 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10469
10470 CHECK_PARSE("BasedOnStyle: LLVM\n"
10471 "IndentWidth: 67",
10472 IndentWidth, 67u);
10473
10474 CHECK_PARSE("---\n"
10475 "Language: JavaScript\n"
10476 "IndentWidth: 12\n"
10477 "---\n"
10478 "Language: Cpp\n"
10479 "IndentWidth: 34\n"
10480 "...\n",
10481 IndentWidth, 12u);
10482
10483 Style.Language = FormatStyle::LK_Cpp;
10484 CHECK_PARSE("---\n"
10485 "Language: JavaScript\n"
10486 "IndentWidth: 12\n"
10487 "---\n"
10488 "Language: Cpp\n"
10489 "IndentWidth: 34\n"
10490 "...\n",
10491 IndentWidth, 34u);
10492 CHECK_PARSE("---\n"
10493 "IndentWidth: 78\n"
10494 "---\n"
10495 "Language: JavaScript\n"
10496 "IndentWidth: 56\n"
10497 "...\n",
10498 IndentWidth, 78u);
10499
10500 Style.ColumnLimit = 123;
10501 Style.IndentWidth = 234;
10502 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10503 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010504 EXPECT_FALSE(parseConfiguration("---\n"
10505 "IndentWidth: 456\n"
10506 "BreakBeforeBraces: Allman\n"
10507 "---\n"
10508 "Language: JavaScript\n"
10509 "IndentWidth: 111\n"
10510 "TabWidth: 111\n"
10511 "---\n"
10512 "Language: Cpp\n"
10513 "BreakBeforeBraces: Stroustrup\n"
10514 "TabWidth: 789\n"
10515 "...\n",
10516 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010517 EXPECT_EQ(123u, Style.ColumnLimit);
10518 EXPECT_EQ(456u, Style.IndentWidth);
10519 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10520 EXPECT_EQ(789u, Style.TabWidth);
10521
Rafael Espindola1f243172014-06-12 11:35:17 +000010522 EXPECT_EQ(parseConfiguration("---\n"
10523 "Language: JavaScript\n"
10524 "IndentWidth: 56\n"
10525 "---\n"
10526 "IndentWidth: 78\n"
10527 "...\n",
10528 &Style),
10529 ParseError::Error);
10530 EXPECT_EQ(parseConfiguration("---\n"
10531 "Language: JavaScript\n"
10532 "IndentWidth: 56\n"
10533 "---\n"
10534 "Language: JavaScript\n"
10535 "IndentWidth: 78\n"
10536 "...\n",
10537 &Style),
10538 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010539
10540 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10541}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010542
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010543#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010544
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010545TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10546 FormatStyle Style = {};
10547 Style.Language = FormatStyle::LK_JavaScript;
10548 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010549 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010550 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010551
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010552 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010553 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010554 "BasedOnStyle: Google\n"
10555 "---\n"
10556 "Language: JavaScript\n"
10557 "IndentWidth: 76\n"
10558 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010559 &Style)
10560 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010561 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010562 EXPECT_EQ(76u, Style.IndentWidth);
10563 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10564}
10565
Alexander Kornienkod6538332013-05-07 15:32:14 +000010566TEST_F(FormatTest, ConfigurationRoundTripTest) {
10567 FormatStyle Style = getLLVMStyle();
10568 std::string YAML = configurationAsText(Style);
10569 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010570 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010571 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10572 EXPECT_EQ(Style, ParsedStyle);
10573}
10574
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010575TEST_F(FormatTest, WorksFor8bitEncodings) {
10576 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10577 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10578 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10579 "\"\xef\xee\xf0\xf3...\"",
10580 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10581 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10582 "\xef\xee\xf0\xf3...\"",
10583 getLLVMStyleWithColumns(12)));
10584}
10585
Alexander Kornienko393e3082013-11-13 14:04:17 +000010586TEST_F(FormatTest, HandlesUTF8BOM) {
10587 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10588 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10589 format("\xef\xbb\xbf#include <iostream>"));
10590 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10591 format("\xef\xbb\xbf\n#include <iostream>"));
10592}
10593
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010594// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10595#if !defined(_MSC_VER)
10596
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010597TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10598 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10599 getLLVMStyleWithColumns(35));
10600 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010601 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010602 verifyFormat("// Однажды в студёную зимнюю пору...",
10603 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010604 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010605 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10606 getLLVMStyleWithColumns(39));
10607 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010608 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010609}
10610
10611TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010612 // Non-printable characters' width is currently considered to be the length in
10613 // bytes in UTF8. The characters can be displayed in very different manner
10614 // (zero-width, single width with a substitution glyph, expanded to their code
10615 // (e.g. "<8d>"), so there's no single correct way to handle them.
10616 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010617 "\"\xc2\x8d\";",
10618 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010619 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010620 "\"\xc2\x8d\";",
10621 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010622 EXPECT_EQ("\"Однажды, в \"\n"
10623 "\"студёную \"\n"
10624 "\"зимнюю \"\n"
10625 "\"пору,\"",
10626 format("\"Однажды, в студёную зимнюю пору,\"",
10627 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010628 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010629 "\"一 二 三 \"\n"
10630 "\"四 五六 \"\n"
10631 "\"七 八 九 \"\n"
10632 "\"十\"",
10633 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010634 EXPECT_EQ("\"一\t\"\n"
10635 "\"二 \t\"\n"
10636 "\"三 四 \"\n"
10637 "\"五\t\"\n"
10638 "\"六 \t\"\n"
10639 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010640 "\"八九十\tqq\"",
10641 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10642 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010643
10644 // UTF8 character in an escape sequence.
10645 EXPECT_EQ("\"aaaaaa\"\n"
10646 "\"\\\xC2\x8D\"",
10647 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010648}
10649
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010650TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10651 EXPECT_EQ("const char *sssss =\n"
10652 " \"一二三四五六七八\\\n"
10653 " 九 十\";",
10654 format("const char *sssss = \"一二三四五六七八\\\n"
10655 " 九 十\";",
10656 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010657}
10658
10659TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010660 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10661 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010662 EXPECT_EQ("// Я из лесу\n"
10663 "// вышел; был\n"
10664 "// сильный\n"
10665 "// мороз.",
10666 format("// Я из лесу вышел; был сильный мороз.",
10667 getLLVMStyleWithColumns(13)));
10668 EXPECT_EQ("// 一二三\n"
10669 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010670 "// 八 九\n"
10671 "// 十",
10672 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010673}
10674
10675TEST_F(FormatTest, SplitsUTF8BlockComments) {
10676 EXPECT_EQ("/* Гляжу,\n"
10677 " * поднимается\n"
10678 " * медленно в\n"
10679 " * гору\n"
10680 " * Лошадка,\n"
10681 " * везущая\n"
10682 " * хворосту\n"
10683 " * воз. */",
10684 format("/* Гляжу, поднимается медленно в гору\n"
10685 " * Лошадка, везущая хворосту воз. */",
10686 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010687 EXPECT_EQ(
10688 "/* 一二三\n"
10689 " * 四五六七\n"
10690 " * 八 九\n"
10691 " * 十 */",
10692 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010693 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10694 " * 𝕓𝕪𝕥𝕖\n"
10695 " * 𝖀𝕿𝕱-𝟠 */",
10696 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010697}
10698
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010699#endif // _MSC_VER
10700
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010701TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10702 FormatStyle Style = getLLVMStyle();
10703
10704 Style.ConstructorInitializerIndentWidth = 4;
10705 verifyFormat(
10706 "SomeClass::Constructor()\n"
10707 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10708 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10709 Style);
10710
10711 Style.ConstructorInitializerIndentWidth = 2;
10712 verifyFormat(
10713 "SomeClass::Constructor()\n"
10714 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10715 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10716 Style);
10717
10718 Style.ConstructorInitializerIndentWidth = 0;
10719 verifyFormat(
10720 "SomeClass::Constructor()\n"
10721 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10722 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10723 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010724 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10725 verifyFormat(
10726 "SomeLongTemplateVariableName<\n"
10727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10728 Style);
10729 verifyFormat(
10730 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10732 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010733}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010734
Daniel Jasper00853002014-09-16 16:22:30 +000010735TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10736 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010737 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010738 Style.ConstructorInitializerIndentWidth = 4;
10739 verifyFormat("SomeClass::Constructor()\n"
10740 " : a(a)\n"
10741 " , b(b)\n"
10742 " , c(c) {}",
10743 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010744 verifyFormat("SomeClass::Constructor()\n"
10745 " : a(a) {}",
10746 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010747
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010748 Style.ColumnLimit = 0;
10749 verifyFormat("SomeClass::Constructor()\n"
10750 " : a(a) {}",
10751 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010752 verifyFormat("SomeClass::Constructor() noexcept\n"
10753 " : a(a) {}",
10754 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010755 verifyFormat("SomeClass::Constructor()\n"
10756 " : a(a)\n"
10757 " , b(b)\n"
10758 " , c(c) {}",
10759 Style);
10760 verifyFormat("SomeClass::Constructor()\n"
10761 " : a(a) {\n"
10762 " foo();\n"
10763 " bar();\n"
10764 "}",
10765 Style);
10766
Daniel Jasperd74cf402014-04-08 12:46:38 +000010767 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010768 verifyFormat("SomeClass::Constructor()\n"
10769 " : a(a)\n"
10770 " , b(b)\n"
10771 " , c(c) {\n}",
10772 Style);
10773 verifyFormat("SomeClass::Constructor()\n"
10774 " : a(a) {\n}",
10775 Style);
10776
10777 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010778 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010779 Style.ConstructorInitializerIndentWidth = 2;
10780 verifyFormat("SomeClass::Constructor()\n"
10781 " : a(a)\n"
10782 " , b(b)\n"
10783 " , c(c) {}",
10784 Style);
10785
10786 Style.ConstructorInitializerIndentWidth = 0;
10787 verifyFormat("SomeClass::Constructor()\n"
10788 ": a(a)\n"
10789 ", b(b)\n"
10790 ", c(c) {}",
10791 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010792
10793 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10794 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010795 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10796 verifyFormat(
10797 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10798 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010799 verifyFormat(
10800 "SomeClass::Constructor()\n"
10801 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10802 Style);
10803 Style.ConstructorInitializerIndentWidth = 4;
10804 Style.ColumnLimit = 60;
10805 verifyFormat("SomeClass::Constructor()\n"
10806 " : aaaaaaaa(aaaaaaaa)\n"
10807 " , aaaaaaaa(aaaaaaaa)\n"
10808 " , aaaaaaaa(aaaaaaaa) {}",
10809 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010810}
10811
Daniel Jasper38efc132014-10-21 07:51:54 +000010812TEST_F(FormatTest, Destructors) {
10813 verifyFormat("void F(int &i) { i.~int(); }");
10814 verifyFormat("void F(int &i) { i->~int(); }");
10815}
10816
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010817TEST_F(FormatTest, FormatsWithWebKitStyle) {
10818 FormatStyle Style = getWebKitStyle();
10819
10820 // Don't indent in outer namespaces.
10821 verifyFormat("namespace outer {\n"
10822 "int i;\n"
10823 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010824 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010825 "} // namespace inner\n"
10826 "} // namespace outer\n"
10827 "namespace other_outer {\n"
10828 "int i;\n"
10829 "}",
10830 Style);
10831
10832 // Don't indent case labels.
10833 verifyFormat("switch (variable) {\n"
10834 "case 1:\n"
10835 "case 2:\n"
10836 " doSomething();\n"
10837 " break;\n"
10838 "default:\n"
10839 " ++variable;\n"
10840 "}",
10841 Style);
10842
10843 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010844 EXPECT_EQ("void f()\n"
10845 "{\n"
10846 " if (aaaaaaaaaaaaaaaa\n"
10847 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10848 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10849 " return;\n"
10850 "}",
10851 format("void f() {\n"
10852 "if (aaaaaaaaaaaaaaaa\n"
10853 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10854 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10855 "return;\n"
10856 "}",
10857 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010858
Daniel Jasper35995672014-04-29 14:05:20 +000010859 // Allow functions on a single line.
10860 verifyFormat("void f() { return; }", Style);
10861
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010862 // Constructor initializers are formatted one per line with the "," on the
10863 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010864 verifyFormat("Constructor()\n"
10865 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10866 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010867 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010868 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10869 "{\n"
10870 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010871 Style);
10872 verifyFormat("SomeClass::Constructor()\n"
10873 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010874 "{\n"
10875 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010876 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010877 EXPECT_EQ("SomeClass::Constructor()\n"
10878 " : a(a)\n"
10879 "{\n"
10880 "}",
10881 format("SomeClass::Constructor():a(a){}", Style));
10882 verifyFormat("SomeClass::Constructor()\n"
10883 " : a(a)\n"
10884 " , b(b)\n"
10885 " , c(c)\n"
10886 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010887 "}",
10888 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010889 verifyFormat("SomeClass::Constructor()\n"
10890 " : a(a)\n"
10891 "{\n"
10892 " foo();\n"
10893 " bar();\n"
10894 "}",
10895 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010896
Daniel Jasper65ee3472013-07-31 23:16:02 +000010897 // Access specifiers should be aligned left.
10898 verifyFormat("class C {\n"
10899 "public:\n"
10900 " int i;\n"
10901 "};",
10902 Style);
10903
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010904 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010905 verifyFormat("int a; // Do not\n"
10906 "double b; // align comments.",
10907 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010908
Daniel Jasper3219e432014-12-02 13:24:51 +000010909 // Do not align operands.
10910 EXPECT_EQ("ASSERT(aaaa\n"
10911 " || bbbb);",
10912 format("ASSERT ( aaaa\n||bbbb);", Style));
10913
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010914 // Accept input's line breaks.
10915 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10916 " || bbbbbbbbbbbbbbb) {\n"
10917 " i++;\n"
10918 "}",
10919 format("if (aaaaaaaaaaaaaaa\n"
10920 "|| bbbbbbbbbbbbbbb) { i++; }",
10921 Style));
10922 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10923 " i++;\n"
10924 "}",
10925 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010926
10927 // Don't automatically break all macro definitions (llvm.org/PR17842).
10928 verifyFormat("#define aNumber 10", Style);
10929 // However, generally keep the line breaks that the user authored.
10930 EXPECT_EQ("#define aNumber \\\n"
10931 " 10",
10932 format("#define aNumber \\\n"
10933 " 10",
10934 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010935
10936 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010937 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10938 " copyItems:YES];",
10939 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10940 "copyItems:YES];",
10941 Style));
10942 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10943 " copyItems:YES];",
10944 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10945 " copyItems:YES];",
10946 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010947 // FIXME: This does not seem right, there should be more indentation before
10948 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010949 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010950 " @\"a\",\n"
10951 " @\"a\"\n"
10952 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010953 " copyItems:YES];",
10954 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10955 " @\"a\",\n"
10956 " @\"a\"\n"
10957 " ]\n"
10958 " copyItems:YES];",
10959 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010960 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010961 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10962 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010963 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10964 " copyItems:YES];",
10965 Style));
10966
10967 verifyFormat("[self.a b:c c:d];", Style);
10968 EXPECT_EQ("[self.a b:c\n"
10969 " c:d];",
10970 format("[self.a b:c\n"
10971 "c:d];",
10972 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010973}
10974
Manuel Klimekffdeb592013-09-03 15:10:01 +000010975TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010976 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10977 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10978 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10979 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10980 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010981 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000010982 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
10983 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010984 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010985 verifyFormat("void f() {\n"
10986 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10987 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010988 verifyFormat("void f() {\n"
10989 " other(x.begin(), //\n"
10990 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010991 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010992 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010993 verifyFormat("SomeFunction([]() { // A cool function...\n"
10994 " return 43;\n"
10995 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010996 EXPECT_EQ("SomeFunction([]() {\n"
10997 "#define A a\n"
10998 " return 43;\n"
10999 "});",
11000 format("SomeFunction([](){\n"
11001 "#define A a\n"
11002 "return 43;\n"
11003 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011004 verifyFormat("void f() {\n"
11005 " SomeFunction([](decltype(x), A *a) {});\n"
11006 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011007 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11008 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011009 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11010 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11011 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011012 verifyFormat("Constructor()\n"
11013 " : Field([] { // comment\n"
11014 " int i;\n"
11015 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011016 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11017 " return some_parameter.size();\n"
11018 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011019 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11020 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011021 verifyFormat("int i = aaaaaa ? 1 //\n"
11022 " : [] {\n"
11023 " return 2; //\n"
11024 " }();");
11025 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11026 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11027 " return x == 2; // force break\n"
11028 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011029 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11030 " [=](int iiiiiiiiiiii) {\n"
11031 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11032 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11033 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011034 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011035 verifyFormat("SomeFunction({[&] {\n"
11036 " // comment\n"
11037 " },\n"
11038 " [&] {\n"
11039 " // comment\n"
11040 " }});");
11041 verifyFormat("SomeFunction({[&] {\n"
11042 " // comment\n"
11043 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011044 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11045 " [&]() { return true; },\n"
11046 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011047
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011048 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011049 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011050 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011051 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11052 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011053 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011054 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011055 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11056 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011057 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011058 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11059 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011060 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011061 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011062 verifyFormat(
11063 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11064 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11065 " return aaaaaaaaaaaaaaaaa;\n"
11066 " });",
11067 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011068 verifyFormat("[]() //\n"
11069 " -> int {\n"
11070 " return 1; //\n"
11071 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011072
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011073 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011074 verifyFormat("SomeFunction(\n"
11075 " []() {\n"
11076 " int i = 42;\n"
11077 " return i;\n"
11078 " },\n"
11079 " []() {\n"
11080 " int j = 43;\n"
11081 " return j;\n"
11082 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011083
Daniel Jasperda18fd82014-06-10 06:39:03 +000011084 // More complex introducers.
11085 verifyFormat("return [i, args...] {};");
11086
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011087 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011088 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011089 verifyFormat("double &operator[](int i) { return 0; }\n"
11090 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011091 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011092 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011093 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011094
11095 // Other corner cases.
11096 verifyFormat("void f() {\n"
11097 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011098 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011099 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011100
11101 // Lambdas created through weird macros.
11102 verifyFormat("void f() {\n"
11103 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011104 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011105 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011106
11107 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11108 " doo_dah();\n"
11109 " doo_dah();\n"
11110 " })) {\n"
11111 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011112 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11113 " doo_dah();\n"
11114 " doo_dah();\n"
11115 " })) {\n"
11116 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011117 verifyFormat("auto lambda = []() {\n"
11118 " int a = 2\n"
11119 "#if A\n"
11120 " + 2\n"
11121 "#endif\n"
11122 " ;\n"
11123 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011124
11125 // Lambdas with complex multiline introducers.
11126 verifyFormat(
11127 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11128 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11129 " -> ::std::unordered_set<\n"
11130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11131 " //\n"
11132 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011133}
11134
Martin Probsta004b3f2017-11-17 18:06:33 +000011135TEST_F(FormatTest, EmptyLinesInLambdas) {
11136 verifyFormat("auto lambda = []() {\n"
11137 " x(); //\n"
11138 "};",
11139 "auto lambda = []() {\n"
11140 "\n"
11141 " x(); //\n"
11142 "\n"
11143 "};");
11144}
11145
Manuel Klimek516e0542013-09-04 13:25:30 +000011146TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011147 FormatStyle ShortBlocks = getLLVMStyle();
11148 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11149 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11150 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11151 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11152 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11153 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11154 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011155
Daniel Jasper76284682014-10-22 09:12:44 +000011156 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11157 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11158 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011159
Daniel Jasper76284682014-10-22 09:12:44 +000011160 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011161 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011162 "}];");
11163 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011164 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011165 "}]};");
11166 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011167 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011168 "}];");
11169 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011170 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011171 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011172 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011173 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011174 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011175 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011176 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011177
11178 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011179 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011180 "}];",
11181 getLLVMStyleWithColumns(60));
11182 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011183 " NSString *path = [self sessionFilePath];\n"
11184 " if (path) {\n"
11185 " // ...\n"
11186 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011187 "});");
11188 verifyFormat("[[SessionService sharedService]\n"
11189 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011190 " if (window) {\n"
11191 " [self windowDidLoad:window];\n"
11192 " } else {\n"
11193 " [self errorLoadingWindow];\n"
11194 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011195 " }];");
11196 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011197 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011198 "};\n",
11199 getLLVMStyleWithColumns(40));
11200 verifyFormat("[[SessionService sharedService]\n"
11201 " loadWindowWithCompletionBlock: //\n"
11202 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011203 " if (window) {\n"
11204 " [self windowDidLoad:window];\n"
11205 " } else {\n"
11206 " [self errorLoadingWindow];\n"
11207 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011208 " }];",
11209 getLLVMStyleWithColumns(60));
11210 verifyFormat("[myObject doSomethingWith:arg1\n"
11211 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011212 " // ...\n"
11213 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011214 " }\n"
11215 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011216 " // ...\n"
11217 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011218 " }\n"
11219 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011220 " // ...\n"
11221 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011222 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011223 verifyFormat("[myObject doSomethingWith:arg1\n"
11224 " firstBlock:-1\n"
11225 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011226 " // ...\n"
11227 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011228 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011229
11230 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011231 " @autoreleasepool {\n"
11232 " if (a) {\n"
11233 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011234 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011235 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011236 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011237 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011238 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11239 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011240
11241 FormatStyle FourIndent = getLLVMStyle();
11242 FourIndent.ObjCBlockIndentWidth = 4;
11243 verifyFormat("[operation setCompletionBlock:^{\n"
11244 " [self onOperationDone];\n"
11245 "}];",
11246 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011247}
11248
Daniel Jasper289afc02015-04-23 09:23:17 +000011249TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11250 FormatStyle ZeroColumn = getLLVMStyle();
11251 ZeroColumn.ColumnLimit = 0;
11252
11253 verifyFormat("[[SessionService sharedService] "
11254 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11255 " if (window) {\n"
11256 " [self windowDidLoad:window];\n"
11257 " } else {\n"
11258 " [self errorLoadingWindow];\n"
11259 " }\n"
11260 "}];",
11261 ZeroColumn);
11262 EXPECT_EQ("[[SessionService sharedService]\n"
11263 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11264 " if (window) {\n"
11265 " [self windowDidLoad:window];\n"
11266 " } else {\n"
11267 " [self errorLoadingWindow];\n"
11268 " }\n"
11269 " }];",
11270 format("[[SessionService sharedService]\n"
11271 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11272 " if (window) {\n"
11273 " [self windowDidLoad:window];\n"
11274 " } else {\n"
11275 " [self errorLoadingWindow];\n"
11276 " }\n"
11277 "}];",
11278 ZeroColumn));
11279 verifyFormat("[myObject doSomethingWith:arg1\n"
11280 " firstBlock:^(Foo *a) {\n"
11281 " // ...\n"
11282 " int i;\n"
11283 " }\n"
11284 " secondBlock:^(Bar *b) {\n"
11285 " // ...\n"
11286 " int i;\n"
11287 " }\n"
11288 " thirdBlock:^Foo(Bar *b) {\n"
11289 " // ...\n"
11290 " int i;\n"
11291 " }];",
11292 ZeroColumn);
11293 verifyFormat("f(^{\n"
11294 " @autoreleasepool {\n"
11295 " if (a) {\n"
11296 " g();\n"
11297 " }\n"
11298 " }\n"
11299 "});",
11300 ZeroColumn);
11301 verifyFormat("void (^largeBlock)(void) = ^{\n"
11302 " // ...\n"
11303 "};",
11304 ZeroColumn);
11305
11306 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11307 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011308 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011309 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11310 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11311 " int i;\n"
11312 "};",
11313 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11314}
11315
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011316TEST_F(FormatTest, SupportsCRLF) {
11317 EXPECT_EQ("int a;\r\n"
11318 "int b;\r\n"
11319 "int c;\r\n",
11320 format("int a;\r\n"
11321 " int b;\r\n"
11322 " int c;\r\n",
11323 getLLVMStyle()));
11324 EXPECT_EQ("int a;\r\n"
11325 "int b;\r\n"
11326 "int c;\r\n",
11327 format("int a;\r\n"
11328 " int b;\n"
11329 " int c;\r\n",
11330 getLLVMStyle()));
11331 EXPECT_EQ("int a;\n"
11332 "int b;\n"
11333 "int c;\n",
11334 format("int a;\r\n"
11335 " int b;\n"
11336 " int c;\n",
11337 getLLVMStyle()));
11338 EXPECT_EQ("\"aaaaaaa \"\r\n"
11339 "\"bbbbbbb\";\r\n",
11340 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11341 EXPECT_EQ("#define A \\\r\n"
11342 " b; \\\r\n"
11343 " c; \\\r\n"
11344 " d;\r\n",
11345 format("#define A \\\r\n"
11346 " b; \\\r\n"
11347 " c; d; \r\n",
11348 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011349
11350 EXPECT_EQ("/*\r\n"
11351 "multi line block comments\r\n"
11352 "should not introduce\r\n"
11353 "an extra carriage return\r\n"
11354 "*/\r\n",
11355 format("/*\r\n"
11356 "multi line block comments\r\n"
11357 "should not introduce\r\n"
11358 "an extra carriage return\r\n"
11359 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011360}
11361
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011362TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11363 verifyFormat("MY_CLASS(C) {\n"
11364 " int i;\n"
11365 " int j;\n"
11366 "};");
11367}
11368
Daniel Jasper6633ab82013-10-18 10:38:14 +000011369TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11370 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11371 TwoIndent.ContinuationIndentWidth = 2;
11372
11373 EXPECT_EQ("int i =\n"
11374 " longFunction(\n"
11375 " arg);",
11376 format("int i = longFunction(arg);", TwoIndent));
11377
11378 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11379 SixIndent.ContinuationIndentWidth = 6;
11380
11381 EXPECT_EQ("int i =\n"
11382 " longFunction(\n"
11383 " arg);",
11384 format("int i = longFunction(arg);", SixIndent));
11385}
11386
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011387TEST_F(FormatTest, SpacesInAngles) {
11388 FormatStyle Spaces = getLLVMStyle();
11389 Spaces.SpacesInAngles = true;
11390
11391 verifyFormat("static_cast< int >(arg);", Spaces);
11392 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11393 verifyFormat("f< int, float >();", Spaces);
11394 verifyFormat("template <> g() {}", Spaces);
11395 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011396 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11397 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11398 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011399
11400 Spaces.Standard = FormatStyle::LS_Cpp03;
11401 Spaces.SpacesInAngles = true;
11402 verifyFormat("A< A< int > >();", Spaces);
11403
11404 Spaces.SpacesInAngles = false;
11405 verifyFormat("A<A<int> >();", Spaces);
11406
11407 Spaces.Standard = FormatStyle::LS_Cpp11;
11408 Spaces.SpacesInAngles = true;
11409 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011410
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011411 Spaces.SpacesInAngles = false;
11412 verifyFormat("A<A<int>>();", Spaces);
11413}
11414
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011415TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11416 FormatStyle Style = getLLVMStyle();
11417 Style.SpaceAfterTemplateKeyword = false;
11418 verifyFormat("template<int> void foo();", Style);
11419}
11420
Jacques Pienaarfc275112015-02-18 23:48:37 +000011421TEST_F(FormatTest, TripleAngleBrackets) {
11422 verifyFormat("f<<<1, 1>>>();");
11423 verifyFormat("f<<<1, 1, 1, s>>>();");
11424 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011425 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011426 verifyFormat("f<param><<<1, 1>>>();");
11427 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011428 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011429 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11430 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011431 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11432 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011433}
11434
11435TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011436 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011437 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011438 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11439 "aaallvm::outs() <<");
11440 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11441 "aaaallvm::outs()\n <<");
11442}
11443
Manuel Klimek819788d2014-03-18 11:22:45 +000011444TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11445 std::string code = "#if A\n"
11446 "#if B\n"
11447 "a.\n"
11448 "#endif\n"
11449 " a = 1;\n"
11450 "#else\n"
11451 "#endif\n"
11452 "#if C\n"
11453 "#else\n"
11454 "#endif\n";
11455 EXPECT_EQ(code, format(code));
11456}
11457
Manuel Klimek68b03042014-04-14 09:14:11 +000011458TEST_F(FormatTest, HandleConflictMarkers) {
11459 // Git/SVN conflict markers.
11460 EXPECT_EQ("int a;\n"
11461 "void f() {\n"
11462 " callme(some(parameter1,\n"
11463 "<<<<<<< text by the vcs\n"
11464 " parameter2),\n"
11465 "||||||| text by the vcs\n"
11466 " parameter2),\n"
11467 " parameter3,\n"
11468 "======= text by the vcs\n"
11469 " parameter2, parameter3),\n"
11470 ">>>>>>> text by the vcs\n"
11471 " otherparameter);\n",
11472 format("int a;\n"
11473 "void f() {\n"
11474 " callme(some(parameter1,\n"
11475 "<<<<<<< text by the vcs\n"
11476 " parameter2),\n"
11477 "||||||| text by the vcs\n"
11478 " parameter2),\n"
11479 " parameter3,\n"
11480 "======= text by the vcs\n"
11481 " parameter2,\n"
11482 " parameter3),\n"
11483 ">>>>>>> text by the vcs\n"
11484 " otherparameter);\n"));
11485
11486 // Perforce markers.
11487 EXPECT_EQ("void f() {\n"
11488 " function(\n"
11489 ">>>> text by the vcs\n"
11490 " parameter,\n"
11491 "==== text by the vcs\n"
11492 " parameter,\n"
11493 "==== text by the vcs\n"
11494 " parameter,\n"
11495 "<<<< text by the vcs\n"
11496 " parameter);\n",
11497 format("void f() {\n"
11498 " function(\n"
11499 ">>>> text by the vcs\n"
11500 " parameter,\n"
11501 "==== text by the vcs\n"
11502 " parameter,\n"
11503 "==== text by the vcs\n"
11504 " parameter,\n"
11505 "<<<< text by the vcs\n"
11506 " parameter);\n"));
11507
11508 EXPECT_EQ("<<<<<<<\n"
11509 "|||||||\n"
11510 "=======\n"
11511 ">>>>>>>",
11512 format("<<<<<<<\n"
11513 "|||||||\n"
11514 "=======\n"
11515 ">>>>>>>"));
11516
11517 EXPECT_EQ("<<<<<<<\n"
11518 "|||||||\n"
11519 "int i;\n"
11520 "=======\n"
11521 ">>>>>>>",
11522 format("<<<<<<<\n"
11523 "|||||||\n"
11524 "int i;\n"
11525 "=======\n"
11526 ">>>>>>>"));
11527
11528 // FIXME: Handle parsing of macros around conflict markers correctly:
11529 EXPECT_EQ("#define Macro \\\n"
11530 "<<<<<<<\n"
11531 "Something \\\n"
11532 "|||||||\n"
11533 "Else \\\n"
11534 "=======\n"
11535 "Other \\\n"
11536 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011537 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011538 format("#define Macro \\\n"
11539 "<<<<<<<\n"
11540 " Something \\\n"
11541 "|||||||\n"
11542 " Else \\\n"
11543 "=======\n"
11544 " Other \\\n"
11545 ">>>>>>>\n"
11546 " End\n"
11547 "int i;\n"));
11548}
11549
Daniel Jasper471894432014-08-06 13:40:26 +000011550TEST_F(FormatTest, DisableRegions) {
11551 EXPECT_EQ("int i;\n"
11552 "// clang-format off\n"
11553 " int j;\n"
11554 "// clang-format on\n"
11555 "int k;",
11556 format(" int i;\n"
11557 " // clang-format off\n"
11558 " int j;\n"
11559 " // clang-format on\n"
11560 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011561 EXPECT_EQ("int i;\n"
11562 "/* clang-format off */\n"
11563 " int j;\n"
11564 "/* clang-format on */\n"
11565 "int k;",
11566 format(" int i;\n"
11567 " /* clang-format off */\n"
11568 " int j;\n"
11569 " /* clang-format on */\n"
11570 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011571
11572 // Don't reflow comments within disabled regions.
11573 EXPECT_EQ(
11574 "// clang-format off\n"
11575 "// long long long long long long line\n"
11576 "/* clang-format on */\n"
11577 "/* long long long\n"
11578 " * long long long\n"
11579 " * line */\n"
11580 "int i;\n"
11581 "/* clang-format off */\n"
11582 "/* long long long long long long line */\n",
11583 format("// clang-format off\n"
11584 "// long long long long long long line\n"
11585 "/* clang-format on */\n"
11586 "/* long long long long long long line */\n"
11587 "int i;\n"
11588 "/* clang-format off */\n"
11589 "/* long long long long long long line */\n",
11590 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011591}
11592
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011593TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11594 format("? ) =");
11595 verifyNoCrash("#define a\\\n /**/}");
11596}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011597
Daniel Jasper498f5582015-12-25 08:53:31 +000011598TEST_F(FormatTest, FormatsTableGenCode) {
11599 FormatStyle Style = getLLVMStyle();
11600 Style.Language = FormatStyle::LK_TableGen;
11601 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11602}
11603
Nico Weberb2673a12016-11-10 21:49:25 +000011604TEST_F(FormatTest, ArrayOfTemplates) {
11605 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11606 format("auto a = new unique_ptr<int > [ 10];"));
11607
11608 FormatStyle Spaces = getLLVMStyle();
11609 Spaces.SpacesInSquareBrackets = true;
11610 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11611 format("auto a = new unique_ptr<int > [10];", Spaces));
11612}
11613
11614TEST_F(FormatTest, ArrayAsTemplateType) {
11615 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11616 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11617
11618 FormatStyle Spaces = getLLVMStyle();
11619 Spaces.SpacesInSquareBrackets = true;
11620 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11621 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11622}
11623
Martin Probstc9c51c42017-03-16 10:21:35 +000011624TEST_F(FormatTest, NoSpaceAfterSuper) {
11625 verifyFormat("__super::FooBar();");
11626}
11627
Eric Liu547d8792016-03-24 13:22:42 +000011628TEST(FormatStyle, GetStyleOfFile) {
11629 vfs::InMemoryFileSystem FS;
11630 // Test 1: format file in the same directory.
11631 ASSERT_TRUE(
11632 FS.addFile("/a/.clang-format", 0,
11633 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11634 ASSERT_TRUE(
11635 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011636 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011637 ASSERT_TRUE((bool)Style1);
11638 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011639
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011640 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011641 ASSERT_TRUE(
11642 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011643 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011644 ASSERT_TRUE((bool)Style2);
11645 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011646
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011647 // Test 2.2: no format on 'none' fallback style.
11648 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11649 ASSERT_TRUE((bool)Style2);
11650 ASSERT_EQ(*Style2, getNoStyle());
11651
11652 // Test 2.3: format if config is found with no based style while fallback is
11653 // 'none'.
11654 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11655 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11656 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11657 ASSERT_TRUE((bool)Style2);
11658 ASSERT_EQ(*Style2, getLLVMStyle());
11659
11660 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11661 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11662 ASSERT_TRUE((bool)Style2);
11663 ASSERT_EQ(*Style2, getLLVMStyle());
11664
Eric Liu547d8792016-03-24 13:22:42 +000011665 // Test 3: format file in parent directory.
11666 ASSERT_TRUE(
11667 FS.addFile("/c/.clang-format", 0,
11668 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11669 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11670 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011671 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011672 ASSERT_TRUE((bool)Style3);
11673 ASSERT_EQ(*Style3, getGoogleStyle());
11674
11675 // Test 4: error on invalid fallback style
11676 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11677 ASSERT_FALSE((bool)Style4);
11678 llvm::consumeError(Style4.takeError());
11679
11680 // Test 5: error on invalid yaml on command line
11681 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11682 ASSERT_FALSE((bool)Style5);
11683 llvm::consumeError(Style5.takeError());
11684
11685 // Test 6: error on invalid style
11686 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11687 ASSERT_FALSE((bool)Style6);
11688 llvm::consumeError(Style6.takeError());
11689
11690 // Test 7: found config file, error on parsing it
11691 ASSERT_TRUE(
11692 FS.addFile("/d/.clang-format", 0,
11693 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11694 "InvalidKey: InvalidValue")));
11695 ASSERT_TRUE(
11696 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11697 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11698 ASSERT_FALSE((bool)Style7);
11699 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011700}
11701
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011702TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11703 // Column limit is 20.
11704 std::string Code = "Type *a =\n"
11705 " new Type();\n"
11706 "g(iiiii, 0, jjjjj,\n"
11707 " 0, kkkkk, 0, mm);\n"
11708 "int bad = format ;";
11709 std::string Expected = "auto a = new Type();\n"
11710 "g(iiiii, nullptr,\n"
11711 " jjjjj, nullptr,\n"
11712 " kkkkk, nullptr,\n"
11713 " mm);\n"
11714 "int bad = format ;";
11715 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011716 tooling::Replacements Replaces = toReplacements(
11717 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11718 "auto "),
11719 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11720 "nullptr"),
11721 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11722 "nullptr"),
11723 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11724 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011725
11726 format::FormatStyle Style = format::getLLVMStyle();
11727 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011728 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11729 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11730 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11731 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11732 EXPECT_TRUE(static_cast<bool>(Result));
11733 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011734}
11735
Eric Liubaf58c22016-05-18 13:43:48 +000011736TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11737 std::string Code = "#include \"a.h\"\n"
11738 "#include \"c.h\"\n"
11739 "\n"
11740 "int main() {\n"
11741 " return 0;\n"
11742 "}";
11743 std::string Expected = "#include \"a.h\"\n"
11744 "#include \"b.h\"\n"
11745 "#include \"c.h\"\n"
11746 "\n"
11747 "int main() {\n"
11748 " return 0;\n"
11749 "}";
11750 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011751 tooling::Replacements Replaces = toReplacements(
11752 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11753 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011754
11755 format::FormatStyle Style = format::getLLVMStyle();
11756 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011757 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11758 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11759 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11760 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11761 EXPECT_TRUE(static_cast<bool>(Result));
11762 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011763}
11764
Krasimir Georgievac16a202017-06-23 11:46:03 +000011765TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11766 EXPECT_EQ("using std::cin;\n"
11767 "using std::cout;",
11768 format("using std::cout;\n"
11769 "using std::cin;", getGoogleStyle()));
11770}
11771
Nico Weberdc065182017-04-05 18:10:42 +000011772TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11773 format::FormatStyle Style = format::getLLVMStyle();
11774 Style.Standard = FormatStyle::LS_Cpp03;
11775 // cpp03 recognize this string as identifier u8 and literal character 'a'
11776 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11777}
11778
11779TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11780 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11781 // all modes, including C++11, C++14 and C++17
11782 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11783}
11784
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000011785TEST_F(FormatTest, DoNotFormatLikelyXml) {
11786 EXPECT_EQ("<!-- ;> -->",
11787 format("<!-- ;> -->", getGoogleStyle()));
11788 EXPECT_EQ(" <!-- >; -->",
11789 format(" <!-- >; -->", getGoogleStyle()));
11790}
11791
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011792TEST_F(FormatTest, StructuredBindings) {
11793 // Structured bindings is a C++17 feature.
11794 // all modes, including C++11, C++14 and C++17
11795 verifyFormat("auto [a, b] = f();");
11796 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
11797 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
11798 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
11799 EXPECT_EQ("auto const volatile [a, b] = f();",
11800 format("auto const volatile[a, b] = f();"));
11801 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011802 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011803 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011804 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011805 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011806 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
11807 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011808 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011809 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
11810 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
11811 EXPECT_EQ("const auto volatile &&[a, b] = f();",
11812 format("const auto volatile &&[a, b] = f();"));
11813 EXPECT_EQ("volatile const auto &&[a, b] = f();",
11814 format("volatile const auto &&[a, b] = f();"));
11815 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011816
Manuel Klimeke411aa82017-09-20 09:29:37 +000011817 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011818 FormatStyle PointerMiddle = getLLVMStyle();
11819 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
11820 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
11821 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
11822 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
11823 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
11824 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
11825 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
11826 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
11827 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
11828 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
11829 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
11830 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
11831 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
11832
11833 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
11834 format("for (const auto && [a, b] : some_range) {\n}"));
11835 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
11836 format("for (const auto & [a, b] : some_range) {\n}"));
11837 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
11838 format("for (const auto[a, b] : some_range) {\n}"));
11839 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
11840 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
11841 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
11842 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
11843 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
11844 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
11845 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
11846 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000011847
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011848 format::FormatStyle Spaces = format::getLLVMStyle();
11849 Spaces.SpacesInSquareBrackets = true;
11850 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011851 verifyFormat("auto &&[ a, b ] = f();", Spaces);
11852 verifyFormat("auto &[ a, b ] = f();", Spaces);
11853 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
11854 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011855}
11856
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011857} // end namespace
11858} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011859} // end namespace clang