blob: dcb1089a82cd8872703e534d6278e9cf2da909fa [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
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000591TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
592 FormatStyle Style = getLLVMStyleWithColumns(60);
593 Style.AllowShortBlocksOnASingleLine = true;
594 Style.AllowShortIfStatementsOnASingleLine = true;
595 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
596 EXPECT_EQ("#define A \\\n"
597 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
598 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
599 "X;",
600 format("#define A \\\n"
601 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
602 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
603 " }\n"
604 "X;",
605 Style));
606}
607
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000608TEST_F(FormatTest, ParseIfElse) {
609 verifyFormat("if (true)\n"
610 " if (true)\n"
611 " if (true)\n"
612 " f();\n"
613 " else\n"
614 " g();\n"
615 " else\n"
616 " h();\n"
617 "else\n"
618 " i();");
619 verifyFormat("if (true)\n"
620 " if (true)\n"
621 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000622 " if (true)\n"
623 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000624 " } else {\n"
625 " g();\n"
626 " }\n"
627 " else\n"
628 " h();\n"
629 "else {\n"
630 " i();\n"
631 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000632 verifyFormat("if (true)\n"
633 " if constexpr (true)\n"
634 " if (true) {\n"
635 " if constexpr (true)\n"
636 " f();\n"
637 " } else {\n"
638 " g();\n"
639 " }\n"
640 " else\n"
641 " h();\n"
642 "else {\n"
643 " i();\n"
644 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000645 verifyFormat("void f() {\n"
646 " if (a) {\n"
647 " } else {\n"
648 " }\n"
649 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000650}
651
652TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000653 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000654 verifyFormat("if (a)\n"
655 " f();\n"
656 "else if (b)\n"
657 " g();\n"
658 "else\n"
659 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000660 verifyFormat("if constexpr (a)\n"
661 " f();\n"
662 "else if constexpr (b)\n"
663 " g();\n"
664 "else\n"
665 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000666 verifyFormat("if (a) {\n"
667 " f();\n"
668 "}\n"
669 "// or else ..\n"
670 "else {\n"
671 " g()\n"
672 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000673
674 verifyFormat("if (a) {\n"
675 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
677 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000678 verifyFormat("if (a) {\n"
679 "} else if (\n"
680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
681 "}",
682 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000683 verifyFormat("if (a) {\n"
684 "} else if constexpr (\n"
685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
686 "}",
687 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000688}
689
Daniel Jasperf7935112012-12-03 18:12:45 +0000690TEST_F(FormatTest, FormatsForLoop) {
691 verifyFormat(
692 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000693 " ++VeryVeryLongLoopVariable)\n"
694 " ;");
695 verifyFormat("for (;;)\n"
696 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000697 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000698 verifyFormat("for (;;) {\n"
699 " f();\n"
700 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000701 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000702
703 verifyFormat(
704 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
705 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000706 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000707
708 verifyFormat(
709 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000710 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000711 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
712 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000713 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000714 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
715 " I = FD->getDeclsInPrototypeScope().begin(),\n"
716 " E = FD->getDeclsInPrototypeScope().end();\n"
717 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000718 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
719 " I = Container.begin(),\n"
720 " E = Container.end();\n"
721 " I != E; ++I) {\n}",
722 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000723
Daniel Jasper48c62f92013-01-28 17:30:17 +0000724 verifyFormat(
725 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000729 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000730 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
731 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
732 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000733 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
734 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
735 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000736 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
737 " aaaaaaaaaa);\n"
738 " iter; ++iter) {\n"
739 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000740 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
742 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
743 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000744
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000745 FormatStyle NoBinPacking = getLLVMStyle();
746 NoBinPacking.BinPackParameters = false;
747 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
748 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
749 " aaaaaaaaaaaaaaaa,\n"
750 " aaaaaaaaaaaaaaaa,\n"
751 " aaaaaaaaaaaaaaaa);\n"
752 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
753 "}",
754 NoBinPacking);
755 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000756 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
757 " E = UnwrappedLines.end();\n"
758 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000759 " ++I) {\n}",
760 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000761
762 FormatStyle AlignLeft = getLLVMStyle();
763 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
764 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000765}
766
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000767TEST_F(FormatTest, RangeBasedForLoops) {
768 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
770 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
771 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000772 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000774 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
775 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000776}
777
Daniel Jaspere1e43192014-04-01 12:55:11 +0000778TEST_F(FormatTest, ForEachLoops) {
779 verifyFormat("void f() {\n"
780 " foreach (Item *item, itemlist) {}\n"
781 " Q_FOREACH (Item *item, itemlist) {}\n"
782 " BOOST_FOREACH (Item *item, itemlist) {}\n"
783 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
784 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000785
786 // As function-like macros.
787 verifyFormat("#define foreach(x, y)\n"
788 "#define Q_FOREACH(x, y)\n"
789 "#define BOOST_FOREACH(x, y)\n"
790 "#define UNKNOWN_FOREACH(x, y)\n");
791
792 // Not as function-like macros.
793 verifyFormat("#define foreach (x, y)\n"
794 "#define Q_FOREACH (x, y)\n"
795 "#define BOOST_FOREACH (x, y)\n"
796 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000797}
798
Daniel Jasperf7935112012-12-03 18:12:45 +0000799TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000800 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000801 verifyFormat("while (true)\n"
802 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000803 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000804 verifyFormat("while () {\n"
805 " f();\n"
806 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000807}
808
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000809TEST_F(FormatTest, FormatsDoWhile) {
810 verifyFormat("do {\n"
811 " do_something();\n"
812 "} while (something());");
813 verifyFormat("do\n"
814 " do_something();\n"
815 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000816}
817
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000818TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000819 verifyFormat("switch (x) {\n"
820 "case 1:\n"
821 " f();\n"
822 " break;\n"
823 "case kFoo:\n"
824 "case ns::kBar:\n"
825 "case kBaz:\n"
826 " break;\n"
827 "default:\n"
828 " g();\n"
829 " break;\n"
830 "}");
831 verifyFormat("switch (x) {\n"
832 "case 1: {\n"
833 " f();\n"
834 " break;\n"
835 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000836 "case 2: {\n"
837 " break;\n"
838 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000839 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000840 verifyFormat("switch (x) {\n"
841 "case 1: {\n"
842 " f();\n"
843 " {\n"
844 " g();\n"
845 " h();\n"
846 " }\n"
847 " break;\n"
848 "}\n"
849 "}");
850 verifyFormat("switch (x) {\n"
851 "case 1: {\n"
852 " f();\n"
853 " if (foo) {\n"
854 " g();\n"
855 " h();\n"
856 " }\n"
857 " break;\n"
858 "}\n"
859 "}");
860 verifyFormat("switch (x) {\n"
861 "case 1: {\n"
862 " f();\n"
863 " g();\n"
864 "} break;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866 verifyFormat("switch (test)\n"
867 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000868 verifyFormat("switch (x) {\n"
869 "default: {\n"
870 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000871 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000872 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000873 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000874 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000875 "// if 1, do f()\n"
876 "case 1:\n"
877 " f();\n"
878 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000879 verifyFormat("switch (x) {\n"
880 "case 1:\n"
881 " // Do amazing stuff\n"
882 " {\n"
883 " f();\n"
884 " g();\n"
885 " }\n"
886 " break;\n"
887 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000888 verifyFormat("#define A \\\n"
889 " switch (x) { \\\n"
890 " case a: \\\n"
891 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000892 " }",
893 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000894 verifyFormat("#define OPERATION_CASE(name) \\\n"
895 " case OP_name: \\\n"
896 " return operations::Operation##name\n",
897 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000898 verifyFormat("switch (x) {\n"
899 "case 1:;\n"
900 "default:;\n"
901 " int i;\n"
902 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000903
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000904 verifyGoogleFormat("switch (x) {\n"
905 " case 1:\n"
906 " f();\n"
907 " break;\n"
908 " case kFoo:\n"
909 " case ns::kBar:\n"
910 " case kBaz:\n"
911 " break;\n"
912 " default:\n"
913 " g();\n"
914 " break;\n"
915 "}");
916 verifyGoogleFormat("switch (x) {\n"
917 " case 1: {\n"
918 " f();\n"
919 " break;\n"
920 " }\n"
921 "}");
922 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000923 " ;");
924
925 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
926 " case OP_name: \\\n"
927 " return operations::Operation##name\n");
928 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
929 " // Get the correction operation class.\n"
930 " switch (OpCode) {\n"
931 " CASE(Add);\n"
932 " CASE(Subtract);\n"
933 " default:\n"
934 " return operations::Unknown;\n"
935 " }\n"
936 "#undef OPERATION_CASE\n"
937 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000938 verifyFormat("DEBUG({\n"
939 " switch (x) {\n"
940 " case A:\n"
941 " f();\n"
942 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000943 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000944 " case B:\n"
945 " g();\n"
946 " break;\n"
947 " }\n"
948 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000949 EXPECT_EQ("DEBUG({\n"
950 " switch (x) {\n"
951 " case A:\n"
952 " f();\n"
953 " break;\n"
954 " // On B:\n"
955 " case B:\n"
956 " g();\n"
957 " break;\n"
958 " }\n"
959 "});",
960 format("DEBUG({\n"
961 " switch (x) {\n"
962 " case A:\n"
963 " f();\n"
964 " break;\n"
965 " // On B:\n"
966 " case B:\n"
967 " g();\n"
968 " break;\n"
969 " }\n"
970 "});",
971 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000972 verifyFormat("switch (a) {\n"
973 "case (b):\n"
974 " return;\n"
975 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000976
977 verifyFormat("switch (a) {\n"
978 "case some_namespace::\n"
979 " some_constant:\n"
980 " return;\n"
981 "}",
982 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000983}
984
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000985TEST_F(FormatTest, CaseRanges) {
986 verifyFormat("switch (x) {\n"
987 "case 'A' ... 'Z':\n"
988 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000989 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000990 " break;\n"
991 "}");
992}
993
Daniel Jasperb87899b2014-09-10 13:11:45 +0000994TEST_F(FormatTest, ShortCaseLabels) {
995 FormatStyle Style = getLLVMStyle();
996 Style.AllowShortCaseLabelsOnASingleLine = true;
997 verifyFormat("switch (a) {\n"
998 "case 1: x = 1; break;\n"
999 "case 2: return;\n"
1000 "case 3:\n"
1001 "case 4:\n"
1002 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001003 "case 6: // comment\n"
1004 " return;\n"
1005 "case 7:\n"
1006 " // comment\n"
1007 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001008 "case 8:\n"
1009 " x = 8; // comment\n"
1010 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001011 "default: y = 1; break;\n"
1012 "}",
1013 Style);
1014 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001015 "case 0: return; // comment\n"
1016 "case 1: break; // comment\n"
1017 "case 2: return;\n"
1018 "// comment\n"
1019 "case 3: return;\n"
1020 "// comment 1\n"
1021 "// comment 2\n"
1022 "// comment 3\n"
1023 "case 4: break; /* comment */\n"
1024 "case 5:\n"
1025 " // comment\n"
1026 " break;\n"
1027 "case 6: /* comment */ x = 1; break;\n"
1028 "case 7: x = /* comment */ 1; break;\n"
1029 "case 8:\n"
1030 " x = 1; /* comment */\n"
1031 " break;\n"
1032 "case 9:\n"
1033 " break; // comment line 1\n"
1034 " // comment line 2\n"
1035 "}",
1036 Style);
1037 EXPECT_EQ("switch (a) {\n"
1038 "case 1:\n"
1039 " x = 8;\n"
1040 " // fall through\n"
1041 "case 2: x = 8;\n"
1042 "// comment\n"
1043 "case 3:\n"
1044 " return; /* comment line 1\n"
1045 " * comment line 2 */\n"
1046 "case 4: i = 8;\n"
1047 "// something else\n"
1048 "#if FOO\n"
1049 "case 5: break;\n"
1050 "#endif\n"
1051 "}",
1052 format("switch (a) {\n"
1053 "case 1: x = 8;\n"
1054 " // fall through\n"
1055 "case 2:\n"
1056 " x = 8;\n"
1057 "// comment\n"
1058 "case 3:\n"
1059 " return; /* comment line 1\n"
1060 " * comment line 2 */\n"
1061 "case 4:\n"
1062 " i = 8;\n"
1063 "// something else\n"
1064 "#if FOO\n"
1065 "case 5: break;\n"
1066 "#endif\n"
1067 "}",
1068 Style));
1069 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1070 " return; // long long long long long long long long long long long long comment\n"
1071 " // line\n" "}",
1072 format("switch (a) {\n"
1073 "case 0: return; // long long long long long long long long long long long long comment line\n"
1074 "}",
1075 Style));
1076 EXPECT_EQ("switch (a) {\n"
1077 "case 0:\n"
1078 " return; /* long long long long long long long long long long long long comment\n"
1079 " line */\n"
1080 "}",
1081 format("switch (a) {\n"
1082 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1083 "}",
1084 Style));
1085 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001086 "#if FOO\n"
1087 "case 0: return 0;\n"
1088 "#endif\n"
1089 "}",
1090 Style);
1091 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001092 "case 1: {\n"
1093 "}\n"
1094 "case 2: {\n"
1095 " return;\n"
1096 "}\n"
1097 "case 3: {\n"
1098 " x = 1;\n"
1099 " return;\n"
1100 "}\n"
1101 "case 4:\n"
1102 " if (x)\n"
1103 " return;\n"
1104 "}",
1105 Style);
1106 Style.ColumnLimit = 21;
1107 verifyFormat("switch (a) {\n"
1108 "case 1: x = 1; break;\n"
1109 "case 2: return;\n"
1110 "case 3:\n"
1111 "case 4:\n"
1112 "case 5: return;\n"
1113 "default:\n"
1114 " y = 1;\n"
1115 " break;\n"
1116 "}",
1117 Style);
1118}
1119
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001120TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001121 verifyFormat("void f() {\n"
1122 " some_code();\n"
1123 "test_label:\n"
1124 " some_other_code();\n"
1125 " {\n"
1126 " some_more_code();\n"
1127 " another_label:\n"
1128 " some_more_code();\n"
1129 " }\n"
1130 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001131 verifyFormat("{\n"
1132 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001133 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001134 " some_other_code();\n"
1135 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001136 verifyFormat("{\n"
1137 " some_code();\n"
1138 "test_label:;\n"
1139 " int i = 0;\n"
1140 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001141}
1142
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001143//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001144// Tests for classes, namespaces, etc.
1145//===----------------------------------------------------------------------===//
1146
1147TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001148 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001149}
1150
1151TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1152 verifyFormat("class A {\n"
1153 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001154 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001155 "protected:\n"
1156 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001157 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001158 "};");
1159 verifyGoogleFormat("class A {\n"
1160 " public:\n"
1161 " protected:\n"
1162 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001163 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001164 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001165 verifyFormat("class A {\n"
1166 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001167 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001168 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001169 " void f2() {}\n"
1170 "protected slots:\n"
1171 " void f3() {}\n"
1172 "protected Q_SLOTS:\n"
1173 " void f4() {}\n"
1174 "private slots:\n"
1175 " void f5() {}\n"
1176 "private Q_SLOTS:\n"
1177 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001178 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001179 " void g1();\n"
1180 "Q_SIGNALS:\n"
1181 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001182 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001183
1184 // Don't interpret 'signals' the wrong way.
1185 verifyFormat("signals.set();");
1186 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001187 verifyFormat("{\n"
1188 " signals.set(); // This needs indentation.\n"
1189 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001190 verifyFormat("void f() {\n"
1191 "label:\n"
1192 " signals.baz();\n"
1193 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001194}
1195
Alexander Kornienkofd433362013-03-27 17:08:02 +00001196TEST_F(FormatTest, SeparatesLogicalBlocks) {
1197 EXPECT_EQ("class A {\n"
1198 "public:\n"
1199 " void f();\n"
1200 "\n"
1201 "private:\n"
1202 " void g() {}\n"
1203 " // test\n"
1204 "protected:\n"
1205 " int h;\n"
1206 "};",
1207 format("class A {\n"
1208 "public:\n"
1209 "void f();\n"
1210 "private:\n"
1211 "void g() {}\n"
1212 "// test\n"
1213 "protected:\n"
1214 "int h;\n"
1215 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001216 EXPECT_EQ("class A {\n"
1217 "protected:\n"
1218 "public:\n"
1219 " void f();\n"
1220 "};",
1221 format("class A {\n"
1222 "protected:\n"
1223 "\n"
1224 "public:\n"
1225 "\n"
1226 " void f();\n"
1227 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001228
1229 // Even ensure proper spacing inside macros.
1230 EXPECT_EQ("#define B \\\n"
1231 " class A { \\\n"
1232 " protected: \\\n"
1233 " public: \\\n"
1234 " void f(); \\\n"
1235 " };",
1236 format("#define B \\\n"
1237 " class A { \\\n"
1238 " protected: \\\n"
1239 " \\\n"
1240 " public: \\\n"
1241 " \\\n"
1242 " void f(); \\\n"
1243 " };",
1244 getGoogleStyle()));
1245 // But don't remove empty lines after macros ending in access specifiers.
1246 EXPECT_EQ("#define A private:\n"
1247 "\n"
1248 "int i;",
1249 format("#define A private:\n"
1250 "\n"
1251 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001252}
1253
Daniel Jasper83193602013-04-05 17:22:09 +00001254TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001255 verifyFormat("class A : public B {};");
1256 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001257
1258 verifyFormat(
1259 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001260 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001261 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1262 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001263 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001264 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001265 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001266 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1267 " public C,\n"
1268 " public D,\n"
1269 " public E,\n"
1270 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001271 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001272
1273 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001274 " ReallyReallyLongClassName {\n"
1275 " int i;\n"
1276 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001277 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001278 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1279 " aaaaaaaaaaaaaaaa> {};");
1280 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1281 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1282 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001283 verifyFormat("template <class R, class C>\n"
1284 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1285 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001286 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001287}
1288
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001289TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1290 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1291 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1292
1293 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1294 verifyFormat("class MyClass\n"
1295 " : public X\n"
1296 " , public Y {};",
1297 StyleWithInheritanceBreak);
1298}
1299
Manuel Klimek28cacc72013-01-07 18:10:23 +00001300TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001301 verifyFormat("class A {\n} a, b;");
1302 verifyFormat("struct A {\n} a, b;");
1303 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001304}
1305
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001306TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001307 verifyFormat("enum {\n"
1308 " Zero,\n"
1309 " One = 1,\n"
1310 " Two = One + 1,\n"
1311 " Three = (One + Two),\n"
1312 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1313 " Five = (One, Two, Three, Four, 5)\n"
1314 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001315 verifyGoogleFormat("enum {\n"
1316 " Zero,\n"
1317 " One = 1,\n"
1318 " Two = One + 1,\n"
1319 " Three = (One + Two),\n"
1320 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1321 " Five = (One, Two, Three, Four, 5)\n"
1322 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001323 verifyFormat("enum Enum {};");
1324 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001325 verifyFormat("enum X E {} d;");
1326 verifyFormat("enum __attribute__((...)) E {} d;");
1327 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001328 verifyFormat("enum {\n"
1329 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001330 "};",
1331 getLLVMStyleWithColumns(30));
1332
1333 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001334 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001335
1336 EXPECT_EQ("enum KeepEmptyLines {\n"
1337 " ONE,\n"
1338 "\n"
1339 " TWO,\n"
1340 "\n"
1341 " THREE\n"
1342 "}",
1343 format("enum KeepEmptyLines {\n"
1344 " ONE,\n"
1345 "\n"
1346 " TWO,\n"
1347 "\n"
1348 "\n"
1349 " THREE\n"
1350 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001351 verifyFormat("enum E { // comment\n"
1352 " ONE,\n"
1353 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001354 "};\n"
1355 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001356 // Not enums.
1357 verifyFormat("enum X f() {\n"
1358 " a();\n"
1359 " return 42;\n"
1360 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001361 verifyFormat("enum X Type::f() {\n"
1362 " a();\n"
1363 " return 42;\n"
1364 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001365 verifyFormat("enum ::X f() {\n"
1366 " a();\n"
1367 " return 42;\n"
1368 "}");
1369 verifyFormat("enum ns::X f() {\n"
1370 " a();\n"
1371 " return 42;\n"
1372 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001373}
1374
Daniel Jasperb7150872013-08-30 10:10:19 +00001375TEST_F(FormatTest, FormatsEnumsWithErrors) {
1376 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001377 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001378 " Two = 1;\n"
1379 "};");
1380 verifyFormat("namespace n {\n"
1381 "enum Type {\n"
1382 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001383 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001384 " int i;\n"
1385 "}\n"
1386 "void g() {}");
1387}
1388
Daniel Jasper2b41a822013-08-20 12:42:50 +00001389TEST_F(FormatTest, FormatsEnumStruct) {
1390 verifyFormat("enum struct {\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 struct Enum {};");
1399 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001400 verifyFormat("enum struct X E {} d;");
1401 verifyFormat("enum struct __attribute__((...)) E {} d;");
1402 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001403 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1404}
1405
1406TEST_F(FormatTest, FormatsEnumClass) {
1407 verifyFormat("enum class {\n"
1408 " Zero,\n"
1409 " One = 1,\n"
1410 " Two = One + 1,\n"
1411 " Three = (One + Two),\n"
1412 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1413 " Five = (One, Two, Three, Four, 5)\n"
1414 "};");
1415 verifyFormat("enum class Enum {};");
1416 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001417 verifyFormat("enum class X E {} d;");
1418 verifyFormat("enum class __attribute__((...)) E {} d;");
1419 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001420 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1421}
1422
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001423TEST_F(FormatTest, FormatsEnumTypes) {
1424 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001425 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001426 " B\n"
1427 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001428 verifyFormat("enum X : int { A, B };");
1429 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001430}
1431
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001432TEST_F(FormatTest, FormatsTypedefEnum) {
1433 FormatStyle Style = getLLVMStyle();
1434 Style.ColumnLimit = 40;
1435 verifyFormat("typedef enum {} EmptyEnum;");
1436 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1437 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001438 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001439 " ONE = 1,\n"
1440 " TWO = 2,\n"
1441 " THREE = 3\n"
1442 "} LongEnum;",
1443 Style);
1444 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1445 Style.BraceWrapping.AfterEnum = true;
1446 verifyFormat("typedef enum {} EmptyEnum;");
1447 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1448 verifyFormat("typedef enum\n"
1449 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001450 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001451 " ONE = 1,\n"
1452 " TWO = 2,\n"
1453 " THREE = 3\n"
1454 "} LongEnum;",
1455 Style);
1456}
1457
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001458TEST_F(FormatTest, FormatsNSEnums) {
1459 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1460 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1461 " // Information about someDecentlyLongValue.\n"
1462 " someDecentlyLongValue,\n"
1463 " // Information about anotherDecentlyLongValue.\n"
1464 " anotherDecentlyLongValue,\n"
1465 " // Information about aThirdDecentlyLongValue.\n"
1466 " aThirdDecentlyLongValue\n"
1467 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001468 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1469 " a = 1,\n"
1470 " b = 2,\n"
1471 " c = 3,\n"
1472 "};");
1473 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1474 " a = 1,\n"
1475 " b = 2,\n"
1476 " c = 3,\n"
1477 "};");
1478 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1479 " a = 1,\n"
1480 " b = 2,\n"
1481 " c = 3,\n"
1482 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001483}
1484
Nico Weber7769a902013-01-14 05:49:49 +00001485TEST_F(FormatTest, FormatsBitfields) {
1486 verifyFormat("struct Bitfields {\n"
1487 " unsigned sClass : 8;\n"
1488 " unsigned ValueKind : 2;\n"
1489 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001490 verifyFormat("struct A {\n"
1491 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1492 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1493 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001494 verifyFormat("struct MyStruct {\n"
1495 " uchar data;\n"
1496 " uchar : 8;\n"
1497 " uchar : 8;\n"
1498 " uchar other;\n"
1499 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001500}
1501
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001502TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001503 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1504 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1505
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001506 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001507 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001508 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001509 "}",
1510 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001511 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001512 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001513 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001514 "}",
1515 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001516 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001517 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001518 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001519 "}",
1520 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001521 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001522 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001523 "void f() { f(); }",
1524 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001525
1526 // This code is more common than we thought; if we
1527 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001528 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001529 verifyFormat("namespace {};",
1530 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001531 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001532 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001533 "};",
1534 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001535
1536 verifyFormat("namespace {\n"
1537 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001538 "} // namespace",
1539 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001540 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1541 "#define HEADER_GUARD\n"
1542 "namespace my_namespace {\n"
1543 "int i;\n"
1544 "} // my_namespace\n"
1545 "#endif // HEADER_GUARD",
1546 format("#ifndef HEADER_GUARD\n"
1547 " #define HEADER_GUARD\n"
1548 " namespace my_namespace {\n"
1549 "int i;\n"
1550 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001551 "#endif // HEADER_GUARD",
1552 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001553
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001554 EXPECT_EQ("namespace A::B {\n"
1555 "class C {};\n"
1556 "}",
1557 format("namespace A::B {\n"
1558 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001559 "}",
1560 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001561
Daniel Jasper65ee3472013-07-31 23:16:02 +00001562 FormatStyle Style = getLLVMStyle();
1563 Style.NamespaceIndentation = FormatStyle::NI_All;
1564 EXPECT_EQ("namespace out {\n"
1565 " int i;\n"
1566 " namespace in {\n"
1567 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001568 " } // namespace in\n"
1569 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001570 format("namespace out {\n"
1571 "int i;\n"
1572 "namespace in {\n"
1573 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001574 "} // namespace in\n"
1575 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001576 Style));
1577
1578 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1579 EXPECT_EQ("namespace out {\n"
1580 "int i;\n"
1581 "namespace in {\n"
1582 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001583 "} // namespace in\n"
1584 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001585 format("namespace out {\n"
1586 "int i;\n"
1587 "namespace in {\n"
1588 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001589 "} // namespace in\n"
1590 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001591 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001592}
1593
Francois Ferrande56a8292017-06-14 12:29:47 +00001594TEST_F(FormatTest, FormatsCompactNamespaces) {
1595 FormatStyle Style = getLLVMStyle();
1596 Style.CompactNamespaces = true;
1597
1598 verifyFormat("namespace A { namespace B {\n"
1599 "}} // namespace A::B",
1600 Style);
1601
1602 EXPECT_EQ("namespace out { namespace in {\n"
1603 "}} // namespace out::in",
1604 format("namespace out {\n"
1605 "namespace in {\n"
1606 "} // namespace in\n"
1607 "} // namespace out",
1608 Style));
1609
1610 // Only namespaces which have both consecutive opening and end get compacted
1611 EXPECT_EQ("namespace out {\n"
1612 "namespace in1 {\n"
1613 "} // namespace in1\n"
1614 "namespace in2 {\n"
1615 "} // namespace in2\n"
1616 "} // namespace out",
1617 format("namespace out {\n"
1618 "namespace in1 {\n"
1619 "} // namespace in1\n"
1620 "namespace in2 {\n"
1621 "} // namespace in2\n"
1622 "} // namespace out",
1623 Style));
1624
1625 EXPECT_EQ("namespace out {\n"
1626 "int i;\n"
1627 "namespace in {\n"
1628 "int j;\n"
1629 "} // namespace in\n"
1630 "int k;\n"
1631 "} // namespace out",
1632 format("namespace out { int i;\n"
1633 "namespace in { int j; } // namespace in\n"
1634 "int k; } // namespace out",
1635 Style));
1636
1637 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1638 "}}} // namespace A::B::C\n",
1639 format("namespace A { namespace B {\n"
1640 "namespace C {\n"
1641 "}} // namespace B::C\n"
1642 "} // namespace A\n",
1643 Style));
1644
1645 Style.ColumnLimit = 40;
1646 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1647 "namespace bbbbbbbbbb {\n"
1648 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1649 format("namespace aaaaaaaaaa {\n"
1650 "namespace bbbbbbbbbb {\n"
1651 "} // namespace bbbbbbbbbb\n"
1652 "} // namespace aaaaaaaaaa",
1653 Style));
1654
1655 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1656 "namespace cccccc {\n"
1657 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1658 format("namespace aaaaaa {\n"
1659 "namespace bbbbbb {\n"
1660 "namespace cccccc {\n"
1661 "} // namespace cccccc\n"
1662 "} // namespace bbbbbb\n"
1663 "} // namespace aaaaaa",
1664 Style));
1665 Style.ColumnLimit = 80;
1666
1667 // Extra semicolon after 'inner' closing brace prevents merging
1668 EXPECT_EQ("namespace out { namespace in {\n"
1669 "}; } // namespace out::in",
1670 format("namespace out {\n"
1671 "namespace in {\n"
1672 "}; // namespace in\n"
1673 "} // namespace out",
1674 Style));
1675
1676 // Extra semicolon after 'outer' closing brace is conserved
1677 EXPECT_EQ("namespace out { namespace in {\n"
1678 "}}; // namespace out::in",
1679 format("namespace out {\n"
1680 "namespace in {\n"
1681 "} // namespace in\n"
1682 "}; // namespace out",
1683 Style));
1684
1685 Style.NamespaceIndentation = FormatStyle::NI_All;
1686 EXPECT_EQ("namespace out { namespace in {\n"
1687 " int i;\n"
1688 "}} // namespace out::in",
1689 format("namespace out {\n"
1690 "namespace in {\n"
1691 "int i;\n"
1692 "} // namespace in\n"
1693 "} // namespace out",
1694 Style));
1695 EXPECT_EQ("namespace out { namespace mid {\n"
1696 " namespace in {\n"
1697 " int j;\n"
1698 " } // namespace in\n"
1699 " int k;\n"
1700 "}} // namespace out::mid",
1701 format("namespace out { namespace mid {\n"
1702 "namespace in { int j; } // namespace in\n"
1703 "int k; }} // namespace out::mid",
1704 Style));
1705
1706 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1707 EXPECT_EQ("namespace out { namespace in {\n"
1708 " int i;\n"
1709 "}} // namespace out::in",
1710 format("namespace out {\n"
1711 "namespace in {\n"
1712 "int i;\n"
1713 "} // namespace in\n"
1714 "} // namespace out",
1715 Style));
1716 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1717 " int i;\n"
1718 "}}} // namespace out::mid::in",
1719 format("namespace out {\n"
1720 "namespace mid {\n"
1721 "namespace in {\n"
1722 "int i;\n"
1723 "} // namespace in\n"
1724 "} // namespace mid\n"
1725 "} // namespace out",
1726 Style));
1727}
1728
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001729TEST_F(FormatTest, FormatsExternC) {
1730 verifyFormat("extern \"C\" {\nint a;");
1731 verifyFormat("extern \"C\" {}");
1732 verifyFormat("extern \"C\" {\n"
1733 "int foo();\n"
1734 "}");
1735 verifyFormat("extern \"C\" int foo() {}");
1736 verifyFormat("extern \"C\" int foo();");
1737 verifyFormat("extern \"C\" int foo() {\n"
1738 " int i = 42;\n"
1739 " return i;\n"
1740 "}");
1741
1742 FormatStyle Style = getLLVMStyle();
1743 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1744 Style.BraceWrapping.AfterFunction = true;
1745 verifyFormat("extern \"C\" int foo() {}", Style);
1746 verifyFormat("extern \"C\" int foo();", Style);
1747 verifyFormat("extern \"C\" int foo()\n"
1748 "{\n"
1749 " int i = 42;\n"
1750 " return i;\n"
1751 "}",
1752 Style);
1753
1754 Style.BraceWrapping.AfterExternBlock = true;
1755 Style.BraceWrapping.SplitEmptyRecord = false;
1756 verifyFormat("extern \"C\"\n"
1757 "{}",
1758 Style);
1759 verifyFormat("extern \"C\"\n"
1760 "{\n"
1761 " int foo();\n"
1762 "}",
1763 Style);
1764}
Manuel Klimekae610d12013-01-21 14:32:05 +00001765
Daniel Jasper40aacf42013-03-14 13:45:21 +00001766TEST_F(FormatTest, FormatsInlineASM) {
1767 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001768 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001769 verifyFormat(
1770 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1771 " \"cpuid\\n\\t\"\n"
1772 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001773 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001774 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001775 EXPECT_EQ(
1776 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001777 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001778 " mov edx,[that] // vtable in edx\n"
1779 " mov eax,methodIndex\n"
1780 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001781 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001782 "}",
1783 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1784 " __asm {\n"
1785 " mov edx,[that] // vtable in edx\n"
1786 " mov eax,methodIndex\n"
1787 " call [edx][eax*4] // stdcall\n"
1788 " }\n"
1789 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001790 EXPECT_EQ("_asm {\n"
1791 " xor eax, eax;\n"
1792 " cpuid;\n"
1793 "}",
1794 format("_asm {\n"
1795 " xor eax, eax;\n"
1796 " cpuid;\n"
1797 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001798 verifyFormat("void function() {\n"
1799 " // comment\n"
1800 " asm(\"\");\n"
1801 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001802 EXPECT_EQ("__asm {\n"
1803 "}\n"
1804 "int i;",
1805 format("__asm {\n"
1806 "}\n"
1807 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001808}
1809
Nico Weberd5650bd2013-01-07 16:36:17 +00001810TEST_F(FormatTest, FormatTryCatch) {
1811 verifyFormat("try {\n"
1812 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001813 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001814 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001815 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001816 " exit(42);\n"
1817 "}");
1818
1819 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001820 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001821 " return 5;\n"
1822 "}");
1823 verifyFormat("class A {\n"
1824 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001825 " A() try : a(0) {\n"
1826 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001827 " throw;\n"
1828 " }\n"
1829 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001830
1831 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001832 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001833}
1834
Nico Weberfac23712015-02-04 15:26:27 +00001835TEST_F(FormatTest, FormatSEHTryCatch) {
1836 verifyFormat("__try {\n"
1837 " int a = b * c;\n"
1838 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1839 " // Do nothing.\n"
1840 "}");
1841
1842 verifyFormat("__try {\n"
1843 " int a = b * c;\n"
1844 "} __finally {\n"
1845 " // Do nothing.\n"
1846 "}");
1847
1848 verifyFormat("DEBUG({\n"
1849 " __try {\n"
1850 " } __finally {\n"
1851 " }\n"
1852 "});\n");
1853}
1854
Daniel Jasper04a71a42014-05-08 11:58:24 +00001855TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1856 verifyFormat("try {\n"
1857 " f();\n"
1858 "} catch {\n"
1859 " g();\n"
1860 "}");
1861 verifyFormat("try {\n"
1862 " f();\n"
1863 "} catch (A a) MACRO(x) {\n"
1864 " g();\n"
1865 "} catch (B b) MACRO(x) {\n"
1866 " g();\n"
1867 "}");
1868}
1869
1870TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1871 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001872 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1873 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001874 Style.BreakBeforeBraces = BraceStyle;
1875 verifyFormat("try {\n"
1876 " // something\n"
1877 "} catch (...) {\n"
1878 " // something\n"
1879 "}",
1880 Style);
1881 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001882 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1883 verifyFormat("try {\n"
1884 " // something\n"
1885 "}\n"
1886 "catch (...) {\n"
1887 " // something\n"
1888 "}",
1889 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001890 verifyFormat("__try {\n"
1891 " // something\n"
1892 "}\n"
1893 "__finally {\n"
1894 " // something\n"
1895 "}",
1896 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001897 verifyFormat("@try {\n"
1898 " // something\n"
1899 "}\n"
1900 "@finally {\n"
1901 " // something\n"
1902 "}",
1903 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001904 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1905 verifyFormat("try\n"
1906 "{\n"
1907 " // something\n"
1908 "}\n"
1909 "catch (...)\n"
1910 "{\n"
1911 " // something\n"
1912 "}",
1913 Style);
1914 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1915 verifyFormat("try\n"
1916 " {\n"
1917 " // something\n"
1918 " }\n"
1919 "catch (...)\n"
1920 " {\n"
1921 " // something\n"
1922 " }",
1923 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001924 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1925 Style.BraceWrapping.BeforeCatch = true;
1926 verifyFormat("try {\n"
1927 " // something\n"
1928 "}\n"
1929 "catch (...) {\n"
1930 " // something\n"
1931 "}",
1932 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001933}
1934
Daniel Jaspere25509f2012-12-17 11:29:41 +00001935TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001936 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001937
Daniel Jaspera44991332015-04-29 13:06:49 +00001938 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1939 " 100000000, "
1940 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001941
Daniel Jasper473c62c2013-05-17 09:35:01 +00001942 // Here, everything other than the "}" would fit on a line.
1943 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001944 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001945 EXPECT_EQ("S s = {a,\n"
1946 "\n"
1947 " b};",
1948 format("S s = {\n"
1949 " a,\n"
1950 "\n"
1951 " b\n"
1952 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001953
1954 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1955 // line. However, the formatting looks a bit off and this probably doesn't
1956 // happen often in practice.
1957 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001958 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001959 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001960}
1961
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001962TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001963 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1964 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1965 " .bbbbbbbbbb = 2,\n"
1966 " .cccccccccc = 3,\n"
1967 " .dddddddddd = 4,\n"
1968 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001969 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001970 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1971 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1972 " .ccccccccccccccccccccccccccc = 3,\n"
1973 " .ddddddddddddddddddddddddddd = 4,\n"
1974 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001975
1976 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001977
1978 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1979 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1980 " [2] = bbbbbbbbbb,\n"
1981 " [3] = cccccccccc,\n"
1982 " [4] = dddddddddd,\n"
1983 " [5] = eeeeeeeeee};");
1984 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1985 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1986 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1987 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1988 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1989 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001990}
1991
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001992TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001993 verifyFormat("static A x = {{{}}};\n");
1994 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1995 " {init1, init2, init3, init4}}};",
1996 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001997
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001998 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001999 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2000 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2001 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2002 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002003 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002004 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2005 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2006 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002007 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2008 " {rect.fRight - rect.fLeft, rect.fBottom - "
2009 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002010
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002011 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002012 "SomeArrayOfSomeType a = {\n"
2013 " {{1, 2, 3},\n"
2014 " {1, 2, 3},\n"
2015 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2016 " 333333333333333333333333333333},\n"
2017 " {1, 2, 3},\n"
2018 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002019 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002020 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002021 " {{1, 2, 3}},\n"
2022 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002023 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2024 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002025 " {{1, 2, 3}},\n"
2026 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002027
Daniel Jaspera44991332015-04-29 13:06:49 +00002028 verifyFormat("struct {\n"
2029 " unsigned bit;\n"
2030 " const char *const name;\n"
2031 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2032 " {kOsWin, \"Windows\"},\n"
2033 " {kOsLinux, \"Linux\"},\n"
2034 " {kOsCrOS, \"Chrome OS\"}};");
2035 verifyFormat("struct {\n"
2036 " unsigned bit;\n"
2037 " const char *const name;\n"
2038 "} kBitsToOs[] = {\n"
2039 " {kOsMac, \"Mac\"},\n"
2040 " {kOsWin, \"Windows\"},\n"
2041 " {kOsLinux, \"Linux\"},\n"
2042 " {kOsCrOS, \"Chrome OS\"},\n"
2043 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002044}
2045
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002046TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2047 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2048 " \\\n"
2049 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2050}
2051
Daniel Jasperda16db32013-01-07 10:48:50 +00002052TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002053 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2054 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002055
2056 // Do break defaulted and deleted functions.
2057 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2058 " default;",
2059 getLLVMStyleWithColumns(40));
2060 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2061 " delete;",
2062 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002063}
2064
2065TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2066 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2067 getLLVMStyleWithColumns(40));
2068 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2069 getLLVMStyleWithColumns(40));
2070 EXPECT_EQ("#define Q \\\n"
2071 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2072 " \"aaaaaaaa.cpp\"",
2073 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2074 getLLVMStyleWithColumns(40)));
2075}
2076
2077TEST_F(FormatTest, UnderstandsLinePPDirective) {
2078 EXPECT_EQ("# 123 \"A string literal\"",
2079 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002080}
2081
Manuel Klimek591b5802013-01-31 15:58:48 +00002082TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002083 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002084 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002085}
2086
2087TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2088 EXPECT_EQ("#line 42 \"test\"\n",
2089 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002090 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2091 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002092}
2093
2094TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2095 EXPECT_EQ("#line 42 \"test\"",
2096 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002097 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002098}
2099
Daniel Jasper877615c2013-10-11 19:45:02 +00002100TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2101 verifyFormat("#define A \\x20");
2102 verifyFormat("#define A \\ x20");
2103 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2104 verifyFormat("#define A ''");
2105 verifyFormat("#define A ''qqq");
2106 verifyFormat("#define A `qqq");
2107 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002108 EXPECT_EQ("const char *c = STRINGIFY(\n"
2109 "\\na : b);",
2110 format("const char * c = STRINGIFY(\n"
2111 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002112
2113 verifyFormat("a\r\\");
2114 verifyFormat("a\v\\");
2115 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002116}
2117
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002118TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002119 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2120 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002121 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002122 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002123 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002124
2125 verifyFormat("#define A A\n#define A A");
2126 verifyFormat("#define A(X) A\n#define A A");
2127
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002128 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2129 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002130}
2131
2132TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002133 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002134 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002135 "#define A( \\\n"
2136 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002137 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002138 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002139 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002140 " #include \"a.h\"\n"
2141 "#define A(A,\\\n"
2142 " B)\n"
2143 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002144 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002145 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002146}
2147
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002148TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002149
2150TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2151 EXPECT_EQ("#define A \\\n"
2152 " c; \\\n"
2153 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002154 "f;",
2155 format("#define A c; e;\n"
2156 "f;",
2157 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002158}
2159
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002160TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002161
Manuel Klimek1abf7892013-01-04 23:34:14 +00002162TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002163 EXPECT_EQ("int x,\n"
2164 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002165 " y;",
2166 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002167}
2168
Manuel Klimek09e07972013-01-05 21:34:55 +00002169TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002170 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002171 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002172 verifyFormat("#define A \\\n"
2173 " { \\\n"
2174 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002175 " }",
2176 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002177
2178 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002179 " void function##X()",
2180 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002181
2182 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002183 " void a##b##c()",
2184 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002185
Daniel Jasper39825ea2013-01-14 15:40:57 +00002186 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002187}
2188
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002189TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002190 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2191 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002192}
2193
Manuel Klimek0c137952013-02-11 12:33:24 +00002194TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2195 EXPECT_EQ("#define A b;", format("#define A \\\n"
2196 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002197 " b;",
2198 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002199 EXPECT_EQ("#define A \\\n"
2200 " \\\n"
2201 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002202 " b;",
2203 format("#define A \\\n"
2204 " \\\n"
2205 " a; \\\n"
2206 " b;",
2207 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002208 EXPECT_EQ("#define A \\\n"
2209 " a; \\\n"
2210 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002211 " b;",
2212 format("#define A \\\n"
2213 " a; \\\n"
2214 " \\\n"
2215 " b;",
2216 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002217}
2218
Daniel Jasper00475962013-02-19 17:14:38 +00002219TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002220 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002221 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002222 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002223 " case 2\n",
2224 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002225 verifyFormat("#define MACRO(a) \\\n"
2226 " if (a) \\\n"
2227 " f(); \\\n"
2228 " else \\\n"
2229 " g()",
2230 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002231 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002232 verifyIncompleteFormat("#define STR(x) #x\n"
2233 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002234 verifyFormat("#pragma omp threadprivate( \\\n"
2235 " y)), // expected-warning",
2236 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002237 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002238 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002239 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002240 "#define b \\\n"
2241 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002242 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002243 "a",
2244 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002245 verifyFormat("#define A \\\n"
2246 " { \\\n"
2247 " {\n"
2248 "#define B \\\n"
2249 " } \\\n"
2250 " }",
2251 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002252 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002253 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002254 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002255 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002256}
2257
Daniel Jasper40e19212013-05-29 13:16:10 +00002258TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2259 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2260 EXPECT_EQ("class A : public QObject {\n"
2261 " Q_OBJECT\n"
2262 "\n"
2263 " A() {}\n"
2264 "};",
2265 format("class A : public QObject {\n"
2266 " Q_OBJECT\n"
2267 "\n"
2268 " A() {\n}\n"
2269 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002270 EXPECT_EQ("MACRO\n"
2271 "/*static*/ int i;",
2272 format("MACRO\n"
2273 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002274 EXPECT_EQ("SOME_MACRO\n"
2275 "namespace {\n"
2276 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002277 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002278 format("SOME_MACRO\n"
2279 " namespace {\n"
2280 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002281 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002282 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002283 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2284 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002285 // Only if everything is upper case.
2286 EXPECT_EQ("class A : public QObject {\n"
2287 " Q_Object A() {}\n"
2288 "};",
2289 format("class A : public QObject {\n"
2290 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002291 " A() {\n}\n"
2292 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002293
2294 // Only if the next line can actually start an unwrapped line.
2295 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2296 format("SOME_WEIRD_LOG_MACRO\n"
2297 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002298
2299 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002300 "(n, buffers))\n",
2301 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002302}
2303
Alexander Kornienkode644272013-04-08 22:16:06 +00002304TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2305 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2306 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2307 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002308 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002309 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2310 "int *createScopDetectionPass() { return 0; }",
2311 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2312 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2313 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2314 " class X {};\n"
2315 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2316 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002317 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2318 // braces, so that inner block is indented one level more.
2319 EXPECT_EQ("int q() {\n"
2320 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2321 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2322 " IPC_END_MESSAGE_MAP()\n"
2323 "}",
2324 format("int q() {\n"
2325 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2326 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2327 " IPC_END_MESSAGE_MAP()\n"
2328 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002329
Daniel Jasper352dae12014-01-03 11:50:46 +00002330 // Same inside macros.
2331 EXPECT_EQ("#define LIST(L) \\\n"
2332 " L(A) \\\n"
2333 " L(B) \\\n"
2334 " L(C)",
2335 format("#define LIST(L) \\\n"
2336 " L(A) \\\n"
2337 " L(B) \\\n"
2338 " L(C)",
2339 getGoogleStyle()));
2340
Daniel Jasper545c6522013-09-17 09:26:07 +00002341 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002342 EXPECT_EQ("int q() {\n"
2343 " f(x);\n"
2344 " f(x) {}\n"
2345 " f(x)->g();\n"
2346 " f(x)->*g();\n"
2347 " f(x).g();\n"
2348 " f(x) = x;\n"
2349 " f(x) += x;\n"
2350 " f(x) -= x;\n"
2351 " f(x) *= x;\n"
2352 " f(x) /= x;\n"
2353 " f(x) %= x;\n"
2354 " f(x) &= x;\n"
2355 " f(x) |= x;\n"
2356 " f(x) ^= x;\n"
2357 " f(x) >>= x;\n"
2358 " f(x) <<= x;\n"
2359 " f(x)[y].z();\n"
2360 " LOG(INFO) << x;\n"
2361 " ifstream(x) >> x;\n"
2362 "}\n",
2363 format("int q() {\n"
2364 " f(x)\n;\n"
2365 " f(x)\n {}\n"
2366 " f(x)\n->g();\n"
2367 " f(x)\n->*g();\n"
2368 " f(x)\n.g();\n"
2369 " f(x)\n = x;\n"
2370 " f(x)\n += x;\n"
2371 " f(x)\n -= x;\n"
2372 " f(x)\n *= x;\n"
2373 " f(x)\n /= x;\n"
2374 " f(x)\n %= x;\n"
2375 " f(x)\n &= x;\n"
2376 " f(x)\n |= x;\n"
2377 " f(x)\n ^= x;\n"
2378 " f(x)\n >>= x;\n"
2379 " f(x)\n <<= x;\n"
2380 " f(x)\n[y].z();\n"
2381 " LOG(INFO)\n << x;\n"
2382 " ifstream(x)\n >> x;\n"
2383 "}\n"));
2384 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002385 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002386 " if (1) {\n"
2387 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002388 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002389 " while (1) {\n"
2390 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002391 " F(x)\n"
2392 " G(x);\n"
2393 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002394 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002395 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002396 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002397 " }\n"
2398 "}\n",
2399 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002400 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002401 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002402 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002403 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002404 "F(x)\n"
2405 "G(x);\n"
2406 "F(x)\n"
2407 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002408 "}\n"));
2409 EXPECT_EQ("class A {\n"
2410 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002411 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002412 " A(X x)\n" // FIXME: function-level try blocks are broken.
2413 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002414 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002415 " }\n"
2416 "};",
2417 format("class A {\n"
2418 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002419 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002420 " A(X x)\n"
2421 " try : t(0) {} catch (...) {}\n"
2422 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002423 EXPECT_EQ("class SomeClass {\n"
2424 "public:\n"
2425 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2426 "};",
2427 format("class SomeClass {\n"
2428 "public:\n"
2429 " SomeClass()\n"
2430 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2431 "};"));
2432 EXPECT_EQ("class SomeClass {\n"
2433 "public:\n"
2434 " SomeClass()\n"
2435 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2436 "};",
2437 format("class SomeClass {\n"
2438 "public:\n"
2439 " SomeClass()\n"
2440 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2441 "};",
2442 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002443
2444 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002445}
2446
Manuel Klimek4fe43002013-05-22 12:51:29 +00002447TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2448 verifyFormat("#define A \\\n"
2449 " f({ \\\n"
2450 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002451 " });",
2452 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002453}
2454
Krasimir Georgievad47c902017-08-30 14:34:57 +00002455TEST_F(FormatTest, IndentPreprocessorDirectives) {
2456 FormatStyle Style = getLLVMStyle();
2457 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2458 Style.ColumnLimit = 40;
2459 verifyFormat("#ifdef _WIN32\n"
2460 "#define A 0\n"
2461 "#ifdef VAR2\n"
2462 "#define B 1\n"
2463 "#include <someheader.h>\n"
2464 "#define MACRO \\\n"
2465 " some_very_long_func_aaaaaaaaaa();\n"
2466 "#endif\n"
2467 "#else\n"
2468 "#define A 1\n"
2469 "#endif",
2470 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002471 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2472 verifyFormat("#ifdef _WIN32\n"
2473 "# define A 0\n"
2474 "# ifdef VAR2\n"
2475 "# define B 1\n"
2476 "# include <someheader.h>\n"
2477 "# define MACRO \\\n"
2478 " some_very_long_func_aaaaaaaaaa();\n"
2479 "# endif\n"
2480 "#else\n"
2481 "# define A 1\n"
2482 "#endif",
2483 Style);
2484 verifyFormat("#if A\n"
2485 "# define MACRO \\\n"
2486 " void a(int x) { \\\n"
2487 " b(); \\\n"
2488 " c(); \\\n"
2489 " d(); \\\n"
2490 " e(); \\\n"
2491 " f(); \\\n"
2492 " }\n"
2493 "#endif",
2494 Style);
2495 // Comments before include guard.
2496 verifyFormat("// file comment\n"
2497 "// file comment\n"
2498 "#ifndef HEADER_H\n"
2499 "#define HEADER_H\n"
2500 "code();\n"
2501 "#endif",
2502 Style);
2503 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002504 verifyFormat("#ifndef HEADER_H\n"
2505 "#define HEADER_H\n"
2506 "code();\n"
2507 "#endif",
2508 Style);
2509 // Include guards must have a #define with the same variable immediately
2510 // after #ifndef.
2511 verifyFormat("#ifndef NOT_GUARD\n"
2512 "# define FOO\n"
2513 "code();\n"
2514 "#endif",
2515 Style);
2516
2517 // Include guards must cover the entire file.
2518 verifyFormat("code();\n"
2519 "code();\n"
2520 "#ifndef NOT_GUARD\n"
2521 "# define NOT_GUARD\n"
2522 "code();\n"
2523 "#endif",
2524 Style);
2525 verifyFormat("#ifndef NOT_GUARD\n"
2526 "# define NOT_GUARD\n"
2527 "code();\n"
2528 "#endif\n"
2529 "code();",
2530 Style);
2531 // Test with trailing blank lines.
2532 verifyFormat("#ifndef HEADER_H\n"
2533 "#define HEADER_H\n"
2534 "code();\n"
2535 "#endif\n",
2536 Style);
2537 // Include guards don't have #else.
2538 verifyFormat("#ifndef NOT_GUARD\n"
2539 "# define NOT_GUARD\n"
2540 "code();\n"
2541 "#else\n"
2542 "#endif",
2543 Style);
2544 verifyFormat("#ifndef NOT_GUARD\n"
2545 "# define NOT_GUARD\n"
2546 "code();\n"
2547 "#elif FOO\n"
2548 "#endif",
2549 Style);
2550 // FIXME: This doesn't handle the case where there's code between the
2551 // #ifndef and #define but all other conditions hold. This is because when
2552 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2553 // previous code line yet, so we can't detect it.
2554 EXPECT_EQ("#ifndef NOT_GUARD\n"
2555 "code();\n"
2556 "#define NOT_GUARD\n"
2557 "code();\n"
2558 "#endif",
2559 format("#ifndef NOT_GUARD\n"
2560 "code();\n"
2561 "# define NOT_GUARD\n"
2562 "code();\n"
2563 "#endif",
2564 Style));
2565 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2566 // be outside an include guard. Examples are #pragma once and
2567 // #pragma GCC diagnostic, or anything else that does not change the meaning
2568 // of the file if it's included multiple times.
2569 EXPECT_EQ("#ifdef WIN32\n"
2570 "# pragma once\n"
2571 "#endif\n"
2572 "#ifndef HEADER_H\n"
2573 "# define HEADER_H\n"
2574 "code();\n"
2575 "#endif",
2576 format("#ifdef WIN32\n"
2577 "# pragma once\n"
2578 "#endif\n"
2579 "#ifndef HEADER_H\n"
2580 "#define HEADER_H\n"
2581 "code();\n"
2582 "#endif",
2583 Style));
2584 // FIXME: This does not detect when there is a single non-preprocessor line
2585 // in front of an include-guard-like structure where other conditions hold
2586 // because ScopedLineState hides the line.
2587 EXPECT_EQ("code();\n"
2588 "#ifndef HEADER_H\n"
2589 "#define HEADER_H\n"
2590 "code();\n"
2591 "#endif",
2592 format("code();\n"
2593 "#ifndef HEADER_H\n"
2594 "# define HEADER_H\n"
2595 "code();\n"
2596 "#endif",
2597 Style));
2598 // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
2599 // preprocessor indentation.
2600 EXPECT_EQ("#if 1\n"
2601 " // comment\n"
2602 "# define A 0\n"
2603 "// comment\n"
2604 "# define B 0\n"
2605 "#endif",
2606 format("#if 1\n"
2607 "// comment\n"
2608 "# define A 0\n"
2609 " // comment\n"
2610 "# define B 0\n"
2611 "#endif",
2612 Style));
2613 // Test with tabs.
2614 Style.UseTab = FormatStyle::UT_Always;
2615 Style.IndentWidth = 8;
2616 Style.TabWidth = 8;
2617 verifyFormat("#ifdef _WIN32\n"
2618 "#\tdefine A 0\n"
2619 "#\tifdef VAR2\n"
2620 "#\t\tdefine B 1\n"
2621 "#\t\tinclude <someheader.h>\n"
2622 "#\t\tdefine MACRO \\\n"
2623 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2624 "#\tendif\n"
2625 "#else\n"
2626 "#\tdefine A 1\n"
2627 "#endif",
2628 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002629
2630 // Regression test: Multiline-macro inside include guards.
2631 verifyFormat("#ifndef HEADER_H\n"
2632 "#define HEADER_H\n"
2633 "#define A() \\\n"
2634 " int i; \\\n"
2635 " int j;\n"
2636 "#endif // HEADER_H",
2637 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002638}
2639
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002640TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002641 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002642}
2643
Manuel Klimek1058d982013-01-06 20:07:31 +00002644TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2645 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2646 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2647 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2648 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2649}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002650
Daniel Jaspere2408e32015-05-06 11:16:43 +00002651TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002652 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2653 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2654 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002655 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002656 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002657 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002658 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002659
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002660 FormatStyle AlignLeft = getLLVMStyle();
2661 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2662 EXPECT_EQ("#define MACRO(x) \\\n"
2663 "private: \\\n"
2664 " int x(int a);\n",
2665 format("#define MACRO(x) \\\n"
2666 "private: \\\n"
2667 " int x(int a);\n",
2668 AlignLeft));
2669
2670 // CRLF line endings
2671 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2672 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2673 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2674 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2675 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2676 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2677 EXPECT_EQ("#define MACRO(x) \\\r\n"
2678 "private: \\\r\n"
2679 " int x(int a);\r\n",
2680 format("#define MACRO(x) \\\r\n"
2681 "private: \\\r\n"
2682 " int x(int a);\r\n",
2683 AlignLeft));
2684
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002685 FormatStyle DontAlign = getLLVMStyle();
2686 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2687 DontAlign.MaxEmptyLinesToKeep = 3;
2688 // FIXME: can't use verifyFormat here because the newline before
2689 // "public:" is not inserted the first time it's reformatted
2690 EXPECT_EQ("#define A \\\n"
2691 " class Foo { \\\n"
2692 " void bar(); \\\n"
2693 "\\\n"
2694 "\\\n"
2695 "\\\n"
2696 " public: \\\n"
2697 " void baz(); \\\n"
2698 " };",
2699 format("#define A \\\n"
2700 " class Foo { \\\n"
2701 " void bar(); \\\n"
2702 "\\\n"
2703 "\\\n"
2704 "\\\n"
2705 " public: \\\n"
2706 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002707 " };",
2708 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002709}
2710
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002711TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2712 verifyFormat("#define A \\\n"
2713 " int v( \\\n"
2714 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002715 " int i;",
2716 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002717}
2718
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002719TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002720 EXPECT_EQ(
2721 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2722 " \\\n"
2723 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2724 "\n"
2725 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2726 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2727 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2728 "\\\n"
2729 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2730 " \n"
2731 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2732 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002733}
2734
Manuel Klimek52b15152013-01-09 15:25:02 +00002735TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2736 EXPECT_EQ("int\n"
2737 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002738 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002739 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002740 verifyFormat("functionCallTo(\n"
2741 " someOtherFunction(\n"
2742 " withSomeParameters, whichInSequence,\n"
2743 " areLongerThanALine(andAnotherCall,\n"
2744 "#define A B\n"
2745 " withMoreParamters,\n"
2746 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002747 " andMoreParameters),\n"
2748 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002749 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002750 verifyFormat("Foo::Foo()\n"
2751 "#ifdef BAR\n"
2752 " : baz(0)\n"
2753 "#endif\n"
2754 "{\n"
2755 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002756 verifyFormat("void f() {\n"
2757 " if (true)\n"
2758 "#ifdef A\n"
2759 " f(42);\n"
2760 " x();\n"
2761 "#else\n"
2762 " g();\n"
2763 " x();\n"
2764 "#endif\n"
2765 "}");
2766 verifyFormat("void f(param1, param2,\n"
2767 " param3,\n"
2768 "#ifdef A\n"
2769 " param4(param5,\n"
2770 "#ifdef A1\n"
2771 " param6,\n"
2772 "#ifdef A2\n"
2773 " param7),\n"
2774 "#else\n"
2775 " param8),\n"
2776 " param9,\n"
2777 "#endif\n"
2778 " param10,\n"
2779 "#endif\n"
2780 " param11)\n"
2781 "#else\n"
2782 " param12)\n"
2783 "#endif\n"
2784 "{\n"
2785 " x();\n"
2786 "}",
2787 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002788 verifyFormat("#if 1\n"
2789 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002790 verifyFormat("#if 1\n"
2791 "#endif\n"
2792 "#if 1\n"
2793 "#else\n"
2794 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002795 verifyFormat("DEBUG({\n"
2796 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2798 "});\n"
2799 "#if a\n"
2800 "#else\n"
2801 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002802
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002803 verifyIncompleteFormat("void f(\n"
2804 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002805 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002806 "#else\n"
2807 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002808}
2809
Manuel Klimek14bd9172014-01-29 08:49:02 +00002810TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2811 verifyFormat("#endif\n"
2812 "#if B");
2813}
2814
Manuel Klimek88033d72013-10-21 08:11:15 +00002815TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2816 FormatStyle SingleLine = getLLVMStyle();
2817 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002818 verifyFormat("#if 0\n"
2819 "#elif 1\n"
2820 "#endif\n"
2821 "void foo() {\n"
2822 " if (test) foo2();\n"
2823 "}",
2824 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002825}
2826
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002827TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002828 verifyFormat("functionCall({ int i; });");
2829 verifyFormat("functionCall({\n"
2830 " int i;\n"
2831 " int j;\n"
2832 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002833 verifyFormat("functionCall(\n"
2834 " {\n"
2835 " int i;\n"
2836 " int j;\n"
2837 " },\n"
2838 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002839 verifyFormat("functionA(functionB({\n"
2840 " int i;\n"
2841 " int j;\n"
2842 " }),\n"
2843 " aaaa, bbbb, cccc);");
2844 verifyFormat("functionCall(\n"
2845 " {\n"
2846 " int i;\n"
2847 " int j;\n"
2848 " },\n"
2849 " aaaa, bbbb, // comment\n"
2850 " cccc);");
2851 verifyFormat("functionA(functionB({\n"
2852 " int i;\n"
2853 " int j;\n"
2854 " }),\n"
2855 " aaaa, bbbb, // comment\n"
2856 " cccc);");
2857 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2858 verifyFormat("functionCall(aaaa, bbbb, {\n"
2859 " int i;\n"
2860 " int j;\n"
2861 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002862 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002863 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002864 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002865 " int i; // break\n"
2866 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2868 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002869 verifyFormat("DEBUG({\n"
2870 " if (a)\n"
2871 " f();\n"
2872 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002873}
2874
2875TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002876 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002877 "int i;",
2878 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002879}
2880
2881TEST_F(FormatTest, LayoutNestedBlocks) {
2882 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2883 " struct s {\n"
2884 " int i;\n"
2885 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002886 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002887 " for (int i = 0; i < 10; ++i)\n"
2888 " return;\n"
2889 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002890 verifyFormat("call(parameter, {\n"
2891 " something();\n"
2892 " // Comment using all columns.\n"
2893 " somethingelse();\n"
2894 "});",
2895 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002896 verifyFormat("DEBUG( //\n"
2897 " { f(); }, a);");
2898 verifyFormat("DEBUG( //\n"
2899 " {\n"
2900 " f(); //\n"
2901 " },\n"
2902 " a);");
2903
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002904 EXPECT_EQ("call(parameter, {\n"
2905 " something();\n"
2906 " // Comment too\n"
2907 " // looooooooooong.\n"
2908 " somethingElse();\n"
2909 "});",
2910 format("call(parameter, {\n"
2911 " something();\n"
2912 " // Comment too looooooooooong.\n"
2913 " somethingElse();\n"
2914 "});",
2915 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002916 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002917 EXPECT_EQ("DEBUG({ // comment\n"
2918 " int i;\n"
2919 "});",
2920 format("DEBUG({ // comment\n"
2921 "int i;\n"
2922 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002923 EXPECT_EQ("DEBUG({\n"
2924 " int i;\n"
2925 "\n"
2926 " // comment\n"
2927 " int j;\n"
2928 "});",
2929 format("DEBUG({\n"
2930 " int i;\n"
2931 "\n"
2932 " // comment\n"
2933 " int j;\n"
2934 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002935
2936 verifyFormat("DEBUG({\n"
2937 " if (a)\n"
2938 " return;\n"
2939 "});");
2940 verifyGoogleFormat("DEBUG({\n"
2941 " if (a) return;\n"
2942 "});");
2943 FormatStyle Style = getGoogleStyle();
2944 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002945 verifyFormat("Debug(aaaaa,\n"
2946 " {\n"
2947 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2948 " },\n"
2949 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002950 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002951
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002952 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2953
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002954 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002955}
2956
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002957TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2958 EXPECT_EQ("#define MACRO() \\\n"
2959 " Debug(aaa, /* force line break */ \\\n"
2960 " { \\\n"
2961 " int i; \\\n"
2962 " int j; \\\n"
2963 " })",
2964 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2965 " { int i; int j; })",
2966 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002967
2968 EXPECT_EQ("#define A \\\n"
2969 " [] { \\\n"
2970 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2971 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2972 " }",
2973 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2974 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2975 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002976}
2977
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002978TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2979 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002980 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002981 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002982}
2983
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002984TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2985 FormatStyle Style = getLLVMStyle();
2986 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2987 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2988 verifyFormat("FOO_BEGIN\n"
2989 " FOO_ENTRY\n"
2990 "FOO_END", Style);
2991 verifyFormat("FOO_BEGIN\n"
2992 " NESTED_FOO_BEGIN\n"
2993 " NESTED_FOO_ENTRY\n"
2994 " NESTED_FOO_END\n"
2995 "FOO_END", Style);
2996 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2997 " int x;\n"
2998 " x = 1;\n"
2999 "FOO_END(Baz)", Style);
3000}
3001
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003002//===----------------------------------------------------------------------===//
3003// Line break tests.
3004//===----------------------------------------------------------------------===//
3005
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003006TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003007 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003008 "void f() {\n"
3009 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3010 " parameter, parameter, parameter)),\n"
3011 " SecondLongCall(parameter));\n"
3012 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003013 verifyFormat(
3014 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3015 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3017 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3018 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003019 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3020 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3021 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3022 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003023 verifyFormat(
3024 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3025 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3027 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003028 verifyFormat("int a = bbbb && ccc &&\n"
3029 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003030 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003031 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003032}
3033
Daniel Jasperd69fc772013-05-08 14:12:04 +00003034TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3035 verifyFormat(
3036 "bool aaaaaaa =\n"
3037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3038 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003039 verifyFormat(
3040 "bool aaaaaaa =\n"
3041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3042 " bbbbbbbb();");
3043
Daniel Jasperd69fc772013-05-08 14:12:04 +00003044 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3046 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003047 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3049 " ccccccccc == ddddddddddd;");
3050 verifyFormat(
3051 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3053 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003054
3055 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3056 " aaaaaa) &&\n"
3057 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003058 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3059 " aaaaaa) >>\n"
3060 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003061 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003062 " SourceMgr.getSpellingColumnNumber(\n"
3063 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3064 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003065
Daniel Jasper68d888c2013-06-03 08:42:05 +00003066 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3067 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3068 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003069 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3070 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3071 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003072 verifyFormat("b = a &&\n"
3073 " // Comment\n"
3074 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003075
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003076 // If the LHS of a comparison is not a binary expression itself, the
3077 // additional linebreak confuses many people.
3078 verifyFormat(
3079 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3081 "}");
3082 verifyFormat(
3083 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3085 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003086 verifyFormat(
3087 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3089 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003090 verifyFormat(
3091 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3093 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003094 // Even explicit parentheses stress the precedence enough to make the
3095 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003096 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3098 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003099 // This cases is borderline, but with the indentation it is still readable.
3100 verifyFormat(
3101 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3102 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3103 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3104 "}",
3105 getLLVMStyleWithColumns(75));
3106
3107 // If the LHS is a binary expression, we should still use the additional break
3108 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003109 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3111 " 5) {\n"
3112 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003113 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3115 " 5) {\n"
3116 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003117
Daniel Jasper571f1af2013-05-14 20:39:56 +00003118 FormatStyle OnePerLine = getLLVMStyle();
3119 OnePerLine.BinPackParameters = false;
3120 verifyFormat(
3121 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3124 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003125
3126 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3127 " .aaa(aaaaaaaaaaaaa) *\n"
3128 " aaaaaaa +\n"
3129 " aaaaaaa;",
3130 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003131}
3132
Daniel Jasper6bee6822013-04-08 20:33:42 +00003133TEST_F(FormatTest, ExpressionIndentation) {
3134 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3137 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3138 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3139 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3140 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3142 " ccccccccccccccccccccccccccccccccccccccccc;");
3143 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3146 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3147 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3150 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3151 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3154 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003155 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003156 "} else if (aaaaa && bbbbb > // break\n"
3157 " ccccc) {\n"
3158 "}");
3159 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003160 "} else if (aaaaa &&\n"
3161 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003162 " ccccc &&\n"
3163 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003164 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003165
3166 // Presence of a trailing comment used to change indentation of b.
3167 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3168 " b;\n"
3169 "return aaaaaaaaaaaaaaaaaaa +\n"
3170 " b; //",
3171 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003172}
3173
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003174TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3175 // Not sure what the best system is here. Like this, the LHS can be found
3176 // immediately above an operator (everything with the same or a higher
3177 // indent). The RHS is aligned right of the operator and so compasses
3178 // everything until something with the same indent as the operator is found.
3179 // FIXME: Is this a good system?
3180 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003181 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003182 verifyFormat(
3183 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003184 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3185 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3186 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3187 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3188 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003189 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003190 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3191 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003192 Style);
3193 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003194 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3195 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003196 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3197 Style);
3198 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003199 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3200 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003201 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3202 Style);
3203 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3204 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003205 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3206 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003207 Style);
3208 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003209 "} else if (aaaaa\n"
3210 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003211 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003212 "}",
3213 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003214 verifyFormat("return (a)\n"
3215 " // comment\n"
3216 " + b;",
3217 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003218 verifyFormat(
3219 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3220 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3221 " + cc;",
3222 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003223
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003224 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3225 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3226 Style);
3227
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003228 // Forced by comments.
3229 verifyFormat(
3230 "unsigned ContentSize =\n"
3231 " sizeof(int16_t) // DWARF ARange version number\n"
3232 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3233 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3234 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003235
3236 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3237 " == boost::fusion::at_c<1>(iiii).second;",
3238 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003239
3240 Style.ColumnLimit = 60;
3241 verifyFormat("zzzzzzzzzz\n"
3242 " = bbbbbbbbbbbbbbbbb\n"
3243 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3244 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003245}
3246
Daniel Jasperb1270392017-02-01 23:27:37 +00003247TEST_F(FormatTest, EnforcedOperatorWraps) {
3248 // Here we'd like to wrap after the || operators, but a comment is forcing an
3249 // earlier wrap.
3250 verifyFormat("bool x = aaaaa //\n"
3251 " || bbbbb\n"
3252 " //\n"
3253 " || cccc;");
3254}
3255
Daniel Jasper3219e432014-12-02 13:24:51 +00003256TEST_F(FormatTest, NoOperandAlignment) {
3257 FormatStyle Style = getLLVMStyle();
3258 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003259 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3262 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003263 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003264 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3265 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3266 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3267 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3268 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3269 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3270 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3271 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3272 " > ccccccccccccccccccccccccccccccccccccccccc;",
3273 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003274
3275 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3276 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3277 " + cc;",
3278 Style);
3279 verifyFormat("int a = aa\n"
3280 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003281 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003282 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003283
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003284 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003285 verifyFormat("return (a > b\n"
3286 " // comment1\n"
3287 " // comment2\n"
3288 " || c);",
3289 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003290}
3291
Daniel Jasperac043c92014-09-15 11:11:00 +00003292TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3293 FormatStyle Style = getLLVMStyle();
3294 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3295 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003297 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3298 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003299}
3300
Daniel Jasper988e7e42017-05-08 15:07:52 +00003301TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3302 FormatStyle Style = getLLVMStyle();
3303 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3304 Style.BinPackArguments = false;
3305 Style.ColumnLimit = 40;
3306 verifyFormat("void test() {\n"
3307 " someFunction(\n"
3308 " this + argument + is + quite\n"
3309 " + long + so + it + gets + wrapped\n"
3310 " + but + remains + bin - packed);\n"
3311 "}",
3312 Style);
3313 verifyFormat("void test() {\n"
3314 " someFunction(arg1,\n"
3315 " this + argument + is\n"
3316 " + quite + long + so\n"
3317 " + it + gets + wrapped\n"
3318 " + but + remains + bin\n"
3319 " - packed,\n"
3320 " arg3);\n"
3321 "}",
3322 Style);
3323 verifyFormat("void test() {\n"
3324 " someFunction(\n"
3325 " arg1,\n"
3326 " this + argument + has\n"
3327 " + anotherFunc(nested,\n"
3328 " calls + whose\n"
3329 " + arguments\n"
3330 " + are + also\n"
3331 " + wrapped,\n"
3332 " in + addition)\n"
3333 " + to + being + bin - packed,\n"
3334 " arg3);\n"
3335 "}",
3336 Style);
3337
3338 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3339 verifyFormat("void test() {\n"
3340 " someFunction(\n"
3341 " arg1,\n"
3342 " this + argument + has +\n"
3343 " anotherFunc(nested,\n"
3344 " calls + whose +\n"
3345 " arguments +\n"
3346 " are + also +\n"
3347 " wrapped,\n"
3348 " in + addition) +\n"
3349 " to + being + bin - packed,\n"
3350 " arg3);\n"
3351 "}",
3352 Style);
3353}
3354
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003355TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003356 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003357 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3358 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003359 verifyFormat("Constructor()\n"
3360 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003361 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003362 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003363 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003364 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003365
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003366 verifyFormat("template <typename T>\n"
3367 "Constructor() : Initializer(FitsOnTheLine) {}",
3368 getLLVMStyleWithColumns(45));
3369
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003370 verifyFormat(
3371 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003372 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003373
3374 verifyFormat(
3375 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003376 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003377 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003378 verifyFormat(
3379 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003380 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003381 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003382 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3383 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3384 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003385
3386 verifyFormat("Constructor()\n"
3387 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3389 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003390 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003391
Daniel Jasper65585ed2013-01-28 13:31:35 +00003392 verifyFormat("Constructor()\n"
3393 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003395
Daniel Jasper62e68172013-02-25 15:59:54 +00003396 verifyFormat("Constructor(int Parameter = 0)\n"
3397 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3398 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003399 verifyFormat("Constructor()\n"
3400 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3401 "}",
3402 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003403 verifyFormat("Constructor()\n"
3404 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3405 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003406
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003407 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003408 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003409 verifyFormat("Constructor()\n"
3410 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3411 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3412 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003413
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003414 FormatStyle OnePerLine = getLLVMStyle();
3415 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003416 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003417 verifyFormat("SomeClass::Constructor()\n"
3418 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3419 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003420 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003421 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003422 verifyFormat("SomeClass::Constructor()\n"
3423 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3424 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003425 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003426 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003427 verifyFormat("MyClass::MyClass(int var)\n"
3428 " : some_var_(var), // 4 space indent\n"
3429 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003430 "}",
3431 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003432 verifyFormat("Constructor()\n"
3433 " : aaaaa(aaaaaa),\n"
3434 " aaaaa(aaaaaa),\n"
3435 " aaaaa(aaaaaa),\n"
3436 " aaaaa(aaaaaa),\n"
3437 " aaaaa(aaaaaa) {}",
3438 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003439 verifyFormat("Constructor()\n"
3440 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3441 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3442 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003443 OnePerLine.BinPackParameters = false;
3444 verifyFormat(
3445 "Constructor()\n"
3446 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3447 " aaaaaaaaaaa().aaa(),\n"
3448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3449 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003450 OnePerLine.ColumnLimit = 60;
3451 verifyFormat("Constructor()\n"
3452 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3453 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3454 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003455
3456 EXPECT_EQ("Constructor()\n"
3457 " : // Comment forcing unwanted break.\n"
3458 " aaaa(aaaa) {}",
3459 format("Constructor() :\n"
3460 " // Comment forcing unwanted break.\n"
3461 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003462}
3463
Francois Ferranda6b6d512017-05-24 11:36:58 +00003464TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3465 FormatStyle Style = getLLVMStyle();
3466 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3467
3468 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3469 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3470 getStyleWithColumns(Style, 45));
3471 verifyFormat("Constructor() :\n"
3472 " Initializer(FitsOnTheLine) {}",
3473 getStyleWithColumns(Style, 44));
3474 verifyFormat("Constructor() :\n"
3475 " Initializer(FitsOnTheLine) {}",
3476 getStyleWithColumns(Style, 43));
3477
3478 verifyFormat("template <typename T>\n"
3479 "Constructor() : Initializer(FitsOnTheLine) {}",
3480 getStyleWithColumns(Style, 50));
3481
3482 verifyFormat(
3483 "SomeClass::Constructor() :\n"
3484 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3485 Style);
3486
3487 verifyFormat(
3488 "SomeClass::Constructor() :\n"
3489 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3490 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3491 Style);
3492 verifyFormat(
3493 "SomeClass::Constructor() :\n"
3494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3495 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3496 Style);
3497 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3498 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3499 " aaaaaaaaaa(aaaaaa) {}",
3500 Style);
3501
3502 verifyFormat("Constructor() :\n"
3503 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3504 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3505 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3506 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3507 Style);
3508
3509 verifyFormat("Constructor() :\n"
3510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3512 Style);
3513
3514 verifyFormat("Constructor(int Parameter = 0) :\n"
3515 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3516 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3517 Style);
3518 verifyFormat("Constructor() :\n"
3519 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3520 "}",
3521 getStyleWithColumns(Style, 60));
3522 verifyFormat("Constructor() :\n"
3523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3524 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3525 Style);
3526
3527 // Here a line could be saved by splitting the second initializer onto two
3528 // lines, but that is not desirable.
3529 verifyFormat("Constructor() :\n"
3530 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3531 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3532 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3533 Style);
3534
3535 FormatStyle OnePerLine = Style;
3536 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3537 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3538 verifyFormat("SomeClass::Constructor() :\n"
3539 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3540 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3541 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3542 OnePerLine);
3543 verifyFormat("SomeClass::Constructor() :\n"
3544 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3545 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3546 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3547 OnePerLine);
3548 verifyFormat("MyClass::MyClass(int var) :\n"
3549 " some_var_(var), // 4 space indent\n"
3550 " some_other_var_(var + 1) { // lined up\n"
3551 "}",
3552 OnePerLine);
3553 verifyFormat("Constructor() :\n"
3554 " aaaaa(aaaaaa),\n"
3555 " aaaaa(aaaaaa),\n"
3556 " aaaaa(aaaaaa),\n"
3557 " aaaaa(aaaaaa),\n"
3558 " aaaaa(aaaaaa) {}",
3559 OnePerLine);
3560 verifyFormat("Constructor() :\n"
3561 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3562 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3563 OnePerLine);
3564 OnePerLine.BinPackParameters = false;
3565 verifyFormat(
3566 "Constructor() :\n"
3567 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3568 " aaaaaaaaaaa().aaa(),\n"
3569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3570 OnePerLine);
3571 OnePerLine.ColumnLimit = 60;
3572 verifyFormat("Constructor() :\n"
3573 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3574 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3575 OnePerLine);
3576
3577 EXPECT_EQ("Constructor() :\n"
3578 " // Comment forcing unwanted break.\n"
3579 " aaaa(aaaa) {}",
3580 format("Constructor() :\n"
3581 " // Comment forcing unwanted break.\n"
3582 " aaaa(aaaa) {}",
3583 Style));
3584
3585 Style.ColumnLimit = 0;
3586 verifyFormat("SomeClass::Constructor() :\n"
3587 " a(a) {}",
3588 Style);
3589 verifyFormat("SomeClass::Constructor() noexcept :\n"
3590 " a(a) {}",
3591 Style);
3592 verifyFormat("SomeClass::Constructor() :\n"
3593 " a(a), b(b), c(c) {}",
3594 Style);
3595 verifyFormat("SomeClass::Constructor() :\n"
3596 " a(a) {\n"
3597 " foo();\n"
3598 " bar();\n"
3599 "}",
3600 Style);
3601
3602 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3603 verifyFormat("SomeClass::Constructor() :\n"
3604 " a(a), b(b), c(c) {\n"
3605 "}",
3606 Style);
3607 verifyFormat("SomeClass::Constructor() :\n"
3608 " a(a) {\n"
3609 "}",
3610 Style);
3611
3612 Style.ColumnLimit = 80;
3613 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3614 Style.ConstructorInitializerIndentWidth = 2;
3615 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3616 Style);
3617 verifyFormat("SomeClass::Constructor() :\n"
3618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3619 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3620 Style);
3621}
3622
David Blaikieea95dd72017-08-31 18:49:34 +00003623#ifndef EXPENSIVE_CHECKS
3624// Expensive checks enables libstdc++ checking which includes validating the
3625// state of ranges used in std::priority_queue - this blows out the
3626// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003627TEST_F(FormatTest, MemoizationTests) {
3628 // This breaks if the memoization lookup does not take \c Indent and
3629 // \c LastSpace into account.
3630 verifyFormat(
3631 "extern CFRunLoopTimerRef\n"
3632 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3633 " CFTimeInterval interval, CFOptionFlags flags,\n"
3634 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003635 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003636
3637 // Deep nesting somewhat works around our memoization.
3638 verifyFormat(
3639 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3640 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3641 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3642 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3643 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3644 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003645 verifyFormat(
3646 "aaaaa(\n"
3647 " aaaaa,\n"
3648 " aaaaa(\n"
3649 " aaaaa,\n"
3650 " aaaaa(\n"
3651 " aaaaa,\n"
3652 " aaaaa(\n"
3653 " aaaaa,\n"
3654 " aaaaa(\n"
3655 " aaaaa,\n"
3656 " aaaaa(\n"
3657 " aaaaa,\n"
3658 " aaaaa(\n"
3659 " aaaaa,\n"
3660 " aaaaa(\n"
3661 " aaaaa,\n"
3662 " aaaaa(\n"
3663 " aaaaa,\n"
3664 " aaaaa(\n"
3665 " aaaaa,\n"
3666 " aaaaa(\n"
3667 " aaaaa,\n"
3668 " aaaaa(\n"
3669 " aaaaa,\n"
3670 " aaaaa))))))))))));",
3671 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003672 verifyFormat(
3673 "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"
3674 " a),\n"
3675 " a),\n"
3676 " a),\n"
3677 " a),\n"
3678 " a),\n"
3679 " a),\n"
3680 " a),\n"
3681 " a),\n"
3682 " a),\n"
3683 " a),\n"
3684 " a),\n"
3685 " a),\n"
3686 " a),\n"
3687 " a),\n"
3688 " a),\n"
3689 " a),\n"
3690 " a)",
3691 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003692
3693 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003694 FormatStyle OnePerLine = getLLVMStyle();
3695 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003696 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003697 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003698 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003699 for (unsigned i = 0, e = 80; i != e; ++i) {
3700 input += " a,\n";
3701 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003702 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003703 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003704}
David Blaikieea95dd72017-08-31 18:49:34 +00003705#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003706
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003707TEST_F(FormatTest, BreaksAsHighAsPossible) {
3708 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003709 "void f() {\n"
3710 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3711 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3712 " f();\n"
3713 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003714 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003715 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003716}
3717
Daniel Jasper6728fc12013-04-11 14:29:13 +00003718TEST_F(FormatTest, BreaksFunctionDeclarations) {
3719 // Principially, we break function declarations in a certain order:
3720 // 1) break amongst arguments.
3721 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3722 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003723 verifyFormat("template <class TemplateIt>\n"
3724 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3725 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003726
3727 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003728 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003729 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003730 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003731 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003732
3733 // 3) break after (.
3734 verifyFormat(
3735 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003736 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3737 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003738
3739 // 4) break before after nested name specifiers.
3740 verifyFormat(
3741 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003742 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3743 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003744 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003745
3746 // However, there are exceptions, if a sufficient amount of lines can be
3747 // saved.
3748 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3749 // more adjusting.
3750 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3751 " Cccccccccccccc cccccccccc,\n"
3752 " Cccccccccccccc cccccccccc,\n"
3753 " Cccccccccccccc cccccccccc,\n"
3754 " Cccccccccccccc cccccccccc);");
3755 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003756 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003757 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3758 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3759 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003760 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003761 verifyFormat(
3762 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3763 " Cccccccccccccc cccccccccc,\n"
3764 " Cccccccccccccc cccccccccc,\n"
3765 " Cccccccccccccc cccccccccc,\n"
3766 " Cccccccccccccc cccccccccc,\n"
3767 " Cccccccccccccc cccccccccc,\n"
3768 " Cccccccccccccc cccccccccc);");
3769 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3770 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3771 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3772 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3773 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003774
3775 // Break after multi-line parameters.
3776 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3779 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003780 verifyFormat("void SomeLoooooooooooongFunction(\n"
3781 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3782 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3783 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003784
3785 // Treat overloaded operators like other functions.
3786 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3787 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003788 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3789 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003790 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3791 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3792 verifyGoogleFormat(
3793 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3794 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003795 verifyGoogleFormat(
3796 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3797 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003798 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3799 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3800 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3801 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003802 verifyGoogleFormat(
3803 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3804 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3805 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003806 verifyGoogleFormat(
3807 "template <typename T>\n"
3808 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3809 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3810 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003811
3812 FormatStyle Style = getLLVMStyle();
3813 Style.PointerAlignment = FormatStyle::PAS_Left;
3814 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3815 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3816 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003817 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3819 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003820}
3821
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003822TEST_F(FormatTest, TrailingReturnType) {
3823 verifyFormat("auto foo() -> int;\n");
3824 verifyFormat("struct S {\n"
3825 " auto bar() const -> int;\n"
3826 "};");
3827 verifyFormat("template <size_t Order, typename T>\n"
3828 "auto load_img(const std::string &filename)\n"
3829 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003830 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3831 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003832 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003833 verifyFormat("template <typename T>\n"
3834 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3835 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003836
3837 // Not trailing return types.
3838 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003839}
3840
Daniel Jasper5be31f72013-05-21 09:16:31 +00003841TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003842 // Avoid breaking before trailing 'const' or other trailing annotations, if
3843 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003844 FormatStyle Style = getGoogleStyle();
3845 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003846 verifyFormat("void someLongFunction(\n"
3847 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003848 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003849 verifyFormat("LoooooongReturnType\n"
3850 "someLoooooooongFunction() const {}",
3851 getLLVMStyleWithColumns(47));
3852 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3853 " const {}",
3854 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003855 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3856 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3857 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3858 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3859 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3860 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003861 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3862 " aaaaaaaaaaa aaaaa) const override;");
3863 verifyGoogleFormat(
3864 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3865 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003866
Daniel Jasper5550de62014-02-17 07:57:46 +00003867 // Even if the first parameter has to be wrapped.
3868 verifyFormat("void someLongFunction(\n"
3869 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003870 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003871 verifyFormat("void someLongFunction(\n"
3872 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003873 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003874 verifyFormat("void someLongFunction(\n"
3875 " int someLongParameter) override {}",
3876 Style);
3877 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003878 " int someLongParameter) OVERRIDE {}",
3879 Style);
3880 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003881 " int someLongParameter) final {}",
3882 Style);
3883 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003884 " int someLongParameter) FINAL {}",
3885 Style);
3886 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003887 " int parameter) const override {}",
3888 Style);
3889
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003890 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3891 verifyFormat("void someLongFunction(\n"
3892 " int someLongParameter) const\n"
3893 "{\n"
3894 "}",
3895 Style);
3896
Daniel Jasper5550de62014-02-17 07:57:46 +00003897 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003898 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3899 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3900 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003901
3902 // Breaking before function-like trailing annotations is fine to keep them
3903 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003904 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3905 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3906 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3907 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3908 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3909 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003910 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3911 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003912 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003913
3914 verifyFormat(
3915 "void aaaaaaaaaaaaaaaaaa()\n"
3916 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3917 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3918 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3919 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003920 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003921 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003922 " GUARDED_BY(aaaaaaaaaaaa);");
3923 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003924 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003925 " GUARDED_BY(aaaaaaaaaaaa);");
3926 verifyGoogleFormat(
3927 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3928 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003929 verifyGoogleFormat(
3930 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3931 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003932}
3933
Daniel Jasperf090f032015-05-18 09:47:22 +00003934TEST_F(FormatTest, FunctionAnnotations) {
3935 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003936 "int OldFunction(const string &parameter) {}");
3937 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003938 "string OldFunction(const string &parameter) {}");
3939 verifyFormat("template <typename T>\n"
3940 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3941 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003942
3943 // Not function annotations.
3944 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3945 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003946 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3947 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003948 verifyFormat("MACRO(abc).function() // wrap\n"
3949 " << abc;");
3950 verifyFormat("MACRO(abc)->function() // wrap\n"
3951 " << abc;");
3952 verifyFormat("MACRO(abc)::function() // wrap\n"
3953 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003954}
3955
Daniel Jasperf7935112012-12-03 18:12:45 +00003956TEST_F(FormatTest, BreaksDesireably) {
3957 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3958 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003959 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003960 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3962 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003963
3964 verifyFormat(
3965 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003967
3968 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003971
3972 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003973 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3974 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003976 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003978
3979 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3980 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3981
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003982 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003983 "void f() {\n"
3984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3986 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003987 verifyFormat(
3988 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3990 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003991 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3993 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003994 "aaaaaa(aaa,\n"
3995 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3997 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003998 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004001
Daniel Jasper739b85f2015-06-29 10:42:59 +00004002 // Indent consistently independent of call expression and unary operator.
4003 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4004 " dddddddddddddddddddddddddddddd));");
4005 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4006 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004007 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004008 " dddddddddddddddddddddddddddddd));");
4009
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004010 // This test case breaks on an incorrect memoization, i.e. an optimization not
4011 // taking into account the StopAt value.
4012 verifyFormat(
4013 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004014 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4015 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4016 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004017
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004018 verifyFormat("{\n {\n {\n"
4019 " Annotation.SpaceRequiredBefore =\n"
4020 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4021 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4022 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004023
4024 // Break on an outer level if there was a break on an inner level.
4025 EXPECT_EQ("f(g(h(a, // comment\n"
4026 " b, c),\n"
4027 " d, e),\n"
4028 " x, y);",
4029 format("f(g(h(a, // comment\n"
4030 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004031
4032 // Prefer breaking similar line breaks.
4033 verifyFormat(
4034 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4035 " NSTrackingMouseEnteredAndExited |\n"
4036 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004037}
4038
Daniel Jasper18210d72014-10-09 09:52:05 +00004039TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4040 FormatStyle NoBinPacking = getGoogleStyle();
4041 NoBinPacking.BinPackParameters = false;
4042 NoBinPacking.BinPackArguments = true;
4043 verifyFormat("void f() {\n"
4044 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4046 "}",
4047 NoBinPacking);
4048 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4049 " int aaaaaaaaaaaaaaaaaaaa,\n"
4050 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4051 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004052
Daniel Jasper00693b082016-01-09 15:56:47 +00004053 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4054 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4055 " vector<int> bbbbbbbbbbbbbbb);",
4056 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004057 // FIXME: This behavior difference is probably not wanted. However, currently
4058 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4059 // template arguments from BreakBeforeParameter being set because of the
4060 // one-per-line formatting.
4061 verifyFormat(
4062 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4063 " aaaaaaaaaa> aaaaaaaaaa);",
4064 NoBinPacking);
4065 verifyFormat(
4066 "void fffffffffff(\n"
4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4068 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004069}
4070
Daniel Jasper9278eb92013-01-16 14:59:02 +00004071TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004072 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004073 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004074 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004075 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4076 " aaaaaaaaaaaaaaaaaaaa,\n"
4077 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4078 NoBinPacking);
4079 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4080 " aaaaaaaaaaaaa,\n"
4081 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4082 NoBinPacking);
4083 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004084 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4085 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4087 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4089 NoBinPacking);
4090 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4091 " .aaaaaaaaaaaaaaaaaa();",
4092 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004093 verifyFormat("void f() {\n"
4094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4095 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4096 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004097 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004098
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004099 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004100 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4101 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004102 " aaaaaaaaaaaa);",
4103 NoBinPacking);
4104 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004105 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4106 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004107 " test);",
4108 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004109
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004110 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4111 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004112 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4113 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004114 NoBinPacking);
4115 verifyFormat("a(\"a\"\n"
4116 " \"a\",\n"
4117 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004118
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004119 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004120 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004121 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004123 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004124 verifyFormat(
4125 "void f() {\n"
4126 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4127 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004128 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004129 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004130 verifyFormat(
4131 "template <class SomeType, class SomeOtherType>\n"
4132 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4133 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004134}
4135
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004136TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4137 FormatStyle Style = getLLVMStyleWithColumns(15);
4138 Style.ExperimentalAutoDetectBinPacking = true;
4139 EXPECT_EQ("aaa(aaaa,\n"
4140 " aaaa,\n"
4141 " aaaa);\n"
4142 "aaa(aaaa,\n"
4143 " aaaa,\n"
4144 " aaaa);",
4145 format("aaa(aaaa,\n" // one-per-line
4146 " aaaa,\n"
4147 " aaaa );\n"
4148 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4149 Style));
4150 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4151 " aaaa);\n"
4152 "aaa(aaaa, aaaa,\n"
4153 " aaaa);",
4154 format("aaa(aaaa, aaaa,\n" // bin-packed
4155 " aaaa );\n"
4156 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4157 Style));
4158}
4159
Daniel Jasper04468962013-01-18 10:56:38 +00004160TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004161 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4162 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4163 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4164 " .StartsWith(\".init\", ORDER_INIT)\n"
4165 " .StartsWith(\".fini\", ORDER_FINI)\n"
4166 " .StartsWith(\".hash\", ORDER_HASH)\n"
4167 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004168
Daniel Jaspereb50c672013-02-15 20:33:06 +00004169 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004170 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004171 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004172 "aaaaaaa->aaaaaaa\n"
4173 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004175 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004176 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004177 "aaaaaaa->aaaaaaa\n"
4178 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4179 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4180 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004181 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004182 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004183 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004184 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4185 " aaaaaa->aaaaaaaaaaaa()\n"
4186 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004188 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004189 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004190 "void f() {\n"
4191 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004192 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004193 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004194 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004195 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004196 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004197 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004198 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004199 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004200 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004201 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004202 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004203
4204 verifyFormat(
4205 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4206 verifyFormat("aaaaaaaaaaaaaaa()\n"
4207 " .aaaaaaaaaaaaaaa()\n"
4208 " .aaaaaaaaaaaaaaa()\n"
4209 " .aaaaaaaaaaaaaaa()\n"
4210 " .aaaaaaaaaaaaaaa();");
4211 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4212 " .aaaaaaaaaaaaaaa()\n"
4213 " .aaaaaaaaaaaaaaa()\n"
4214 " .aaaaaaaaaaaaaaa();");
4215 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4216 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4217 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004218 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4219 " ->aaaaaaaaaaaaaae(0)\n"
4220 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004221
Daniel Jasper775954b2015-04-24 10:08:09 +00004222 // Don't linewrap after very short segments.
4223 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4224 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4225 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4226 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4227 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4228 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4229 verifyFormat("aaa()\n"
4230 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4231 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4232 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4233
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004234 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4235 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4236 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4237 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4238 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004240
Daniel Jaspera41aa532014-09-19 08:01:25 +00004241 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004242 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4243 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004244
4245 // Prefer not to create "hanging" indents.
4246 verifyFormat(
4247 "return !soooooooooooooome_map\n"
4248 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4249 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004250 verifyFormat(
4251 "return aaaaaaaaaaaaaaaa\n"
4252 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4253 " .aaaa(aaaaaaaaaaaaaa);");
4254 // No hanging indent here.
4255 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4257 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004259 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4260 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4261 getLLVMStyleWithColumns(60));
4262 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4263 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4264 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4265 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004266 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4268 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004269}
4270
Daniel Jasperde5c2072012-12-24 00:13:23 +00004271TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4272 verifyFormat(
4273 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004274 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004275 verifyFormat(
4276 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4277 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4278
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004279 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004280 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004281 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4282 " ccccccccccccccccccccccccc) {\n}");
4283
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004284 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004285 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004286 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4287 " ccccccccccccccccccccccccc) {\n}");
4288
Daniel Jasperde5c2072012-12-24 00:13:23 +00004289 verifyFormat(
4290 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004291 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004292 verifyFormat(
4293 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4294 " ccccccccccccccccccccccccc) {\n}");
4295
Daniel Jasper400adc62013-02-08 15:28:42 +00004296 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4297 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4298 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4299 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004300 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4301 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4302 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4303 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4304
Daniel Jasper400adc62013-02-08 15:28:42 +00004305 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4306 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4307 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004308 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4309 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4310 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004311}
4312
Daniel Jasper43b65482013-01-23 12:27:43 +00004313TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004314 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004315 "unsigned Cost =\n"
4316 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4317 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004318 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004319 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4320 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004321
4322 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004323 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4324 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004325 verifyFormat("unsigned OriginalStartColumn =\n"
4326 " SourceMgr.getSpellingColumnNumber(\n"
4327 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4328 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004329}
4330
Francois Ferrand9976efa2017-05-22 08:28:17 +00004331TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4332 FormatStyle Style = getLLVMStyle();
4333 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4334 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4335 Style);
4336
4337 Style.PenaltyBreakAssignment = 20;
4338 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4339 " cccccccccccccccccccccccccc;",
4340 Style);
4341}
4342
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004343TEST_F(FormatTest, AlignsAfterAssignments) {
4344 verifyFormat(
4345 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004346 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004347 verifyFormat(
4348 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004349 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004350 verifyFormat(
4351 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004352 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004353 verifyFormat(
4354 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004355 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004356 verifyFormat(
4357 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4358 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4359 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004360}
4361
4362TEST_F(FormatTest, AlignsAfterReturn) {
4363 verifyFormat(
4364 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4365 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4366 verifyFormat(
4367 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4368 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004369 verifyFormat(
4370 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004371 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004372 verifyFormat(
4373 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004374 " aaaaaaaaaaaaaaaaaaaaaa());");
4375 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4377 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004380 verifyFormat("return\n"
4381 " // true if code is one of a or b.\n"
4382 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004383}
4384
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004385TEST_F(FormatTest, AlignsAfterOpenBracket) {
4386 verifyFormat(
4387 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4388 " aaaaaaaaa aaaaaaa) {}");
4389 verifyFormat(
4390 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4391 " aaaaaaaaaaa aaaaaaaaa);");
4392 verifyFormat(
4393 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4394 " aaaaaaaaaaaaaaaaaaaaa));");
4395 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004396 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004397 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4398 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4399 Style);
4400 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4401 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4402 Style);
4403 verifyFormat("SomeLongVariableName->someFunction(\n"
4404 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4405 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004406 verifyFormat(
4407 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4408 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4409 Style);
4410 verifyFormat(
4411 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4412 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4413 Style);
4414 verifyFormat(
4415 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4416 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4417 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004418
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004419 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4420 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4421 " b));",
4422 Style);
4423
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004424 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4425 Style.BinPackArguments = false;
4426 Style.BinPackParameters = false;
4427 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4428 " aaaaaaaaaaa aaaaaaaa,\n"
4429 " aaaaaaaaa aaaaaaa,\n"
4430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4431 Style);
4432 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4433 " aaaaaaaaaaa aaaaaaaaa,\n"
4434 " aaaaaaaaaaa aaaaaaaaa,\n"
4435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4436 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004437 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4438 " aaaaaaaaaaaaaaa,\n"
4439 " aaaaaaaaaaaaaaaaaaaaa,\n"
4440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004441 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004442 verifyFormat(
4443 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4444 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4445 Style);
4446 verifyFormat(
4447 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4448 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4449 Style);
4450 verifyFormat(
4451 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4452 " aaaaaaaaaaaaaaaaaaaaa(\n"
4453 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4454 " aaaaaaaaaaaaaaaa);",
4455 Style);
4456 verifyFormat(
4457 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4458 " aaaaaaaaaaaaaaaaaaaaa(\n"
4459 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4460 " aaaaaaaaaaaaaaaa);",
4461 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004462}
4463
Daniel Jasper3219e432014-12-02 13:24:51 +00004464TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4465 FormatStyle Style = getLLVMStyleWithColumns(40);
4466 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4467 " bbbbbbbbbbbbbbbbbbbbbb);",
4468 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004469 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004470 Style.AlignOperands = false;
4471 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4472 " bbbbbbbbbbbbbbbbbbbbbb);",
4473 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004474 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004475 Style.AlignOperands = true;
4476 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4477 " bbbbbbbbbbbbbbbbbbbbbb);",
4478 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004479 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004480 Style.AlignOperands = false;
4481 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4482 " bbbbbbbbbbbbbbbbbbbbbb);",
4483 Style);
4484}
4485
Daniel Jasper399d24b2013-01-09 07:06:56 +00004486TEST_F(FormatTest, BreaksConditionalExpressions) {
4487 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004488 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4489 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4490 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4491 verifyFormat(
4492 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004493 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4494 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004495 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004496 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4497 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4498 verifyFormat(
4499 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004500 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4501 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004502 verifyFormat(
4503 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4504 " : aaaaaaaaaaaaa);");
4505 verifyFormat(
4506 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004507 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004508 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4509 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004510 verifyFormat(
4511 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4512 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4513 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004514 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4515 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4517 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4519 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4521 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4523 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4524 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4525 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004526 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4528 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4529 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4530 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004531 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4532 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4533 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004534 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4535 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4536 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4537 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004538 verifyFormat(
4539 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4540 " ? aaaaaaaaaaaaaaa\n"
4541 " : aaaaaaaaaaaaaaa;");
4542 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004543 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004544 " ? b\n"
4545 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004546 verifyFormat("return aaaa == bbbb\n"
4547 " // comment\n"
4548 " ? aaaa\n"
4549 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004550 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004551 " format(TheLine.First,\n"
4552 " IndentForLevel[TheLine.Level] >= 0\n"
4553 " ? IndentForLevel[TheLine.Level]\n"
4554 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004555 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004556 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004557 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4558 " ? aaaaaaaaaaaaaaa\n"
4559 " : bbbbbbbbbbbbbbb //\n"
4560 " ? ccccccccccccccc\n"
4561 " : ddddddddddddddd;");
4562 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4563 " ? aaaaaaaaaaaaaaa\n"
4564 " : (bbbbbbbbbbbbbbb //\n"
4565 " ? ccccccccccccccc\n"
4566 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004567 verifyFormat(
4568 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4569 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4570 " aaaaaaaaaaaaaaaaaaaaa +\n"
4571 " aaaaaaaaaaaaaaaaaaaaa\n"
4572 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004573 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004574 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4576 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004577
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004578 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004579 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004580 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004581 "void f() {\n"
4582 " g(aaa,\n"
4583 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4585 " ? aaaaaaaaaaaaaaa\n"
4586 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004587 "}",
4588 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004589 verifyFormat(
4590 "void f() {\n"
4591 " g(aaa,\n"
4592 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4594 " ?: aaaaaaaaaaaaaaa);\n"
4595 "}",
4596 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004597
4598 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4599 " // comment.\n"
4600 " ccccccccccccccccccccccccccccccccccccccc\n"
4601 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4602 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004603
4604 // Assignments in conditional expressions. Apparently not uncommon :-(.
4605 verifyFormat("return a != b\n"
4606 " // comment\n"
4607 " ? a = b\n"
4608 " : a = b;");
4609 verifyFormat("return a != b\n"
4610 " // comment\n"
4611 " ? a = a != b\n"
4612 " // comment\n"
4613 " ? a = b\n"
4614 " : a\n"
4615 " : a;\n");
4616 verifyFormat("return a != b\n"
4617 " // comment\n"
4618 " ? a\n"
4619 " : a = a != b\n"
4620 " // comment\n"
4621 " ? a = b\n"
4622 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004623}
4624
Daniel Jasper165b29e2013-11-08 00:57:11 +00004625TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4626 FormatStyle Style = getLLVMStyle();
4627 Style.BreakBeforeTernaryOperators = false;
4628 Style.ColumnLimit = 70;
4629 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004630 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4633 Style);
4634 verifyFormat(
4635 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004636 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004638 Style);
4639 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004640 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4642 Style);
4643 verifyFormat(
4644 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004645 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004647 Style);
4648 verifyFormat(
4649 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4650 " aaaaaaaaaaaaa);",
4651 Style);
4652 verifyFormat(
4653 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4654 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4656 " aaaaaaaaaaaaa);",
4657 Style);
4658 verifyFormat(
4659 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4660 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4661 " aaaaaaaaaaaaa);",
4662 Style);
4663 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4665 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4666 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4668 Style);
4669 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4675 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4676 Style);
4677 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4681 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4682 Style);
4683 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4684 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4685 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4686 Style);
4687 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4691 Style);
4692 verifyFormat(
4693 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4694 " aaaaaaaaaaaaaaa :\n"
4695 " aaaaaaaaaaaaaaa;",
4696 Style);
4697 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4698 " aaaaaaaaa ?\n"
4699 " b :\n"
4700 " c);",
4701 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004702 verifyFormat("unsigned Indent =\n"
4703 " format(TheLine.First,\n"
4704 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4705 " IndentForLevel[TheLine.Level] :\n"
4706 " TheLine * 2,\n"
4707 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4708 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004709 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4710 " aaaaaaaaaaaaaaa :\n"
4711 " bbbbbbbbbbbbbbb ? //\n"
4712 " ccccccccccccccc :\n"
4713 " ddddddddddddddd;",
4714 Style);
4715 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4716 " aaaaaaaaaaaaaaa :\n"
4717 " (bbbbbbbbbbbbbbb ? //\n"
4718 " ccccccccccccccc :\n"
4719 " ddddddddddddddd);",
4720 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004721 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4722 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4723 " ccccccccccccccccccccccccccc;",
4724 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004725 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4726 " aaaaa :\n"
4727 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4728 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004729}
4730
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004731TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4732 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4733 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4734 verifyFormat("bool a = true, b = false;");
4735
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004736 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004738 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004739 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004740 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004741 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004742 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004743 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004744 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4745 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4746 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4747 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4748 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4749 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004750
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004751 FormatStyle Style = getGoogleStyle();
4752 Style.PointerAlignment = FormatStyle::PAS_Left;
4753 Style.DerivePointerAlignment = false;
4754 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4755 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4756 " *b = bbbbbbbbbbbbbbbbbbb;",
4757 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004758 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4759 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4760 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004761 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004762 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004763}
4764
Nico Weber4a5030c2013-01-12 01:28:06 +00004765TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4766 verifyFormat("arr[foo ? bar : baz];");
4767 verifyFormat("f()[foo ? bar : baz];");
4768 verifyFormat("(a + b)[foo ? bar : baz];");
4769 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4770}
4771
Daniel Jasperf7935112012-12-03 18:12:45 +00004772TEST_F(FormatTest, AlignsStringLiterals) {
4773 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4774 " \"short literal\");");
4775 verifyFormat(
4776 "looooooooooooooooooooooooongFunction(\n"
4777 " \"short literal\"\n"
4778 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004779 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4780 " \" string literals\",\n"
4781 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004782 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4783 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004784 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004785 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004786 getLLVMStyleWithColumns(28)));
4787 EXPECT_EQ(
4788 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4789 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4790 " \"aaaaaaaaaaaaaaaa\";",
4791 format("aaaaaa ="
4792 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4793 "aaaaaaaaaaaaaaaaaaaaa\" "
4794 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004795 verifyFormat("a = a + \"a\"\n"
4796 " \"a\"\n"
4797 " \"a\";");
4798 verifyFormat("f(\"a\", \"b\"\n"
4799 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004800
4801 verifyFormat(
4802 "#define LL_FORMAT \"ll\"\n"
4803 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4804 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004805
4806 verifyFormat("#define A(X) \\\n"
4807 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4808 " \"ccccc\"",
4809 getLLVMStyleWithColumns(23));
4810 verifyFormat("#define A \"def\"\n"
4811 "f(\"abc\" A \"ghi\"\n"
4812 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004813
4814 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004815 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004816 verifyFormat("#define A(X) \\\n"
4817 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4818 " L\"ccccc\"",
4819 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004820
4821 verifyFormat("f(@\"a\"\n"
4822 " @\"b\");");
4823 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004824 " @\"b\"\n"
4825 " @\"c\";");
4826 verifyFormat("NSString s = @\"a\"\n"
4827 " \"b\"\n"
4828 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004829}
4830
Zachary Turner448592e2015-12-18 22:20:15 +00004831TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004832 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004833 // No declarations or definitions should be moved to own line.
4834 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4835 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004836 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004837 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004838 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004839 "int f() { return 1; }\n"
4840 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004841 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004842
4843 // All declarations and definitions should have the return type moved to its
4844 // own
4845 // line.
4846 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4847 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004848 " int\n"
4849 " f() {\n"
4850 " return 1;\n"
4851 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004852 " int\n"
4853 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004854 "};\n"
4855 "int\n"
4856 "f() {\n"
4857 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004858 "}\n"
4859 "int\n"
4860 "g();\n",
4861 Style);
4862
4863 // Top-level definitions, and no kinds of declarations should have the
4864 // return type moved to its own line.
4865 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4866 verifyFormat("class B {\n"
4867 " int f() { return 1; }\n"
4868 " int g();\n"
4869 "};\n"
4870 "int\n"
4871 "f() {\n"
4872 " return 1;\n"
4873 "}\n"
4874 "int g();\n",
4875 Style);
4876
4877 // Top-level definitions and declarations should have the return type moved
4878 // to its own line.
4879 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4880 verifyFormat("class C {\n"
4881 " int f() { return 1; }\n"
4882 " int g();\n"
4883 "};\n"
4884 "int\n"
4885 "f() {\n"
4886 " return 1;\n"
4887 "}\n"
4888 "int\n"
4889 "g();\n",
4890 Style);
4891
4892 // All definitions should have the return type moved to its own line, but no
4893 // kinds of declarations.
4894 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4895 verifyFormat("class D {\n"
4896 " int\n"
4897 " f() {\n"
4898 " return 1;\n"
4899 " }\n"
4900 " int g();\n"
4901 "};\n"
4902 "int\n"
4903 "f() {\n"
4904 " return 1;\n"
4905 "}\n"
4906 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004907 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004908 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004909 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004910 " return \"\";\n"
4911 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004912 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004913 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004914 verifyFormat("template <class T>\n"
4915 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004916 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004917 " return NULL;\n"
4918 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004919 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004920 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004921 verifyFormat("class C {\n"
4922 " int\n"
4923 " operator+() {\n"
4924 " return 1;\n"
4925 " }\n"
4926 " int\n"
4927 " operator()() {\n"
4928 " return 1;\n"
4929 " }\n"
4930 "};\n",
4931 Style);
4932 verifyFormat("void\n"
4933 "A::operator()() {}\n"
4934 "void\n"
4935 "A::operator>>() {}\n"
4936 "void\n"
4937 "A::operator+() {}\n",
4938 Style);
4939 verifyFormat("void *operator new(std::size_t s);", // No break here.
4940 Style);
4941 verifyFormat("void *\n"
4942 "operator new(std::size_t s) {}",
4943 Style);
4944 verifyFormat("void *\n"
4945 "operator delete[](void *ptr) {}",
4946 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004947 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004948 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004949 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004950 "{\n"
4951 " return \"\";\n"
4952 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004953 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004954 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004955 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004956 "T *\n" // Problem here: no line break
4957 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004958 "{\n"
4959 " return NULL;\n"
4960 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004961 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004962 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004963}
4964
Alexander Kornienko58611712013-07-04 12:02:44 +00004965TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4966 FormatStyle NoBreak = getLLVMStyle();
4967 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4968 FormatStyle Break = getLLVMStyle();
4969 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004970 verifyFormat("aaaa = \"bbbb\"\n"
4971 " \"cccc\";",
4972 NoBreak);
4973 verifyFormat("aaaa =\n"
4974 " \"bbbb\"\n"
4975 " \"cccc\";",
4976 Break);
4977 verifyFormat("aaaa(\"bbbb\"\n"
4978 " \"cccc\");",
4979 NoBreak);
4980 verifyFormat("aaaa(\n"
4981 " \"bbbb\"\n"
4982 " \"cccc\");",
4983 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004984 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4985 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004986 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004987 verifyFormat("aaaa(qqq,\n"
4988 " \"bbbb\"\n"
4989 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004990 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004991 verifyFormat("aaaa(qqq,\n"
4992 " L\"bbbb\"\n"
4993 " L\"cccc\");",
4994 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004995 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4996 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004997 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004998 verifyFormat("string s = someFunction(\n"
4999 " \"abc\"\n"
5000 " \"abc\");",
5001 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005002
Daniel Jasper3251fff2014-06-10 06:27:23 +00005003 // As we break before unary operators, breaking right after them is bad.
5004 verifyFormat("string foo = abc ? \"x\"\n"
5005 " \"blah blah blah blah blah blah\"\n"
5006 " : \"y\";",
5007 Break);
5008
Daniel Jasperc834c702013-07-17 15:38:19 +00005009 // Don't break if there is no column gain.
5010 verifyFormat("f(\"aaaa\"\n"
5011 " \"bbbb\");",
5012 Break);
5013
5014 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005015 EXPECT_EQ("x = \"a\\\n"
5016 "b\\\n"
5017 "c\";",
5018 format("x = \"a\\\n"
5019 "b\\\n"
5020 "c\";",
5021 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005022 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005023 " \"a\\\n"
5024 "b\\\n"
5025 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005026 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005027 "b\\\n"
5028 "c\";",
5029 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005030
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005031 EXPECT_EQ("NSString *const kString =\n"
5032 " @\"aaaa\"\n"
5033 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005034 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005035 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005036 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005037
5038 Break.ColumnLimit = 0;
5039 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005040}
5041
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005042TEST_F(FormatTest, AlignsPipes) {
5043 verifyFormat(
5044 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5045 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5046 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5047 verifyFormat(
5048 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5049 " << aaaaaaaaaaaaaaaaaaaa;");
5050 verifyFormat(
5051 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5052 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5053 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005054 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5055 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5056 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005057 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5058 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5059 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5060 verifyFormat(
5061 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5062 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5063 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005064 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5067 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005068 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5069 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005070 verifyFormat(
5071 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005073 verifyFormat(
5074 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5075 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005076
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005077 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5078 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005079 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5081 " aaaaaaaaaaaaaaaaaaaaa)\n"
5082 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005083 verifyFormat("LOG_IF(aaa == //\n"
5084 " bbb)\n"
5085 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005086
Daniel Jasper467ddb12013-08-12 12:58:05 +00005087 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005088 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5089 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005090 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5091 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5092 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005093 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5094 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005095 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5096 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5098 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5099 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5101 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005102
Daniel Jasperc238c872013-04-02 14:33:13 +00005103 verifyFormat(
5104 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5105 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005106
5107 // Incomplete string literal.
5108 EXPECT_EQ("llvm::errs() << \"\n"
5109 " << a;",
5110 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005111
5112 verifyFormat("void f() {\n"
5113 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5114 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5115 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005116
5117 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005118 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5119 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5120 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005121
5122 // Handle '\n'.
5123 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5124 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5125 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5126 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5127 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5128 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5129 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005130}
5131
Daniel Jasper7209bb92016-12-13 11:16:42 +00005132TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5133 verifyFormat("return out << \"somepacket = {\\n\"\n"
5134 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5135 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5136 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5137 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5138 " << \"}\";");
5139
5140 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5141 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5142 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5143 verifyFormat(
5144 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5145 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5146 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5147 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5148 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5149 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5150 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5151 verifyFormat(
5152 "void f() {\n"
5153 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5154 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5155 "}");
5156
5157 // Breaking before the first "<<" is generally not desirable.
5158 verifyFormat(
5159 "llvm::errs()\n"
5160 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5161 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5162 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5163 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5164 getLLVMStyleWithColumns(70));
5165 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5166 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5167 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5168 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5169 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5170 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5171 getLLVMStyleWithColumns(70));
5172
5173 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5174 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5175 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5176 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5177 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5178 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005179 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5180 " (aaaa + aaaa);",
5181 getLLVMStyleWithColumns(40));
5182 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5183 " (aaaaaaa + aaaaa));",
5184 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005185 verifyFormat(
5186 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5187 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5188 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005189}
5190
Daniel Jasperf7935112012-12-03 18:12:45 +00005191TEST_F(FormatTest, UnderstandsEquals) {
5192 verifyFormat(
5193 "aaaaaaaaaaaaaaaaa =\n"
5194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5195 verifyFormat(
5196 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005197 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005198 verifyFormat(
5199 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005200 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005201 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5203 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005204
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005205 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5206 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005207}
5208
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005209TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005210 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5211 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005212
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005213 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5214 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005215
5216 verifyFormat(
5217 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5218 " Parameter2);");
5219
5220 verifyFormat(
5221 "ShortObject->shortFunction(\n"
5222 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5223 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5224
5225 verifyFormat("loooooooooooooongFunction(\n"
5226 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5227
5228 verifyFormat(
5229 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5230 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5231
Daniel Jasper687af3b2013-02-14 14:26:07 +00005232 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5233 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005234 verifyFormat("void f() {\n"
5235 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5236 " .Times(2)\n"
5237 " .WillRepeatedly(Return(SomeValue));\n"
5238 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005239 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5240 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005241 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5243 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005244 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005245 verifyFormat("void f() {\n"
5246 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5247 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5248 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005249 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5251 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5252 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5253 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005254 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5255 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5256 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5257 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5258 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005259
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005260 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005261 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005262 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005263 verifyFormat(
5264 "aaaaaaaaaaa->aaaaaaaaa(\n"
5265 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5266 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005267
5268 verifyFormat(
5269 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005271 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5272 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5273 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5274 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005275
Daniel Jasper9b334242013-03-15 14:57:30 +00005276 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5278 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005279
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005280 FormatStyle NoBinPacking = getLLVMStyle();
5281 NoBinPacking.BinPackParameters = false;
5282 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5283 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5284 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5285 " aaaaaaaaaaaaaaaaaaa,\n"
5286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5287 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005288
5289 // If there is a subsequent call, change to hanging indentation.
5290 verifyFormat(
5291 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5292 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5293 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5294 verifyFormat(
5295 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5296 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005297 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5300 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005303}
5304
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005305TEST_F(FormatTest, WrapsTemplateDeclarations) {
5306 verifyFormat("template <typename T>\n"
5307 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005308 verifyFormat("template <typename T>\n"
5309 "// T should be one of {A, B}.\n"
5310 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005311 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005312 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005313 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005314 verifyFormat("template <typename T>\n"
5315 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5316 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005317 verifyFormat(
5318 "template <typename T>\n"
5319 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5320 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005321 verifyFormat(
5322 "template <typename T>\n"
5323 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005326 verifyFormat("template <typename T>\n"
5327 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005328 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005329 verifyFormat(
5330 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5331 " typename T4 = char>\n"
5332 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005333 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5334 " template <typename> class cccccccccccccccccccccc,\n"
5335 " typename ddddddddddddd>\n"
5336 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005337 verifyFormat(
5338 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005340
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005341 verifyFormat("void f() {\n"
5342 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5343 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5344 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005345
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005346 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005347 verifyFormat("template <typename T> void f();");
5348 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005349 verifyFormat(
5350 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5351 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5353 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5356 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5357 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005358 EXPECT_EQ("static_cast<A< //\n"
5359 " B> *>(\n"
5360 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005361 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005362 format("static_cast<A<//\n"
5363 " B>*>(\n"
5364 "\n"
5365 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005366 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5367 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005368
5369 FormatStyle AlwaysBreak = getLLVMStyle();
5370 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5371 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5372 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5373 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5374 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5375 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5376 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5377 verifyFormat("template <template <typename> class Fooooooo,\n"
5378 " template <typename> class Baaaaaaar>\n"
5379 "struct C {};",
5380 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005381 verifyFormat("template <typename T> // T can be A, B or C.\n"
5382 "struct C {};",
5383 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005384 verifyFormat("template <enum E> class A {\n"
5385 "public:\n"
5386 " E *f();\n"
5387 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005388}
5389
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005390TEST_F(FormatTest, WrapsTemplateParameters) {
5391 FormatStyle Style = getLLVMStyle();
5392 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5393 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5394 verifyFormat(
5395 "template <typename... a> struct q {};\n"
5396 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5397 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5398 " y;",
5399 Style);
5400 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5401 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5402 verifyFormat(
5403 "template <typename... a> struct r {};\n"
5404 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5405 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5406 " y;",
5407 Style);
5408 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5409 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5410 verifyFormat(
5411 "template <typename... a> struct s {};\n"
5412 "extern s<\n"
5413 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5414 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5415 " y;",
5416 Style);
5417 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5418 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5419 verifyFormat(
5420 "template <typename... a> struct t {};\n"
5421 "extern t<\n"
5422 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5423 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5424 " y;",
5425 Style);
5426}
5427
Daniel Jasper45797022013-01-25 10:57:27 +00005428TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5429 verifyFormat(
5430 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5432 verifyFormat(
5433 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5436
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005437 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005438 verifyFormat(
5439 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005442
Daniel Jasper45797022013-01-25 10:57:27 +00005443 verifyFormat(
5444 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005445 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005446
5447 // Breaking at nested name specifiers is generally not desirable.
5448 verifyFormat(
5449 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5450 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005451
5452 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005453 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005456 " aaaaaaaaaaaaaaaaaaaaa);",
5457 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005458
5459 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5461 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005462}
5463
Daniel Jasperf7935112012-12-03 18:12:45 +00005464TEST_F(FormatTest, UnderstandsTemplateParameters) {
5465 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005466 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005467 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5468 verifyFormat("bool x = a < 1 || 2 > a;");
5469 verifyFormat("bool x = 5 < f<int>();");
5470 verifyFormat("bool x = f<int>() > 5;");
5471 verifyFormat("bool x = 5 < a<int>::x;");
5472 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5473 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5474
5475 verifyGoogleFormat("A<A<int>> a;");
5476 verifyGoogleFormat("A<A<A<int>>> a;");
5477 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005478 verifyGoogleFormat("A<A<int> > a;");
5479 verifyGoogleFormat("A<A<A<int> > > a;");
5480 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005481 verifyGoogleFormat("A<::A<int>> a;");
5482 verifyGoogleFormat("A<::A> a;");
5483 verifyGoogleFormat("A< ::A> a;");
5484 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005485 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5486 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005487 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5488 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005489 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5490 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005491
Nico Weber7533b4d2014-09-24 17:17:32 +00005492 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5493
Daniel Jasperf7935112012-12-03 18:12:45 +00005494 verifyFormat("test >> a >> b;");
5495 verifyFormat("test << a >> b;");
5496
5497 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005498 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005499 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005500 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5501 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005502 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005503 verifyFormat("f(a.operator()<A>());");
5504 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5505 " .template operator()<A>());",
5506 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005507
5508 // Not template parameters.
5509 verifyFormat("return a < b && c > d;");
5510 verifyFormat("void f() {\n"
5511 " while (a < b && c > d) {\n"
5512 " }\n"
5513 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005514 verifyFormat("template <typename... Types>\n"
5515 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005516
5517 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5519 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005520 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005521 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005522 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005523}
5524
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005525TEST_F(FormatTest, BitshiftOperatorWidth) {
5526 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5527 " bar */",
5528 format("int a=1<<2; /* foo\n"
5529 " bar */"));
5530
5531 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5532 " bar */",
5533 format("int b =256>>1 ; /* foo\n"
5534 " bar */"));
5535}
5536
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005537TEST_F(FormatTest, UnderstandsBinaryOperators) {
5538 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005539 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005540}
5541
5542TEST_F(FormatTest, UnderstandsPointersToMembers) {
5543 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005544 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005545 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005546 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005547 verifyFormat("void f() {\n"
5548 " (a->*f)();\n"
5549 " a->*x;\n"
5550 " (a.*f)();\n"
5551 " ((*a).*f)();\n"
5552 " a.*x;\n"
5553 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005554 verifyFormat("void f() {\n"
5555 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5556 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5557 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005558 verifyFormat(
5559 "(aaaaaaaaaa->*bbbbbbb)(\n"
5560 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005561 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005562 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005563 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005564}
5565
Daniel Jasper8dd40472012-12-21 09:41:31 +00005566TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005567 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005568 verifyFormat("f(-1, -2, -3);");
5569 verifyFormat("a[-1] = 5;");
5570 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005571 verifyFormat("if (i == -1) {\n}");
5572 verifyFormat("if (i != -1) {\n}");
5573 verifyFormat("if (i > -1) {\n}");
5574 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005575 verifyFormat("++(a->f());");
5576 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005577 verifyFormat("(a->f())++;");
5578 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005579 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005580
5581 verifyFormat("a-- > b;");
5582 verifyFormat("b ? -a : c;");
5583 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005584 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005585 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005586 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005587
5588 verifyFormat("return -1;");
5589 verifyFormat("switch (a) {\n"
5590 "case -1:\n"
5591 " break;\n"
5592 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005593 verifyFormat("#define X -1");
5594 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005595
Chandler Carruthf8b72662014-03-02 12:37:31 +00005596 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5597 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005598
5599 verifyFormat("int a = /* confusing comment */ -1;");
5600 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5601 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005602}
5603
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005604TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005605 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005606 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005607 "}");
5608 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005609 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005610 verifyFormat("*aaa = aaaaaaa( // break\n"
5611 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005612}
5613
Daniel Jasper8863ada2013-08-26 08:10:17 +00005614TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005615 verifyFormat("bool operator<();");
5616 verifyFormat("bool operator>();");
5617 verifyFormat("bool operator=();");
5618 verifyFormat("bool operator==();");
5619 verifyFormat("bool operator!=();");
5620 verifyFormat("int operator+();");
5621 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005622 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005623 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005624 verifyFormat("bool operator();");
5625 verifyFormat("bool operator()();");
5626 verifyFormat("bool operator[]();");
5627 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005628 verifyFormat("operator int();");
5629 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005630 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005631 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005632 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005633 verifyFormat("void *operator new(std::size_t size);");
5634 verifyFormat("void *operator new[](std::size_t size);");
5635 verifyFormat("void operator delete(void *ptr);");
5636 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005637 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5638 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005639 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005640 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005641
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005642 verifyFormat(
5643 "ostream &operator<<(ostream &OutputStream,\n"
5644 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005645 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5646 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5647 " return left.group < right.group;\n"
5648 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005649 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005650 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005651
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005652 verifyGoogleFormat("operator void*();");
5653 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005654 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005655
5656 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005657 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5658 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005659}
5660
Daniel Jasper1c220482015-02-25 10:30:06 +00005661TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005662 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5663 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5664 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5665 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5666 verifyFormat("Deleted &operator=(const Deleted &) &;");
5667 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5668 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5669 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5670 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5671 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5672 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005673 verifyFormat("void Fn(T const &) const &;");
5674 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005675 verifyFormat("template <typename T>\n"
5676 "void F(T) && = delete;",
5677 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005678
Daniel Jasperaf642c62015-08-25 13:40:51 +00005679 FormatStyle AlignLeft = getLLVMStyle();
5680 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005681 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005682 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5683 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5684 AlignLeft);
5685 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5686 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005687 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5688 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5689 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5690 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005691 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5692 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005693
5694 FormatStyle Spaces = getLLVMStyle();
5695 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005696 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5697 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5698 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5699 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005700
5701 Spaces.SpacesInCStyleCastParentheses = false;
5702 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005703 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5704 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5705 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5706 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005707}
5708
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005709TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005710 verifyFormat("void f() {\n"
5711 " A *a = new A;\n"
5712 " A *a = new (placement) A;\n"
5713 " delete a;\n"
5714 " delete (A *)a;\n"
5715 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005716 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5717 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005718 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5719 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5720 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005721 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005722}
5723
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005724TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005725 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005726 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005727 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005728 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005729 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005730 verifyIndependentOfContext("int a = b * 10;");
5731 verifyIndependentOfContext("int a = 10 * b;");
5732 verifyIndependentOfContext("int a = b * c;");
5733 verifyIndependentOfContext("int a += b * c;");
5734 verifyIndependentOfContext("int a -= b * c;");
5735 verifyIndependentOfContext("int a *= b * c;");
5736 verifyIndependentOfContext("int a /= b * c;");
5737 verifyIndependentOfContext("int a = *b;");
5738 verifyIndependentOfContext("int a = *b * c;");
5739 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005740 verifyIndependentOfContext("int a = b * (10);");
5741 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005742 verifyIndependentOfContext("return 10 * b;");
5743 verifyIndependentOfContext("return *b * *c;");
5744 verifyIndependentOfContext("return a & ~b;");
5745 verifyIndependentOfContext("f(b ? *c : *d);");
5746 verifyIndependentOfContext("int a = b ? *c : *d;");
5747 verifyIndependentOfContext("*b = a;");
5748 verifyIndependentOfContext("a * ~b;");
5749 verifyIndependentOfContext("a * !b;");
5750 verifyIndependentOfContext("a * +b;");
5751 verifyIndependentOfContext("a * -b;");
5752 verifyIndependentOfContext("a * ++b;");
5753 verifyIndependentOfContext("a * --b;");
5754 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005755 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005756 verifyIndependentOfContext("f() * b;");
5757 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005758 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005759 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005760 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005761 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005762 verifyIndependentOfContext("return sizeof(int **);");
5763 verifyIndependentOfContext("return sizeof(int ******);");
5764 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005765 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005766 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005767 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005768 verifyGoogleFormat("return sizeof(int**);");
5769 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5770 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005771 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005772 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005773 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005774 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005775 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005776 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005777 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005778 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005779 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005780 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005781 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005782 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005783 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005784 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005785 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005786 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005787 verifyFormat("void f(const MyOverride &override);");
5788 verifyFormat("void f(const MyFinal &final);");
5789 verifyIndependentOfContext("bool a = f() && override.f();");
5790 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005791
Daniel Jasper5b49f472013-01-23 12:10:53 +00005792 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005793
Daniel Jasper5b49f472013-01-23 12:10:53 +00005794 verifyIndependentOfContext("A<int *> a;");
5795 verifyIndependentOfContext("A<int **> a;");
5796 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005797 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005798 verifyIndependentOfContext(
5799 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005800 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005801 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005802 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005803 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005804 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005805
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005806 verifyFormat(
5807 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5808 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5809
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005810 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005811 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005812 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005813 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005814 verifyGoogleFormat("A<int*> a;");
5815 verifyGoogleFormat("A<int**> a;");
5816 verifyGoogleFormat("A<int*, int*> a;");
5817 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005818 verifyGoogleFormat("f(b ? *c : *d);");
5819 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005820 verifyGoogleFormat("Type* t = **x;");
5821 verifyGoogleFormat("Type* t = *++*x;");
5822 verifyGoogleFormat("*++*x;");
5823 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5824 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005825 verifyGoogleFormat(
5826 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005827 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005828 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5829 verifyGoogleFormat("template <typename T>\n"
5830 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005831
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005832 FormatStyle Left = getLLVMStyle();
5833 Left.PointerAlignment = FormatStyle::PAS_Left;
5834 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005835 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005836 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005837 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005838 verifyFormat("delete *x;", Left);
5839 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5840 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5841 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005842
Daniel Jasper5b49f472013-01-23 12:10:53 +00005843 verifyIndependentOfContext("a = *(x + y);");
5844 verifyIndependentOfContext("a = &(x + y);");
5845 verifyIndependentOfContext("*(x + y).call();");
5846 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005847 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005848
Daniel Jasper5b49f472013-01-23 12:10:53 +00005849 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005850 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005851 "int *MyValues = {\n"
5852 " *A, // Operator detection might be confused by the '{'\n"
5853 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005854 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005855
Daniel Jasper5b49f472013-01-23 12:10:53 +00005856 verifyIndependentOfContext("if (int *a = &b)");
5857 verifyIndependentOfContext("if (int &a = *b)");
5858 verifyIndependentOfContext("if (a & b[i])");
5859 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5860 verifyIndependentOfContext("if (*b[i])");
5861 verifyIndependentOfContext("if (int *a = (&b))");
5862 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005863 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005864 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005865 verifyFormat("void f() {\n"
5866 " for (const int &v : Values) {\n"
5867 " }\n"
5868 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005869 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5870 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005871 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005872
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005873 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005874 verifyFormat("#define MACRO \\\n"
5875 " int *i = a * b; \\\n"
5876 " void f(a *b);",
5877 getLLVMStyleWithColumns(19));
5878
Daniel Jasper97b89482013-03-13 07:49:51 +00005879 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005880 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005881 verifyIndependentOfContext("T **t = new T *;");
5882 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005883 verifyGoogleFormat("A = new SomeType*[Length]();");
5884 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005885 verifyGoogleFormat("T** t = new T*;");
5886 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005887
Daniel Jaspera65e8872014-03-25 10:52:45 +00005888 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5889 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005890 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005891 "typename t::if<x && y>::type f() {}");
5892 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005893 verifyFormat("vector<int *> v;");
5894 verifyFormat("vector<int *const> v;");
5895 verifyFormat("vector<int *const **const *> v;");
5896 verifyFormat("vector<int *volatile> v;");
5897 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005898 verifyFormat("foo<b && false>();");
5899 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005900 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005901 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005902 "template <class T, class = typename std::enable_if<\n"
5903 " std::is_integral<T>::value &&\n"
5904 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5905 "void F();",
5906 getLLVMStyleWithColumns(70));
5907 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005908 "template <class T,\n"
5909 " class = typename std::enable_if<\n"
5910 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005911 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5912 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005913 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005914 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005915 verifyFormat(
5916 "template <class T,\n"
5917 " class = typename ::std::enable_if<\n"
5918 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5919 "void F();",
5920 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005921
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005922 verifyIndependentOfContext("MACRO(int *i);");
5923 verifyIndependentOfContext("MACRO(auto *a);");
5924 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00005925 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005926 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005927 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005928 // FIXME: Is there a way to make this work?
5929 // verifyIndependentOfContext("MACRO(A *a);");
5930
Daniel Jasper32ccb032014-06-23 07:36:18 +00005931 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005932 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005933
Daniel Jasper866468a2014-04-14 13:15:29 +00005934 EXPECT_EQ("#define OP(x) \\\n"
5935 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5936 " return s << a.DebugString(); \\\n"
5937 " }",
5938 format("#define OP(x) \\\n"
5939 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5940 " return s << a.DebugString(); \\\n"
5941 " }",
5942 getLLVMStyleWithColumns(50)));
5943
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005944 // FIXME: We cannot handle this case yet; we might be able to figure out that
5945 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005946 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005947
5948 FormatStyle PointerMiddle = getLLVMStyle();
5949 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5950 verifyFormat("delete *x;", PointerMiddle);
5951 verifyFormat("int * x;", PointerMiddle);
5952 verifyFormat("template <int * y> f() {}", PointerMiddle);
5953 verifyFormat("int * f(int * a) {}", PointerMiddle);
5954 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5955 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5956 verifyFormat("A<int *> a;", PointerMiddle);
5957 verifyFormat("A<int **> a;", PointerMiddle);
5958 verifyFormat("A<int *, int *> a;", PointerMiddle);
5959 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005960 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5961 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005962 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005963
5964 // Member function reference qualifiers aren't binary operators.
5965 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005966 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005967 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005968 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005969 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005970 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005971}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005972
Daniel Jasperee6d6502013-07-17 20:25:02 +00005973TEST_F(FormatTest, UnderstandsAttributes) {
5974 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005975 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5976 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005977 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005978 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005979 verifyFormat("__attribute__((nodebug)) void\n"
5980 "foo() {}\n",
5981 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005982}
5983
Daniel Jasper10cd5812013-05-06 06:35:44 +00005984TEST_F(FormatTest, UnderstandsEllipsis) {
5985 verifyFormat("int printf(const char *fmt, ...);");
5986 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005987 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5988
5989 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005990 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005991 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005992}
5993
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005994TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005995 EXPECT_EQ("int *a;\n"
5996 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005997 "int *a;",
5998 format("int *a;\n"
5999 "int* a;\n"
6000 "int *a;",
6001 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006002 EXPECT_EQ("int* a;\n"
6003 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006004 "int* a;",
6005 format("int* a;\n"
6006 "int* a;\n"
6007 "int *a;",
6008 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006009 EXPECT_EQ("int *a;\n"
6010 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006011 "int *a;",
6012 format("int *a;\n"
6013 "int * a;\n"
6014 "int * a;",
6015 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006016 EXPECT_EQ("auto x = [] {\n"
6017 " int *a;\n"
6018 " int *a;\n"
6019 " int *a;\n"
6020 "};",
6021 format("auto x=[]{int *a;\n"
6022 "int * a;\n"
6023 "int * a;};",
6024 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006025}
6026
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006027TEST_F(FormatTest, UnderstandsRvalueReferences) {
6028 verifyFormat("int f(int &&a) {}");
6029 verifyFormat("int f(int a, char &&b) {}");
6030 verifyFormat("void f() { int &&a = b; }");
6031 verifyGoogleFormat("int f(int a, char&& b) {}");
6032 verifyGoogleFormat("void f() { int&& a = b; }");
6033
Daniel Jasper1eff9082013-05-27 16:36:33 +00006034 verifyIndependentOfContext("A<int &&> a;");
6035 verifyIndependentOfContext("A<int &&, int &&> a;");
6036 verifyGoogleFormat("A<int&&> a;");
6037 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006038
6039 // Not rvalue references:
6040 verifyFormat("template <bool B, bool C> class A {\n"
6041 " static_assert(B && C, \"Something is wrong\");\n"
6042 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006043 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6044 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006045 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006046}
6047
Manuel Klimekc1237a82013-01-23 14:08:21 +00006048TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6049 verifyFormat("void f() {\n"
6050 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006051 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006052 "}",
6053 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006054}
6055
Daniel Jasperef906a92013-01-13 08:01:36 +00006056TEST_F(FormatTest, FormatsCasts) {
6057 verifyFormat("Type *A = static_cast<Type *>(P);");
6058 verifyFormat("Type *A = (Type *)P;");
6059 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6060 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006061 verifyFormat("int a = (int)2.0f;");
6062 verifyFormat("x[(int32)y];");
6063 verifyFormat("x = (int32)y;");
6064 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6065 verifyFormat("int a = (int)*b;");
6066 verifyFormat("int a = (int)2.0f;");
6067 verifyFormat("int a = (int)~0;");
6068 verifyFormat("int a = (int)++a;");
6069 verifyFormat("int a = (int)sizeof(int);");
6070 verifyFormat("int a = (int)+2;");
6071 verifyFormat("my_int a = (my_int)2.0f;");
6072 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006073 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006074 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006075 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006076 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006077 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006078
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006079 verifyFormat("void f() { my_int a = (my_int)*b; }");
6080 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6081 verifyFormat("my_int a = (my_int)~0;");
6082 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006083 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006084 verifyFormat("my_int a = (my_int)1;");
6085 verifyFormat("my_int a = (my_int *)1;");
6086 verifyFormat("my_int a = (const my_int)-1;");
6087 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006088 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006089 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006090 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006091 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006092
6093 // FIXME: single value wrapped with paren will be treated as cast.
6094 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006095
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006096 verifyFormat("{ (void)F; }");
6097
Daniel Jasper998cabc2013-07-18 14:46:07 +00006098 // Don't break after a cast's
6099 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6100 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6101 " bbbbbbbbbbbbbbbbbbbbbb);");
6102
Daniel Jasperef906a92013-01-13 08:01:36 +00006103 // These are not casts.
6104 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006105 verifyFormat("f(foo)->b;");
6106 verifyFormat("f(foo).b;");
6107 verifyFormat("f(foo)(b);");
6108 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006109 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006110 verifyFormat("(*funptr)(foo)[4];");
6111 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006112 verifyFormat("void f(int *);");
6113 verifyFormat("void f(int *) = 0;");
6114 verifyFormat("void f(SmallVector<int>) {}");
6115 verifyFormat("void f(SmallVector<int>);");
6116 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006117 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006118 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006119 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006120 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6121 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006122 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006123
Daniel Jasperba0bda92013-02-23 08:07:18 +00006124 // These are not casts, but at some point were confused with casts.
6125 verifyFormat("virtual void foo(int *) override;");
6126 verifyFormat("virtual void foo(char &) const;");
6127 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006128 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006129 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006130 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006131 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006132
6133 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6134 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006135 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006136 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006137 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6138 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6139 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006140}
6141
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006142TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006143 verifyFormat("A<bool()> a;");
6144 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006145 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006146 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006147 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006148 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006149 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006150 verifyFormat("template <class CallbackClass>\n"
6151 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006152
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006153 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6154 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006155 verifyGoogleFormat(
6156 "template <class CallbackClass>\n"
6157 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006158
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006159 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006160 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006161 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006162 verifyFormat("some_var = function(*some_pointer_var)[0];");
6163 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006164 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006165 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006166 verifyFormat("std::function<\n"
6167 " LooooooooooongTemplatedType<\n"
6168 " SomeType>*(\n"
6169 " LooooooooooooooooongType type)>\n"
6170 " function;",
6171 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006172}
6173
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006174TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6175 verifyFormat("A (*foo_)[6];");
6176 verifyFormat("vector<int> (*foo_)[6];");
6177}
6178
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006179TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6180 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6181 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6182 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6183 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006184 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6185 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006186
6187 // Different ways of ()-initializiation.
6188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6189 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6190 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6191 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6192 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6193 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006194 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6195 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006196
6197 // Lambdas should not confuse the variable declaration heuristic.
6198 verifyFormat("LooooooooooooooooongType\n"
6199 " variable(nullptr, [](A *a) {});",
6200 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006201}
6202
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006203TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006204 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006205 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006206 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006208 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006209 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006210 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6211 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006212 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6213 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006214 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6215 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006216 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6217 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006218 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6219 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006220 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6221 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6222 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6223 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006224 FormatStyle Indented = getLLVMStyle();
6225 Indented.IndentWrappedFunctionNames = true;
6226 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6227 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6228 Indented);
6229 verifyFormat(
6230 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6231 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6232 Indented);
6233 verifyFormat(
6234 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6235 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6236 Indented);
6237 verifyFormat(
6238 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6239 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6240 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006241
6242 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006243 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6244 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6245 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006246
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006247 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006248 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006249 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006250 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6251 " SourceLocation L, IdentifierIn *II,\n"
6252 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006253 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006254 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006255 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006256 " const SomeType<string, SomeOtherTemplateParameter>\n"
6257 " &ReallyReallyLongParameterName,\n"
6258 " const SomeType<string, SomeOtherTemplateParameter>\n"
6259 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006260 verifyFormat("template <typename A>\n"
6261 "SomeLoooooooooooooooooooooongType<\n"
6262 " typename some_namespace::SomeOtherType<A>::Type>\n"
6263 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006264
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006265 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006266 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6267 " aaaaaaaaaaaaaaaaaaaaaaa;");
6268 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006269 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6270 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006271 verifyGoogleFormat(
6272 "some_namespace::LongReturnType\n"
6273 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006274 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006275
6276 verifyGoogleFormat("template <typename T>\n"
6277 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006278 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006279 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6280 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006281
6282 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006283 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6284 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006285 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6286 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6287 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6288 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6289 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006292
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006293 verifyFormat("template <typename T> // Templates on own line.\n"
6294 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006295 "MyFunction(int a);",
6296 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006297}
6298
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006299TEST_F(FormatTest, FormatsArrays) {
6300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6301 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6303 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006304 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6305 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006306 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6307 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6308 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6309 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6310 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6311 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6312 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6313 verifyFormat(
6314 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6315 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6316 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006317 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6318 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006319
6320 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006322 verifyFormat(
6323 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6324 " .aaaaaaa[0]\n"
6325 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006326 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006327
6328 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006329
6330 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6331 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006332}
6333
Daniel Jaspere9de2602012-12-06 09:56:08 +00006334TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6335 verifyFormat("(a)->b();");
6336 verifyFormat("--a;");
6337}
6338
Daniel Jasper8b529712012-12-04 13:02:32 +00006339TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006340 verifyFormat("#include <string>\n"
6341 "#include <a/b/c.h>\n"
6342 "#include \"a/b/string\"\n"
6343 "#include \"string.h\"\n"
6344 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006345 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006346 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006347 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006348 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006349 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006350 "#include \"some very long include path\"\n"
6351 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006352 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006353 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6354 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006355
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006356 verifyFormat("#import <string>");
6357 verifyFormat("#import <a/b/c.h>");
6358 verifyFormat("#import \"a/b/string\"");
6359 verifyFormat("#import \"string.h\"");
6360 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006361 verifyFormat("#if __has_include(<strstream>)\n"
6362 "#include <strstream>\n"
6363 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006364
Daniel Jasper343643b2014-08-13 08:29:18 +00006365 verifyFormat("#define MY_IMPORT <a/b>");
6366
Nico Weber21088802017-02-10 19:36:52 +00006367 verifyFormat("#if __has_include(<a/b>)");
6368 verifyFormat("#if __has_include_next(<a/b>)");
6369 verifyFormat("#define F __has_include(<a/b>)");
6370 verifyFormat("#define F __has_include_next(<a/b>)");
6371
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006372 // Protocol buffer definition or missing "#".
6373 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6374 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006375
6376 FormatStyle Style = getLLVMStyle();
6377 Style.AlwaysBreakBeforeMultilineStrings = true;
6378 Style.ColumnLimit = 0;
6379 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006380
6381 // But 'import' might also be a regular C++ namespace.
6382 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006384}
6385
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006386//===----------------------------------------------------------------------===//
6387// Error recovery tests.
6388//===----------------------------------------------------------------------===//
6389
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006390TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006391 FormatStyle NoBinPacking = getLLVMStyle();
6392 NoBinPacking.BinPackParameters = false;
6393 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6394 " double *min_x,\n"
6395 " double *max_x,\n"
6396 " double *min_y,\n"
6397 " double *max_y,\n"
6398 " double *min_z,\n"
6399 " double *max_z, ) {}",
6400 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006401}
6402
Daniel Jasper83a54d22013-01-10 09:26:47 +00006403TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006404 verifyFormat("void f() { return; }\n42");
6405 verifyFormat("void f() {\n"
6406 " if (0)\n"
6407 " return;\n"
6408 "}\n"
6409 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006410 verifyFormat("void f() { return }\n42");
6411 verifyFormat("void f() {\n"
6412 " if (0)\n"
6413 " return\n"
6414 "}\n"
6415 "42");
6416}
6417
6418TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6419 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6420 EXPECT_EQ("void f() {\n"
6421 " if (a)\n"
6422 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006423 "}",
6424 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006425 EXPECT_EQ("namespace N {\n"
6426 "void f()\n"
6427 "}",
6428 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006429 EXPECT_EQ("namespace N {\n"
6430 "void f() {}\n"
6431 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006432 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006433 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006434}
6435
Daniel Jasper2df93312013-01-09 10:16:05 +00006436TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6437 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006438 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006439 " b;",
6440 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006441 verifyFormat("function(\n"
6442 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006443 " LoooooooooooongArgument);\n",
6444 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006445}
6446
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006447TEST_F(FormatTest, IncorrectAccessSpecifier) {
6448 verifyFormat("public:");
6449 verifyFormat("class A {\n"
6450 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006451 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006452 "};");
6453 verifyFormat("public\n"
6454 "int qwerty;");
6455 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006456 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006457 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006458 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006459 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006460 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006461}
Daniel Jasperf7935112012-12-03 18:12:45 +00006462
Daniel Jasper291f9362013-03-20 15:58:10 +00006463TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6464 verifyFormat("{");
6465 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006466 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006467}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006468
6469TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006470 verifyFormat("do {\n}");
6471 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006472 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006473 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006474 "wheeee(fun);");
6475 verifyFormat("do {\n"
6476 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006477 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006478}
6479
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006480TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006481 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006482 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006483 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006484 verifyFormat("while {\n foo;\n foo();\n}");
6485 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006486}
6487
Daniel Jasperc0880a92013-01-04 18:52:56 +00006488TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006489 verifyIncompleteFormat("namespace {\n"
6490 "class Foo { Foo (\n"
6491 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006492 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006493}
6494
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006495TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006496 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006497 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6498 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006499 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006500
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006501 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006502 " {\n"
6503 " breakme(\n"
6504 " qwe);\n"
6505 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006506 format("{\n"
6507 " {\n"
6508 " breakme(qwe);\n"
6509 "}\n",
6510 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006511}
6512
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006513TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006514 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006515 " avariable,\n"
6516 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006517 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006518}
6519
Manuel Klimek762dd182013-01-21 10:07:49 +00006520TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006521 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006522}
6523
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006524TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006525 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006526 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006527 " 1,\n"
6528 " 2,\n"
6529 " 3,\n"
6530 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006531 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006532 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6533 verifyFormat("f({1, 2});");
6534 verifyFormat("auto v = Foo{-1};");
6535 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6536 verifyFormat("Class::Class : member{1, 2, 3} {}");
6537 verifyFormat("new vector<int>{1, 2, 3};");
6538 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006539 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006540 verifyFormat("return {arg1, arg2};");
6541 verifyFormat("return {arg1, SomeType{parameter}};");
6542 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6543 verifyFormat("new T{arg1, arg2};");
6544 verifyFormat("f(MyMap[{composite, key}]);");
6545 verifyFormat("class Class {\n"
6546 " T member = {arg1, arg2};\n"
6547 "};");
6548 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006549 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6550 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006551 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6552 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006553
Daniel Jasper438059e2014-05-22 12:11:13 +00006554 verifyFormat("int foo(int i) { return fo1{}(i); }");
6555 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006556 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006557 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006558 verifyFormat("Node n{1, Node{1000}, //\n"
6559 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006560 verifyFormat("Aaaa aaaaaaa{\n"
6561 " {\n"
6562 " aaaa,\n"
6563 " },\n"
6564 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006565 verifyFormat("class C : public D {\n"
6566 " SomeClass SC{2};\n"
6567 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006568 verifyFormat("class C : public A {\n"
6569 " class D : public B {\n"
6570 " void f() { int i{2}; }\n"
6571 " };\n"
6572 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006573 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006574
Francois Ferrandd2130f52017-06-30 20:00:02 +00006575 // Binpacking only if there is no trailing comma
6576 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6577 " cccccccccc, dddddddddd};",
6578 getLLVMStyleWithColumns(50));
6579 verifyFormat("const Aaaaaa aaaaa = {\n"
6580 " aaaaaaaaaaa,\n"
6581 " bbbbbbbbbbb,\n"
6582 " ccccccccccc,\n"
6583 " ddddddddddd,\n"
6584 "};", getLLVMStyleWithColumns(50));
6585
Daniel Jaspere4ada022016-12-13 10:05:03 +00006586 // Cases where distinguising braced lists and blocks is hard.
6587 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6588 verifyFormat("void f() {\n"
6589 " return; // comment\n"
6590 "}\n"
6591 "SomeType t;");
6592 verifyFormat("void f() {\n"
6593 " if (a) {\n"
6594 " f();\n"
6595 " }\n"
6596 "}\n"
6597 "SomeType t;");
6598
Daniel Jasper08434342015-05-26 07:26:26 +00006599 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006600 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006601 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006602 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6603 " bbbbb,\n"
6604 " ccccc,\n"
6605 " ddddd,\n"
6606 " eeeee,\n"
6607 " ffffff,\n"
6608 " ggggg,\n"
6609 " hhhhhh,\n"
6610 " iiiiii,\n"
6611 " jjjjjj,\n"
6612 " kkkkkk};",
6613 NoBinPacking);
6614 verifyFormat("const Aaaaaa aaaaa = {\n"
6615 " aaaaa,\n"
6616 " bbbbb,\n"
6617 " ccccc,\n"
6618 " ddddd,\n"
6619 " eeeee,\n"
6620 " ffffff,\n"
6621 " ggggg,\n"
6622 " hhhhhh,\n"
6623 " iiiiii,\n"
6624 " jjjjjj,\n"
6625 " kkkkkk,\n"
6626 "};",
6627 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006628 verifyFormat(
6629 "const Aaaaaa aaaaa = {\n"
6630 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6631 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6632 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6633 "};",
6634 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006635
Chandler Carruthf8b72662014-03-02 12:37:31 +00006636 // FIXME: The alignment of these trailing comments might be bad. Then again,
6637 // this might be utterly useless in real code.
6638 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006639 " : some_value{ //\n"
6640 " aaaaaaa, //\n"
6641 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006642
Chandler Carruthf8b72662014-03-02 12:37:31 +00006643 // In braced lists, the first comment is always assumed to belong to the
6644 // first element. Thus, it can be moved to the next or previous line as
6645 // appropriate.
6646 EXPECT_EQ("function({// First element:\n"
6647 " 1,\n"
6648 " // Second element:\n"
6649 " 2});",
6650 format("function({\n"
6651 " // First element:\n"
6652 " 1,\n"
6653 " // Second element:\n"
6654 " 2});"));
6655 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6656 " // First element:\n"
6657 " 1,\n"
6658 " // Second element:\n"
6659 " 2};",
6660 format("std::vector<int> MyNumbers{// First element:\n"
6661 " 1,\n"
6662 " // Second element:\n"
6663 " 2};",
6664 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006665 // A trailing comma should still lead to an enforced line break and no
6666 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006667 EXPECT_EQ("vector<int> SomeVector = {\n"
6668 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006669 " 1,\n"
6670 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006671 "};",
6672 format("vector<int> SomeVector = { // aaa\n"
6673 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006674
Chandler Carruthf8b72662014-03-02 12:37:31 +00006675 FormatStyle ExtraSpaces = getLLVMStyle();
6676 ExtraSpaces.Cpp11BracedListStyle = false;
6677 ExtraSpaces.ColumnLimit = 75;
6678 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6679 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6680 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6681 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6682 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6683 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6684 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6685 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6686 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6687 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6688 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6689 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6690 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6691 verifyFormat("class Class {\n"
6692 " T member = { arg1, arg2 };\n"
6693 "};",
6694 ExtraSpaces);
6695 verifyFormat(
6696 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6697 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6698 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6699 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6700 ExtraSpaces);
6701 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006702 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006703 ExtraSpaces);
6704 verifyFormat(
6705 "someFunction(OtherParam,\n"
6706 " BracedList{ // comment 1 (Forcing interesting break)\n"
6707 " param1, param2,\n"
6708 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006709 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006710 ExtraSpaces);
6711 verifyFormat(
6712 "std::this_thread::sleep_for(\n"
6713 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6714 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006715 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006716 " aaaaaaa,\n"
6717 " aaaaaaaaaa,\n"
6718 " aaaaa,\n"
6719 " aaaaaaaaaaaaaaa,\n"
6720 " aaa,\n"
6721 " aaaaaaaaaa,\n"
6722 " a,\n"
6723 " aaaaaaaaaaaaaaaaaaaaa,\n"
6724 " aaaaaaaaaaaa,\n"
6725 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6726 " aaaaaaa,\n"
6727 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006728 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006729 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6730 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006731}
6732
Daniel Jasper33b909c2013-10-25 14:29:37 +00006733TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006734 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6735 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6736 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6737 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6738 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6739 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006740 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006741 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006742 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006743 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6744 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006745 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006746 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6747 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6748 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6749 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6750 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6751 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6752 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006753 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006754 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6755 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006756 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6757 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6758 " // Separating comment.\n"
6759 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6760 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6761 " // Leading comment\n"
6762 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6763 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006764 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6765 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006766 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006767 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6768 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006769 getLLVMStyleWithColumns(38));
6770 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006771 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6772 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006773 verifyFormat(
6774 "static unsigned SomeValues[10][3] = {\n"
6775 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6776 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6777 verifyFormat("static auto fields = new vector<string>{\n"
6778 " \"aaaaaaaaaaaaa\",\n"
6779 " \"aaaaaaaaaaaaa\",\n"
6780 " \"aaaaaaaaaaaa\",\n"
6781 " \"aaaaaaaaaaaaaa\",\n"
6782 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6783 " \"aaaaaaaaaaaa\",\n"
6784 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6785 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006786 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6787 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6788 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6789 " 3, cccccccccccccccccccccc};",
6790 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006791
6792 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006793 verifyFormat("vector<int> x = {\n"
6794 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6795 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006796 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006797 verifyFormat("vector<int> x = {\n"
6798 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006799 "};",
6800 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006801 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6802 " 1, 1, 1, 1,\n"
6803 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006804 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006805
Daniel Jasper60c27072015-05-13 08:16:00 +00006806 // Trailing comment in the first line.
6807 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6808 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6809 " 111111111, 222222222, 3333333333, 444444444, //\n"
6810 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006811 // Trailing comment in the last line.
6812 verifyFormat("int aaaaa[] = {\n"
6813 " 1, 2, 3, // comment\n"
6814 " 4, 5, 6 // comment\n"
6815 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006816
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006817 // With nested lists, we should either format one item per line or all nested
6818 // lists one on line.
6819 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006820 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6821 " {aaaaaaaaaaaaaaaaaaa},\n"
6822 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6823 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006824 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006825 verifyFormat(
6826 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006827 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6828 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6829 " {aaa, aaa},\n"
6830 " {aaa, aaa},\n"
6831 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6832 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6833 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006834
6835 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006836 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006837 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006838
6839 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006840
Daniel Jaspereb65e912015-12-21 18:31:15 +00006841 // No braced initializer here.
6842 verifyFormat("void f() {\n"
6843 " struct Dummy {};\n"
6844 " f(v);\n"
6845 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006846
6847 // Long lists should be formatted in columns even if they are nested.
6848 verifyFormat(
6849 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6850 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6851 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6852 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6853 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6854 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006855
6856 // Allow "single-column" layout even if that violates the column limit. There
6857 // isn't going to be a better way.
6858 verifyFormat("std::vector<int> a = {\n"
6859 " aaaaaaaa,\n"
6860 " aaaaaaaa,\n"
6861 " aaaaaaaa,\n"
6862 " aaaaaaaa,\n"
6863 " aaaaaaaaaa,\n"
6864 " aaaaaaaa,\n"
6865 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6866 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006867 verifyFormat("vector<int> aaaa = {\n"
6868 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6869 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6870 " aaaaaa.aaaaaaa,\n"
6871 " aaaaaa.aaaaaaa,\n"
6872 " aaaaaa.aaaaaaa,\n"
6873 " aaaaaa.aaaaaaa,\n"
6874 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006875
6876 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006877 verifyFormat("someFunction(Param, {List1, List2,\n"
6878 " List3});",
6879 getLLVMStyleWithColumns(35));
6880 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006881 " {List1, List2,\n"
6882 " List3});",
6883 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006884 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6885 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006886}
6887
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006888TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006889 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006890 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006891
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006892 verifyFormat("void f() { return 42; }");
6893 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006894 " return 42;\n"
6895 "}",
6896 DoNotMerge);
6897 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006898 " // Comment\n"
6899 "}");
6900 verifyFormat("{\n"
6901 "#error {\n"
6902 " int a;\n"
6903 "}");
6904 verifyFormat("{\n"
6905 " int a;\n"
6906 "#error {\n"
6907 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006908 verifyFormat("void f() {} // comment");
6909 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006910 verifyFormat("void f() {\n"
6911 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006912 DoNotMerge);
6913 verifyFormat("void f() {\n"
6914 " int a;\n"
6915 "} // comment",
6916 DoNotMerge);
6917 verifyFormat("void f() {\n"
6918 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006919 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006920
6921 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6922 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6923
6924 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6925 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006926 verifyFormat("class C {\n"
6927 " C()\n"
6928 " : iiiiiiii(nullptr),\n"
6929 " kkkkkkk(nullptr),\n"
6930 " mmmmmmm(nullptr),\n"
6931 " nnnnnnn(nullptr) {}\n"
6932 "};",
6933 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006934
6935 FormatStyle NoColumnLimit = getLLVMStyle();
6936 NoColumnLimit.ColumnLimit = 0;
6937 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6938 EXPECT_EQ("class C {\n"
6939 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006940 "};",
6941 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006942 EXPECT_EQ("A()\n"
6943 " : b(0) {\n"
6944 "}",
6945 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6946
6947 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006948 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6949 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006950 EXPECT_EQ("A()\n"
6951 " : b(0) {\n"
6952 "}",
6953 format("A():b(0){}", DoNotMergeNoColumnLimit));
6954 EXPECT_EQ("A()\n"
6955 " : b(0) {\n"
6956 "}",
6957 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006958
6959 verifyFormat("#define A \\\n"
6960 " void f() { \\\n"
6961 " int i; \\\n"
6962 " }",
6963 getLLVMStyleWithColumns(20));
6964 verifyFormat("#define A \\\n"
6965 " void f() { int i; }",
6966 getLLVMStyleWithColumns(21));
6967 verifyFormat("#define A \\\n"
6968 " void f() { \\\n"
6969 " int i; \\\n"
6970 " } \\\n"
6971 " int j;",
6972 getLLVMStyleWithColumns(22));
6973 verifyFormat("#define A \\\n"
6974 " void f() { int i; } \\\n"
6975 " int j;",
6976 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006977}
6978
Francois Ferrand2a81ca82017-06-13 07:02:43 +00006979TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6980 FormatStyle MergeEmptyOnly = getLLVMStyle();
6981 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6982 verifyFormat("class C {\n"
6983 " int f() {}\n"
6984 "};",
6985 MergeEmptyOnly);
6986 verifyFormat("class C {\n"
6987 " int f() {\n"
6988 " return 42;\n"
6989 " }\n"
6990 "};",
6991 MergeEmptyOnly);
6992 verifyFormat("int f() {}", MergeEmptyOnly);
6993 verifyFormat("int f() {\n"
6994 " return 42;\n"
6995 "}",
6996 MergeEmptyOnly);
6997
6998 // Also verify behavior when BraceWrapping.AfterFunction = true
6999 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7000 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7001 verifyFormat("int f() {}", MergeEmptyOnly);
7002 verifyFormat("class C {\n"
7003 " int f() {}\n"
7004 "};",
7005 MergeEmptyOnly);
7006}
7007
Daniel Jasperd74cf402014-04-08 12:46:38 +00007008TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7009 FormatStyle MergeInlineOnly = getLLVMStyle();
7010 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7011 verifyFormat("class C {\n"
7012 " int f() { return 42; }\n"
7013 "};",
7014 MergeInlineOnly);
7015 verifyFormat("int f() {\n"
7016 " return 42;\n"
7017 "}",
7018 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007019
7020 // SFS_Inline implies SFS_Empty
7021 verifyFormat("class C {\n"
7022 " int f() {}\n"
7023 "};",
7024 MergeInlineOnly);
7025 verifyFormat("int f() {}", MergeInlineOnly);
7026
7027 // Also verify behavior when BraceWrapping.AfterFunction = true
7028 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7029 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7030 verifyFormat("class C {\n"
7031 " int f() { return 42; }\n"
7032 "};",
7033 MergeInlineOnly);
7034 verifyFormat("int f()\n"
7035 "{\n"
7036 " return 42;\n"
7037 "}",
7038 MergeInlineOnly);
7039
7040 // SFS_Inline implies SFS_Empty
7041 verifyFormat("int f() {}", MergeInlineOnly);
7042 verifyFormat("class C {\n"
7043 " int f() {}\n"
7044 "};",
7045 MergeInlineOnly);
7046}
7047
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007048TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7049 FormatStyle MergeInlineOnly = getLLVMStyle();
7050 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7051 FormatStyle::SFS_InlineOnly;
7052 verifyFormat("class C {\n"
7053 " int f() { return 42; }\n"
7054 "};",
7055 MergeInlineOnly);
7056 verifyFormat("int f() {\n"
7057 " return 42;\n"
7058 "}",
7059 MergeInlineOnly);
7060
7061 // SFS_InlineOnly does not imply SFS_Empty
7062 verifyFormat("class C {\n"
7063 " int f() {}\n"
7064 "};",
7065 MergeInlineOnly);
7066 verifyFormat("int f() {\n"
7067 "}",
7068 MergeInlineOnly);
7069
7070 // Also verify behavior when BraceWrapping.AfterFunction = true
7071 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7072 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7073 verifyFormat("class C {\n"
7074 " int f() { return 42; }\n"
7075 "};",
7076 MergeInlineOnly);
7077 verifyFormat("int f()\n"
7078 "{\n"
7079 " return 42;\n"
7080 "}",
7081 MergeInlineOnly);
7082
7083 // SFS_InlineOnly does not imply SFS_Empty
7084 verifyFormat("int f()\n"
7085 "{\n"
7086 "}",
7087 MergeInlineOnly);
7088 verifyFormat("class C {\n"
7089 " int f() {}\n"
7090 "};",
7091 MergeInlineOnly);
7092}
7093
Francois Ferrandad722562017-06-30 20:25:55 +00007094TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007095 FormatStyle Style = getLLVMStyle();
7096 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7097 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7098 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007099 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007100 Style.ColumnLimit = 40;
7101
7102 verifyFormat("int f()\n"
7103 "{}",
7104 Style);
7105 verifyFormat("int f()\n"
7106 "{\n"
7107 " return 42;\n"
7108 "}",
7109 Style);
7110 verifyFormat("int f()\n"
7111 "{\n"
7112 " // some comment\n"
7113 "}",
7114 Style);
7115
7116 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7117 verifyFormat("int f() {}", Style);
7118 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7119 "{}",
7120 Style);
7121 verifyFormat("int f()\n"
7122 "{\n"
7123 " return 0;\n"
7124 "}",
7125 Style);
7126
7127 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7128 verifyFormat("class Foo {\n"
7129 " int f() {}\n"
7130 "};\n",
7131 Style);
7132 verifyFormat("class Foo {\n"
7133 " int f() { return 0; }\n"
7134 "};\n",
7135 Style);
7136 verifyFormat("class Foo {\n"
7137 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7138 " {}\n"
7139 "};\n",
7140 Style);
7141 verifyFormat("class Foo {\n"
7142 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7143 " {\n"
7144 " return 0;\n"
7145 " }\n"
7146 "};\n",
7147 Style);
7148
7149 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7150 verifyFormat("int f() {}", Style);
7151 verifyFormat("int f() { return 0; }", Style);
7152 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7153 "{}",
7154 Style);
7155 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7156 "{\n"
7157 " return 0;\n"
7158 "}",
7159 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007160}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007161TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7162 FormatStyle Style = getLLVMStyle();
7163 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7164 verifyFormat("#ifdef A\n"
7165 "int f() {}\n"
7166 "#else\n"
7167 "int g() {}\n"
7168 "#endif",
7169 Style);
7170}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007171
Francois Ferrandad722562017-06-30 20:25:55 +00007172TEST_F(FormatTest, SplitEmptyClass) {
7173 FormatStyle Style = getLLVMStyle();
7174 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7175 Style.BraceWrapping.AfterClass = true;
7176 Style.BraceWrapping.SplitEmptyRecord = false;
7177
7178 verifyFormat("class Foo\n"
7179 "{};",
7180 Style);
7181 verifyFormat("/* something */ class Foo\n"
7182 "{};",
7183 Style);
7184 verifyFormat("template <typename X> class Foo\n"
7185 "{};",
7186 Style);
7187 verifyFormat("class Foo\n"
7188 "{\n"
7189 " Foo();\n"
7190 "};",
7191 Style);
7192 verifyFormat("typedef class Foo\n"
7193 "{\n"
7194 "} Foo_t;",
7195 Style);
7196}
7197
7198TEST_F(FormatTest, SplitEmptyStruct) {
7199 FormatStyle Style = getLLVMStyle();
7200 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7201 Style.BraceWrapping.AfterStruct = true;
7202 Style.BraceWrapping.SplitEmptyRecord = false;
7203
7204 verifyFormat("struct Foo\n"
7205 "{};",
7206 Style);
7207 verifyFormat("/* something */ struct Foo\n"
7208 "{};",
7209 Style);
7210 verifyFormat("template <typename X> struct Foo\n"
7211 "{};",
7212 Style);
7213 verifyFormat("struct Foo\n"
7214 "{\n"
7215 " Foo();\n"
7216 "};",
7217 Style);
7218 verifyFormat("typedef struct Foo\n"
7219 "{\n"
7220 "} Foo_t;",
7221 Style);
7222 //typedef struct Bar {} Bar_t;
7223}
7224
7225TEST_F(FormatTest, SplitEmptyUnion) {
7226 FormatStyle Style = getLLVMStyle();
7227 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7228 Style.BraceWrapping.AfterUnion = true;
7229 Style.BraceWrapping.SplitEmptyRecord = false;
7230
7231 verifyFormat("union Foo\n"
7232 "{};",
7233 Style);
7234 verifyFormat("/* something */ union Foo\n"
7235 "{};",
7236 Style);
7237 verifyFormat("union Foo\n"
7238 "{\n"
7239 " A,\n"
7240 "};",
7241 Style);
7242 verifyFormat("typedef union Foo\n"
7243 "{\n"
7244 "} Foo_t;",
7245 Style);
7246}
7247
7248TEST_F(FormatTest, SplitEmptyNamespace) {
7249 FormatStyle Style = getLLVMStyle();
7250 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7251 Style.BraceWrapping.AfterNamespace = true;
7252 Style.BraceWrapping.SplitEmptyNamespace = false;
7253
7254 verifyFormat("namespace Foo\n"
7255 "{};",
7256 Style);
7257 verifyFormat("/* something */ namespace Foo\n"
7258 "{};",
7259 Style);
7260 verifyFormat("inline namespace Foo\n"
7261 "{};",
7262 Style);
7263 verifyFormat("namespace Foo\n"
7264 "{\n"
7265 "void Bar();\n"
7266 "};",
7267 Style);
7268}
7269
7270TEST_F(FormatTest, NeverMergeShortRecords) {
7271 FormatStyle Style = getLLVMStyle();
7272
7273 verifyFormat("class Foo {\n"
7274 " Foo();\n"
7275 "};",
7276 Style);
7277 verifyFormat("typedef class Foo {\n"
7278 " Foo();\n"
7279 "} Foo_t;",
7280 Style);
7281 verifyFormat("struct Foo {\n"
7282 " Foo();\n"
7283 "};",
7284 Style);
7285 verifyFormat("typedef struct Foo {\n"
7286 " Foo();\n"
7287 "} Foo_t;",
7288 Style);
7289 verifyFormat("union Foo {\n"
7290 " A,\n"
7291 "};",
7292 Style);
7293 verifyFormat("typedef union Foo {\n"
7294 " A,\n"
7295 "} Foo_t;",
7296 Style);
7297 verifyFormat("namespace Foo {\n"
7298 "void Bar();\n"
7299 "};",
7300 Style);
7301
7302 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7303 Style.BraceWrapping.AfterClass = true;
7304 Style.BraceWrapping.AfterStruct = true;
7305 Style.BraceWrapping.AfterUnion = true;
7306 Style.BraceWrapping.AfterNamespace = true;
7307 verifyFormat("class Foo\n"
7308 "{\n"
7309 " Foo();\n"
7310 "};",
7311 Style);
7312 verifyFormat("typedef class Foo\n"
7313 "{\n"
7314 " Foo();\n"
7315 "} Foo_t;",
7316 Style);
7317 verifyFormat("struct Foo\n"
7318 "{\n"
7319 " Foo();\n"
7320 "};",
7321 Style);
7322 verifyFormat("typedef struct Foo\n"
7323 "{\n"
7324 " Foo();\n"
7325 "} Foo_t;",
7326 Style);
7327 verifyFormat("union Foo\n"
7328 "{\n"
7329 " A,\n"
7330 "};",
7331 Style);
7332 verifyFormat("typedef union Foo\n"
7333 "{\n"
7334 " A,\n"
7335 "} Foo_t;",
7336 Style);
7337 verifyFormat("namespace Foo\n"
7338 "{\n"
7339 "void Bar();\n"
7340 "};",
7341 Style);
7342}
7343
Manuel Klimeke01bab52013-01-15 13:38:33 +00007344TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7345 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007346 verifyFormat("struct foo a = {bar};\nint n;");
7347 verifyFormat("class foo a = {bar};\nint n;");
7348 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007349
7350 // Elaborate types inside function definitions.
7351 verifyFormat("struct foo f() {}\nint n;");
7352 verifyFormat("class foo f() {}\nint n;");
7353 verifyFormat("union foo f() {}\nint n;");
7354
7355 // Templates.
7356 verifyFormat("template <class X> void f() {}\nint n;");
7357 verifyFormat("template <struct X> void f() {}\nint n;");
7358 verifyFormat("template <union X> void f() {}\nint n;");
7359
7360 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007361 verifyFormat("struct {\n} n;");
7362 verifyFormat(
7363 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007364 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007365 verifyFormat("class MACRO Z {\n} n;");
7366 verifyFormat("class MACRO(X) Z {\n} n;");
7367 verifyFormat("class __attribute__(X) Z {\n} n;");
7368 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007369 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007370 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007371 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7372 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007373
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007374 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007375 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007376
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007377 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007378 verifyFormat(
7379 "template <typename F>\n"
7380 "Matcher(const Matcher<F> &Other,\n"
7381 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7382 " !is_same<F, T>::value>::type * = 0)\n"
7383 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7384
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007385 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007386 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007387 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007388
7389 // FIXME:
7390 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007391 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007392
Manuel Klimeke01bab52013-01-15 13:38:33 +00007393 // Elaborate types where incorrectly parsing the structural element would
7394 // break the indent.
7395 verifyFormat("if (true)\n"
7396 " class X x;\n"
7397 "else\n"
7398 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007399
7400 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007401 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007402}
7403
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007404TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007405 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7406 format("#error Leave all white!!!!! space* alone!\n"));
7407 EXPECT_EQ(
7408 "#warning Leave all white!!!!! space* alone!\n",
7409 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007410 EXPECT_EQ("#error 1", format(" # error 1"));
7411 EXPECT_EQ("#warning 1", format(" # warning 1"));
7412}
7413
Daniel Jasper4431aa92013-04-23 13:54:04 +00007414TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007415 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007416 verifyFormat("#if (AAAA && BBBB)");
7417 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007418 // FIXME: Come up with a better indentation for #elif.
7419 verifyFormat(
7420 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7421 " defined(BBBBBBBB)\n"
7422 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7423 " defined(BBBBBBBB)\n"
7424 "#endif",
7425 getLLVMStyleWithColumns(65));
7426}
7427
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007428TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7429 FormatStyle AllowsMergedIf = getGoogleStyle();
7430 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7431 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7432 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007433 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7434 EXPECT_EQ("if (true) return 42;",
7435 format("if (true)\nreturn 42;", AllowsMergedIf));
7436 FormatStyle ShortMergedIf = AllowsMergedIf;
7437 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007438 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007439 " if (true) return 42;",
7440 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007441 verifyFormat("#define A \\\n"
7442 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007443 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007444 "#define B",
7445 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007446 verifyFormat("#define A \\\n"
7447 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007448 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007449 "g();",
7450 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007451 verifyFormat("{\n"
7452 "#ifdef A\n"
7453 " // Comment\n"
7454 " if (true) continue;\n"
7455 "#endif\n"
7456 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007457 " if (true) continue;\n"
7458 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007459 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007460 ShortMergedIf.ColumnLimit = 33;
7461 verifyFormat("#define A \\\n"
7462 " if constexpr (true) return 42;",
7463 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007464 ShortMergedIf.ColumnLimit = 29;
7465 verifyFormat("#define A \\\n"
7466 " if (aaaaaaaaaa) return 1; \\\n"
7467 " return 2;",
7468 ShortMergedIf);
7469 ShortMergedIf.ColumnLimit = 28;
7470 verifyFormat("#define A \\\n"
7471 " if (aaaaaaaaaa) \\\n"
7472 " return 1; \\\n"
7473 " return 2;",
7474 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007475 verifyFormat("#define A \\\n"
7476 " if constexpr (aaaaaaa) \\\n"
7477 " return 1; \\\n"
7478 " return 2;",
7479 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007480}
7481
Manuel Klimekd33516e2013-01-23 10:09:28 +00007482TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007483 verifyFormat("void f(int *a);");
7484 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007485 verifyFormat("class A {\n void f(int *a);\n};");
7486 verifyFormat("class A {\n int *a;\n};");
7487 verifyFormat("namespace a {\n"
7488 "namespace b {\n"
7489 "class A {\n"
7490 " void f() {}\n"
7491 " int *a;\n"
7492 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007493 "} // namespace b\n"
7494 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007495}
7496
Manuel Klimekd33516e2013-01-23 10:09:28 +00007497TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7498 verifyFormat("while");
7499 verifyFormat("operator");
7500}
7501
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007502TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7503 // This code would be painfully slow to format if we didn't skip it.
7504 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
7505 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7506 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7507 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7508 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7509 "A(1, 1)\n"
7510 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7511 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7512 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7513 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7514 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7515 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7516 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7517 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7518 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7519 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7520 // Deeply nested part is untouched, rest is formatted.
7521 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7522 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007523 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007524}
7525
Nico Weber7e6a7a12013-01-08 17:56:31 +00007526//===----------------------------------------------------------------------===//
7527// Objective-C tests.
7528//===----------------------------------------------------------------------===//
7529
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007530TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7531 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7532 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7533 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007534 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007535 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7536 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7537 format("-(NSInteger)Method3:(id)anObject;"));
7538 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7539 format("-(NSInteger)Method4:(id)anObject;"));
7540 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7541 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7542 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7543 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007544 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7545 "forAllCells:(BOOL)flag;",
7546 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7547 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007548
7549 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007550 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7551 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007552 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7553 " inRange:(NSRange)range\n"
7554 " outRange:(NSRange)out_range\n"
7555 " outRange1:(NSRange)out_range1\n"
7556 " outRange2:(NSRange)out_range2\n"
7557 " outRange3:(NSRange)out_range3\n"
7558 " outRange4:(NSRange)out_range4\n"
7559 " outRange5:(NSRange)out_range5\n"
7560 " outRange6:(NSRange)out_range6\n"
7561 " outRange7:(NSRange)out_range7\n"
7562 " outRange8:(NSRange)out_range8\n"
7563 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007564
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007565 // When the function name has to be wrapped.
7566 FormatStyle Style = getLLVMStyle();
7567 Style.IndentWrappedFunctionNames = false;
7568 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7569 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7570 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7571 "}",
7572 Style);
7573 Style.IndentWrappedFunctionNames = true;
7574 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7575 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7576 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7577 "}",
7578 Style);
7579
Nico Weberd6f962f2013-01-10 20:18:33 +00007580 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007581 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007582 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7583 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007584 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007585
Daniel Jasper37194282013-05-28 08:33:00 +00007586 verifyFormat("- (int (*)())foo:(int (*)())f;");
7587 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007588
7589 // If there's no return type (very rare in practice!), LLVM and Google style
7590 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007591 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007592 verifyFormat("- foo:(int)f;");
7593 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007594}
7595
Nico Weber0588b502013-02-07 00:19:29 +00007596
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007597TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007598 EXPECT_EQ("\"some text \"\n"
7599 "\"other\";",
7600 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007601 EXPECT_EQ("\"some text \"\n"
7602 "\"other\";",
7603 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007604 EXPECT_EQ(
7605 "#define A \\\n"
7606 " \"some \" \\\n"
7607 " \"text \" \\\n"
7608 " \"other\";",
7609 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7610 EXPECT_EQ(
7611 "#define A \\\n"
7612 " \"so \" \\\n"
7613 " \"text \" \\\n"
7614 " \"other\";",
7615 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7616
7617 EXPECT_EQ("\"some text\"",
7618 format("\"some text\"", getLLVMStyleWithColumns(1)));
7619 EXPECT_EQ("\"some text\"",
7620 format("\"some text\"", getLLVMStyleWithColumns(11)));
7621 EXPECT_EQ("\"some \"\n"
7622 "\"text\"",
7623 format("\"some text\"", getLLVMStyleWithColumns(10)));
7624 EXPECT_EQ("\"some \"\n"
7625 "\"text\"",
7626 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007627 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007628 "\" tex\"\n"
7629 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007630 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007631 EXPECT_EQ("\"some\"\n"
7632 "\" tex\"\n"
7633 "\" and\"",
7634 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7635 EXPECT_EQ("\"some\"\n"
7636 "\"/tex\"\n"
7637 "\"/and\"",
7638 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007639
7640 EXPECT_EQ("variable =\n"
7641 " \"long string \"\n"
7642 " \"literal\";",
7643 format("variable = \"long string literal\";",
7644 getLLVMStyleWithColumns(20)));
7645
7646 EXPECT_EQ("variable = f(\n"
7647 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007648 " \"literal\",\n"
7649 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007650 " loooooooooooooooooooong);",
7651 format("variable = f(\"long string literal\", short, "
7652 "loooooooooooooooooooong);",
7653 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007654
Daniel Jaspera44991332015-04-29 13:06:49 +00007655 EXPECT_EQ(
7656 "f(g(\"long string \"\n"
7657 " \"literal\"),\n"
7658 " b);",
7659 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007660 EXPECT_EQ("f(g(\"long string \"\n"
7661 " \"literal\",\n"
7662 " a),\n"
7663 " b);",
7664 format("f(g(\"long string literal\", a), b);",
7665 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007666 EXPECT_EQ(
7667 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007668 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007669 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7670 EXPECT_EQ("f(\"one two three four five six \"\n"
7671 " \"seven\".split(\n"
7672 " really_looooong_variable));",
7673 format("f(\"one two three four five six seven\"."
7674 "split(really_looooong_variable));",
7675 getLLVMStyleWithColumns(33)));
7676
7677 EXPECT_EQ("f(\"some \"\n"
7678 " \"text\",\n"
7679 " other);",
7680 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007681
7682 // Only break as a last resort.
7683 verifyFormat(
7684 "aaaaaaaaaaaaaaaaaaaa(\n"
7685 " aaaaaaaaaaaaaaaaaaaa,\n"
7686 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007687
Daniel Jaspera44991332015-04-29 13:06:49 +00007688 EXPECT_EQ("\"splitmea\"\n"
7689 "\"trandomp\"\n"
7690 "\"oint\"",
7691 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007692
Daniel Jaspera44991332015-04-29 13:06:49 +00007693 EXPECT_EQ("\"split/\"\n"
7694 "\"pathat/\"\n"
7695 "\"slashes\"",
7696 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007697
Daniel Jaspera44991332015-04-29 13:06:49 +00007698 EXPECT_EQ("\"split/\"\n"
7699 "\"pathat/\"\n"
7700 "\"slashes\"",
7701 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007702 EXPECT_EQ("\"split at \"\n"
7703 "\"spaces/at/\"\n"
7704 "\"slashes.at.any$\"\n"
7705 "\"non-alphanumeric%\"\n"
7706 "\"1111111111characte\"\n"
7707 "\"rs\"",
7708 format("\"split at "
7709 "spaces/at/"
7710 "slashes.at."
7711 "any$non-"
7712 "alphanumeric%"
7713 "1111111111characte"
7714 "rs\"",
7715 getLLVMStyleWithColumns(20)));
7716
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007717 // Verify that splitting the strings understands
7718 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007719 EXPECT_EQ(
7720 "aaaaaaaaaaaa(\n"
7721 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7722 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7723 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7724 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7725 "aaaaaaaaaaaaaaaaaaaaaa\");",
7726 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007727 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7728 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7729 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7730 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7731 "aaaaaaaaaaaaaaaaaaaaaa\";",
7732 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007733 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7734 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7735 format("llvm::outs() << "
7736 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7737 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007738 EXPECT_EQ("ffff(\n"
7739 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7740 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7741 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7742 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7743 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007744
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007745 FormatStyle Style = getLLVMStyleWithColumns(12);
7746 Style.BreakStringLiterals = false;
7747 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7748
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007749 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007750 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007751 EXPECT_EQ("#define A \\\n"
7752 " \"some \" \\\n"
7753 " \"text \" \\\n"
7754 " \"other\";",
7755 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007756}
7757
Manuel Klimek93699f42017-11-29 14:29:43 +00007758TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7759 EXPECT_EQ("C a = \"some more \"\n"
7760 " \"text\";",
7761 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7762}
7763
Manuel Klimek9e321992015-07-28 15:50:24 +00007764TEST_F(FormatTest, FullyRemoveEmptyLines) {
7765 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7766 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7767 EXPECT_EQ("int i = a(b());",
7768 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7769}
7770
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007771TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7772 EXPECT_EQ(
7773 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7774 "(\n"
7775 " \"x\t\");",
7776 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7777 "aaaaaaa("
7778 "\"x\t\");"));
7779}
7780
Daniel Jasper174b0122014-01-09 14:18:12 +00007781TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007782 EXPECT_EQ(
7783 "u8\"utf8 string \"\n"
7784 "u8\"literal\";",
7785 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7786 EXPECT_EQ(
7787 "u\"utf16 string \"\n"
7788 "u\"literal\";",
7789 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7790 EXPECT_EQ(
7791 "U\"utf32 string \"\n"
7792 "U\"literal\";",
7793 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7794 EXPECT_EQ("L\"wide string \"\n"
7795 "L\"literal\";",
7796 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007797 EXPECT_EQ("@\"NSString \"\n"
7798 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007799 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007800 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007801
7802 // This input makes clang-format try to split the incomplete unicode escape
7803 // sequence, which used to lead to a crasher.
7804 verifyNoCrash(
7805 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7806 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007807}
7808
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007809TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7810 FormatStyle Style = getGoogleStyleWithColumns(15);
7811 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7812 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7813 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7814 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7815 EXPECT_EQ("u8R\"x(raw literal)x\";",
7816 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007817}
7818
7819TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7820 FormatStyle Style = getLLVMStyleWithColumns(20);
7821 EXPECT_EQ(
7822 "_T(\"aaaaaaaaaaaaaa\")\n"
7823 "_T(\"aaaaaaaaaaaaaa\")\n"
7824 "_T(\"aaaaaaaaaaaa\")",
7825 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007826 EXPECT_EQ("f(x,\n"
7827 " _T(\"aaaaaaaaaaaa\")\n"
7828 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007829 " z);",
7830 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7831
7832 // FIXME: Handle embedded spaces in one iteration.
7833 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7834 // "_T(\"aaaaaaaaaaaaa\")\n"
7835 // "_T(\"aaaaaaaaaaaaa\")\n"
7836 // "_T(\"a\")",
7837 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7838 // getLLVMStyleWithColumns(20)));
7839 EXPECT_EQ(
7840 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7841 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007842 EXPECT_EQ("f(\n"
7843 "#if !TEST\n"
7844 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7845 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007846 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007847 format("f(\n"
7848 "#if !TEST\n"
7849 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7850 "#endif\n"
7851 ");"));
7852 EXPECT_EQ("f(\n"
7853 "\n"
7854 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7855 format("f(\n"
7856 "\n"
7857 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007858}
7859
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007860TEST_F(FormatTest, BreaksStringLiteralOperands) {
7861 // In a function call with two operands, the second can be broken with no line
7862 // break before it.
7863 EXPECT_EQ("func(a, \"long long \"\n"
7864 " \"long long\");",
7865 format("func(a, \"long long long long\");",
7866 getLLVMStyleWithColumns(24)));
7867 // In a function call with three operands, the second must be broken with a
7868 // line break before it.
7869 EXPECT_EQ("func(a,\n"
7870 " \"long long long \"\n"
7871 " \"long\",\n"
7872 " c);",
7873 format("func(a, \"long long long long\", c);",
7874 getLLVMStyleWithColumns(24)));
7875 // In a function call with three operands, the third must be broken with a
7876 // line break before it.
7877 EXPECT_EQ("func(a, b,\n"
7878 " \"long long long \"\n"
7879 " \"long\");",
7880 format("func(a, b, \"long long long long\");",
7881 getLLVMStyleWithColumns(24)));
7882 // In a function call with three operands, both the second and the third must
7883 // be broken with a line break before them.
7884 EXPECT_EQ("func(a,\n"
7885 " \"long long long \"\n"
7886 " \"long\",\n"
7887 " \"long long long \"\n"
7888 " \"long\");",
7889 format("func(a, \"long long long long\", \"long long long long\");",
7890 getLLVMStyleWithColumns(24)));
7891 // In a chain of << with two operands, the second can be broken with no line
7892 // break before it.
7893 EXPECT_EQ("a << \"line line \"\n"
7894 " \"line\";",
7895 format("a << \"line line line\";",
7896 getLLVMStyleWithColumns(20)));
7897 // In a chain of << with three operands, the second can be broken with no line
7898 // break before it.
7899 EXPECT_EQ("abcde << \"line \"\n"
7900 " \"line line\"\n"
7901 " << c;",
7902 format("abcde << \"line line line\" << c;",
7903 getLLVMStyleWithColumns(20)));
7904 // In a chain of << with three operands, the third must be broken with a line
7905 // break before it.
7906 EXPECT_EQ("a << b\n"
7907 " << \"line line \"\n"
7908 " \"line\";",
7909 format("a << b << \"line line line\";",
7910 getLLVMStyleWithColumns(20)));
7911 // In a chain of << with three operands, the second can be broken with no line
7912 // break before it and the third must be broken with a line break before it.
7913 EXPECT_EQ("abcd << \"line line \"\n"
7914 " \"line\"\n"
7915 " << \"line line \"\n"
7916 " \"line\";",
7917 format("abcd << \"line line line\" << \"line line line\";",
7918 getLLVMStyleWithColumns(20)));
7919 // In a chain of binary operators with two operands, the second can be broken
7920 // with no line break before it.
7921 EXPECT_EQ("abcd + \"line line \"\n"
7922 " \"line line\";",
7923 format("abcd + \"line line line line\";",
7924 getLLVMStyleWithColumns(20)));
7925 // In a chain of binary operators with three operands, the second must be
7926 // broken with a line break before it.
7927 EXPECT_EQ("abcd +\n"
7928 " \"line line \"\n"
7929 " \"line line\" +\n"
7930 " e;",
7931 format("abcd + \"line line line line\" + e;",
7932 getLLVMStyleWithColumns(20)));
7933 // In a function call with two operands, with AlignAfterOpenBracket enabled,
7934 // the first must be broken with a line break before it.
7935 FormatStyle Style = getLLVMStyleWithColumns(25);
7936 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7937 EXPECT_EQ("someFunction(\n"
7938 " \"long long long \"\n"
7939 " \"long\",\n"
7940 " a);",
7941 format("someFunction(\"long long long long\", a);", Style));
7942}
7943
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007944TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007945 EXPECT_EQ(
7946 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7948 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7949 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7952}
7953
7954TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7955 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007956 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007957 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7958 "multiline raw string literal xxxxxxxxxxxxxx\n"
7959 ")x\",\n"
7960 " a),\n"
7961 " b);",
7962 format("fffffffffff(g(R\"x(\n"
7963 "multiline raw string literal xxxxxxxxxxxxxx\n"
7964 ")x\", a), b);",
7965 getGoogleStyleWithColumns(20)));
7966 EXPECT_EQ("fffffffffff(\n"
7967 " g(R\"x(qqq\n"
7968 "multiline raw string literal xxxxxxxxxxxxxx\n"
7969 ")x\",\n"
7970 " a),\n"
7971 " b);",
7972 format("fffffffffff(g(R\"x(qqq\n"
7973 "multiline raw string literal xxxxxxxxxxxxxx\n"
7974 ")x\", a), b);",
7975 getGoogleStyleWithColumns(20)));
7976
7977 EXPECT_EQ("fffffffffff(R\"x(\n"
7978 "multiline raw string literal xxxxxxxxxxxxxx\n"
7979 ")x\");",
7980 format("fffffffffff(R\"x(\n"
7981 "multiline raw string literal xxxxxxxxxxxxxx\n"
7982 ")x\");",
7983 getGoogleStyleWithColumns(20)));
7984 EXPECT_EQ("fffffffffff(R\"x(\n"
7985 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007986 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007987 format("fffffffffff(R\"x(\n"
7988 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007989 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007990 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007991 EXPECT_EQ("fffffffffff(\n"
7992 " R\"x(\n"
7993 "multiline raw string literal xxxxxxxxxxxxxx\n"
7994 ")x\" +\n"
7995 " bbbbbb);",
7996 format("fffffffffff(\n"
7997 " R\"x(\n"
7998 "multiline raw string literal xxxxxxxxxxxxxx\n"
7999 ")x\" + bbbbbb);",
8000 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008001}
8002
Alexander Kornienkobe633902013-06-14 11:46:10 +00008003TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008004 verifyFormat("string a = \"unterminated;");
8005 EXPECT_EQ("function(\"unterminated,\n"
8006 " OtherParameter);",
8007 format("function( \"unterminated,\n"
8008 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008009}
8010
8011TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008012 FormatStyle Style = getLLVMStyle();
8013 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008014 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008015 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008016}
8017
Daniel Jaspera44991332015-04-29 13:06:49 +00008018TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008019
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008020TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8021 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8022 " \"ddeeefff\");",
8023 format("someFunction(\"aaabbbcccdddeeefff\");",
8024 getLLVMStyleWithColumns(25)));
8025 EXPECT_EQ("someFunction1234567890(\n"
8026 " \"aaabbbcccdddeeefff\");",
8027 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8028 getLLVMStyleWithColumns(26)));
8029 EXPECT_EQ("someFunction1234567890(\n"
8030 " \"aaabbbcccdddeeeff\"\n"
8031 " \"f\");",
8032 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8033 getLLVMStyleWithColumns(25)));
8034 EXPECT_EQ("someFunction1234567890(\n"
8035 " \"aaabbbcccdddeeeff\"\n"
8036 " \"f\");",
8037 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8038 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008039 EXPECT_EQ("someFunction(\n"
8040 " \"aaabbbcc ddde \"\n"
8041 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008042 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008043 getLLVMStyleWithColumns(25)));
8044 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8045 " \"ddeeefff\");",
8046 format("someFunction(\"aaabbbccc ddeeefff\");",
8047 getLLVMStyleWithColumns(25)));
8048 EXPECT_EQ("someFunction1234567890(\n"
8049 " \"aaabb \"\n"
8050 " \"cccdddeeefff\");",
8051 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8052 getLLVMStyleWithColumns(25)));
8053 EXPECT_EQ("#define A \\\n"
8054 " string s = \\\n"
8055 " \"123456789\" \\\n"
8056 " \"0\"; \\\n"
8057 " int i;",
8058 format("#define A string s = \"1234567890\"; int i;",
8059 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008060 EXPECT_EQ("someFunction(\n"
8061 " \"aaabbbcc \"\n"
8062 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008063 format("someFunction(\"aaabbbcc dddeeefff\");",
8064 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008065}
8066
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008067TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008068 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8069 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008070 EXPECT_EQ("\"test\"\n"
8071 "\"\\n\"",
8072 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8073 EXPECT_EQ("\"tes\\\\\"\n"
8074 "\"n\"",
8075 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8076 EXPECT_EQ("\"\\\\\\\\\"\n"
8077 "\"\\n\"",
8078 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008079 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008080 EXPECT_EQ("\"\\uff01\"\n"
8081 "\"test\"",
8082 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8083 EXPECT_EQ("\"\\Uff01ff02\"",
8084 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8085 EXPECT_EQ("\"\\x000000000001\"\n"
8086 "\"next\"",
8087 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8088 EXPECT_EQ("\"\\x000000000001next\"",
8089 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8090 EXPECT_EQ("\"\\x000000000001\"",
8091 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8092 EXPECT_EQ("\"test\"\n"
8093 "\"\\000000\"\n"
8094 "\"000001\"",
8095 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8096 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008097 "\"00000000\"\n"
8098 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008099 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008100}
8101
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008102TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8103 verifyFormat("void f() {\n"
8104 " return g() {}\n"
8105 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008106 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008107 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008108 "}");
8109}
8110
Manuel Klimek421147e2014-01-24 09:25:23 +00008111TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8112 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008113 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008114}
8115
Manuel Klimek13b97d82013-05-13 08:42:42 +00008116TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8117 verifyFormat("class X {\n"
8118 " void f() {\n"
8119 " }\n"
8120 "};",
8121 getLLVMStyleWithColumns(12));
8122}
8123
8124TEST_F(FormatTest, ConfigurableIndentWidth) {
8125 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8126 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008127 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008128 verifyFormat("void f() {\n"
8129 " someFunction();\n"
8130 " if (true) {\n"
8131 " f();\n"
8132 " }\n"
8133 "}",
8134 EightIndent);
8135 verifyFormat("class X {\n"
8136 " void f() {\n"
8137 " }\n"
8138 "};",
8139 EightIndent);
8140 verifyFormat("int x[] = {\n"
8141 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008142 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008143 EightIndent);
8144}
8145
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008146TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008147 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008148 "f();",
8149 getLLVMStyleWithColumns(8));
8150}
8151
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008152TEST_F(FormatTest, ConfigurableUseOfTab) {
8153 FormatStyle Tab = getLLVMStyleWithColumns(42);
8154 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008155 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008156 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008157
8158 EXPECT_EQ("if (aaaaaaaa && // q\n"
8159 " bb)\t\t// w\n"
8160 "\t;",
8161 format("if (aaaaaaaa &&// q\n"
8162 "bb)// w\n"
8163 ";",
8164 Tab));
8165 EXPECT_EQ("if (aaa && bbb) // w\n"
8166 "\t;",
8167 format("if(aaa&&bbb)// w\n"
8168 ";",
8169 Tab));
8170
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008171 verifyFormat("class X {\n"
8172 "\tvoid f() {\n"
8173 "\t\tsomeFunction(parameter1,\n"
8174 "\t\t\t parameter2);\n"
8175 "\t}\n"
8176 "};",
8177 Tab);
8178 verifyFormat("#define A \\\n"
8179 "\tvoid f() { \\\n"
8180 "\t\tsomeFunction( \\\n"
8181 "\t\t parameter1, \\\n"
8182 "\t\t parameter2); \\\n"
8183 "\t}",
8184 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008185
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008186 Tab.TabWidth = 4;
8187 Tab.IndentWidth = 8;
8188 verifyFormat("class TabWidth4Indent8 {\n"
8189 "\t\tvoid f() {\n"
8190 "\t\t\t\tsomeFunction(parameter1,\n"
8191 "\t\t\t\t\t\t\t parameter2);\n"
8192 "\t\t}\n"
8193 "};",
8194 Tab);
8195
8196 Tab.TabWidth = 4;
8197 Tab.IndentWidth = 4;
8198 verifyFormat("class TabWidth4Indent4 {\n"
8199 "\tvoid f() {\n"
8200 "\t\tsomeFunction(parameter1,\n"
8201 "\t\t\t\t\t parameter2);\n"
8202 "\t}\n"
8203 "};",
8204 Tab);
8205
8206 Tab.TabWidth = 8;
8207 Tab.IndentWidth = 4;
8208 verifyFormat("class TabWidth8Indent4 {\n"
8209 " void f() {\n"
8210 "\tsomeFunction(parameter1,\n"
8211 "\t\t parameter2);\n"
8212 " }\n"
8213 "};",
8214 Tab);
8215
Alexander Kornienko39856b72013-09-10 09:38:25 +00008216 Tab.TabWidth = 8;
8217 Tab.IndentWidth = 8;
8218 EXPECT_EQ("/*\n"
8219 "\t a\t\tcomment\n"
8220 "\t in multiple lines\n"
8221 " */",
8222 format(" /*\t \t \n"
8223 " \t \t a\t\tcomment\t \t\n"
8224 " \t \t in multiple lines\t\n"
8225 " \t */",
8226 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008227
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008228 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008229 verifyFormat("{\n"
8230 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8231 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8232 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8233 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8234 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8235 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008236 "};",
8237 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008238 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008239 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008240 "\ta2,\n"
8241 "\ta3\n"
8242 "};",
8243 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008244 EXPECT_EQ("if (aaaaaaaa && // q\n"
8245 " bb) // w\n"
8246 "\t;",
8247 format("if (aaaaaaaa &&// q\n"
8248 "bb)// w\n"
8249 ";",
8250 Tab));
8251 verifyFormat("class X {\n"
8252 "\tvoid f() {\n"
8253 "\t\tsomeFunction(parameter1,\n"
8254 "\t\t parameter2);\n"
8255 "\t}\n"
8256 "};",
8257 Tab);
8258 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008259 "\tQ(\n"
8260 "\t {\n"
8261 "\t\t int a;\n"
8262 "\t\t someFunction(aaaaaaaa,\n"
8263 "\t\t bbbbbbb);\n"
8264 "\t },\n"
8265 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008266 "}",
8267 Tab);
8268 EXPECT_EQ("{\n"
8269 "\t/* aaaa\n"
8270 "\t bbbb */\n"
8271 "}",
8272 format("{\n"
8273 "/* aaaa\n"
8274 " bbbb */\n"
8275 "}",
8276 Tab));
8277 EXPECT_EQ("{\n"
8278 "\t/*\n"
8279 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8280 "\t bbbbbbbbbbbbb\n"
8281 "\t*/\n"
8282 "}",
8283 format("{\n"
8284 "/*\n"
8285 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8286 "*/\n"
8287 "}",
8288 Tab));
8289 EXPECT_EQ("{\n"
8290 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8291 "\t// bbbbbbbbbbbbb\n"
8292 "}",
8293 format("{\n"
8294 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8295 "}",
8296 Tab));
8297 EXPECT_EQ("{\n"
8298 "\t/*\n"
8299 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8300 "\t bbbbbbbbbbbbb\n"
8301 "\t*/\n"
8302 "}",
8303 format("{\n"
8304 "\t/*\n"
8305 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8306 "\t*/\n"
8307 "}",
8308 Tab));
8309 EXPECT_EQ("{\n"
8310 "\t/*\n"
8311 "\n"
8312 "\t*/\n"
8313 "}",
8314 format("{\n"
8315 "\t/*\n"
8316 "\n"
8317 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008318 "}",
8319 Tab));
8320 EXPECT_EQ("{\n"
8321 "\t/*\n"
8322 " asdf\n"
8323 "\t*/\n"
8324 "}",
8325 format("{\n"
8326 "\t/*\n"
8327 " asdf\n"
8328 "\t*/\n"
8329 "}",
8330 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008331
8332 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008333 EXPECT_EQ("/*\n"
8334 " a\t\tcomment\n"
8335 " in multiple lines\n"
8336 " */",
8337 format(" /*\t \t \n"
8338 " \t \t a\t\tcomment\t \t\n"
8339 " \t \t in multiple lines\t\n"
8340 " \t */",
8341 Tab));
8342 EXPECT_EQ("/* some\n"
8343 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008344 format(" \t \t /* some\n"
8345 " \t \t comment */",
8346 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008347 EXPECT_EQ("int a; /* some\n"
8348 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008349 format(" \t \t int a; /* some\n"
8350 " \t \t comment */",
8351 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008352
Alexander Kornienko39856b72013-09-10 09:38:25 +00008353 EXPECT_EQ("int a; /* some\n"
8354 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008355 format(" \t \t int\ta; /* some\n"
8356 " \t \t comment */",
8357 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008358 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8359 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008360 format(" \t \t f(\"\t\t\"); /* some\n"
8361 " \t \t comment */",
8362 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008363 EXPECT_EQ("{\n"
8364 " /*\n"
8365 " * Comment\n"
8366 " */\n"
8367 " int i;\n"
8368 "}",
8369 format("{\n"
8370 "\t/*\n"
8371 "\t * Comment\n"
8372 "\t */\n"
8373 "\t int i;\n"
8374 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008375
8376 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8377 Tab.TabWidth = 8;
8378 Tab.IndentWidth = 8;
8379 EXPECT_EQ("if (aaaaaaaa && // q\n"
8380 " bb) // w\n"
8381 "\t;",
8382 format("if (aaaaaaaa &&// q\n"
8383 "bb)// w\n"
8384 ";",
8385 Tab));
8386 EXPECT_EQ("if (aaa && bbb) // w\n"
8387 "\t;",
8388 format("if(aaa&&bbb)// w\n"
8389 ";",
8390 Tab));
8391 verifyFormat("class X {\n"
8392 "\tvoid f() {\n"
8393 "\t\tsomeFunction(parameter1,\n"
8394 "\t\t\t parameter2);\n"
8395 "\t}\n"
8396 "};",
8397 Tab);
8398 verifyFormat("#define A \\\n"
8399 "\tvoid f() { \\\n"
8400 "\t\tsomeFunction( \\\n"
8401 "\t\t parameter1, \\\n"
8402 "\t\t parameter2); \\\n"
8403 "\t}",
8404 Tab);
8405 Tab.TabWidth = 4;
8406 Tab.IndentWidth = 8;
8407 verifyFormat("class TabWidth4Indent8 {\n"
8408 "\t\tvoid f() {\n"
8409 "\t\t\t\tsomeFunction(parameter1,\n"
8410 "\t\t\t\t\t\t\t parameter2);\n"
8411 "\t\t}\n"
8412 "};",
8413 Tab);
8414 Tab.TabWidth = 4;
8415 Tab.IndentWidth = 4;
8416 verifyFormat("class TabWidth4Indent4 {\n"
8417 "\tvoid f() {\n"
8418 "\t\tsomeFunction(parameter1,\n"
8419 "\t\t\t\t\t parameter2);\n"
8420 "\t}\n"
8421 "};",
8422 Tab);
8423 Tab.TabWidth = 8;
8424 Tab.IndentWidth = 4;
8425 verifyFormat("class TabWidth8Indent4 {\n"
8426 " void f() {\n"
8427 "\tsomeFunction(parameter1,\n"
8428 "\t\t parameter2);\n"
8429 " }\n"
8430 "};",
8431 Tab);
8432 Tab.TabWidth = 8;
8433 Tab.IndentWidth = 8;
8434 EXPECT_EQ("/*\n"
8435 "\t a\t\tcomment\n"
8436 "\t in multiple lines\n"
8437 " */",
8438 format(" /*\t \t \n"
8439 " \t \t a\t\tcomment\t \t\n"
8440 " \t \t in multiple lines\t\n"
8441 " \t */",
8442 Tab));
8443 verifyFormat("{\n"
8444 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8445 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8446 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8447 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8448 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8449 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8450 "};",
8451 Tab);
8452 verifyFormat("enum AA {\n"
8453 "\ta1, // Force multiple lines\n"
8454 "\ta2,\n"
8455 "\ta3\n"
8456 "};",
8457 Tab);
8458 EXPECT_EQ("if (aaaaaaaa && // q\n"
8459 " bb) // w\n"
8460 "\t;",
8461 format("if (aaaaaaaa &&// q\n"
8462 "bb)// w\n"
8463 ";",
8464 Tab));
8465 verifyFormat("class X {\n"
8466 "\tvoid f() {\n"
8467 "\t\tsomeFunction(parameter1,\n"
8468 "\t\t\t parameter2);\n"
8469 "\t}\n"
8470 "};",
8471 Tab);
8472 verifyFormat("{\n"
8473 "\tQ(\n"
8474 "\t {\n"
8475 "\t\t int a;\n"
8476 "\t\t someFunction(aaaaaaaa,\n"
8477 "\t\t\t\t bbbbbbb);\n"
8478 "\t },\n"
8479 "\t p);\n"
8480 "}",
8481 Tab);
8482 EXPECT_EQ("{\n"
8483 "\t/* aaaa\n"
8484 "\t bbbb */\n"
8485 "}",
8486 format("{\n"
8487 "/* aaaa\n"
8488 " bbbb */\n"
8489 "}",
8490 Tab));
8491 EXPECT_EQ("{\n"
8492 "\t/*\n"
8493 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8494 "\t bbbbbbbbbbbbb\n"
8495 "\t*/\n"
8496 "}",
8497 format("{\n"
8498 "/*\n"
8499 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8500 "*/\n"
8501 "}",
8502 Tab));
8503 EXPECT_EQ("{\n"
8504 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8505 "\t// bbbbbbbbbbbbb\n"
8506 "}",
8507 format("{\n"
8508 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8509 "}",
8510 Tab));
8511 EXPECT_EQ("{\n"
8512 "\t/*\n"
8513 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8514 "\t bbbbbbbbbbbbb\n"
8515 "\t*/\n"
8516 "}",
8517 format("{\n"
8518 "\t/*\n"
8519 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8520 "\t*/\n"
8521 "}",
8522 Tab));
8523 EXPECT_EQ("{\n"
8524 "\t/*\n"
8525 "\n"
8526 "\t*/\n"
8527 "}",
8528 format("{\n"
8529 "\t/*\n"
8530 "\n"
8531 "\t*/\n"
8532 "}",
8533 Tab));
8534 EXPECT_EQ("{\n"
8535 "\t/*\n"
8536 " asdf\n"
8537 "\t*/\n"
8538 "}",
8539 format("{\n"
8540 "\t/*\n"
8541 " asdf\n"
8542 "\t*/\n"
8543 "}",
8544 Tab));
8545 EXPECT_EQ("/*\n"
8546 "\t a\t\tcomment\n"
8547 "\t in multiple lines\n"
8548 " */",
8549 format(" /*\t \t \n"
8550 " \t \t a\t\tcomment\t \t\n"
8551 " \t \t in multiple lines\t\n"
8552 " \t */",
8553 Tab));
8554 EXPECT_EQ("/* some\n"
8555 " comment */",
8556 format(" \t \t /* some\n"
8557 " \t \t comment */",
8558 Tab));
8559 EXPECT_EQ("int a; /* some\n"
8560 " comment */",
8561 format(" \t \t int a; /* some\n"
8562 " \t \t comment */",
8563 Tab));
8564 EXPECT_EQ("int a; /* some\n"
8565 "comment */",
8566 format(" \t \t int\ta; /* some\n"
8567 " \t \t comment */",
8568 Tab));
8569 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8570 " comment */",
8571 format(" \t \t f(\"\t\t\"); /* some\n"
8572 " \t \t comment */",
8573 Tab));
8574 EXPECT_EQ("{\n"
8575 " /*\n"
8576 " * Comment\n"
8577 " */\n"
8578 " int i;\n"
8579 "}",
8580 format("{\n"
8581 "\t/*\n"
8582 "\t * Comment\n"
8583 "\t */\n"
8584 "\t int i;\n"
8585 "}"));
8586 Tab.AlignConsecutiveAssignments = true;
8587 Tab.AlignConsecutiveDeclarations = true;
8588 Tab.TabWidth = 4;
8589 Tab.IndentWidth = 4;
8590 verifyFormat("class Assign {\n"
8591 "\tvoid f() {\n"
8592 "\t\tint x = 123;\n"
8593 "\t\tint random = 4;\n"
8594 "\t\tstd::string alphabet =\n"
8595 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8596 "\t}\n"
8597 "};",
8598 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008599}
8600
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008601TEST_F(FormatTest, CalculatesOriginalColumn) {
8602 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8603 "q\"; /* some\n"
8604 " comment */",
8605 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8606 "q\"; /* some\n"
8607 " comment */",
8608 getLLVMStyle()));
8609 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8610 "/* some\n"
8611 " comment */",
8612 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8613 " /* some\n"
8614 " comment */",
8615 getLLVMStyle()));
8616 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8617 "qqq\n"
8618 "/* some\n"
8619 " comment */",
8620 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8621 "qqq\n"
8622 " /* some\n"
8623 " comment */",
8624 getLLVMStyle()));
8625 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8626 "wwww; /* some\n"
8627 " comment */",
8628 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8629 "wwww; /* some\n"
8630 " comment */",
8631 getLLVMStyle()));
8632}
8633
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008634TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008635 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008636 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008637
8638 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008639 " continue;",
8640 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008641 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008642 " continue;",
8643 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008644 verifyFormat("if(true)\n"
8645 " f();\n"
8646 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008647 " f();",
8648 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008649 verifyFormat("do {\n"
8650 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008651 "} while(something());",
8652 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008653 verifyFormat("switch(x) {\n"
8654 "default:\n"
8655 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008656 "}",
8657 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008658 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008659 verifyFormat("size_t x = sizeof(x);", NoSpace);
8660 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8661 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8662 verifyFormat("alignas(128) char a[128];", NoSpace);
8663 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8664 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8665 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008666 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008667 verifyFormat("T A::operator()();", NoSpace);
8668 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008669
8670 FormatStyle Space = getLLVMStyle();
8671 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8672
8673 verifyFormat("int f ();", Space);
8674 verifyFormat("void f (int a, T b) {\n"
8675 " while (true)\n"
8676 " continue;\n"
8677 "}",
8678 Space);
8679 verifyFormat("if (true)\n"
8680 " f ();\n"
8681 "else if (true)\n"
8682 " f ();",
8683 Space);
8684 verifyFormat("do {\n"
8685 " do_something ();\n"
8686 "} while (something ());",
8687 Space);
8688 verifyFormat("switch (x) {\n"
8689 "default:\n"
8690 " break;\n"
8691 "}",
8692 Space);
8693 verifyFormat("A::A () : a (1) {}", Space);
8694 verifyFormat("void f () __attribute__ ((asdf));", Space);
8695 verifyFormat("*(&a + 1);\n"
8696 "&((&a)[1]);\n"
8697 "a[(b + c) * d];\n"
8698 "(((a + 1) * 2) + 3) * 4;",
8699 Space);
8700 verifyFormat("#define A(x) x", Space);
8701 verifyFormat("#define A (x) x", Space);
8702 verifyFormat("#if defined(x)\n"
8703 "#endif",
8704 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008705 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008706 verifyFormat("size_t x = sizeof (x);", Space);
8707 verifyFormat("auto f (int x) -> decltype (x);", Space);
8708 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8709 verifyFormat("alignas (128) char a[128];", Space);
8710 verifyFormat("size_t x = alignof (MyType);", Space);
8711 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8712 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008713 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008714 verifyFormat("T A::operator() ();", Space);
8715 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008716}
8717
8718TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8719 FormatStyle Spaces = getLLVMStyle();
8720
8721 Spaces.SpacesInParentheses = true;
8722 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008723 verifyFormat("call();", Spaces);
8724 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008725 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8726 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008727 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008728 " continue;",
8729 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008730 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008731 " continue;",
8732 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008733 verifyFormat("if ( true )\n"
8734 " f();\n"
8735 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008736 " f();",
8737 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008738 verifyFormat("do {\n"
8739 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008740 "} while ( something() );",
8741 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008742 verifyFormat("switch ( x ) {\n"
8743 "default:\n"
8744 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008745 "}",
8746 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008747
8748 Spaces.SpacesInParentheses = false;
8749 Spaces.SpacesInCStyleCastParentheses = true;
8750 verifyFormat("Type *A = ( Type * )P;", Spaces);
8751 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8752 verifyFormat("x = ( int32 )y;", Spaces);
8753 verifyFormat("int a = ( int )(2.0f);", Spaces);
8754 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8755 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8756 verifyFormat("#define x (( int )-1)", Spaces);
8757
Daniel Jasper92e09822015-03-18 12:59:19 +00008758 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008759 Spaces.SpacesInParentheses = false;
8760 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008761 Spaces.SpacesInCStyleCastParentheses = true;
8762 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008763 verifyFormat("call( );", Spaces);
8764 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008765 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008766 " continue;",
8767 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008768 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008769 " continue;",
8770 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008771 verifyFormat("if (true)\n"
8772 " f( );\n"
8773 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008774 " f( );",
8775 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008776 verifyFormat("do {\n"
8777 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008778 "} while (something( ));",
8779 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008780 verifyFormat("switch (x) {\n"
8781 "default:\n"
8782 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008783 "}",
8784 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008785
Daniel Jasper92e09822015-03-18 12:59:19 +00008786 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008787 Spaces.SpaceAfterCStyleCast = true;
8788 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008789 verifyFormat("call( );", Spaces);
8790 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008791 verifyFormat("while (( bool ) 1)\n"
8792 " continue;",
8793 Spaces);
8794 verifyFormat("for (;;)\n"
8795 " continue;",
8796 Spaces);
8797 verifyFormat("if (true)\n"
8798 " f( );\n"
8799 "else if (true)\n"
8800 " f( );",
8801 Spaces);
8802 verifyFormat("do {\n"
8803 " do_something(( int ) i);\n"
8804 "} while (something( ));",
8805 Spaces);
8806 verifyFormat("switch (x) {\n"
8807 "default:\n"
8808 " break;\n"
8809 "}",
8810 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008811
8812 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008813 Spaces.SpacesInCStyleCastParentheses = false;
8814 Spaces.SpaceAfterCStyleCast = true;
8815 verifyFormat("while ((bool) 1)\n"
8816 " continue;",
8817 Spaces);
8818 verifyFormat("do {\n"
8819 " do_something((int) i);\n"
8820 "} while (something( ));",
8821 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008822}
8823
Daniel Jasperad981f82014-08-26 11:41:14 +00008824TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8825 verifyFormat("int a[5];");
8826 verifyFormat("a[3] += 42;");
8827
8828 FormatStyle Spaces = getLLVMStyle();
8829 Spaces.SpacesInSquareBrackets = true;
8830 // Lambdas unchanged.
8831 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8832 verifyFormat("return [i, args...] {};", Spaces);
8833
8834 // Not lambdas.
8835 verifyFormat("int a[ 5 ];", Spaces);
8836 verifyFormat("a[ 3 ] += 42;", Spaces);
8837 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8838 verifyFormat("double &operator[](int i) { return 0; }\n"
8839 "int i;",
8840 Spaces);
8841 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8842 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8843 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8844}
8845
Daniel Jasperd94bff32013-09-25 15:15:02 +00008846TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8847 verifyFormat("int a = 5;");
8848 verifyFormat("a += 42;");
8849 verifyFormat("a or_eq 8;");
8850
8851 FormatStyle Spaces = getLLVMStyle();
8852 Spaces.SpaceBeforeAssignmentOperators = false;
8853 verifyFormat("int a= 5;", Spaces);
8854 verifyFormat("a+= 42;", Spaces);
8855 verifyFormat("a or_eq 8;", Spaces);
8856}
8857
Daniel Jaspera44991332015-04-29 13:06:49 +00008858TEST_F(FormatTest, AlignConsecutiveAssignments) {
8859 FormatStyle Alignment = getLLVMStyle();
8860 Alignment.AlignConsecutiveAssignments = false;
8861 verifyFormat("int a = 5;\n"
8862 "int oneTwoThree = 123;",
8863 Alignment);
8864 verifyFormat("int a = 5;\n"
8865 "int oneTwoThree = 123;",
8866 Alignment);
8867
8868 Alignment.AlignConsecutiveAssignments = true;
8869 verifyFormat("int a = 5;\n"
8870 "int oneTwoThree = 123;",
8871 Alignment);
8872 verifyFormat("int a = method();\n"
8873 "int oneTwoThree = 133;",
8874 Alignment);
8875 verifyFormat("a &= 5;\n"
8876 "bcd *= 5;\n"
8877 "ghtyf += 5;\n"
8878 "dvfvdb -= 5;\n"
8879 "a /= 5;\n"
8880 "vdsvsv %= 5;\n"
8881 "sfdbddfbdfbb ^= 5;\n"
8882 "dvsdsv |= 5;\n"
8883 "int dsvvdvsdvvv = 123;",
8884 Alignment);
8885 verifyFormat("int i = 1, j = 10;\n"
8886 "something = 2000;",
8887 Alignment);
8888 verifyFormat("something = 2000;\n"
8889 "int i = 1, j = 10;\n",
8890 Alignment);
8891 verifyFormat("something = 2000;\n"
8892 "another = 911;\n"
8893 "int i = 1, j = 10;\n"
8894 "oneMore = 1;\n"
8895 "i = 2;",
8896 Alignment);
8897 verifyFormat("int a = 5;\n"
8898 "int one = 1;\n"
8899 "method();\n"
8900 "int oneTwoThree = 123;\n"
8901 "int oneTwo = 12;",
8902 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008903 verifyFormat("int oneTwoThree = 123;\n"
8904 "int oneTwo = 12;\n"
8905 "method();\n",
8906 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008907 verifyFormat("int oneTwoThree = 123; // comment\n"
8908 "int oneTwo = 12; // comment",
8909 Alignment);
8910 EXPECT_EQ("int a = 5;\n"
8911 "\n"
8912 "int oneTwoThree = 123;",
8913 format("int a = 5;\n"
8914 "\n"
8915 "int oneTwoThree= 123;",
8916 Alignment));
8917 EXPECT_EQ("int a = 5;\n"
8918 "int one = 1;\n"
8919 "\n"
8920 "int oneTwoThree = 123;",
8921 format("int a = 5;\n"
8922 "int one = 1;\n"
8923 "\n"
8924 "int oneTwoThree = 123;",
8925 Alignment));
8926 EXPECT_EQ("int a = 5;\n"
8927 "int one = 1;\n"
8928 "\n"
8929 "int oneTwoThree = 123;\n"
8930 "int oneTwo = 12;",
8931 format("int a = 5;\n"
8932 "int one = 1;\n"
8933 "\n"
8934 "int oneTwoThree = 123;\n"
8935 "int oneTwo = 12;",
8936 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008937 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8938 verifyFormat("#define A \\\n"
8939 " int aaaa = 12; \\\n"
8940 " int b = 23; \\\n"
8941 " int ccc = 234; \\\n"
8942 " int dddddddddd = 2345;",
8943 Alignment);
8944 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008945 verifyFormat("#define A \\\n"
8946 " int aaaa = 12; \\\n"
8947 " int b = 23; \\\n"
8948 " int ccc = 234; \\\n"
8949 " int dddddddddd = 2345;",
8950 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008951 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00008952 verifyFormat("#define A "
8953 " \\\n"
8954 " int aaaa = 12; "
8955 " \\\n"
8956 " int b = 23; "
8957 " \\\n"
8958 " int ccc = 234; "
8959 " \\\n"
8960 " int dddddddddd = 2345;",
8961 Alignment);
8962 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8963 "k = 4, int l = 5,\n"
8964 " int m = 6) {\n"
8965 " int j = 10;\n"
8966 " otherThing = 1;\n"
8967 "}",
8968 Alignment);
8969 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8970 " int i = 1;\n"
8971 " int j = 2;\n"
8972 " int big = 10000;\n"
8973 "}",
8974 Alignment);
8975 verifyFormat("class C {\n"
8976 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008977 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008978 " virtual void f() = 0;\n"
8979 "};",
8980 Alignment);
8981 verifyFormat("int i = 1;\n"
8982 "if (SomeType t = getSomething()) {\n"
8983 "}\n"
8984 "int j = 2;\n"
8985 "int big = 10000;",
8986 Alignment);
8987 verifyFormat("int j = 7;\n"
8988 "for (int k = 0; k < N; ++k) {\n"
8989 "}\n"
8990 "int j = 2;\n"
8991 "int big = 10000;\n"
8992 "}",
8993 Alignment);
8994 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8995 verifyFormat("int i = 1;\n"
8996 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8997 " = someLooooooooooooooooongFunction();\n"
8998 "int j = 2;",
8999 Alignment);
9000 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9001 verifyFormat("int i = 1;\n"
9002 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9003 " someLooooooooooooooooongFunction();\n"
9004 "int j = 2;",
9005 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009006
9007 verifyFormat("auto lambda = []() {\n"
9008 " auto i = 0;\n"
9009 " return 0;\n"
9010 "};\n"
9011 "int i = 0;\n"
9012 "auto v = type{\n"
9013 " i = 1, //\n"
9014 " (i = 2), //\n"
9015 " i = 3 //\n"
9016 "};",
9017 Alignment);
9018
Daniel Jaspera44991332015-04-29 13:06:49 +00009019 verifyFormat(
9020 "int i = 1;\n"
9021 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9022 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009023 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009024 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009025
9026 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9027 " typename B = very_long_type_name_1,\n"
9028 " typename T_2 = very_long_type_name_2>\n"
9029 "auto foo() {}\n",
9030 Alignment);
9031 verifyFormat("int a, b = 1;\n"
9032 "int c = 2;\n"
9033 "int dd = 3;\n",
9034 Alignment);
9035 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9036 "float b[1][] = {{3.f}};\n",
9037 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009038 verifyFormat("for (int i = 0; i < 1; i++)\n"
9039 " int x = 1;\n",
9040 Alignment);
9041 verifyFormat("for (i = 0; i < 1; i++)\n"
9042 " x = 1;\n"
9043 "y = 1;\n",
9044 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009045}
9046
Daniel Jaspere12597c2015-10-01 10:06:54 +00009047TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9048 FormatStyle Alignment = getLLVMStyle();
9049 Alignment.AlignConsecutiveDeclarations = false;
9050 verifyFormat("float const a = 5;\n"
9051 "int oneTwoThree = 123;",
9052 Alignment);
9053 verifyFormat("int a = 5;\n"
9054 "float const oneTwoThree = 123;",
9055 Alignment);
9056
9057 Alignment.AlignConsecutiveDeclarations = true;
9058 verifyFormat("float const a = 5;\n"
9059 "int oneTwoThree = 123;",
9060 Alignment);
9061 verifyFormat("int a = method();\n"
9062 "float const oneTwoThree = 133;",
9063 Alignment);
9064 verifyFormat("int i = 1, j = 10;\n"
9065 "something = 2000;",
9066 Alignment);
9067 verifyFormat("something = 2000;\n"
9068 "int i = 1, j = 10;\n",
9069 Alignment);
9070 verifyFormat("float something = 2000;\n"
9071 "double another = 911;\n"
9072 "int i = 1, j = 10;\n"
9073 "const int *oneMore = 1;\n"
9074 "unsigned i = 2;",
9075 Alignment);
9076 verifyFormat("float a = 5;\n"
9077 "int one = 1;\n"
9078 "method();\n"
9079 "const double oneTwoThree = 123;\n"
9080 "const unsigned int oneTwo = 12;",
9081 Alignment);
9082 verifyFormat("int oneTwoThree{0}; // comment\n"
9083 "unsigned oneTwo; // comment",
9084 Alignment);
9085 EXPECT_EQ("float const a = 5;\n"
9086 "\n"
9087 "int oneTwoThree = 123;",
9088 format("float const a = 5;\n"
9089 "\n"
9090 "int oneTwoThree= 123;",
9091 Alignment));
9092 EXPECT_EQ("float a = 5;\n"
9093 "int one = 1;\n"
9094 "\n"
9095 "unsigned oneTwoThree = 123;",
9096 format("float a = 5;\n"
9097 "int one = 1;\n"
9098 "\n"
9099 "unsigned oneTwoThree = 123;",
9100 Alignment));
9101 EXPECT_EQ("float a = 5;\n"
9102 "int one = 1;\n"
9103 "\n"
9104 "unsigned oneTwoThree = 123;\n"
9105 "int oneTwo = 12;",
9106 format("float a = 5;\n"
9107 "int one = 1;\n"
9108 "\n"
9109 "unsigned oneTwoThree = 123;\n"
9110 "int oneTwo = 12;",
9111 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009112 // Function prototype alignment
9113 verifyFormat("int a();\n"
9114 "double b();",
9115 Alignment);
9116 verifyFormat("int a(int x);\n"
9117 "double b();",
9118 Alignment);
9119 unsigned OldColumnLimit = Alignment.ColumnLimit;
9120 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9121 // otherwise the function parameters will be re-flowed onto a single line.
9122 Alignment.ColumnLimit = 0;
9123 EXPECT_EQ("int a(int x,\n"
9124 " float y);\n"
9125 "double b(int x,\n"
9126 " double y);",
9127 format("int a(int x,\n"
9128 " float y);\n"
9129 "double b(int x,\n"
9130 " double y);",
9131 Alignment));
9132 // This ensures that function parameters of function declarations are
9133 // correctly indented when their owning functions are indented.
9134 // The failure case here is for 'double y' to not be indented enough.
9135 EXPECT_EQ("double a(int x);\n"
9136 "int b(int y,\n"
9137 " double z);",
9138 format("double a(int x);\n"
9139 "int b(int y,\n"
9140 " double z);",
9141 Alignment));
9142 // Set ColumnLimit low so that we induce wrapping immediately after
9143 // the function name and opening paren.
9144 Alignment.ColumnLimit = 13;
9145 verifyFormat("int function(\n"
9146 " int x,\n"
9147 " bool y);",
9148 Alignment);
9149 Alignment.ColumnLimit = OldColumnLimit;
9150 // Ensure function pointers don't screw up recursive alignment
9151 verifyFormat("int a(int x, void (*fp)(int y));\n"
9152 "double b();",
9153 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009154 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009155 // Ensure recursive alignment is broken by function braces, so that the
9156 // "a = 1" does not align with subsequent assignments inside the function
9157 // body.
9158 verifyFormat("int func(int a = 1) {\n"
9159 " int b = 2;\n"
9160 " int cc = 3;\n"
9161 "}",
9162 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009163 verifyFormat("float something = 2000;\n"
9164 "double another = 911;\n"
9165 "int i = 1, j = 10;\n"
9166 "const int *oneMore = 1;\n"
9167 "unsigned i = 2;",
9168 Alignment);
9169 verifyFormat("int oneTwoThree = {0}; // comment\n"
9170 "unsigned oneTwo = 0; // comment",
9171 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009172 // Make sure that scope is correctly tracked, in the absence of braces
9173 verifyFormat("for (int i = 0; i < n; i++)\n"
9174 " j = i;\n"
9175 "double x = 1;\n",
9176 Alignment);
9177 verifyFormat("if (int i = 0)\n"
9178 " j = i;\n"
9179 "double x = 1;\n",
9180 Alignment);
9181 // Ensure operator[] and operator() are comprehended
9182 verifyFormat("struct test {\n"
9183 " long long int foo();\n"
9184 " int operator[](int a);\n"
9185 " double bar();\n"
9186 "};\n",
9187 Alignment);
9188 verifyFormat("struct test {\n"
9189 " long long int foo();\n"
9190 " int operator()(int a);\n"
9191 " double bar();\n"
9192 "};\n",
9193 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009194 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9195 " int const i = 1;\n"
9196 " int * j = 2;\n"
9197 " int big = 10000;\n"
9198 "\n"
9199 " unsigned oneTwoThree = 123;\n"
9200 " int oneTwo = 12;\n"
9201 " method();\n"
9202 " float k = 2;\n"
9203 " int ll = 10000;\n"
9204 "}",
9205 format("void SomeFunction(int parameter= 0) {\n"
9206 " int const i= 1;\n"
9207 " int *j=2;\n"
9208 " int big = 10000;\n"
9209 "\n"
9210 "unsigned oneTwoThree =123;\n"
9211 "int oneTwo = 12;\n"
9212 " method();\n"
9213 "float k= 2;\n"
9214 "int ll=10000;\n"
9215 "}",
9216 Alignment));
9217 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009218 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9219 verifyFormat("#define A \\\n"
9220 " int aaaa = 12; \\\n"
9221 " float b = 23; \\\n"
9222 " const int ccc = 234; \\\n"
9223 " unsigned dddddddddd = 2345;",
9224 Alignment);
9225 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009226 verifyFormat("#define A \\\n"
9227 " int aaaa = 12; \\\n"
9228 " float b = 23; \\\n"
9229 " const int ccc = 234; \\\n"
9230 " unsigned dddddddddd = 2345;",
9231 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009232 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009233 Alignment.ColumnLimit = 30;
9234 verifyFormat("#define A \\\n"
9235 " int aaaa = 12; \\\n"
9236 " float b = 23; \\\n"
9237 " const int ccc = 234; \\\n"
9238 " int dddddddddd = 2345;",
9239 Alignment);
9240 Alignment.ColumnLimit = 80;
9241 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9242 "k = 4, int l = 5,\n"
9243 " int m = 6) {\n"
9244 " const int j = 10;\n"
9245 " otherThing = 1;\n"
9246 "}",
9247 Alignment);
9248 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9249 " int const i = 1;\n"
9250 " int * j = 2;\n"
9251 " int big = 10000;\n"
9252 "}",
9253 Alignment);
9254 verifyFormat("class C {\n"
9255 "public:\n"
9256 " int i = 1;\n"
9257 " virtual void f() = 0;\n"
9258 "};",
9259 Alignment);
9260 verifyFormat("float i = 1;\n"
9261 "if (SomeType t = getSomething()) {\n"
9262 "}\n"
9263 "const unsigned j = 2;\n"
9264 "int big = 10000;",
9265 Alignment);
9266 verifyFormat("float j = 7;\n"
9267 "for (int k = 0; k < N; ++k) {\n"
9268 "}\n"
9269 "unsigned j = 2;\n"
9270 "int big = 10000;\n"
9271 "}",
9272 Alignment);
9273 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9274 verifyFormat("float i = 1;\n"
9275 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9276 " = someLooooooooooooooooongFunction();\n"
9277 "int j = 2;",
9278 Alignment);
9279 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9280 verifyFormat("int i = 1;\n"
9281 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9282 " someLooooooooooooooooongFunction();\n"
9283 "int j = 2;",
9284 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009285
9286 Alignment.AlignConsecutiveAssignments = true;
9287 verifyFormat("auto lambda = []() {\n"
9288 " auto ii = 0;\n"
9289 " float j = 0;\n"
9290 " return 0;\n"
9291 "};\n"
9292 "int i = 0;\n"
9293 "float i2 = 0;\n"
9294 "auto v = type{\n"
9295 " i = 1, //\n"
9296 " (i = 2), //\n"
9297 " i = 3 //\n"
9298 "};",
9299 Alignment);
9300 Alignment.AlignConsecutiveAssignments = false;
9301
Daniel Jaspere12597c2015-10-01 10:06:54 +00009302 verifyFormat(
9303 "int i = 1;\n"
9304 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9305 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009306 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009307 Alignment);
9308
9309 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9310 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009311 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009312 // happens.
9313 Alignment.AlignConsecutiveAssignments = true;
9314 Alignment.ColumnLimit = 30;
9315 verifyFormat("float ii = 1;\n"
9316 "unsigned j = 2;\n"
9317 "int someVerylongVariable = 1;\n"
9318 "AnotherLongType ll = 123456;\n"
9319 "VeryVeryLongType k = 2;\n"
9320 "int myvar = 1;",
9321 Alignment);
9322 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009323 Alignment.AlignConsecutiveAssignments = false;
9324
9325 verifyFormat(
9326 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9327 " typename LongType, typename B>\n"
9328 "auto foo() {}\n",
9329 Alignment);
9330 verifyFormat("float a, b = 1;\n"
9331 "int c = 2;\n"
9332 "int dd = 3;\n",
9333 Alignment);
9334 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9335 "float b[1][] = {{3.f}};\n",
9336 Alignment);
9337 Alignment.AlignConsecutiveAssignments = true;
9338 verifyFormat("float a, b = 1;\n"
9339 "int c = 2;\n"
9340 "int dd = 3;\n",
9341 Alignment);
9342 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9343 "float b[1][] = {{3.f}};\n",
9344 Alignment);
9345 Alignment.AlignConsecutiveAssignments = false;
9346
9347 Alignment.ColumnLimit = 30;
9348 Alignment.BinPackParameters = false;
9349 verifyFormat("void foo(float a,\n"
9350 " float b,\n"
9351 " int c,\n"
9352 " uint32_t *d) {\n"
9353 " int * e = 0;\n"
9354 " float f = 0;\n"
9355 " double g = 0;\n"
9356 "}\n"
9357 "void bar(ino_t a,\n"
9358 " int b,\n"
9359 " uint32_t *c,\n"
9360 " bool d) {}\n",
9361 Alignment);
9362 Alignment.BinPackParameters = true;
9363 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009364
9365 // Bug 33507
9366 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9367 verifyFormat(
9368 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9369 " static const Version verVs2017;\n"
9370 " return true;\n"
9371 "});\n",
9372 Alignment);
9373 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009374}
9375
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009376TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009377 FormatStyle LinuxBraceStyle = getLLVMStyle();
9378 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009379 verifyFormat("namespace a\n"
9380 "{\n"
9381 "class A\n"
9382 "{\n"
9383 " void f()\n"
9384 " {\n"
9385 " if (true) {\n"
9386 " a();\n"
9387 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009388 " } else {\n"
9389 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009390 " }\n"
9391 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009392 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009393 "};\n"
9394 "struct B {\n"
9395 " int x;\n"
9396 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009397 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009398 LinuxBraceStyle);
9399 verifyFormat("enum X {\n"
9400 " Y = 0,\n"
9401 "}\n",
9402 LinuxBraceStyle);
9403 verifyFormat("struct S {\n"
9404 " int Type;\n"
9405 " union {\n"
9406 " int x;\n"
9407 " double y;\n"
9408 " } Value;\n"
9409 " class C\n"
9410 " {\n"
9411 " MyFavoriteType Value;\n"
9412 " } Class;\n"
9413 "}\n",
9414 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009415}
9416
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009417TEST_F(FormatTest, MozillaBraceBreaking) {
9418 FormatStyle MozillaBraceStyle = getLLVMStyle();
9419 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009420 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009421 verifyFormat("namespace a {\n"
9422 "class A\n"
9423 "{\n"
9424 " void f()\n"
9425 " {\n"
9426 " if (true) {\n"
9427 " a();\n"
9428 " b();\n"
9429 " }\n"
9430 " }\n"
9431 " void g() { return; }\n"
9432 "};\n"
9433 "enum E\n"
9434 "{\n"
9435 " A,\n"
9436 " // foo\n"
9437 " B,\n"
9438 " C\n"
9439 "};\n"
9440 "struct B\n"
9441 "{\n"
9442 " int x;\n"
9443 "};\n"
9444 "}\n",
9445 MozillaBraceStyle);
9446 verifyFormat("struct S\n"
9447 "{\n"
9448 " int Type;\n"
9449 " union\n"
9450 " {\n"
9451 " int x;\n"
9452 " double y;\n"
9453 " } Value;\n"
9454 " class C\n"
9455 " {\n"
9456 " MyFavoriteType Value;\n"
9457 " } Class;\n"
9458 "}\n",
9459 MozillaBraceStyle);
9460}
9461
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009462TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009463 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9464 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009465 verifyFormat("namespace a {\n"
9466 "class A {\n"
9467 " void f()\n"
9468 " {\n"
9469 " if (true) {\n"
9470 " a();\n"
9471 " b();\n"
9472 " }\n"
9473 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009474 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009475 "};\n"
9476 "struct B {\n"
9477 " int x;\n"
9478 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009479 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009480 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009481
Daniel Jasperd9670872014-08-05 12:06:20 +00009482 verifyFormat("void foo()\n"
9483 "{\n"
9484 " if (a) {\n"
9485 " a();\n"
9486 " }\n"
9487 " else {\n"
9488 " b();\n"
9489 " }\n"
9490 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009491 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009492
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009493 verifyFormat("#ifdef _DEBUG\n"
9494 "int foo(int i = 0)\n"
9495 "#else\n"
9496 "int foo(int i = 5)\n"
9497 "#endif\n"
9498 "{\n"
9499 " return i;\n"
9500 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009501 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009502
9503 verifyFormat("void foo() {}\n"
9504 "void bar()\n"
9505 "#ifdef _DEBUG\n"
9506 "{\n"
9507 " foo();\n"
9508 "}\n"
9509 "#else\n"
9510 "{\n"
9511 "}\n"
9512 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009513 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009514
9515 verifyFormat("void foobar() { int i = 5; }\n"
9516 "#ifdef _DEBUG\n"
9517 "void bar() {}\n"
9518 "#else\n"
9519 "void bar() { foobar(); }\n"
9520 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009521 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009522}
9523
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009524TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009525 FormatStyle AllmanBraceStyle = getLLVMStyle();
9526 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009527
9528 EXPECT_EQ("namespace a\n"
9529 "{\n"
9530 "void f();\n"
9531 "void g();\n"
9532 "} // namespace a\n",
9533 format("namespace a\n"
9534 "{\n"
9535 "void f();\n"
9536 "void g();\n"
9537 "}\n",
9538 AllmanBraceStyle));
9539
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009540 verifyFormat("namespace a\n"
9541 "{\n"
9542 "class A\n"
9543 "{\n"
9544 " void f()\n"
9545 " {\n"
9546 " if (true)\n"
9547 " {\n"
9548 " a();\n"
9549 " b();\n"
9550 " }\n"
9551 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009552 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009553 "};\n"
9554 "struct B\n"
9555 "{\n"
9556 " int x;\n"
9557 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009558 "} // namespace a",
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 " if (true)\n"
9564 " {\n"
9565 " a();\n"
9566 " }\n"
9567 " else if (false)\n"
9568 " {\n"
9569 " b();\n"
9570 " }\n"
9571 " else\n"
9572 " {\n"
9573 " c();\n"
9574 " }\n"
9575 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009576 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009577
9578 verifyFormat("void f()\n"
9579 "{\n"
9580 " for (int i = 0; i < 10; ++i)\n"
9581 " {\n"
9582 " a();\n"
9583 " }\n"
9584 " while (false)\n"
9585 " {\n"
9586 " b();\n"
9587 " }\n"
9588 " do\n"
9589 " {\n"
9590 " c();\n"
9591 " } while (false)\n"
9592 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009593 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009594
9595 verifyFormat("void f(int a)\n"
9596 "{\n"
9597 " switch (a)\n"
9598 " {\n"
9599 " case 0:\n"
9600 " break;\n"
9601 " case 1:\n"
9602 " {\n"
9603 " break;\n"
9604 " }\n"
9605 " case 2:\n"
9606 " {\n"
9607 " }\n"
9608 " break;\n"
9609 " default:\n"
9610 " break;\n"
9611 " }\n"
9612 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009613 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009614
9615 verifyFormat("enum X\n"
9616 "{\n"
9617 " Y = 0,\n"
9618 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009619 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009620 verifyFormat("enum X\n"
9621 "{\n"
9622 " Y = 0\n"
9623 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009624 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009625
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009626 verifyFormat("@interface BSApplicationController ()\n"
9627 "{\n"
9628 "@private\n"
9629 " id _extraIvar;\n"
9630 "}\n"
9631 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009632 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009633
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009634 verifyFormat("#ifdef _DEBUG\n"
9635 "int foo(int i = 0)\n"
9636 "#else\n"
9637 "int foo(int i = 5)\n"
9638 "#endif\n"
9639 "{\n"
9640 " return i;\n"
9641 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009642 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009643
9644 verifyFormat("void foo() {}\n"
9645 "void bar()\n"
9646 "#ifdef _DEBUG\n"
9647 "{\n"
9648 " foo();\n"
9649 "}\n"
9650 "#else\n"
9651 "{\n"
9652 "}\n"
9653 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009654 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009655
9656 verifyFormat("void foobar() { int i = 5; }\n"
9657 "#ifdef _DEBUG\n"
9658 "void bar() {}\n"
9659 "#else\n"
9660 "void bar() { foobar(); }\n"
9661 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009662 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009663
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009664 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009665 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009666 " // ...\n"
9667 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009668 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009669 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009670 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009671 " // ...\n"
9672 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009673 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009674 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009675 // .. or dict literals.
9676 verifyFormat("void f()\n"
9677 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009678 " // ...\n"
9679 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9680 "}",
9681 AllmanBraceStyle);
9682 verifyFormat("void f()\n"
9683 "{\n"
9684 " // ...\n"
9685 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009686 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009687 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009688 verifyFormat("int f()\n"
9689 "{ // comment\n"
9690 " return 42;\n"
9691 "}",
9692 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009693
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009694 AllmanBraceStyle.ColumnLimit = 19;
9695 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9696 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009697 verifyFormat("void f()\n"
9698 "{\n"
9699 " int i;\n"
9700 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009701 AllmanBraceStyle);
9702 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009703
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009704 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009705 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9706 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9707 verifyFormat("void f(bool b)\n"
9708 "{\n"
9709 " if (b)\n"
9710 " {\n"
9711 " return;\n"
9712 " }\n"
9713 "}\n",
9714 BreakBeforeBraceShortIfs);
9715 verifyFormat("void f(bool b)\n"
9716 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009717 " if constexpr (b)\n"
9718 " {\n"
9719 " return;\n"
9720 " }\n"
9721 "}\n",
9722 BreakBeforeBraceShortIfs);
9723 verifyFormat("void f(bool b)\n"
9724 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009725 " if (b) return;\n"
9726 "}\n",
9727 BreakBeforeBraceShortIfs);
9728 verifyFormat("void f(bool b)\n"
9729 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009730 " if constexpr (b) return;\n"
9731 "}\n",
9732 BreakBeforeBraceShortIfs);
9733 verifyFormat("void f(bool b)\n"
9734 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009735 " while (b)\n"
9736 " {\n"
9737 " return;\n"
9738 " }\n"
9739 "}\n",
9740 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009741}
9742
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009743TEST_F(FormatTest, GNUBraceBreaking) {
9744 FormatStyle GNUBraceStyle = getLLVMStyle();
9745 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9746 verifyFormat("namespace a\n"
9747 "{\n"
9748 "class A\n"
9749 "{\n"
9750 " void f()\n"
9751 " {\n"
9752 " int a;\n"
9753 " {\n"
9754 " int b;\n"
9755 " }\n"
9756 " if (true)\n"
9757 " {\n"
9758 " a();\n"
9759 " b();\n"
9760 " }\n"
9761 " }\n"
9762 " void g() { return; }\n"
9763 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009764 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009765 GNUBraceStyle);
9766
9767 verifyFormat("void f()\n"
9768 "{\n"
9769 " if (true)\n"
9770 " {\n"
9771 " a();\n"
9772 " }\n"
9773 " else if (false)\n"
9774 " {\n"
9775 " b();\n"
9776 " }\n"
9777 " else\n"
9778 " {\n"
9779 " c();\n"
9780 " }\n"
9781 "}\n",
9782 GNUBraceStyle);
9783
9784 verifyFormat("void f()\n"
9785 "{\n"
9786 " for (int i = 0; i < 10; ++i)\n"
9787 " {\n"
9788 " a();\n"
9789 " }\n"
9790 " while (false)\n"
9791 " {\n"
9792 " b();\n"
9793 " }\n"
9794 " do\n"
9795 " {\n"
9796 " c();\n"
9797 " }\n"
9798 " while (false);\n"
9799 "}\n",
9800 GNUBraceStyle);
9801
9802 verifyFormat("void f(int a)\n"
9803 "{\n"
9804 " switch (a)\n"
9805 " {\n"
9806 " case 0:\n"
9807 " break;\n"
9808 " case 1:\n"
9809 " {\n"
9810 " break;\n"
9811 " }\n"
9812 " case 2:\n"
9813 " {\n"
9814 " }\n"
9815 " break;\n"
9816 " default:\n"
9817 " break;\n"
9818 " }\n"
9819 "}\n",
9820 GNUBraceStyle);
9821
9822 verifyFormat("enum X\n"
9823 "{\n"
9824 " Y = 0,\n"
9825 "}\n",
9826 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009827
9828 verifyFormat("@interface BSApplicationController ()\n"
9829 "{\n"
9830 "@private\n"
9831 " id _extraIvar;\n"
9832 "}\n"
9833 "@end\n",
9834 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009835
9836 verifyFormat("#ifdef _DEBUG\n"
9837 "int foo(int i = 0)\n"
9838 "#else\n"
9839 "int foo(int i = 5)\n"
9840 "#endif\n"
9841 "{\n"
9842 " return i;\n"
9843 "}",
9844 GNUBraceStyle);
9845
9846 verifyFormat("void foo() {}\n"
9847 "void bar()\n"
9848 "#ifdef _DEBUG\n"
9849 "{\n"
9850 " foo();\n"
9851 "}\n"
9852 "#else\n"
9853 "{\n"
9854 "}\n"
9855 "#endif",
9856 GNUBraceStyle);
9857
9858 verifyFormat("void foobar() { int i = 5; }\n"
9859 "#ifdef _DEBUG\n"
9860 "void bar() {}\n"
9861 "#else\n"
9862 "void bar() { foobar(); }\n"
9863 "#endif",
9864 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009865}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009866
9867TEST_F(FormatTest, WebKitBraceBreaking) {
9868 FormatStyle WebKitBraceStyle = getLLVMStyle();
9869 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009870 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009871 verifyFormat("namespace a {\n"
9872 "class A {\n"
9873 " void f()\n"
9874 " {\n"
9875 " if (true) {\n"
9876 " a();\n"
9877 " b();\n"
9878 " }\n"
9879 " }\n"
9880 " void g() { return; }\n"
9881 "};\n"
9882 "enum E {\n"
9883 " A,\n"
9884 " // foo\n"
9885 " B,\n"
9886 " C\n"
9887 "};\n"
9888 "struct B {\n"
9889 " int x;\n"
9890 "};\n"
9891 "}\n",
9892 WebKitBraceStyle);
9893 verifyFormat("struct S {\n"
9894 " int Type;\n"
9895 " union {\n"
9896 " int x;\n"
9897 " double y;\n"
9898 " } Value;\n"
9899 " class C {\n"
9900 " MyFavoriteType Value;\n"
9901 " } Class;\n"
9902 "};\n",
9903 WebKitBraceStyle);
9904}
9905
Manuel Klimekd5735502013-08-12 03:51:17 +00009906TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9907 verifyFormat("void f() {\n"
9908 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009909 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009910 " }\n"
9911 "}\n",
9912 getLLVMStyle());
9913}
9914
Daniel Jasper9613c812013-08-07 16:29:23 +00009915TEST_F(FormatTest, UnderstandsPragmas) {
9916 verifyFormat("#pragma omp reduction(| : var)");
9917 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009918
9919 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9920 "(including parentheses).",
9921 format("#pragma mark Any non-hyphenated or hyphenated string "
9922 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009923}
9924
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009925TEST_F(FormatTest, UnderstandPragmaOption) {
9926 verifyFormat("#pragma option -C -A");
9927
9928 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9929}
9930
Manuel Klimek77866142017-11-17 11:17:15 +00009931TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
9932 FormatStyle Style = getLLVMStyle();
9933 Style.ColumnLimit = 20;
9934
9935 verifyFormat("int a; // the\n"
9936 " // comment", Style);
9937 EXPECT_EQ("int a; /* first line\n"
9938 " * second\n"
9939 " * line third\n"
9940 " * line\n"
9941 " */",
9942 format("int a; /* first line\n"
9943 " * second\n"
9944 " * line third\n"
9945 " * line\n"
9946 " */",
9947 Style));
9948 EXPECT_EQ("int a; // first line\n"
9949 " // second\n"
9950 " // line third\n"
9951 " // line",
9952 format("int a; // first line\n"
9953 " // second line\n"
9954 " // third line",
9955 Style));
9956
9957 Style.PenaltyExcessCharacter = 90;
9958 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +00009959 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009960 " // aaa",
9961 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +00009962 EXPECT_EQ("int a; /* first line\n"
9963 " * second line\n"
9964 " * third line\n"
9965 " */",
9966 format("int a; /* first line\n"
9967 " * second line\n"
9968 " * third line\n"
9969 " */",
9970 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +00009971 EXPECT_EQ("int a; // first line\n"
9972 " // second line\n"
9973 " // third line",
9974 format("int a; // first line\n"
9975 " // second line\n"
9976 " // third line",
9977 Style));
Manuel Klimek77866142017-11-17 11:17:15 +00009978 // FIXME: Investigate why this is not getting the same layout as the test
9979 // above.
9980 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +00009981 " * second line\n"
9982 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +00009983 " */",
9984 format("int a; /* first line second line third line"
9985 "\n*/",
9986 Style));
9987
9988 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009989 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009990 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009991 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009992 Style));
9993 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009994 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009995 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +00009996 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +00009997 Style));
9998
9999 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10000 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010001 EXPECT_EQ("// foo bar baz bazfoo\n"
10002 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010003 format("// foo bar baz bazfoo bar\n"
10004 "// foo bar\n",
10005 Style));
10006
10007 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010008 "// foo bar baz bazfoo\n"
10009 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010010 format("// foo bar baz bazfoo\n"
10011 "// foo bar baz bazfoo bar\n"
10012 "// foo bar\n",
10013 Style));
10014
Manuel Klimek77866142017-11-17 11:17:15 +000010015 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010016 "// foo bar baz bazfoo\n"
10017 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010018 format("// foo bar baz bazfoo\n"
10019 "// foo bar baz bazfoo bar\n"
10020 "// foo bar\n",
10021 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010022
10023 // Make sure we do not keep protruding characters if strict mode reflow is
10024 // cheaper than keeping protruding characters.
10025 Style.ColumnLimit = 21;
10026 EXPECT_EQ("// foo foo foo foo\n"
10027 "// foo foo foo foo\n"
10028 "// foo foo foo foo\n",
10029 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10030 Style));
10031
10032 EXPECT_EQ("int a = /* long block\n"
10033 " comment */\n"
10034 " 42;",
10035 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010036}
10037
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010038#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10039 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010040 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10041 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010042
10043TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010044 SmallVector<FormatStyle, 3> Styles;
10045 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010046
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010047 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010048 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10049 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10050 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010051
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010052 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010053 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10054 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10055 EXPECT_ALL_STYLES_EQUAL(Styles);
10056
Nico Weber514ecc82014-02-02 20:50:45 +000010057 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010058 EXPECT_TRUE(
10059 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10060 EXPECT_TRUE(
10061 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10062 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010063
Nico Weber514ecc82014-02-02 20:50:45 +000010064 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010065 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10066 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10067 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010068
10069 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010070 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10071 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10072 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010073
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010074 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010075 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10076 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10077 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010078
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010079 Styles[0] = getGNUStyle();
10080 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10081 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10082 EXPECT_ALL_STYLES_EQUAL(Styles);
10083
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010084 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10085}
10086
10087TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10088 SmallVector<FormatStyle, 8> Styles;
10089 Styles.resize(2);
10090
10091 Styles[0] = getGoogleStyle();
10092 Styles[1] = getLLVMStyle();
10093 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10094 EXPECT_ALL_STYLES_EQUAL(Styles);
10095
10096 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010097 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010098 Styles[1] = getLLVMStyle();
10099 Styles[1].Language = FormatStyle::LK_JavaScript;
10100 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10101
10102 Styles[2] = getLLVMStyle();
10103 Styles[2].Language = FormatStyle::LK_JavaScript;
10104 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10105 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010106 &Styles[2])
10107 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010108
10109 Styles[3] = getLLVMStyle();
10110 Styles[3].Language = FormatStyle::LK_JavaScript;
10111 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10112 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010113 &Styles[3])
10114 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010115
10116 Styles[4] = getLLVMStyle();
10117 Styles[4].Language = FormatStyle::LK_JavaScript;
10118 EXPECT_EQ(0, parseConfiguration("---\n"
10119 "BasedOnStyle: LLVM\n"
10120 "IndentWidth: 123\n"
10121 "---\n"
10122 "BasedOnStyle: Google\n"
10123 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010124 &Styles[4])
10125 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010126 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010127}
10128
Daniel Jasper91881d92014-09-29 08:07:46 +000010129#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010130 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010131 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010132 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010133 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010134 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010135
Daniel Jasper91881d92014-09-29 08:07:46 +000010136#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10137
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010138#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10139 Style.STRUCT.FIELD = false; \
10140 EXPECT_EQ(0, \
10141 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10142 .value()); \
10143 EXPECT_TRUE(Style.STRUCT.FIELD); \
10144 EXPECT_EQ(0, \
10145 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10146 .value()); \
10147 EXPECT_FALSE(Style.STRUCT.FIELD);
10148
10149#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10150 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10151
Daniel Jasper00853002014-09-16 16:22:30 +000010152#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10153 EXPECT_NE(VALUE, Style.FIELD); \
10154 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10155 EXPECT_EQ(VALUE, Style.FIELD)
10156
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010157TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010158 FormatStyle Style = {};
10159 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010160 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010161 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010162 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010163 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010164 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010165 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010166 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010167 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010168 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010169 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010170 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010171 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010172 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010173 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010174 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010175 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010176 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010177 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010178 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010179 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010180 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010181 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010182 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010183 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010184 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010185 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010186 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010187 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010188 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010189 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010190 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010191 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010192 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010193 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010194 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010195 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010196 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010197 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010198 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010199
10200 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10201 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10202 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10203 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10204 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10205 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10206 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10207 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010208 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010209 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10210 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10211 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010212 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10213 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10214 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010215}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010216
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010217#undef CHECK_PARSE_BOOL
10218
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010219TEST_F(FormatTest, ParsesConfiguration) {
10220 FormatStyle Style = {};
10221 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010222 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010223 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10224 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010225 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010226 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10227 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010228 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10229 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010230 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10231 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010232 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10233 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10234 PenaltyReturnTypeOnItsOwnLine, 1234u);
10235 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10236 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010237 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010238 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010239 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010240
Daniel Jasper553d4872014-06-17 12:40:34 +000010241 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010242 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10243 FormatStyle::PAS_Left);
10244 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10245 FormatStyle::PAS_Right);
10246 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10247 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010248 // For backward compatibility:
10249 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10250 FormatStyle::PAS_Left);
10251 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10252 FormatStyle::PAS_Right);
10253 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10254 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010255
Alexander Kornienkod6538332013-05-07 15:32:14 +000010256 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010257 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10258 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010259 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10260 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10261 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10262
Daniel Jasperac043c92014-09-15 11:11:00 +000010263 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010264 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10265 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010266 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10267 FormatStyle::BOS_None);
10268 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10269 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010270 // For backward compatibility:
10271 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10272 FormatStyle::BOS_None);
10273 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10274 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010275
Francois Ferranda6b6d512017-05-24 11:36:58 +000010276 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10277 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10278 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10279 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10280 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10281 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10282 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10283 // For backward compatibility:
10284 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10285 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10286
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010287 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10288 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10289 FormatStyle::BAS_Align);
10290 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10291 FormatStyle::BAS_DontAlign);
10292 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10293 FormatStyle::BAS_AlwaysBreak);
10294 // For backward compatibility:
10295 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10296 FormatStyle::BAS_DontAlign);
10297 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10298 FormatStyle::BAS_Align);
10299
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010300 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10301 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10302 FormatStyle::ENAS_DontAlign);
10303 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10304 FormatStyle::ENAS_Left);
10305 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10306 FormatStyle::ENAS_Right);
10307 // For backward compatibility:
10308 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10309 FormatStyle::ENAS_Left);
10310 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10311 FormatStyle::ENAS_Right);
10312
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010313 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010314 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10315 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10316 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010317 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10318 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010319 // For backward compatibility:
10320 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10321 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010322
Daniel Jasperd74cf402014-04-08 12:46:38 +000010323 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010324 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10325 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10326 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10327 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010328 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10329 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010330 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10331 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010332 // For backward compatibility:
10333 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10334 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10335 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10336 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010337
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010338 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10339 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10340 FormatStyle::SBPO_Never);
10341 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10342 FormatStyle::SBPO_Always);
10343 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10344 FormatStyle::SBPO_ControlStatements);
10345 // For backward compatibility:
10346 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10347 FormatStyle::SBPO_Never);
10348 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10349 FormatStyle::SBPO_ControlStatements);
10350
Alexander Kornienkod6538332013-05-07 15:32:14 +000010351 Style.ColumnLimit = 123;
10352 FormatStyle BaseStyle = getLLVMStyle();
10353 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10354 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10355
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010356 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10357 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10358 FormatStyle::BS_Attach);
10359 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10360 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010361 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10362 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010363 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10364 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010365 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10366 FormatStyle::BS_Allman);
10367 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010368 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10369 FormatStyle::BS_WebKit);
10370 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10371 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010372
Zachary Turner448592e2015-12-18 22:20:15 +000010373 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10374 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10375 FormatStyle::RTBS_None);
10376 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10377 FormatStyle::RTBS_All);
10378 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010379 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010380 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10381 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10382 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10383 AlwaysBreakAfterReturnType,
10384 FormatStyle::RTBS_TopLevelDefinitions);
10385
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010386 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10387 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10388 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10389 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10390 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10391 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10392 AlwaysBreakAfterDefinitionReturnType,
10393 FormatStyle::DRTBS_TopLevel);
10394
Daniel Jasper65ee3472013-07-31 23:16:02 +000010395 Style.NamespaceIndentation = FormatStyle::NI_All;
10396 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10397 FormatStyle::NI_None);
10398 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10399 FormatStyle::NI_Inner);
10400 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10401 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010402
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010403 // FIXME: This is required because parsing a configuration simply overwrites
10404 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010405 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010406 std::vector<std::string> BoostForeach;
10407 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010408 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010409 std::vector<std::string> BoostAndQForeach;
10410 BoostAndQForeach.push_back("BOOST_FOREACH");
10411 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010412 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10413 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010414
10415 Style.IncludeCategories.clear();
10416 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10417 {".*", 1}};
10418 CHECK_PARSE("IncludeCategories:\n"
10419 " - Regex: abc/.*\n"
10420 " Priority: 2\n"
10421 " - Regex: .*\n"
10422 " Priority: 1",
10423 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010424 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010425
10426 Style.RawStringFormats.clear();
10427 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010428 {
10429 FormatStyle::LK_TextProto,
10430 {"pb", "proto"},
10431 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010432 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010433 "llvm",
10434 },
10435 {
10436 FormatStyle::LK_Cpp,
10437 {"cc", "cpp"},
10438 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010439 /*CanonicalDelimiter=*/"cc",
10440 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010441 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010442 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010443
10444 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010445 " - Language: TextProto\n"
10446 " Delimiters:\n"
10447 " - 'pb'\n"
10448 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010449 " EnclosingFunctions:\n"
10450 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010451 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010452 " - Language: Cpp\n"
10453 " Delimiters:\n"
10454 " - 'cc'\n"
10455 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010456 " EnclosingFunctions:\n"
10457 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010458 " - 'CPPEVAL'\n"
10459 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010460 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010461}
10462
10463TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10464 FormatStyle Style = {};
10465 Style.Language = FormatStyle::LK_Cpp;
10466 CHECK_PARSE("Language: Cpp\n"
10467 "IndentWidth: 12",
10468 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010469 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10470 "IndentWidth: 34",
10471 &Style),
10472 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010473 EXPECT_EQ(12u, Style.IndentWidth);
10474 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10475 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10476
10477 Style.Language = FormatStyle::LK_JavaScript;
10478 CHECK_PARSE("Language: JavaScript\n"
10479 "IndentWidth: 12",
10480 IndentWidth, 12u);
10481 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010482 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10483 "IndentWidth: 34",
10484 &Style),
10485 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010486 EXPECT_EQ(23u, Style.IndentWidth);
10487 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10488 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10489
10490 CHECK_PARSE("BasedOnStyle: LLVM\n"
10491 "IndentWidth: 67",
10492 IndentWidth, 67u);
10493
10494 CHECK_PARSE("---\n"
10495 "Language: JavaScript\n"
10496 "IndentWidth: 12\n"
10497 "---\n"
10498 "Language: Cpp\n"
10499 "IndentWidth: 34\n"
10500 "...\n",
10501 IndentWidth, 12u);
10502
10503 Style.Language = FormatStyle::LK_Cpp;
10504 CHECK_PARSE("---\n"
10505 "Language: JavaScript\n"
10506 "IndentWidth: 12\n"
10507 "---\n"
10508 "Language: Cpp\n"
10509 "IndentWidth: 34\n"
10510 "...\n",
10511 IndentWidth, 34u);
10512 CHECK_PARSE("---\n"
10513 "IndentWidth: 78\n"
10514 "---\n"
10515 "Language: JavaScript\n"
10516 "IndentWidth: 56\n"
10517 "...\n",
10518 IndentWidth, 78u);
10519
10520 Style.ColumnLimit = 123;
10521 Style.IndentWidth = 234;
10522 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10523 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010524 EXPECT_FALSE(parseConfiguration("---\n"
10525 "IndentWidth: 456\n"
10526 "BreakBeforeBraces: Allman\n"
10527 "---\n"
10528 "Language: JavaScript\n"
10529 "IndentWidth: 111\n"
10530 "TabWidth: 111\n"
10531 "---\n"
10532 "Language: Cpp\n"
10533 "BreakBeforeBraces: Stroustrup\n"
10534 "TabWidth: 789\n"
10535 "...\n",
10536 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010537 EXPECT_EQ(123u, Style.ColumnLimit);
10538 EXPECT_EQ(456u, Style.IndentWidth);
10539 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10540 EXPECT_EQ(789u, Style.TabWidth);
10541
Rafael Espindola1f243172014-06-12 11:35:17 +000010542 EXPECT_EQ(parseConfiguration("---\n"
10543 "Language: JavaScript\n"
10544 "IndentWidth: 56\n"
10545 "---\n"
10546 "IndentWidth: 78\n"
10547 "...\n",
10548 &Style),
10549 ParseError::Error);
10550 EXPECT_EQ(parseConfiguration("---\n"
10551 "Language: JavaScript\n"
10552 "IndentWidth: 56\n"
10553 "---\n"
10554 "Language: JavaScript\n"
10555 "IndentWidth: 78\n"
10556 "...\n",
10557 &Style),
10558 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010559
10560 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10561}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010562
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010563#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010564
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010565TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10566 FormatStyle Style = {};
10567 Style.Language = FormatStyle::LK_JavaScript;
10568 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010569 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010570 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010571
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010572 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010573 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010574 "BasedOnStyle: Google\n"
10575 "---\n"
10576 "Language: JavaScript\n"
10577 "IndentWidth: 76\n"
10578 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010579 &Style)
10580 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010581 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010582 EXPECT_EQ(76u, Style.IndentWidth);
10583 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10584}
10585
Alexander Kornienkod6538332013-05-07 15:32:14 +000010586TEST_F(FormatTest, ConfigurationRoundTripTest) {
10587 FormatStyle Style = getLLVMStyle();
10588 std::string YAML = configurationAsText(Style);
10589 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010590 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010591 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10592 EXPECT_EQ(Style, ParsedStyle);
10593}
10594
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010595TEST_F(FormatTest, WorksFor8bitEncodings) {
10596 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10597 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10598 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10599 "\"\xef\xee\xf0\xf3...\"",
10600 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10601 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10602 "\xef\xee\xf0\xf3...\"",
10603 getLLVMStyleWithColumns(12)));
10604}
10605
Alexander Kornienko393e3082013-11-13 14:04:17 +000010606TEST_F(FormatTest, HandlesUTF8BOM) {
10607 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10608 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10609 format("\xef\xbb\xbf#include <iostream>"));
10610 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10611 format("\xef\xbb\xbf\n#include <iostream>"));
10612}
10613
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010614// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10615#if !defined(_MSC_VER)
10616
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010617TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10618 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10619 getLLVMStyleWithColumns(35));
10620 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010621 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010622 verifyFormat("// Однажды в студёную зимнюю пору...",
10623 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010624 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010625 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10626 getLLVMStyleWithColumns(39));
10627 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010628 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010629}
10630
10631TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010632 // Non-printable characters' width is currently considered to be the length in
10633 // bytes in UTF8. The characters can be displayed in very different manner
10634 // (zero-width, single width with a substitution glyph, expanded to their code
10635 // (e.g. "<8d>"), so there's no single correct way to handle them.
10636 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010637 "\"\xc2\x8d\";",
10638 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010639 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010640 "\"\xc2\x8d\";",
10641 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010642 EXPECT_EQ("\"Однажды, в \"\n"
10643 "\"студёную \"\n"
10644 "\"зимнюю \"\n"
10645 "\"пору,\"",
10646 format("\"Однажды, в студёную зимнюю пору,\"",
10647 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010648 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010649 "\"一 二 三 \"\n"
10650 "\"四 五六 \"\n"
10651 "\"七 八 九 \"\n"
10652 "\"十\"",
10653 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010654 EXPECT_EQ("\"一\t\"\n"
10655 "\"二 \t\"\n"
10656 "\"三 四 \"\n"
10657 "\"五\t\"\n"
10658 "\"六 \t\"\n"
10659 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010660 "\"八九十\tqq\"",
10661 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10662 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010663
10664 // UTF8 character in an escape sequence.
10665 EXPECT_EQ("\"aaaaaa\"\n"
10666 "\"\\\xC2\x8D\"",
10667 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010668}
10669
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010670TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10671 EXPECT_EQ("const char *sssss =\n"
10672 " \"一二三四五六七八\\\n"
10673 " 九 十\";",
10674 format("const char *sssss = \"一二三四五六七八\\\n"
10675 " 九 十\";",
10676 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010677}
10678
10679TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010680 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10681 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010682 EXPECT_EQ("// Я из лесу\n"
10683 "// вышел; был\n"
10684 "// сильный\n"
10685 "// мороз.",
10686 format("// Я из лесу вышел; был сильный мороз.",
10687 getLLVMStyleWithColumns(13)));
10688 EXPECT_EQ("// 一二三\n"
10689 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010690 "// 八 九\n"
10691 "// 十",
10692 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010693}
10694
10695TEST_F(FormatTest, SplitsUTF8BlockComments) {
10696 EXPECT_EQ("/* Гляжу,\n"
10697 " * поднимается\n"
10698 " * медленно в\n"
10699 " * гору\n"
10700 " * Лошадка,\n"
10701 " * везущая\n"
10702 " * хворосту\n"
10703 " * воз. */",
10704 format("/* Гляжу, поднимается медленно в гору\n"
10705 " * Лошадка, везущая хворосту воз. */",
10706 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010707 EXPECT_EQ(
10708 "/* 一二三\n"
10709 " * 四五六七\n"
10710 " * 八 九\n"
10711 " * 十 */",
10712 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010713 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10714 " * 𝕓𝕪𝕥𝕖\n"
10715 " * 𝖀𝕿𝕱-𝟠 */",
10716 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010717}
10718
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010719#endif // _MSC_VER
10720
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010721TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10722 FormatStyle Style = getLLVMStyle();
10723
10724 Style.ConstructorInitializerIndentWidth = 4;
10725 verifyFormat(
10726 "SomeClass::Constructor()\n"
10727 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10728 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10729 Style);
10730
10731 Style.ConstructorInitializerIndentWidth = 2;
10732 verifyFormat(
10733 "SomeClass::Constructor()\n"
10734 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10735 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10736 Style);
10737
10738 Style.ConstructorInitializerIndentWidth = 0;
10739 verifyFormat(
10740 "SomeClass::Constructor()\n"
10741 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10742 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10743 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010744 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10745 verifyFormat(
10746 "SomeLongTemplateVariableName<\n"
10747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10748 Style);
10749 verifyFormat(
10750 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10752 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010753}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010754
Daniel Jasper00853002014-09-16 16:22:30 +000010755TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10756 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010757 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010758 Style.ConstructorInitializerIndentWidth = 4;
10759 verifyFormat("SomeClass::Constructor()\n"
10760 " : a(a)\n"
10761 " , b(b)\n"
10762 " , c(c) {}",
10763 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010764 verifyFormat("SomeClass::Constructor()\n"
10765 " : a(a) {}",
10766 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010767
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010768 Style.ColumnLimit = 0;
10769 verifyFormat("SomeClass::Constructor()\n"
10770 " : a(a) {}",
10771 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010772 verifyFormat("SomeClass::Constructor() noexcept\n"
10773 " : a(a) {}",
10774 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010775 verifyFormat("SomeClass::Constructor()\n"
10776 " : a(a)\n"
10777 " , b(b)\n"
10778 " , c(c) {}",
10779 Style);
10780 verifyFormat("SomeClass::Constructor()\n"
10781 " : a(a) {\n"
10782 " foo();\n"
10783 " bar();\n"
10784 "}",
10785 Style);
10786
Daniel Jasperd74cf402014-04-08 12:46:38 +000010787 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010788 verifyFormat("SomeClass::Constructor()\n"
10789 " : a(a)\n"
10790 " , b(b)\n"
10791 " , c(c) {\n}",
10792 Style);
10793 verifyFormat("SomeClass::Constructor()\n"
10794 " : a(a) {\n}",
10795 Style);
10796
10797 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010798 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010799 Style.ConstructorInitializerIndentWidth = 2;
10800 verifyFormat("SomeClass::Constructor()\n"
10801 " : a(a)\n"
10802 " , b(b)\n"
10803 " , c(c) {}",
10804 Style);
10805
10806 Style.ConstructorInitializerIndentWidth = 0;
10807 verifyFormat("SomeClass::Constructor()\n"
10808 ": a(a)\n"
10809 ", b(b)\n"
10810 ", c(c) {}",
10811 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010812
10813 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10814 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010815 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10816 verifyFormat(
10817 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10818 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010819 verifyFormat(
10820 "SomeClass::Constructor()\n"
10821 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10822 Style);
10823 Style.ConstructorInitializerIndentWidth = 4;
10824 Style.ColumnLimit = 60;
10825 verifyFormat("SomeClass::Constructor()\n"
10826 " : aaaaaaaa(aaaaaaaa)\n"
10827 " , aaaaaaaa(aaaaaaaa)\n"
10828 " , aaaaaaaa(aaaaaaaa) {}",
10829 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010830}
10831
Daniel Jasper38efc132014-10-21 07:51:54 +000010832TEST_F(FormatTest, Destructors) {
10833 verifyFormat("void F(int &i) { i.~int(); }");
10834 verifyFormat("void F(int &i) { i->~int(); }");
10835}
10836
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010837TEST_F(FormatTest, FormatsWithWebKitStyle) {
10838 FormatStyle Style = getWebKitStyle();
10839
10840 // Don't indent in outer namespaces.
10841 verifyFormat("namespace outer {\n"
10842 "int i;\n"
10843 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010844 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010845 "} // namespace inner\n"
10846 "} // namespace outer\n"
10847 "namespace other_outer {\n"
10848 "int i;\n"
10849 "}",
10850 Style);
10851
10852 // Don't indent case labels.
10853 verifyFormat("switch (variable) {\n"
10854 "case 1:\n"
10855 "case 2:\n"
10856 " doSomething();\n"
10857 " break;\n"
10858 "default:\n"
10859 " ++variable;\n"
10860 "}",
10861 Style);
10862
10863 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010864 EXPECT_EQ("void f()\n"
10865 "{\n"
10866 " if (aaaaaaaaaaaaaaaa\n"
10867 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10868 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10869 " return;\n"
10870 "}",
10871 format("void f() {\n"
10872 "if (aaaaaaaaaaaaaaaa\n"
10873 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10874 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10875 "return;\n"
10876 "}",
10877 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010878
Daniel Jasper35995672014-04-29 14:05:20 +000010879 // Allow functions on a single line.
10880 verifyFormat("void f() { return; }", Style);
10881
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010882 // Constructor initializers are formatted one per line with the "," on the
10883 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010884 verifyFormat("Constructor()\n"
10885 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10886 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010887 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010888 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10889 "{\n"
10890 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010891 Style);
10892 verifyFormat("SomeClass::Constructor()\n"
10893 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010894 "{\n"
10895 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010896 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010897 EXPECT_EQ("SomeClass::Constructor()\n"
10898 " : a(a)\n"
10899 "{\n"
10900 "}",
10901 format("SomeClass::Constructor():a(a){}", Style));
10902 verifyFormat("SomeClass::Constructor()\n"
10903 " : a(a)\n"
10904 " , b(b)\n"
10905 " , c(c)\n"
10906 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010907 "}",
10908 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010909 verifyFormat("SomeClass::Constructor()\n"
10910 " : a(a)\n"
10911 "{\n"
10912 " foo();\n"
10913 " bar();\n"
10914 "}",
10915 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010916
Daniel Jasper65ee3472013-07-31 23:16:02 +000010917 // Access specifiers should be aligned left.
10918 verifyFormat("class C {\n"
10919 "public:\n"
10920 " int i;\n"
10921 "};",
10922 Style);
10923
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010924 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010925 verifyFormat("int a; // Do not\n"
10926 "double b; // align comments.",
10927 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010928
Daniel Jasper3219e432014-12-02 13:24:51 +000010929 // Do not align operands.
10930 EXPECT_EQ("ASSERT(aaaa\n"
10931 " || bbbb);",
10932 format("ASSERT ( aaaa\n||bbbb);", Style));
10933
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010934 // Accept input's line breaks.
10935 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10936 " || bbbbbbbbbbbbbbb) {\n"
10937 " i++;\n"
10938 "}",
10939 format("if (aaaaaaaaaaaaaaa\n"
10940 "|| bbbbbbbbbbbbbbb) { i++; }",
10941 Style));
10942 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10943 " i++;\n"
10944 "}",
10945 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010946
10947 // Don't automatically break all macro definitions (llvm.org/PR17842).
10948 verifyFormat("#define aNumber 10", Style);
10949 // However, generally keep the line breaks that the user authored.
10950 EXPECT_EQ("#define aNumber \\\n"
10951 " 10",
10952 format("#define aNumber \\\n"
10953 " 10",
10954 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010955
10956 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010957 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10958 " copyItems:YES];",
10959 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10960 "copyItems:YES];",
10961 Style));
10962 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10963 " copyItems:YES];",
10964 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10965 " copyItems:YES];",
10966 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010967 // FIXME: This does not seem right, there should be more indentation before
10968 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010969 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010970 " @\"a\",\n"
10971 " @\"a\"\n"
10972 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010973 " copyItems:YES];",
10974 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10975 " @\"a\",\n"
10976 " @\"a\"\n"
10977 " ]\n"
10978 " copyItems:YES];",
10979 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010980 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010981 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10982 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010983 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10984 " copyItems:YES];",
10985 Style));
10986
10987 verifyFormat("[self.a b:c c:d];", Style);
10988 EXPECT_EQ("[self.a b:c\n"
10989 " c:d];",
10990 format("[self.a b:c\n"
10991 "c:d];",
10992 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010993}
10994
Manuel Klimekffdeb592013-09-03 15:10:01 +000010995TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010996 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10997 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10998 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10999 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11000 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011001 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011002 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11003 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011004 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011005 verifyFormat("void f() {\n"
11006 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11007 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011008 verifyFormat("void f() {\n"
11009 " other(x.begin(), //\n"
11010 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011011 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011012 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011013 verifyFormat("SomeFunction([]() { // A cool function...\n"
11014 " return 43;\n"
11015 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011016 EXPECT_EQ("SomeFunction([]() {\n"
11017 "#define A a\n"
11018 " return 43;\n"
11019 "});",
11020 format("SomeFunction([](){\n"
11021 "#define A a\n"
11022 "return 43;\n"
11023 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011024 verifyFormat("void f() {\n"
11025 " SomeFunction([](decltype(x), A *a) {});\n"
11026 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011027 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11028 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011029 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11030 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11031 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011032 verifyFormat("Constructor()\n"
11033 " : Field([] { // comment\n"
11034 " int i;\n"
11035 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011036 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11037 " return some_parameter.size();\n"
11038 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011039 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11040 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011041 verifyFormat("int i = aaaaaa ? 1 //\n"
11042 " : [] {\n"
11043 " return 2; //\n"
11044 " }();");
11045 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11046 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11047 " return x == 2; // force break\n"
11048 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011049 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11050 " [=](int iiiiiiiiiiii) {\n"
11051 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11052 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11053 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011054 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011055 verifyFormat("SomeFunction({[&] {\n"
11056 " // comment\n"
11057 " },\n"
11058 " [&] {\n"
11059 " // comment\n"
11060 " }});");
11061 verifyFormat("SomeFunction({[&] {\n"
11062 " // comment\n"
11063 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011064 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11065 " [&]() { return true; },\n"
11066 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011067
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011068 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011069 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011070 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011071 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11072 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011073 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011074 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011075 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11076 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011077 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011078 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11079 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011080 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011081 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011082 verifyFormat(
11083 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11084 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11085 " return aaaaaaaaaaaaaaaaa;\n"
11086 " });",
11087 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011088 verifyFormat("[]() //\n"
11089 " -> int {\n"
11090 " return 1; //\n"
11091 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011092
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011093 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011094 verifyFormat("SomeFunction(\n"
11095 " []() {\n"
11096 " int i = 42;\n"
11097 " return i;\n"
11098 " },\n"
11099 " []() {\n"
11100 " int j = 43;\n"
11101 " return j;\n"
11102 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011103
Daniel Jasperda18fd82014-06-10 06:39:03 +000011104 // More complex introducers.
11105 verifyFormat("return [i, args...] {};");
11106
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011107 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011108 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011109 verifyFormat("double &operator[](int i) { return 0; }\n"
11110 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011111 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011112 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011113 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011114
11115 // Other corner cases.
11116 verifyFormat("void f() {\n"
11117 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011118 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011119 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011120
11121 // Lambdas created through weird macros.
11122 verifyFormat("void f() {\n"
11123 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011124 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011125 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011126
11127 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11128 " doo_dah();\n"
11129 " doo_dah();\n"
11130 " })) {\n"
11131 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011132 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11133 " doo_dah();\n"
11134 " doo_dah();\n"
11135 " })) {\n"
11136 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011137 verifyFormat("auto lambda = []() {\n"
11138 " int a = 2\n"
11139 "#if A\n"
11140 " + 2\n"
11141 "#endif\n"
11142 " ;\n"
11143 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011144
11145 // Lambdas with complex multiline introducers.
11146 verifyFormat(
11147 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11148 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11149 " -> ::std::unordered_set<\n"
11150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11151 " //\n"
11152 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011153}
11154
Martin Probsta004b3f2017-11-17 18:06:33 +000011155TEST_F(FormatTest, EmptyLinesInLambdas) {
11156 verifyFormat("auto lambda = []() {\n"
11157 " x(); //\n"
11158 "};",
11159 "auto lambda = []() {\n"
11160 "\n"
11161 " x(); //\n"
11162 "\n"
11163 "};");
11164}
11165
Manuel Klimek516e0542013-09-04 13:25:30 +000011166TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011167 FormatStyle ShortBlocks = getLLVMStyle();
11168 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11169 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11170 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11171 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11172 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11173 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11174 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011175
Daniel Jasper76284682014-10-22 09:12:44 +000011176 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11177 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11178 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011179
Daniel Jasper76284682014-10-22 09:12:44 +000011180 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011181 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011182 "}];");
11183 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011184 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011185 "}]};");
11186 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011187 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011188 "}];");
11189 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011190 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011191 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011192 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011193 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011194 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011195 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011196 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011197
11198 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011199 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011200 "}];",
11201 getLLVMStyleWithColumns(60));
11202 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011203 " NSString *path = [self sessionFilePath];\n"
11204 " if (path) {\n"
11205 " // ...\n"
11206 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011207 "});");
11208 verifyFormat("[[SessionService sharedService]\n"
11209 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011210 " if (window) {\n"
11211 " [self windowDidLoad:window];\n"
11212 " } else {\n"
11213 " [self errorLoadingWindow];\n"
11214 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011215 " }];");
11216 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011217 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011218 "};\n",
11219 getLLVMStyleWithColumns(40));
11220 verifyFormat("[[SessionService sharedService]\n"
11221 " loadWindowWithCompletionBlock: //\n"
11222 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011223 " if (window) {\n"
11224 " [self windowDidLoad:window];\n"
11225 " } else {\n"
11226 " [self errorLoadingWindow];\n"
11227 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011228 " }];",
11229 getLLVMStyleWithColumns(60));
11230 verifyFormat("[myObject doSomethingWith:arg1\n"
11231 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011232 " // ...\n"
11233 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011234 " }\n"
11235 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011236 " // ...\n"
11237 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011238 " }\n"
11239 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011240 " // ...\n"
11241 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011242 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011243 verifyFormat("[myObject doSomethingWith:arg1\n"
11244 " firstBlock:-1\n"
11245 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011246 " // ...\n"
11247 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011248 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011249
11250 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011251 " @autoreleasepool {\n"
11252 " if (a) {\n"
11253 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011254 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011255 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011256 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011257 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011258 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11259 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011260
11261 FormatStyle FourIndent = getLLVMStyle();
11262 FourIndent.ObjCBlockIndentWidth = 4;
11263 verifyFormat("[operation setCompletionBlock:^{\n"
11264 " [self onOperationDone];\n"
11265 "}];",
11266 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011267}
11268
Daniel Jasper289afc02015-04-23 09:23:17 +000011269TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11270 FormatStyle ZeroColumn = getLLVMStyle();
11271 ZeroColumn.ColumnLimit = 0;
11272
11273 verifyFormat("[[SessionService sharedService] "
11274 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11275 " if (window) {\n"
11276 " [self windowDidLoad:window];\n"
11277 " } else {\n"
11278 " [self errorLoadingWindow];\n"
11279 " }\n"
11280 "}];",
11281 ZeroColumn);
11282 EXPECT_EQ("[[SessionService sharedService]\n"
11283 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11284 " if (window) {\n"
11285 " [self windowDidLoad:window];\n"
11286 " } else {\n"
11287 " [self errorLoadingWindow];\n"
11288 " }\n"
11289 " }];",
11290 format("[[SessionService sharedService]\n"
11291 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11292 " if (window) {\n"
11293 " [self windowDidLoad:window];\n"
11294 " } else {\n"
11295 " [self errorLoadingWindow];\n"
11296 " }\n"
11297 "}];",
11298 ZeroColumn));
11299 verifyFormat("[myObject doSomethingWith:arg1\n"
11300 " firstBlock:^(Foo *a) {\n"
11301 " // ...\n"
11302 " int i;\n"
11303 " }\n"
11304 " secondBlock:^(Bar *b) {\n"
11305 " // ...\n"
11306 " int i;\n"
11307 " }\n"
11308 " thirdBlock:^Foo(Bar *b) {\n"
11309 " // ...\n"
11310 " int i;\n"
11311 " }];",
11312 ZeroColumn);
11313 verifyFormat("f(^{\n"
11314 " @autoreleasepool {\n"
11315 " if (a) {\n"
11316 " g();\n"
11317 " }\n"
11318 " }\n"
11319 "});",
11320 ZeroColumn);
11321 verifyFormat("void (^largeBlock)(void) = ^{\n"
11322 " // ...\n"
11323 "};",
11324 ZeroColumn);
11325
11326 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11327 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011328 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011329 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11330 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11331 " int i;\n"
11332 "};",
11333 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11334}
11335
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011336TEST_F(FormatTest, SupportsCRLF) {
11337 EXPECT_EQ("int a;\r\n"
11338 "int b;\r\n"
11339 "int c;\r\n",
11340 format("int a;\r\n"
11341 " int b;\r\n"
11342 " int c;\r\n",
11343 getLLVMStyle()));
11344 EXPECT_EQ("int a;\r\n"
11345 "int b;\r\n"
11346 "int c;\r\n",
11347 format("int a;\r\n"
11348 " int b;\n"
11349 " int c;\r\n",
11350 getLLVMStyle()));
11351 EXPECT_EQ("int a;\n"
11352 "int b;\n"
11353 "int c;\n",
11354 format("int a;\r\n"
11355 " int b;\n"
11356 " int c;\n",
11357 getLLVMStyle()));
11358 EXPECT_EQ("\"aaaaaaa \"\r\n"
11359 "\"bbbbbbb\";\r\n",
11360 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11361 EXPECT_EQ("#define A \\\r\n"
11362 " b; \\\r\n"
11363 " c; \\\r\n"
11364 " d;\r\n",
11365 format("#define A \\\r\n"
11366 " b; \\\r\n"
11367 " c; d; \r\n",
11368 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011369
11370 EXPECT_EQ("/*\r\n"
11371 "multi line block comments\r\n"
11372 "should not introduce\r\n"
11373 "an extra carriage return\r\n"
11374 "*/\r\n",
11375 format("/*\r\n"
11376 "multi line block comments\r\n"
11377 "should not introduce\r\n"
11378 "an extra carriage return\r\n"
11379 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011380}
11381
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011382TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11383 verifyFormat("MY_CLASS(C) {\n"
11384 " int i;\n"
11385 " int j;\n"
11386 "};");
11387}
11388
Daniel Jasper6633ab82013-10-18 10:38:14 +000011389TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11390 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11391 TwoIndent.ContinuationIndentWidth = 2;
11392
11393 EXPECT_EQ("int i =\n"
11394 " longFunction(\n"
11395 " arg);",
11396 format("int i = longFunction(arg);", TwoIndent));
11397
11398 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11399 SixIndent.ContinuationIndentWidth = 6;
11400
11401 EXPECT_EQ("int i =\n"
11402 " longFunction(\n"
11403 " arg);",
11404 format("int i = longFunction(arg);", SixIndent));
11405}
11406
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011407TEST_F(FormatTest, SpacesInAngles) {
11408 FormatStyle Spaces = getLLVMStyle();
11409 Spaces.SpacesInAngles = true;
11410
11411 verifyFormat("static_cast< int >(arg);", Spaces);
11412 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11413 verifyFormat("f< int, float >();", Spaces);
11414 verifyFormat("template <> g() {}", Spaces);
11415 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011416 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11417 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11418 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011419
11420 Spaces.Standard = FormatStyle::LS_Cpp03;
11421 Spaces.SpacesInAngles = true;
11422 verifyFormat("A< A< int > >();", Spaces);
11423
11424 Spaces.SpacesInAngles = false;
11425 verifyFormat("A<A<int> >();", Spaces);
11426
11427 Spaces.Standard = FormatStyle::LS_Cpp11;
11428 Spaces.SpacesInAngles = true;
11429 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011430
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011431 Spaces.SpacesInAngles = false;
11432 verifyFormat("A<A<int>>();", Spaces);
11433}
11434
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011435TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11436 FormatStyle Style = getLLVMStyle();
11437 Style.SpaceAfterTemplateKeyword = false;
11438 verifyFormat("template<int> void foo();", Style);
11439}
11440
Jacques Pienaarfc275112015-02-18 23:48:37 +000011441TEST_F(FormatTest, TripleAngleBrackets) {
11442 verifyFormat("f<<<1, 1>>>();");
11443 verifyFormat("f<<<1, 1, 1, s>>>();");
11444 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011445 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011446 verifyFormat("f<param><<<1, 1>>>();");
11447 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011448 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011449 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11450 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011451 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11452 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011453}
11454
11455TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011456 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011457 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011458 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11459 "aaallvm::outs() <<");
11460 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11461 "aaaallvm::outs()\n <<");
11462}
11463
Manuel Klimek819788d2014-03-18 11:22:45 +000011464TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11465 std::string code = "#if A\n"
11466 "#if B\n"
11467 "a.\n"
11468 "#endif\n"
11469 " a = 1;\n"
11470 "#else\n"
11471 "#endif\n"
11472 "#if C\n"
11473 "#else\n"
11474 "#endif\n";
11475 EXPECT_EQ(code, format(code));
11476}
11477
Manuel Klimek68b03042014-04-14 09:14:11 +000011478TEST_F(FormatTest, HandleConflictMarkers) {
11479 // Git/SVN conflict markers.
11480 EXPECT_EQ("int a;\n"
11481 "void f() {\n"
11482 " callme(some(parameter1,\n"
11483 "<<<<<<< text by the vcs\n"
11484 " parameter2),\n"
11485 "||||||| text by the vcs\n"
11486 " parameter2),\n"
11487 " parameter3,\n"
11488 "======= text by the vcs\n"
11489 " parameter2, parameter3),\n"
11490 ">>>>>>> text by the vcs\n"
11491 " otherparameter);\n",
11492 format("int a;\n"
11493 "void f() {\n"
11494 " callme(some(parameter1,\n"
11495 "<<<<<<< text by the vcs\n"
11496 " parameter2),\n"
11497 "||||||| text by the vcs\n"
11498 " parameter2),\n"
11499 " parameter3,\n"
11500 "======= text by the vcs\n"
11501 " parameter2,\n"
11502 " parameter3),\n"
11503 ">>>>>>> text by the vcs\n"
11504 " otherparameter);\n"));
11505
11506 // Perforce markers.
11507 EXPECT_EQ("void f() {\n"
11508 " function(\n"
11509 ">>>> text by the vcs\n"
11510 " parameter,\n"
11511 "==== text by the vcs\n"
11512 " parameter,\n"
11513 "==== text by the vcs\n"
11514 " parameter,\n"
11515 "<<<< text by the vcs\n"
11516 " parameter);\n",
11517 format("void f() {\n"
11518 " function(\n"
11519 ">>>> text by the vcs\n"
11520 " parameter,\n"
11521 "==== text by the vcs\n"
11522 " parameter,\n"
11523 "==== text by the vcs\n"
11524 " parameter,\n"
11525 "<<<< text by the vcs\n"
11526 " parameter);\n"));
11527
11528 EXPECT_EQ("<<<<<<<\n"
11529 "|||||||\n"
11530 "=======\n"
11531 ">>>>>>>",
11532 format("<<<<<<<\n"
11533 "|||||||\n"
11534 "=======\n"
11535 ">>>>>>>"));
11536
11537 EXPECT_EQ("<<<<<<<\n"
11538 "|||||||\n"
11539 "int i;\n"
11540 "=======\n"
11541 ">>>>>>>",
11542 format("<<<<<<<\n"
11543 "|||||||\n"
11544 "int i;\n"
11545 "=======\n"
11546 ">>>>>>>"));
11547
11548 // FIXME: Handle parsing of macros around conflict markers correctly:
11549 EXPECT_EQ("#define Macro \\\n"
11550 "<<<<<<<\n"
11551 "Something \\\n"
11552 "|||||||\n"
11553 "Else \\\n"
11554 "=======\n"
11555 "Other \\\n"
11556 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011557 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011558 format("#define Macro \\\n"
11559 "<<<<<<<\n"
11560 " Something \\\n"
11561 "|||||||\n"
11562 " Else \\\n"
11563 "=======\n"
11564 " Other \\\n"
11565 ">>>>>>>\n"
11566 " End\n"
11567 "int i;\n"));
11568}
11569
Daniel Jasper471894432014-08-06 13:40:26 +000011570TEST_F(FormatTest, DisableRegions) {
11571 EXPECT_EQ("int i;\n"
11572 "// clang-format off\n"
11573 " int j;\n"
11574 "// clang-format on\n"
11575 "int k;",
11576 format(" int i;\n"
11577 " // clang-format off\n"
11578 " int j;\n"
11579 " // clang-format on\n"
11580 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011581 EXPECT_EQ("int i;\n"
11582 "/* clang-format off */\n"
11583 " int j;\n"
11584 "/* clang-format on */\n"
11585 "int k;",
11586 format(" int i;\n"
11587 " /* clang-format off */\n"
11588 " int j;\n"
11589 " /* clang-format on */\n"
11590 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011591
11592 // Don't reflow comments within disabled regions.
11593 EXPECT_EQ(
11594 "// clang-format off\n"
11595 "// long long long long long long line\n"
11596 "/* clang-format on */\n"
11597 "/* long long long\n"
11598 " * long long long\n"
11599 " * line */\n"
11600 "int i;\n"
11601 "/* clang-format off */\n"
11602 "/* long long long long long long line */\n",
11603 format("// clang-format off\n"
11604 "// long long long long long long line\n"
11605 "/* clang-format on */\n"
11606 "/* long long long long long long line */\n"
11607 "int i;\n"
11608 "/* clang-format off */\n"
11609 "/* long long long long long long line */\n",
11610 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011611}
11612
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011613TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11614 format("? ) =");
11615 verifyNoCrash("#define a\\\n /**/}");
11616}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011617
Daniel Jasper498f5582015-12-25 08:53:31 +000011618TEST_F(FormatTest, FormatsTableGenCode) {
11619 FormatStyle Style = getLLVMStyle();
11620 Style.Language = FormatStyle::LK_TableGen;
11621 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11622}
11623
Nico Weberb2673a12016-11-10 21:49:25 +000011624TEST_F(FormatTest, ArrayOfTemplates) {
11625 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11626 format("auto a = new unique_ptr<int > [ 10];"));
11627
11628 FormatStyle Spaces = getLLVMStyle();
11629 Spaces.SpacesInSquareBrackets = true;
11630 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11631 format("auto a = new unique_ptr<int > [10];", Spaces));
11632}
11633
11634TEST_F(FormatTest, ArrayAsTemplateType) {
11635 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11636 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11637
11638 FormatStyle Spaces = getLLVMStyle();
11639 Spaces.SpacesInSquareBrackets = true;
11640 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11641 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11642}
11643
Martin Probstc9c51c42017-03-16 10:21:35 +000011644TEST_F(FormatTest, NoSpaceAfterSuper) {
11645 verifyFormat("__super::FooBar();");
11646}
11647
Eric Liu547d8792016-03-24 13:22:42 +000011648TEST(FormatStyle, GetStyleOfFile) {
11649 vfs::InMemoryFileSystem FS;
11650 // Test 1: format file in the same directory.
11651 ASSERT_TRUE(
11652 FS.addFile("/a/.clang-format", 0,
11653 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11654 ASSERT_TRUE(
11655 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011656 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011657 ASSERT_TRUE((bool)Style1);
11658 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011659
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011660 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011661 ASSERT_TRUE(
11662 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011663 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011664 ASSERT_TRUE((bool)Style2);
11665 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011666
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011667 // Test 2.2: no format on 'none' fallback style.
11668 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11669 ASSERT_TRUE((bool)Style2);
11670 ASSERT_EQ(*Style2, getNoStyle());
11671
11672 // Test 2.3: format if config is found with no based style while fallback is
11673 // 'none'.
11674 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11675 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11676 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11677 ASSERT_TRUE((bool)Style2);
11678 ASSERT_EQ(*Style2, getLLVMStyle());
11679
11680 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11681 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11682 ASSERT_TRUE((bool)Style2);
11683 ASSERT_EQ(*Style2, getLLVMStyle());
11684
Eric Liu547d8792016-03-24 13:22:42 +000011685 // Test 3: format file in parent directory.
11686 ASSERT_TRUE(
11687 FS.addFile("/c/.clang-format", 0,
11688 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11689 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11690 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011691 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011692 ASSERT_TRUE((bool)Style3);
11693 ASSERT_EQ(*Style3, getGoogleStyle());
11694
11695 // Test 4: error on invalid fallback style
11696 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11697 ASSERT_FALSE((bool)Style4);
11698 llvm::consumeError(Style4.takeError());
11699
11700 // Test 5: error on invalid yaml on command line
11701 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11702 ASSERT_FALSE((bool)Style5);
11703 llvm::consumeError(Style5.takeError());
11704
11705 // Test 6: error on invalid style
11706 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11707 ASSERT_FALSE((bool)Style6);
11708 llvm::consumeError(Style6.takeError());
11709
11710 // Test 7: found config file, error on parsing it
11711 ASSERT_TRUE(
11712 FS.addFile("/d/.clang-format", 0,
11713 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11714 "InvalidKey: InvalidValue")));
11715 ASSERT_TRUE(
11716 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11717 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11718 ASSERT_FALSE((bool)Style7);
11719 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011720}
11721
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011722TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11723 // Column limit is 20.
11724 std::string Code = "Type *a =\n"
11725 " new Type();\n"
11726 "g(iiiii, 0, jjjjj,\n"
11727 " 0, kkkkk, 0, mm);\n"
11728 "int bad = format ;";
11729 std::string Expected = "auto a = new Type();\n"
11730 "g(iiiii, nullptr,\n"
11731 " jjjjj, nullptr,\n"
11732 " kkkkk, nullptr,\n"
11733 " mm);\n"
11734 "int bad = format ;";
11735 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011736 tooling::Replacements Replaces = toReplacements(
11737 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11738 "auto "),
11739 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11740 "nullptr"),
11741 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11742 "nullptr"),
11743 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11744 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011745
11746 format::FormatStyle Style = format::getLLVMStyle();
11747 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011748 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11749 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11750 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11751 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11752 EXPECT_TRUE(static_cast<bool>(Result));
11753 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011754}
11755
Eric Liubaf58c22016-05-18 13:43:48 +000011756TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11757 std::string Code = "#include \"a.h\"\n"
11758 "#include \"c.h\"\n"
11759 "\n"
11760 "int main() {\n"
11761 " return 0;\n"
11762 "}";
11763 std::string Expected = "#include \"a.h\"\n"
11764 "#include \"b.h\"\n"
11765 "#include \"c.h\"\n"
11766 "\n"
11767 "int main() {\n"
11768 " return 0;\n"
11769 "}";
11770 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011771 tooling::Replacements Replaces = toReplacements(
11772 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11773 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011774
11775 format::FormatStyle Style = format::getLLVMStyle();
11776 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011777 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11778 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11779 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11780 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11781 EXPECT_TRUE(static_cast<bool>(Result));
11782 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011783}
11784
Krasimir Georgievac16a202017-06-23 11:46:03 +000011785TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11786 EXPECT_EQ("using std::cin;\n"
11787 "using std::cout;",
11788 format("using std::cout;\n"
11789 "using std::cin;", getGoogleStyle()));
11790}
11791
Nico Weberdc065182017-04-05 18:10:42 +000011792TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11793 format::FormatStyle Style = format::getLLVMStyle();
11794 Style.Standard = FormatStyle::LS_Cpp03;
11795 // cpp03 recognize this string as identifier u8 and literal character 'a'
11796 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11797}
11798
11799TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11800 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11801 // all modes, including C++11, C++14 and C++17
11802 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11803}
11804
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000011805TEST_F(FormatTest, DoNotFormatLikelyXml) {
11806 EXPECT_EQ("<!-- ;> -->",
11807 format("<!-- ;> -->", getGoogleStyle()));
11808 EXPECT_EQ(" <!-- >; -->",
11809 format(" <!-- >; -->", getGoogleStyle()));
11810}
11811
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011812TEST_F(FormatTest, StructuredBindings) {
11813 // Structured bindings is a C++17 feature.
11814 // all modes, including C++11, C++14 and C++17
11815 verifyFormat("auto [a, b] = f();");
11816 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
11817 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
11818 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
11819 EXPECT_EQ("auto const volatile [a, b] = f();",
11820 format("auto const volatile[a, b] = f();"));
11821 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011822 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011823 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011824 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011825 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011826 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
11827 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011828 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011829 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
11830 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
11831 EXPECT_EQ("const auto volatile &&[a, b] = f();",
11832 format("const auto volatile &&[a, b] = f();"));
11833 EXPECT_EQ("volatile const auto &&[a, b] = f();",
11834 format("volatile const auto &&[a, b] = f();"));
11835 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011836
Manuel Klimeke411aa82017-09-20 09:29:37 +000011837 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011838 FormatStyle PointerMiddle = getLLVMStyle();
11839 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
11840 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
11841 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
11842 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
11843 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
11844 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
11845 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
11846 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
11847 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
11848 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
11849 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
11850 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
11851 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
11852
11853 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
11854 format("for (const auto && [a, b] : some_range) {\n}"));
11855 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
11856 format("for (const auto & [a, b] : some_range) {\n}"));
11857 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
11858 format("for (const auto[a, b] : some_range) {\n}"));
11859 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
11860 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
11861 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
11862 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
11863 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
11864 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
11865 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
11866 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000011867
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011868 format::FormatStyle Spaces = format::getLLVMStyle();
11869 Spaces.SpacesInSquareBrackets = true;
11870 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011871 verifyFormat("auto &&[ a, b ] = f();", Spaces);
11872 verifyFormat("auto &[ a, b ] = f();", Spaces);
11873 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
11874 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011875}
11876
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011877} // end namespace
11878} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011879} // end namespace clang