blob: f87fd8481afc5a46d1be80a7f622dac13deeda30 [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);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002550 // Non-identifier #define after potential include guard.
2551 verifyFormat("#ifndef FOO\n"
2552 "# define 1\n"
2553 "#endif\n",
2554 Style);
2555 // #if closes past last non-preprocessor line.
2556 verifyFormat("#ifndef FOO\n"
2557 "#define FOO\n"
2558 "#if 1\n"
2559 "int i;\n"
2560 "# define A 0\n"
2561 "#endif\n"
2562 "#endif\n",
2563 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002564 // FIXME: This doesn't handle the case where there's code between the
2565 // #ifndef and #define but all other conditions hold. This is because when
2566 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2567 // previous code line yet, so we can't detect it.
2568 EXPECT_EQ("#ifndef NOT_GUARD\n"
2569 "code();\n"
2570 "#define NOT_GUARD\n"
2571 "code();\n"
2572 "#endif",
2573 format("#ifndef NOT_GUARD\n"
2574 "code();\n"
2575 "# define NOT_GUARD\n"
2576 "code();\n"
2577 "#endif",
2578 Style));
2579 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2580 // be outside an include guard. Examples are #pragma once and
2581 // #pragma GCC diagnostic, or anything else that does not change the meaning
2582 // of the file if it's included multiple times.
2583 EXPECT_EQ("#ifdef WIN32\n"
2584 "# pragma once\n"
2585 "#endif\n"
2586 "#ifndef HEADER_H\n"
2587 "# define HEADER_H\n"
2588 "code();\n"
2589 "#endif",
2590 format("#ifdef WIN32\n"
2591 "# pragma once\n"
2592 "#endif\n"
2593 "#ifndef HEADER_H\n"
2594 "#define HEADER_H\n"
2595 "code();\n"
2596 "#endif",
2597 Style));
2598 // FIXME: This does not detect when there is a single non-preprocessor line
2599 // in front of an include-guard-like structure where other conditions hold
2600 // because ScopedLineState hides the line.
2601 EXPECT_EQ("code();\n"
2602 "#ifndef HEADER_H\n"
2603 "#define HEADER_H\n"
2604 "code();\n"
2605 "#endif",
2606 format("code();\n"
2607 "#ifndef HEADER_H\n"
2608 "# define HEADER_H\n"
2609 "code();\n"
2610 "#endif",
2611 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002612 // Keep comments aligned with #, otherwise indent comments normally. These
2613 // tests cannot use verifyFormat because messUp manipulates leading
2614 // whitespace.
2615 {
2616 const char *Expected = ""
2617 "void f() {\n"
2618 "#if 1\n"
2619 "// Preprocessor aligned.\n"
2620 "# define A 0\n"
2621 " // Code. Separated by blank line.\n"
2622 "\n"
2623 "# define B 0\n"
2624 " // Code. Not aligned with #\n"
2625 "# define C 0\n"
2626 "#endif";
2627 const char *ToFormat = ""
2628 "void f() {\n"
2629 "#if 1\n"
2630 "// Preprocessor aligned.\n"
2631 "# define A 0\n"
2632 "// Code. Separated by blank line.\n"
2633 "\n"
2634 "# define B 0\n"
2635 " // Code. Not aligned with #\n"
2636 "# define C 0\n"
2637 "#endif";
2638 EXPECT_EQ(Expected, format(ToFormat, Style));
2639 EXPECT_EQ(Expected, format(Expected, Style));
2640 }
2641 // Keep block quotes aligned.
2642 {
2643 const char *Expected = ""
2644 "void f() {\n"
2645 "#if 1\n"
2646 "/* Preprocessor aligned. */\n"
2647 "# define A 0\n"
2648 " /* Code. Separated by blank line. */\n"
2649 "\n"
2650 "# define B 0\n"
2651 " /* Code. Not aligned with # */\n"
2652 "# define C 0\n"
2653 "#endif";
2654 const char *ToFormat = ""
2655 "void f() {\n"
2656 "#if 1\n"
2657 "/* Preprocessor aligned. */\n"
2658 "# define A 0\n"
2659 "/* Code. Separated by blank line. */\n"
2660 "\n"
2661 "# define B 0\n"
2662 " /* Code. Not aligned with # */\n"
2663 "# define C 0\n"
2664 "#endif";
2665 EXPECT_EQ(Expected, format(ToFormat, Style));
2666 EXPECT_EQ(Expected, format(Expected, Style));
2667 }
2668 // Keep comments aligned with un-indented directives.
2669 {
2670 const char *Expected = ""
2671 "void f() {\n"
2672 "// Preprocessor aligned.\n"
2673 "#define A 0\n"
2674 " // Code. Separated by blank line.\n"
2675 "\n"
2676 "#define B 0\n"
2677 " // Code. Not aligned with #\n"
2678 "#define C 0\n";
2679 const char *ToFormat = ""
2680 "void f() {\n"
2681 "// Preprocessor aligned.\n"
2682 "#define A 0\n"
2683 "// Code. Separated by blank line.\n"
2684 "\n"
2685 "#define B 0\n"
2686 " // Code. Not aligned with #\n"
2687 "#define C 0\n";
2688 EXPECT_EQ(Expected, format(ToFormat, Style));
2689 EXPECT_EQ(Expected, format(Expected, Style));
2690 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002691 // Test with tabs.
2692 Style.UseTab = FormatStyle::UT_Always;
2693 Style.IndentWidth = 8;
2694 Style.TabWidth = 8;
2695 verifyFormat("#ifdef _WIN32\n"
2696 "#\tdefine A 0\n"
2697 "#\tifdef VAR2\n"
2698 "#\t\tdefine B 1\n"
2699 "#\t\tinclude <someheader.h>\n"
2700 "#\t\tdefine MACRO \\\n"
2701 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2702 "#\tendif\n"
2703 "#else\n"
2704 "#\tdefine A 1\n"
2705 "#endif",
2706 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002707
2708 // Regression test: Multiline-macro inside include guards.
2709 verifyFormat("#ifndef HEADER_H\n"
2710 "#define HEADER_H\n"
2711 "#define A() \\\n"
2712 " int i; \\\n"
2713 " int j;\n"
2714 "#endif // HEADER_H",
2715 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002716}
2717
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002718TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002719 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002720}
2721
Manuel Klimek1058d982013-01-06 20:07:31 +00002722TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2723 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2724 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2725 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2726 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2727}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002728
Daniel Jaspere2408e32015-05-06 11:16:43 +00002729TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002730 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2731 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2732 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002733 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002734 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002735 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002736 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002737
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002738 FormatStyle AlignLeft = getLLVMStyle();
2739 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2740 EXPECT_EQ("#define MACRO(x) \\\n"
2741 "private: \\\n"
2742 " int x(int a);\n",
2743 format("#define MACRO(x) \\\n"
2744 "private: \\\n"
2745 " int x(int a);\n",
2746 AlignLeft));
2747
2748 // CRLF line endings
2749 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2750 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2751 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2752 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2753 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2754 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2755 EXPECT_EQ("#define MACRO(x) \\\r\n"
2756 "private: \\\r\n"
2757 " int x(int a);\r\n",
2758 format("#define MACRO(x) \\\r\n"
2759 "private: \\\r\n"
2760 " int x(int a);\r\n",
2761 AlignLeft));
2762
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002763 FormatStyle DontAlign = getLLVMStyle();
2764 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2765 DontAlign.MaxEmptyLinesToKeep = 3;
2766 // FIXME: can't use verifyFormat here because the newline before
2767 // "public:" is not inserted the first time it's reformatted
2768 EXPECT_EQ("#define A \\\n"
2769 " class Foo { \\\n"
2770 " void bar(); \\\n"
2771 "\\\n"
2772 "\\\n"
2773 "\\\n"
2774 " public: \\\n"
2775 " void baz(); \\\n"
2776 " };",
2777 format("#define A \\\n"
2778 " class Foo { \\\n"
2779 " void bar(); \\\n"
2780 "\\\n"
2781 "\\\n"
2782 "\\\n"
2783 " public: \\\n"
2784 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002785 " };",
2786 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002787}
2788
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002789TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2790 verifyFormat("#define A \\\n"
2791 " int v( \\\n"
2792 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002793 " int i;",
2794 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002795}
2796
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002797TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002798 EXPECT_EQ(
2799 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2800 " \\\n"
2801 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2802 "\n"
2803 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2804 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2805 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2806 "\\\n"
2807 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2808 " \n"
2809 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2810 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002811}
2812
Manuel Klimek52b15152013-01-09 15:25:02 +00002813TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2814 EXPECT_EQ("int\n"
2815 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002816 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002817 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002818 verifyFormat("functionCallTo(\n"
2819 " someOtherFunction(\n"
2820 " withSomeParameters, whichInSequence,\n"
2821 " areLongerThanALine(andAnotherCall,\n"
2822 "#define A B\n"
2823 " withMoreParamters,\n"
2824 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002825 " andMoreParameters),\n"
2826 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002827 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002828 verifyFormat("Foo::Foo()\n"
2829 "#ifdef BAR\n"
2830 " : baz(0)\n"
2831 "#endif\n"
2832 "{\n"
2833 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002834 verifyFormat("void f() {\n"
2835 " if (true)\n"
2836 "#ifdef A\n"
2837 " f(42);\n"
2838 " x();\n"
2839 "#else\n"
2840 " g();\n"
2841 " x();\n"
2842 "#endif\n"
2843 "}");
2844 verifyFormat("void f(param1, param2,\n"
2845 " param3,\n"
2846 "#ifdef A\n"
2847 " param4(param5,\n"
2848 "#ifdef A1\n"
2849 " param6,\n"
2850 "#ifdef A2\n"
2851 " param7),\n"
2852 "#else\n"
2853 " param8),\n"
2854 " param9,\n"
2855 "#endif\n"
2856 " param10,\n"
2857 "#endif\n"
2858 " param11)\n"
2859 "#else\n"
2860 " param12)\n"
2861 "#endif\n"
2862 "{\n"
2863 " x();\n"
2864 "}",
2865 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002866 verifyFormat("#if 1\n"
2867 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002868 verifyFormat("#if 1\n"
2869 "#endif\n"
2870 "#if 1\n"
2871 "#else\n"
2872 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002873 verifyFormat("DEBUG({\n"
2874 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2876 "});\n"
2877 "#if a\n"
2878 "#else\n"
2879 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002880
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002881 verifyIncompleteFormat("void f(\n"
2882 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002883 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002884 "#else\n"
2885 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002886}
2887
Manuel Klimek14bd9172014-01-29 08:49:02 +00002888TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2889 verifyFormat("#endif\n"
2890 "#if B");
2891}
2892
Manuel Klimek88033d72013-10-21 08:11:15 +00002893TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2894 FormatStyle SingleLine = getLLVMStyle();
2895 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002896 verifyFormat("#if 0\n"
2897 "#elif 1\n"
2898 "#endif\n"
2899 "void foo() {\n"
2900 " if (test) foo2();\n"
2901 "}",
2902 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002903}
2904
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002905TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002906 verifyFormat("functionCall({ int i; });");
2907 verifyFormat("functionCall({\n"
2908 " int i;\n"
2909 " int j;\n"
2910 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002911 verifyFormat("functionCall(\n"
2912 " {\n"
2913 " int i;\n"
2914 " int j;\n"
2915 " },\n"
2916 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002917 verifyFormat("functionA(functionB({\n"
2918 " int i;\n"
2919 " int j;\n"
2920 " }),\n"
2921 " aaaa, bbbb, cccc);");
2922 verifyFormat("functionCall(\n"
2923 " {\n"
2924 " int i;\n"
2925 " int j;\n"
2926 " },\n"
2927 " aaaa, bbbb, // comment\n"
2928 " cccc);");
2929 verifyFormat("functionA(functionB({\n"
2930 " int i;\n"
2931 " int j;\n"
2932 " }),\n"
2933 " aaaa, bbbb, // comment\n"
2934 " cccc);");
2935 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2936 verifyFormat("functionCall(aaaa, bbbb, {\n"
2937 " int i;\n"
2938 " int j;\n"
2939 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002940 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002941 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002942 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002943 " int i; // break\n"
2944 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002945 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2946 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002947 verifyFormat("DEBUG({\n"
2948 " if (a)\n"
2949 " f();\n"
2950 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002951}
2952
2953TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002954 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002955 "int i;",
2956 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002957}
2958
2959TEST_F(FormatTest, LayoutNestedBlocks) {
2960 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2961 " struct s {\n"
2962 " int i;\n"
2963 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002964 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002965 " for (int i = 0; i < 10; ++i)\n"
2966 " return;\n"
2967 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002968 verifyFormat("call(parameter, {\n"
2969 " something();\n"
2970 " // Comment using all columns.\n"
2971 " somethingelse();\n"
2972 "});",
2973 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002974 verifyFormat("DEBUG( //\n"
2975 " { f(); }, a);");
2976 verifyFormat("DEBUG( //\n"
2977 " {\n"
2978 " f(); //\n"
2979 " },\n"
2980 " a);");
2981
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002982 EXPECT_EQ("call(parameter, {\n"
2983 " something();\n"
2984 " // Comment too\n"
2985 " // looooooooooong.\n"
2986 " somethingElse();\n"
2987 "});",
2988 format("call(parameter, {\n"
2989 " something();\n"
2990 " // Comment too looooooooooong.\n"
2991 " somethingElse();\n"
2992 "});",
2993 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002994 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002995 EXPECT_EQ("DEBUG({ // comment\n"
2996 " int i;\n"
2997 "});",
2998 format("DEBUG({ // comment\n"
2999 "int i;\n"
3000 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003001 EXPECT_EQ("DEBUG({\n"
3002 " int i;\n"
3003 "\n"
3004 " // comment\n"
3005 " int j;\n"
3006 "});",
3007 format("DEBUG({\n"
3008 " int i;\n"
3009 "\n"
3010 " // comment\n"
3011 " int j;\n"
3012 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003013
3014 verifyFormat("DEBUG({\n"
3015 " if (a)\n"
3016 " return;\n"
3017 "});");
3018 verifyGoogleFormat("DEBUG({\n"
3019 " if (a) return;\n"
3020 "});");
3021 FormatStyle Style = getGoogleStyle();
3022 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003023 verifyFormat("Debug(aaaaa,\n"
3024 " {\n"
3025 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3026 " },\n"
3027 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003028 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003029
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003030 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3031
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003032 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003033}
3034
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003035TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3036 EXPECT_EQ("#define MACRO() \\\n"
3037 " Debug(aaa, /* force line break */ \\\n"
3038 " { \\\n"
3039 " int i; \\\n"
3040 " int j; \\\n"
3041 " })",
3042 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3043 " { int i; int j; })",
3044 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003045
3046 EXPECT_EQ("#define A \\\n"
3047 " [] { \\\n"
3048 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3049 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3050 " }",
3051 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3052 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3053 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003054}
3055
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003056TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3057 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003058 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003059 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003060}
3061
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003062TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3063 FormatStyle Style = getLLVMStyle();
3064 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3065 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3066 verifyFormat("FOO_BEGIN\n"
3067 " FOO_ENTRY\n"
3068 "FOO_END", Style);
3069 verifyFormat("FOO_BEGIN\n"
3070 " NESTED_FOO_BEGIN\n"
3071 " NESTED_FOO_ENTRY\n"
3072 " NESTED_FOO_END\n"
3073 "FOO_END", Style);
3074 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3075 " int x;\n"
3076 " x = 1;\n"
3077 "FOO_END(Baz)", Style);
3078}
3079
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003080//===----------------------------------------------------------------------===//
3081// Line break tests.
3082//===----------------------------------------------------------------------===//
3083
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003084TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003085 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003086 "void f() {\n"
3087 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3088 " parameter, parameter, parameter)),\n"
3089 " SecondLongCall(parameter));\n"
3090 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003091 verifyFormat(
3092 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3093 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3095 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3096 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003097 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3098 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3099 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3100 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003101 verifyFormat(
3102 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3103 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3105 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003106 verifyFormat("int a = bbbb && ccc &&\n"
3107 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003108 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003109 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003110}
3111
Daniel Jasperd69fc772013-05-08 14:12:04 +00003112TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3113 verifyFormat(
3114 "bool aaaaaaa =\n"
3115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3116 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003117 verifyFormat(
3118 "bool aaaaaaa =\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3120 " bbbbbbbb();");
3121
Daniel Jasperd69fc772013-05-08 14:12:04 +00003122 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3124 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003125 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3127 " ccccccccc == ddddddddddd;");
3128 verifyFormat(
3129 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3131 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003132
3133 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3134 " aaaaaa) &&\n"
3135 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003136 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3137 " aaaaaa) >>\n"
3138 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003139 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003140 " SourceMgr.getSpellingColumnNumber(\n"
3141 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3142 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003143
Daniel Jasper68d888c2013-06-03 08:42:05 +00003144 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3145 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3146 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003147 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3148 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3149 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003150 verifyFormat("b = a &&\n"
3151 " // Comment\n"
3152 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003153
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003154 // If the LHS of a comparison is not a binary expression itself, the
3155 // additional linebreak confuses many people.
3156 verifyFormat(
3157 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3159 "}");
3160 verifyFormat(
3161 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3163 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003164 verifyFormat(
3165 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3167 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003168 verifyFormat(
3169 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3171 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003172 // Even explicit parentheses stress the precedence enough to make the
3173 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003174 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3176 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003177 // This cases is borderline, but with the indentation it is still readable.
3178 verifyFormat(
3179 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3180 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3182 "}",
3183 getLLVMStyleWithColumns(75));
3184
3185 // If the LHS is a binary expression, we should still use the additional break
3186 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003187 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3189 " 5) {\n"
3190 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003191 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3193 " 5) {\n"
3194 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003195
Daniel Jasper571f1af2013-05-14 20:39:56 +00003196 FormatStyle OnePerLine = getLLVMStyle();
3197 OnePerLine.BinPackParameters = false;
3198 verifyFormat(
3199 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3202 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003203
3204 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3205 " .aaa(aaaaaaaaaaaaa) *\n"
3206 " aaaaaaa +\n"
3207 " aaaaaaa;",
3208 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003209}
3210
Daniel Jasper6bee6822013-04-08 20:33:42 +00003211TEST_F(FormatTest, ExpressionIndentation) {
3212 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3216 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3217 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3220 " ccccccccccccccccccccccccccccccccccccccccc;");
3221 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3224 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3225 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3228 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3229 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3232 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003233 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003234 "} else if (aaaaa && bbbbb > // break\n"
3235 " ccccc) {\n"
3236 "}");
3237 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003238 "} else if (aaaaa &&\n"
3239 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003240 " ccccc &&\n"
3241 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003242 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003243
3244 // Presence of a trailing comment used to change indentation of b.
3245 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3246 " b;\n"
3247 "return aaaaaaaaaaaaaaaaaaa +\n"
3248 " b; //",
3249 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003250}
3251
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003252TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3253 // Not sure what the best system is here. Like this, the LHS can be found
3254 // immediately above an operator (everything with the same or a higher
3255 // indent). The RHS is aligned right of the operator and so compasses
3256 // everything until something with the same indent as the operator is found.
3257 // FIXME: Is this a good system?
3258 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003259 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003260 verifyFormat(
3261 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003262 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3263 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3264 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3265 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3266 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003267 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003268 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3269 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003270 Style);
3271 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003272 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3273 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003274 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3275 Style);
3276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003277 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3278 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003279 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3280 Style);
3281 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3282 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003283 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3284 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003285 Style);
3286 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003287 "} else if (aaaaa\n"
3288 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003289 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003290 "}",
3291 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003292 verifyFormat("return (a)\n"
3293 " // comment\n"
3294 " + b;",
3295 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003296 verifyFormat(
3297 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3298 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3299 " + cc;",
3300 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003301
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3303 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3304 Style);
3305
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003306 // Forced by comments.
3307 verifyFormat(
3308 "unsigned ContentSize =\n"
3309 " sizeof(int16_t) // DWARF ARange version number\n"
3310 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3311 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3312 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003313
3314 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3315 " == boost::fusion::at_c<1>(iiii).second;",
3316 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003317
3318 Style.ColumnLimit = 60;
3319 verifyFormat("zzzzzzzzzz\n"
3320 " = bbbbbbbbbbbbbbbbb\n"
3321 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3322 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003323}
3324
Daniel Jasperb1270392017-02-01 23:27:37 +00003325TEST_F(FormatTest, EnforcedOperatorWraps) {
3326 // Here we'd like to wrap after the || operators, but a comment is forcing an
3327 // earlier wrap.
3328 verifyFormat("bool x = aaaaa //\n"
3329 " || bbbbb\n"
3330 " //\n"
3331 " || cccc;");
3332}
3333
Daniel Jasper3219e432014-12-02 13:24:51 +00003334TEST_F(FormatTest, NoOperandAlignment) {
3335 FormatStyle Style = getLLVMStyle();
3336 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003337 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3340 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003341 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003342 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3343 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3344 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3345 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3346 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3347 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3348 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3349 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3350 " > ccccccccccccccccccccccccccccccccccccccccc;",
3351 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003352
3353 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3355 " + cc;",
3356 Style);
3357 verifyFormat("int a = aa\n"
3358 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003359 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003360 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003361
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003362 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003363 verifyFormat("return (a > b\n"
3364 " // comment1\n"
3365 " // comment2\n"
3366 " || c);",
3367 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003368}
3369
Daniel Jasperac043c92014-09-15 11:11:00 +00003370TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3371 FormatStyle Style = getLLVMStyle();
3372 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3373 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003375 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3376 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003377}
3378
Daniel Jasper988e7e42017-05-08 15:07:52 +00003379TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3380 FormatStyle Style = getLLVMStyle();
3381 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3382 Style.BinPackArguments = false;
3383 Style.ColumnLimit = 40;
3384 verifyFormat("void test() {\n"
3385 " someFunction(\n"
3386 " this + argument + is + quite\n"
3387 " + long + so + it + gets + wrapped\n"
3388 " + but + remains + bin - packed);\n"
3389 "}",
3390 Style);
3391 verifyFormat("void test() {\n"
3392 " someFunction(arg1,\n"
3393 " this + argument + is\n"
3394 " + quite + long + so\n"
3395 " + it + gets + wrapped\n"
3396 " + but + remains + bin\n"
3397 " - packed,\n"
3398 " arg3);\n"
3399 "}",
3400 Style);
3401 verifyFormat("void test() {\n"
3402 " someFunction(\n"
3403 " arg1,\n"
3404 " this + argument + has\n"
3405 " + anotherFunc(nested,\n"
3406 " calls + whose\n"
3407 " + arguments\n"
3408 " + are + also\n"
3409 " + wrapped,\n"
3410 " in + addition)\n"
3411 " + to + being + bin - packed,\n"
3412 " arg3);\n"
3413 "}",
3414 Style);
3415
3416 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3417 verifyFormat("void test() {\n"
3418 " someFunction(\n"
3419 " arg1,\n"
3420 " this + argument + has +\n"
3421 " anotherFunc(nested,\n"
3422 " calls + whose +\n"
3423 " arguments +\n"
3424 " are + also +\n"
3425 " wrapped,\n"
3426 " in + addition) +\n"
3427 " to + being + bin - packed,\n"
3428 " arg3);\n"
3429 "}",
3430 Style);
3431}
3432
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003433TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003434 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003435 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3436 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003437 verifyFormat("Constructor()\n"
3438 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003439 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003440 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003441 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003442 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003443
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003444 verifyFormat("template <typename T>\n"
3445 "Constructor() : Initializer(FitsOnTheLine) {}",
3446 getLLVMStyleWithColumns(45));
3447
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003448 verifyFormat(
3449 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003450 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003451
3452 verifyFormat(
3453 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003454 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003455 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003456 verifyFormat(
3457 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003458 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003459 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003460 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3461 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3462 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003463
3464 verifyFormat("Constructor()\n"
3465 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3466 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3467 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003468 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003469
Daniel Jasper65585ed2013-01-28 13:31:35 +00003470 verifyFormat("Constructor()\n"
3471 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003473
Daniel Jasper62e68172013-02-25 15:59:54 +00003474 verifyFormat("Constructor(int Parameter = 0)\n"
3475 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3476 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003477 verifyFormat("Constructor()\n"
3478 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3479 "}",
3480 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003481 verifyFormat("Constructor()\n"
3482 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3483 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003484
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003485 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003486 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003487 verifyFormat("Constructor()\n"
3488 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3489 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3490 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003491
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003492 FormatStyle OnePerLine = getLLVMStyle();
3493 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003494 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003495 verifyFormat("SomeClass::Constructor()\n"
3496 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3497 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003498 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003499 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003500 verifyFormat("SomeClass::Constructor()\n"
3501 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3502 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003503 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003504 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003505 verifyFormat("MyClass::MyClass(int var)\n"
3506 " : some_var_(var), // 4 space indent\n"
3507 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003508 "}",
3509 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003510 verifyFormat("Constructor()\n"
3511 " : aaaaa(aaaaaa),\n"
3512 " aaaaa(aaaaaa),\n"
3513 " aaaaa(aaaaaa),\n"
3514 " aaaaa(aaaaaa),\n"
3515 " aaaaa(aaaaaa) {}",
3516 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003517 verifyFormat("Constructor()\n"
3518 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3519 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3520 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003521 OnePerLine.BinPackParameters = false;
3522 verifyFormat(
3523 "Constructor()\n"
3524 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3525 " aaaaaaaaaaa().aaa(),\n"
3526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3527 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003528 OnePerLine.ColumnLimit = 60;
3529 verifyFormat("Constructor()\n"
3530 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3531 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3532 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003533
3534 EXPECT_EQ("Constructor()\n"
3535 " : // Comment forcing unwanted break.\n"
3536 " aaaa(aaaa) {}",
3537 format("Constructor() :\n"
3538 " // Comment forcing unwanted break.\n"
3539 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003540}
3541
Francois Ferranda6b6d512017-05-24 11:36:58 +00003542TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3543 FormatStyle Style = getLLVMStyle();
3544 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3545
3546 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3547 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3548 getStyleWithColumns(Style, 45));
3549 verifyFormat("Constructor() :\n"
3550 " Initializer(FitsOnTheLine) {}",
3551 getStyleWithColumns(Style, 44));
3552 verifyFormat("Constructor() :\n"
3553 " Initializer(FitsOnTheLine) {}",
3554 getStyleWithColumns(Style, 43));
3555
3556 verifyFormat("template <typename T>\n"
3557 "Constructor() : Initializer(FitsOnTheLine) {}",
3558 getStyleWithColumns(Style, 50));
3559
3560 verifyFormat(
3561 "SomeClass::Constructor() :\n"
3562 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3563 Style);
3564
3565 verifyFormat(
3566 "SomeClass::Constructor() :\n"
3567 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3568 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3569 Style);
3570 verifyFormat(
3571 "SomeClass::Constructor() :\n"
3572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3573 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3574 Style);
3575 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3576 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3577 " aaaaaaaaaa(aaaaaa) {}",
3578 Style);
3579
3580 verifyFormat("Constructor() :\n"
3581 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3583 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3585 Style);
3586
3587 verifyFormat("Constructor() :\n"
3588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3590 Style);
3591
3592 verifyFormat("Constructor(int Parameter = 0) :\n"
3593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3594 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3595 Style);
3596 verifyFormat("Constructor() :\n"
3597 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3598 "}",
3599 getStyleWithColumns(Style, 60));
3600 verifyFormat("Constructor() :\n"
3601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3602 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3603 Style);
3604
3605 // Here a line could be saved by splitting the second initializer onto two
3606 // lines, but that is not desirable.
3607 verifyFormat("Constructor() :\n"
3608 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3609 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3610 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3611 Style);
3612
3613 FormatStyle OnePerLine = Style;
3614 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3615 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3616 verifyFormat("SomeClass::Constructor() :\n"
3617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3618 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3619 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3620 OnePerLine);
3621 verifyFormat("SomeClass::Constructor() :\n"
3622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3623 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3624 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3625 OnePerLine);
3626 verifyFormat("MyClass::MyClass(int var) :\n"
3627 " some_var_(var), // 4 space indent\n"
3628 " some_other_var_(var + 1) { // lined up\n"
3629 "}",
3630 OnePerLine);
3631 verifyFormat("Constructor() :\n"
3632 " aaaaa(aaaaaa),\n"
3633 " aaaaa(aaaaaa),\n"
3634 " aaaaa(aaaaaa),\n"
3635 " aaaaa(aaaaaa),\n"
3636 " aaaaa(aaaaaa) {}",
3637 OnePerLine);
3638 verifyFormat("Constructor() :\n"
3639 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3640 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3641 OnePerLine);
3642 OnePerLine.BinPackParameters = false;
3643 verifyFormat(
3644 "Constructor() :\n"
3645 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3646 " aaaaaaaaaaa().aaa(),\n"
3647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3648 OnePerLine);
3649 OnePerLine.ColumnLimit = 60;
3650 verifyFormat("Constructor() :\n"
3651 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3652 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3653 OnePerLine);
3654
3655 EXPECT_EQ("Constructor() :\n"
3656 " // Comment forcing unwanted break.\n"
3657 " aaaa(aaaa) {}",
3658 format("Constructor() :\n"
3659 " // Comment forcing unwanted break.\n"
3660 " aaaa(aaaa) {}",
3661 Style));
3662
3663 Style.ColumnLimit = 0;
3664 verifyFormat("SomeClass::Constructor() :\n"
3665 " a(a) {}",
3666 Style);
3667 verifyFormat("SomeClass::Constructor() noexcept :\n"
3668 " a(a) {}",
3669 Style);
3670 verifyFormat("SomeClass::Constructor() :\n"
3671 " a(a), b(b), c(c) {}",
3672 Style);
3673 verifyFormat("SomeClass::Constructor() :\n"
3674 " a(a) {\n"
3675 " foo();\n"
3676 " bar();\n"
3677 "}",
3678 Style);
3679
3680 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3681 verifyFormat("SomeClass::Constructor() :\n"
3682 " a(a), b(b), c(c) {\n"
3683 "}",
3684 Style);
3685 verifyFormat("SomeClass::Constructor() :\n"
3686 " a(a) {\n"
3687 "}",
3688 Style);
3689
3690 Style.ColumnLimit = 80;
3691 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3692 Style.ConstructorInitializerIndentWidth = 2;
3693 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3694 Style);
3695 verifyFormat("SomeClass::Constructor() :\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3697 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3698 Style);
3699}
3700
David Blaikieea95dd72017-08-31 18:49:34 +00003701#ifndef EXPENSIVE_CHECKS
3702// Expensive checks enables libstdc++ checking which includes validating the
3703// state of ranges used in std::priority_queue - this blows out the
3704// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003705TEST_F(FormatTest, MemoizationTests) {
3706 // This breaks if the memoization lookup does not take \c Indent and
3707 // \c LastSpace into account.
3708 verifyFormat(
3709 "extern CFRunLoopTimerRef\n"
3710 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3711 " CFTimeInterval interval, CFOptionFlags flags,\n"
3712 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003713 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003714
3715 // Deep nesting somewhat works around our memoization.
3716 verifyFormat(
3717 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3718 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3719 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3720 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3721 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3722 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003723 verifyFormat(
3724 "aaaaa(\n"
3725 " aaaaa,\n"
3726 " aaaaa(\n"
3727 " aaaaa,\n"
3728 " aaaaa(\n"
3729 " aaaaa,\n"
3730 " aaaaa(\n"
3731 " aaaaa,\n"
3732 " aaaaa(\n"
3733 " aaaaa,\n"
3734 " aaaaa(\n"
3735 " aaaaa,\n"
3736 " aaaaa(\n"
3737 " aaaaa,\n"
3738 " aaaaa(\n"
3739 " aaaaa,\n"
3740 " aaaaa(\n"
3741 " aaaaa,\n"
3742 " aaaaa(\n"
3743 " aaaaa,\n"
3744 " aaaaa(\n"
3745 " aaaaa,\n"
3746 " aaaaa(\n"
3747 " aaaaa,\n"
3748 " aaaaa))))))))))));",
3749 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003750 verifyFormat(
3751 "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"
3752 " a),\n"
3753 " a),\n"
3754 " a),\n"
3755 " a),\n"
3756 " a),\n"
3757 " a),\n"
3758 " a),\n"
3759 " a),\n"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a)",
3769 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003770
3771 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003772 FormatStyle OnePerLine = getLLVMStyle();
3773 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003774 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003775 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003776 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003777 for (unsigned i = 0, e = 80; i != e; ++i) {
3778 input += " a,\n";
3779 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003780 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003781 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003782}
David Blaikieea95dd72017-08-31 18:49:34 +00003783#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003784
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003785TEST_F(FormatTest, BreaksAsHighAsPossible) {
3786 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003787 "void f() {\n"
3788 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3789 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3790 " f();\n"
3791 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003792 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003793 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003794}
3795
Daniel Jasper6728fc12013-04-11 14:29:13 +00003796TEST_F(FormatTest, BreaksFunctionDeclarations) {
3797 // Principially, we break function declarations in a certain order:
3798 // 1) break amongst arguments.
3799 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3800 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003801 verifyFormat("template <class TemplateIt>\n"
3802 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3803 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003804
3805 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003806 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003807 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003808 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003809 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003810
3811 // 3) break after (.
3812 verifyFormat(
3813 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003814 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3815 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003816
3817 // 4) break before after nested name specifiers.
3818 verifyFormat(
3819 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003820 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3821 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003822 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003823
3824 // However, there are exceptions, if a sufficient amount of lines can be
3825 // saved.
3826 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3827 // more adjusting.
3828 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3829 " Cccccccccccccc cccccccccc,\n"
3830 " Cccccccccccccc cccccccccc,\n"
3831 " Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc);");
3833 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003834 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003835 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3836 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3837 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003838 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003839 verifyFormat(
3840 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3841 " Cccccccccccccc cccccccccc,\n"
3842 " Cccccccccccccc cccccccccc,\n"
3843 " Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc);");
3847 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3848 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3850 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003852
3853 // Break after multi-line parameters.
3854 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3857 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003858 verifyFormat("void SomeLoooooooooooongFunction(\n"
3859 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3860 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3861 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003862
3863 // Treat overloaded operators like other functions.
3864 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3865 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003866 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3867 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003868 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3869 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3870 verifyGoogleFormat(
3871 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3872 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003873 verifyGoogleFormat(
3874 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3875 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003876 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3877 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3878 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3879 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003880 verifyGoogleFormat(
3881 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3882 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3883 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003884 verifyGoogleFormat(
3885 "template <typename T>\n"
3886 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3887 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3888 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003889
3890 FormatStyle Style = getLLVMStyle();
3891 Style.PointerAlignment = FormatStyle::PAS_Left;
3892 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3893 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3894 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003895 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3897 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003898}
3899
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003900TEST_F(FormatTest, TrailingReturnType) {
3901 verifyFormat("auto foo() -> int;\n");
3902 verifyFormat("struct S {\n"
3903 " auto bar() const -> int;\n"
3904 "};");
3905 verifyFormat("template <size_t Order, typename T>\n"
3906 "auto load_img(const std::string &filename)\n"
3907 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003908 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3909 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003910 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003911 verifyFormat("template <typename T>\n"
3912 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3913 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003914
3915 // Not trailing return types.
3916 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003917}
3918
Daniel Jasper5be31f72013-05-21 09:16:31 +00003919TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003920 // Avoid breaking before trailing 'const' or other trailing annotations, if
3921 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003922 FormatStyle Style = getGoogleStyle();
3923 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003924 verifyFormat("void someLongFunction(\n"
3925 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003926 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003927 verifyFormat("LoooooongReturnType\n"
3928 "someLoooooooongFunction() const {}",
3929 getLLVMStyleWithColumns(47));
3930 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3931 " const {}",
3932 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003933 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3934 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3935 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3936 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3937 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3938 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003939 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3940 " aaaaaaaaaaa aaaaa) const override;");
3941 verifyGoogleFormat(
3942 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3943 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003944
Daniel Jasper5550de62014-02-17 07:57:46 +00003945 // Even if the first parameter has to be wrapped.
3946 verifyFormat("void someLongFunction(\n"
3947 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003948 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003949 verifyFormat("void someLongFunction(\n"
3950 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003951 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003952 verifyFormat("void someLongFunction(\n"
3953 " int someLongParameter) override {}",
3954 Style);
3955 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003956 " int someLongParameter) OVERRIDE {}",
3957 Style);
3958 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003959 " int someLongParameter) final {}",
3960 Style);
3961 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003962 " int someLongParameter) FINAL {}",
3963 Style);
3964 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003965 " int parameter) const override {}",
3966 Style);
3967
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003968 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3969 verifyFormat("void someLongFunction(\n"
3970 " int someLongParameter) const\n"
3971 "{\n"
3972 "}",
3973 Style);
3974
Daniel Jasper5550de62014-02-17 07:57:46 +00003975 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003976 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3977 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3978 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003979
3980 // Breaking before function-like trailing annotations is fine to keep them
3981 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003982 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3983 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3984 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3985 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3986 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3987 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003988 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3989 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003990 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003991
3992 verifyFormat(
3993 "void aaaaaaaaaaaaaaaaaa()\n"
3994 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3995 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3996 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3997 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003998 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003999 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004000 " GUARDED_BY(aaaaaaaaaaaa);");
4001 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004002 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004003 " GUARDED_BY(aaaaaaaaaaaa);");
4004 verifyGoogleFormat(
4005 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4006 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004007 verifyGoogleFormat(
4008 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4009 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004010}
4011
Daniel Jasperf090f032015-05-18 09:47:22 +00004012TEST_F(FormatTest, FunctionAnnotations) {
4013 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004014 "int OldFunction(const string &parameter) {}");
4015 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004016 "string OldFunction(const string &parameter) {}");
4017 verifyFormat("template <typename T>\n"
4018 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4019 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004020
4021 // Not function annotations.
4022 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4023 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004024 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4025 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004026 verifyFormat("MACRO(abc).function() // wrap\n"
4027 " << abc;");
4028 verifyFormat("MACRO(abc)->function() // wrap\n"
4029 " << abc;");
4030 verifyFormat("MACRO(abc)::function() // wrap\n"
4031 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004032}
4033
Daniel Jasperf7935112012-12-03 18:12:45 +00004034TEST_F(FormatTest, BreaksDesireably) {
4035 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4036 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004037 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004038 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4040 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004041
4042 verifyFormat(
4043 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004045
4046 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004049
4050 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004051 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4052 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004054 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004056
4057 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4058 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4059
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004060 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004061 "void f() {\n"
4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4064 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004065 verifyFormat(
4066 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4068 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004069 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4071 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004072 "aaaaaa(aaa,\n"
4073 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4075 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004076 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004079
Daniel Jasper739b85f2015-06-29 10:42:59 +00004080 // Indent consistently independent of call expression and unary operator.
4081 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4082 " dddddddddddddddddddddddddddddd));");
4083 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4084 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004085 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004086 " dddddddddddddddddddddddddddddd));");
4087
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004088 // This test case breaks on an incorrect memoization, i.e. an optimization not
4089 // taking into account the StopAt value.
4090 verifyFormat(
4091 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004092 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4094 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004095
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004096 verifyFormat("{\n {\n {\n"
4097 " Annotation.SpaceRequiredBefore =\n"
4098 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4099 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4100 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004101
4102 // Break on an outer level if there was a break on an inner level.
4103 EXPECT_EQ("f(g(h(a, // comment\n"
4104 " b, c),\n"
4105 " d, e),\n"
4106 " x, y);",
4107 format("f(g(h(a, // comment\n"
4108 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004109
4110 // Prefer breaking similar line breaks.
4111 verifyFormat(
4112 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4113 " NSTrackingMouseEnteredAndExited |\n"
4114 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004115}
4116
Daniel Jasper18210d72014-10-09 09:52:05 +00004117TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4118 FormatStyle NoBinPacking = getGoogleStyle();
4119 NoBinPacking.BinPackParameters = false;
4120 NoBinPacking.BinPackArguments = true;
4121 verifyFormat("void f() {\n"
4122 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4124 "}",
4125 NoBinPacking);
4126 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4127 " int aaaaaaaaaaaaaaaaaaaa,\n"
4128 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4129 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004130
Daniel Jasper00693b082016-01-09 15:56:47 +00004131 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4132 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4133 " vector<int> bbbbbbbbbbbbbbb);",
4134 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004135 // FIXME: This behavior difference is probably not wanted. However, currently
4136 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4137 // template arguments from BreakBeforeParameter being set because of the
4138 // one-per-line formatting.
4139 verifyFormat(
4140 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4141 " aaaaaaaaaa> aaaaaaaaaa);",
4142 NoBinPacking);
4143 verifyFormat(
4144 "void fffffffffff(\n"
4145 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4146 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004147}
4148
Daniel Jasper9278eb92013-01-16 14:59:02 +00004149TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004150 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004151 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004152 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004153 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4154 " aaaaaaaaaaaaaaaaaaaa,\n"
4155 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4156 NoBinPacking);
4157 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4158 " aaaaaaaaaaaaa,\n"
4159 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4160 NoBinPacking);
4161 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004162 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4163 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4165 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4167 NoBinPacking);
4168 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4169 " .aaaaaaaaaaaaaaaaaa();",
4170 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004171 verifyFormat("void f() {\n"
4172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4173 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4174 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004175 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004176
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004177 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004178 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4179 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004180 " aaaaaaaaaaaa);",
4181 NoBinPacking);
4182 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004183 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4184 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004185 " test);",
4186 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004187
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004188 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4189 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004190 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4191 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004192 NoBinPacking);
4193 verifyFormat("a(\"a\"\n"
4194 " \"a\",\n"
4195 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004196
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004197 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004198 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004199 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004201 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004202 verifyFormat(
4203 "void f() {\n"
4204 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4205 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004206 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004207 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004208 verifyFormat(
4209 "template <class SomeType, class SomeOtherType>\n"
4210 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4211 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004212}
4213
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004214TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4215 FormatStyle Style = getLLVMStyleWithColumns(15);
4216 Style.ExperimentalAutoDetectBinPacking = true;
4217 EXPECT_EQ("aaa(aaaa,\n"
4218 " aaaa,\n"
4219 " aaaa);\n"
4220 "aaa(aaaa,\n"
4221 " aaaa,\n"
4222 " aaaa);",
4223 format("aaa(aaaa,\n" // one-per-line
4224 " aaaa,\n"
4225 " aaaa );\n"
4226 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4227 Style));
4228 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4229 " aaaa);\n"
4230 "aaa(aaaa, aaaa,\n"
4231 " aaaa);",
4232 format("aaa(aaaa, aaaa,\n" // bin-packed
4233 " aaaa );\n"
4234 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4235 Style));
4236}
4237
Daniel Jasper04468962013-01-18 10:56:38 +00004238TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004239 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4240 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4241 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4242 " .StartsWith(\".init\", ORDER_INIT)\n"
4243 " .StartsWith(\".fini\", ORDER_FINI)\n"
4244 " .StartsWith(\".hash\", ORDER_HASH)\n"
4245 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004246
Daniel Jaspereb50c672013-02-15 20:33:06 +00004247 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004248 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004249 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004250 "aaaaaaa->aaaaaaa\n"
4251 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004253 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004254 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004255 "aaaaaaa->aaaaaaa\n"
4256 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4257 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4258 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004259 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004260 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004261 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004262 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4263 " aaaaaa->aaaaaaaaaaaa()\n"
4264 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004266 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004267 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004268 "void f() {\n"
4269 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004270 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004271 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004272 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004273 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004274 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004275 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004276 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004277 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004278 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004279 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004280 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004281
4282 verifyFormat(
4283 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4284 verifyFormat("aaaaaaaaaaaaaaa()\n"
4285 " .aaaaaaaaaaaaaaa()\n"
4286 " .aaaaaaaaaaaaaaa()\n"
4287 " .aaaaaaaaaaaaaaa()\n"
4288 " .aaaaaaaaaaaaaaa();");
4289 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4290 " .aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa()\n"
4292 " .aaaaaaaaaaaaaaa();");
4293 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4294 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4295 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004296 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4297 " ->aaaaaaaaaaaaaae(0)\n"
4298 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004299
Daniel Jasper775954b2015-04-24 10:08:09 +00004300 // Don't linewrap after very short segments.
4301 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4303 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4304 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4307 verifyFormat("aaa()\n"
4308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4310 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4311
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004312 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4313 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4314 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4315 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4316 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004317 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004318
Daniel Jaspera41aa532014-09-19 08:01:25 +00004319 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004320 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4321 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004322
4323 // Prefer not to create "hanging" indents.
4324 verifyFormat(
4325 "return !soooooooooooooome_map\n"
4326 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4327 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004328 verifyFormat(
4329 "return aaaaaaaaaaaaaaaa\n"
4330 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4331 " .aaaa(aaaaaaaaaaaaaa);");
4332 // No hanging indent here.
4333 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4335 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004337 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4338 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4339 getLLVMStyleWithColumns(60));
4340 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4341 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4342 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4343 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004344 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4346 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004347}
4348
Daniel Jasperde5c2072012-12-24 00:13:23 +00004349TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4350 verifyFormat(
4351 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004352 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004353 verifyFormat(
4354 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4355 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4356
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004358 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004359 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4360 " ccccccccccccccccccccccccc) {\n}");
4361
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004363 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004364 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4365 " ccccccccccccccccccccccccc) {\n}");
4366
Daniel Jasperde5c2072012-12-24 00:13:23 +00004367 verifyFormat(
4368 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004369 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004370 verifyFormat(
4371 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4372 " ccccccccccccccccccccccccc) {\n}");
4373
Daniel Jasper400adc62013-02-08 15:28:42 +00004374 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4375 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4376 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4377 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004378 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4379 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4380 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4381 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4382
Daniel Jasper400adc62013-02-08 15:28:42 +00004383 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4384 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4385 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004386 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4387 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4388 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004389}
4390
Daniel Jasper43b65482013-01-23 12:27:43 +00004391TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004392 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004393 "unsigned Cost =\n"
4394 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4395 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004396 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004397 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4398 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004399
4400 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004401 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4402 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004403 verifyFormat("unsigned OriginalStartColumn =\n"
4404 " SourceMgr.getSpellingColumnNumber(\n"
4405 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4406 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004407}
4408
Francois Ferrand9976efa2017-05-22 08:28:17 +00004409TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4410 FormatStyle Style = getLLVMStyle();
4411 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4412 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4413 Style);
4414
4415 Style.PenaltyBreakAssignment = 20;
4416 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4417 " cccccccccccccccccccccccccc;",
4418 Style);
4419}
4420
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004421TEST_F(FormatTest, AlignsAfterAssignments) {
4422 verifyFormat(
4423 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004424 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004425 verifyFormat(
4426 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004427 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004428 verifyFormat(
4429 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004430 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004431 verifyFormat(
4432 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004433 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004434 verifyFormat(
4435 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4436 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4437 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004438}
4439
4440TEST_F(FormatTest, AlignsAfterReturn) {
4441 verifyFormat(
4442 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4443 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4444 verifyFormat(
4445 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4446 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004447 verifyFormat(
4448 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004449 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004450 verifyFormat(
4451 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004452 " aaaaaaaaaaaaaaaaaaaaaa());");
4453 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4455 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004458 verifyFormat("return\n"
4459 " // true if code is one of a or b.\n"
4460 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004461}
4462
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004463TEST_F(FormatTest, AlignsAfterOpenBracket) {
4464 verifyFormat(
4465 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4466 " aaaaaaaaa aaaaaaa) {}");
4467 verifyFormat(
4468 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4469 " aaaaaaaaaaa aaaaaaaaa);");
4470 verifyFormat(
4471 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaa));");
4473 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004474 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004475 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4476 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4477 Style);
4478 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4479 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4480 Style);
4481 verifyFormat("SomeLongVariableName->someFunction(\n"
4482 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4483 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004484 verifyFormat(
4485 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4486 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4487 Style);
4488 verifyFormat(
4489 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4490 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4491 Style);
4492 verifyFormat(
4493 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4494 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4495 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004496
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004497 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4498 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4499 " b));",
4500 Style);
4501
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004502 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4503 Style.BinPackArguments = false;
4504 Style.BinPackParameters = false;
4505 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaa aaaaaaaa,\n"
4507 " aaaaaaaaa aaaaaaa,\n"
4508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4509 Style);
4510 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4511 " aaaaaaaaaaa aaaaaaaaa,\n"
4512 " aaaaaaaaaaa aaaaaaaaa,\n"
4513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4514 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004515 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4516 " aaaaaaaaaaaaaaa,\n"
4517 " aaaaaaaaaaaaaaaaaaaaa,\n"
4518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004519 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004520 verifyFormat(
4521 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4522 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4523 Style);
4524 verifyFormat(
4525 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4526 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4527 Style);
4528 verifyFormat(
4529 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4530 " aaaaaaaaaaaaaaaaaaaaa(\n"
4531 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4532 " aaaaaaaaaaaaaaaa);",
4533 Style);
4534 verifyFormat(
4535 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaaaaaaaaaaaa(\n"
4537 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4538 " aaaaaaaaaaaaaaaa);",
4539 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004540}
4541
Daniel Jasper3219e432014-12-02 13:24:51 +00004542TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4543 FormatStyle Style = getLLVMStyleWithColumns(40);
4544 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4545 " bbbbbbbbbbbbbbbbbbbbbb);",
4546 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004547 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004548 Style.AlignOperands = false;
4549 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4550 " bbbbbbbbbbbbbbbbbbbbbb);",
4551 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004552 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004553 Style.AlignOperands = true;
4554 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4555 " bbbbbbbbbbbbbbbbbbbbbb);",
4556 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004557 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004558 Style.AlignOperands = false;
4559 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4560 " bbbbbbbbbbbbbbbbbbbbbb);",
4561 Style);
4562}
4563
Daniel Jasper399d24b2013-01-09 07:06:56 +00004564TEST_F(FormatTest, BreaksConditionalExpressions) {
4565 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004566 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4567 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4568 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4569 verifyFormat(
4570 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004571 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004573 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004574 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4576 verifyFormat(
4577 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004578 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4579 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004580 verifyFormat(
4581 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4582 " : aaaaaaaaaaaaa);");
4583 verifyFormat(
4584 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004585 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004586 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4587 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004588 verifyFormat(
4589 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4590 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4591 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004592 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4593 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4595 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4597 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4598 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4599 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4600 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4601 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4603 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004604 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4606 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4608 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004609 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4610 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4611 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004612 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4614 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4615 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004616 verifyFormat(
4617 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618 " ? aaaaaaaaaaaaaaa\n"
4619 " : aaaaaaaaaaaaaaa;");
4620 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004621 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004622 " ? b\n"
4623 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004624 verifyFormat("return aaaa == bbbb\n"
4625 " // comment\n"
4626 " ? aaaa\n"
4627 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004628 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004629 " format(TheLine.First,\n"
4630 " IndentForLevel[TheLine.Level] >= 0\n"
4631 " ? IndentForLevel[TheLine.Level]\n"
4632 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004633 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004634 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004635 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4636 " ? aaaaaaaaaaaaaaa\n"
4637 " : bbbbbbbbbbbbbbb //\n"
4638 " ? ccccccccccccccc\n"
4639 " : ddddddddddddddd;");
4640 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4641 " ? aaaaaaaaaaaaaaa\n"
4642 " : (bbbbbbbbbbbbbbb //\n"
4643 " ? ccccccccccccccc\n"
4644 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004645 verifyFormat(
4646 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4647 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4648 " aaaaaaaaaaaaaaaaaaaaa +\n"
4649 " aaaaaaaaaaaaaaaaaaaaa\n"
4650 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004651 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004652 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4653 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4654 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004655
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004656 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004657 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004658 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004659 "void f() {\n"
4660 " g(aaa,\n"
4661 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4663 " ? aaaaaaaaaaaaaaa\n"
4664 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004665 "}",
4666 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004667 verifyFormat(
4668 "void f() {\n"
4669 " g(aaa,\n"
4670 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4672 " ?: aaaaaaaaaaaaaaa);\n"
4673 "}",
4674 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004675
4676 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4677 " // comment.\n"
4678 " ccccccccccccccccccccccccccccccccccccccc\n"
4679 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4680 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004681
4682 // Assignments in conditional expressions. Apparently not uncommon :-(.
4683 verifyFormat("return a != b\n"
4684 " // comment\n"
4685 " ? a = b\n"
4686 " : a = b;");
4687 verifyFormat("return a != b\n"
4688 " // comment\n"
4689 " ? a = a != b\n"
4690 " // comment\n"
4691 " ? a = b\n"
4692 " : a\n"
4693 " : a;\n");
4694 verifyFormat("return a != b\n"
4695 " // comment\n"
4696 " ? a\n"
4697 " : a = a != b\n"
4698 " // comment\n"
4699 " ? a = b\n"
4700 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004701}
4702
Daniel Jasper165b29e2013-11-08 00:57:11 +00004703TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4704 FormatStyle Style = getLLVMStyle();
4705 Style.BreakBeforeTernaryOperators = false;
4706 Style.ColumnLimit = 70;
4707 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004708 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4711 Style);
4712 verifyFormat(
4713 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004714 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004716 Style);
4717 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004718 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4720 Style);
4721 verifyFormat(
4722 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004723 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004725 Style);
4726 verifyFormat(
4727 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4728 " aaaaaaaaaaaaa);",
4729 Style);
4730 verifyFormat(
4731 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4732 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4734 " aaaaaaaaaaaaa);",
4735 Style);
4736 verifyFormat(
4737 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4738 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4739 " aaaaaaaaaaaaa);",
4740 Style);
4741 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4746 Style);
4747 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4753 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4754 Style);
4755 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4760 Style);
4761 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4764 Style);
4765 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4769 Style);
4770 verifyFormat(
4771 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4772 " aaaaaaaaaaaaaaa :\n"
4773 " aaaaaaaaaaaaaaa;",
4774 Style);
4775 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4776 " aaaaaaaaa ?\n"
4777 " b :\n"
4778 " c);",
4779 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004780 verifyFormat("unsigned Indent =\n"
4781 " format(TheLine.First,\n"
4782 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4783 " IndentForLevel[TheLine.Level] :\n"
4784 " TheLine * 2,\n"
4785 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4786 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004787 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4788 " aaaaaaaaaaaaaaa :\n"
4789 " bbbbbbbbbbbbbbb ? //\n"
4790 " ccccccccccccccc :\n"
4791 " ddddddddddddddd;",
4792 Style);
4793 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4794 " aaaaaaaaaaaaaaa :\n"
4795 " (bbbbbbbbbbbbbbb ? //\n"
4796 " ccccccccccccccc :\n"
4797 " ddddddddddddddd);",
4798 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004799 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4800 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4801 " ccccccccccccccccccccccccccc;",
4802 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004803 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4804 " aaaaa :\n"
4805 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4806 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004807}
4808
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004809TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4810 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4811 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4812 verifyFormat("bool a = true, b = false;");
4813
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004814 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004816 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004818 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004819 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004820 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004821 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004822 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4823 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4824 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4825 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4826 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4827 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004828
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004829 FormatStyle Style = getGoogleStyle();
4830 Style.PointerAlignment = FormatStyle::PAS_Left;
4831 Style.DerivePointerAlignment = false;
4832 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4833 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4834 " *b = bbbbbbbbbbbbbbbbbbb;",
4835 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004836 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4837 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4838 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004839 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004840 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004841}
4842
Nico Weber4a5030c2013-01-12 01:28:06 +00004843TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4844 verifyFormat("arr[foo ? bar : baz];");
4845 verifyFormat("f()[foo ? bar : baz];");
4846 verifyFormat("(a + b)[foo ? bar : baz];");
4847 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4848}
4849
Daniel Jasperf7935112012-12-03 18:12:45 +00004850TEST_F(FormatTest, AlignsStringLiterals) {
4851 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4852 " \"short literal\");");
4853 verifyFormat(
4854 "looooooooooooooooooooooooongFunction(\n"
4855 " \"short literal\"\n"
4856 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004857 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4858 " \" string literals\",\n"
4859 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004860 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4861 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004862 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004863 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004864 getLLVMStyleWithColumns(28)));
4865 EXPECT_EQ(
4866 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4867 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4868 " \"aaaaaaaaaaaaaaaa\";",
4869 format("aaaaaa ="
4870 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4871 "aaaaaaaaaaaaaaaaaaaaa\" "
4872 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004873 verifyFormat("a = a + \"a\"\n"
4874 " \"a\"\n"
4875 " \"a\";");
4876 verifyFormat("f(\"a\", \"b\"\n"
4877 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004878
4879 verifyFormat(
4880 "#define LL_FORMAT \"ll\"\n"
4881 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4882 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004883
4884 verifyFormat("#define A(X) \\\n"
4885 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4886 " \"ccccc\"",
4887 getLLVMStyleWithColumns(23));
4888 verifyFormat("#define A \"def\"\n"
4889 "f(\"abc\" A \"ghi\"\n"
4890 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004891
4892 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004893 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004894 verifyFormat("#define A(X) \\\n"
4895 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4896 " L\"ccccc\"",
4897 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004898
4899 verifyFormat("f(@\"a\"\n"
4900 " @\"b\");");
4901 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004902 " @\"b\"\n"
4903 " @\"c\";");
4904 verifyFormat("NSString s = @\"a\"\n"
4905 " \"b\"\n"
4906 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004907}
4908
Zachary Turner448592e2015-12-18 22:20:15 +00004909TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004910 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004911 // No declarations or definitions should be moved to own line.
4912 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4913 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004914 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004915 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004916 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004917 "int f() { return 1; }\n"
4918 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004919 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004920
4921 // All declarations and definitions should have the return type moved to its
4922 // own
4923 // line.
4924 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4925 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004926 " int\n"
4927 " f() {\n"
4928 " return 1;\n"
4929 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004930 " int\n"
4931 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004932 "};\n"
4933 "int\n"
4934 "f() {\n"
4935 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004936 "}\n"
4937 "int\n"
4938 "g();\n",
4939 Style);
4940
4941 // Top-level definitions, and no kinds of declarations should have the
4942 // return type moved to its own line.
4943 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4944 verifyFormat("class B {\n"
4945 " int f() { return 1; }\n"
4946 " int g();\n"
4947 "};\n"
4948 "int\n"
4949 "f() {\n"
4950 " return 1;\n"
4951 "}\n"
4952 "int g();\n",
4953 Style);
4954
4955 // Top-level definitions and declarations should have the return type moved
4956 // to its own line.
4957 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4958 verifyFormat("class C {\n"
4959 " int f() { return 1; }\n"
4960 " int g();\n"
4961 "};\n"
4962 "int\n"
4963 "f() {\n"
4964 " return 1;\n"
4965 "}\n"
4966 "int\n"
4967 "g();\n",
4968 Style);
4969
4970 // All definitions should have the return type moved to its own line, but no
4971 // kinds of declarations.
4972 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4973 verifyFormat("class D {\n"
4974 " int\n"
4975 " f() {\n"
4976 " return 1;\n"
4977 " }\n"
4978 " int g();\n"
4979 "};\n"
4980 "int\n"
4981 "f() {\n"
4982 " return 1;\n"
4983 "}\n"
4984 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004985 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004986 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004987 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004988 " return \"\";\n"
4989 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004990 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004991 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004992 verifyFormat("template <class T>\n"
4993 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004994 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004995 " return NULL;\n"
4996 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004997 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004998 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004999 verifyFormat("class C {\n"
5000 " int\n"
5001 " operator+() {\n"
5002 " return 1;\n"
5003 " }\n"
5004 " int\n"
5005 " operator()() {\n"
5006 " return 1;\n"
5007 " }\n"
5008 "};\n",
5009 Style);
5010 verifyFormat("void\n"
5011 "A::operator()() {}\n"
5012 "void\n"
5013 "A::operator>>() {}\n"
5014 "void\n"
5015 "A::operator+() {}\n",
5016 Style);
5017 verifyFormat("void *operator new(std::size_t s);", // No break here.
5018 Style);
5019 verifyFormat("void *\n"
5020 "operator new(std::size_t s) {}",
5021 Style);
5022 verifyFormat("void *\n"
5023 "operator delete[](void *ptr) {}",
5024 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005025 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005026 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005027 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005028 "{\n"
5029 " return \"\";\n"
5030 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005031 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005032 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005033 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005034 "T *\n" // Problem here: no line break
5035 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005036 "{\n"
5037 " return NULL;\n"
5038 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005039 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005040 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005041}
5042
Alexander Kornienko58611712013-07-04 12:02:44 +00005043TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5044 FormatStyle NoBreak = getLLVMStyle();
5045 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5046 FormatStyle Break = getLLVMStyle();
5047 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005048 verifyFormat("aaaa = \"bbbb\"\n"
5049 " \"cccc\";",
5050 NoBreak);
5051 verifyFormat("aaaa =\n"
5052 " \"bbbb\"\n"
5053 " \"cccc\";",
5054 Break);
5055 verifyFormat("aaaa(\"bbbb\"\n"
5056 " \"cccc\");",
5057 NoBreak);
5058 verifyFormat("aaaa(\n"
5059 " \"bbbb\"\n"
5060 " \"cccc\");",
5061 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005062 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5063 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005064 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005065 verifyFormat("aaaa(qqq,\n"
5066 " \"bbbb\"\n"
5067 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005068 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005069 verifyFormat("aaaa(qqq,\n"
5070 " L\"bbbb\"\n"
5071 " L\"cccc\");",
5072 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005073 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5074 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005075 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005076 verifyFormat("string s = someFunction(\n"
5077 " \"abc\"\n"
5078 " \"abc\");",
5079 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005080
Daniel Jasper3251fff2014-06-10 06:27:23 +00005081 // As we break before unary operators, breaking right after them is bad.
5082 verifyFormat("string foo = abc ? \"x\"\n"
5083 " \"blah blah blah blah blah blah\"\n"
5084 " : \"y\";",
5085 Break);
5086
Daniel Jasperc834c702013-07-17 15:38:19 +00005087 // Don't break if there is no column gain.
5088 verifyFormat("f(\"aaaa\"\n"
5089 " \"bbbb\");",
5090 Break);
5091
5092 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005093 EXPECT_EQ("x = \"a\\\n"
5094 "b\\\n"
5095 "c\";",
5096 format("x = \"a\\\n"
5097 "b\\\n"
5098 "c\";",
5099 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005100 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005101 " \"a\\\n"
5102 "b\\\n"
5103 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005104 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005105 "b\\\n"
5106 "c\";",
5107 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005108
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005109 EXPECT_EQ("NSString *const kString =\n"
5110 " @\"aaaa\"\n"
5111 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005112 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005113 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005114 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005115
5116 Break.ColumnLimit = 0;
5117 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005118}
5119
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005120TEST_F(FormatTest, AlignsPipes) {
5121 verifyFormat(
5122 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5123 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5124 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5125 verifyFormat(
5126 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5127 " << aaaaaaaaaaaaaaaaaaaa;");
5128 verifyFormat(
5129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5131 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5133 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5134 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005135 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5136 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5137 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5138 verifyFormat(
5139 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5141 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005142 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5145 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005146 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5147 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005148 verifyFormat(
5149 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005151 verifyFormat(
5152 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5153 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005154
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005155 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5156 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005157 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5159 " aaaaaaaaaaaaaaaaaaaaa)\n"
5160 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005161 verifyFormat("LOG_IF(aaa == //\n"
5162 " bbb)\n"
5163 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005164
Daniel Jasper467ddb12013-08-12 12:58:05 +00005165 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005166 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5167 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005168 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5169 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5170 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005171 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5172 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005173 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5174 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5176 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5177 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5179 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005180
Daniel Jasperc238c872013-04-02 14:33:13 +00005181 verifyFormat(
5182 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5183 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005184
5185 // Incomplete string literal.
5186 EXPECT_EQ("llvm::errs() << \"\n"
5187 " << a;",
5188 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005189
5190 verifyFormat("void f() {\n"
5191 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5192 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5193 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005194
5195 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005196 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5197 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5198 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005199
5200 // Handle '\n'.
5201 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5202 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5203 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5204 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5205 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5206 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5207 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005208}
5209
Daniel Jasper7209bb92016-12-13 11:16:42 +00005210TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5211 verifyFormat("return out << \"somepacket = {\\n\"\n"
5212 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5213 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5214 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5215 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5216 " << \"}\";");
5217
5218 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5219 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5220 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5221 verifyFormat(
5222 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5223 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5224 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5225 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5226 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5227 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5228 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5229 verifyFormat(
5230 "void f() {\n"
5231 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5232 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5233 "}");
5234
5235 // Breaking before the first "<<" is generally not desirable.
5236 verifyFormat(
5237 "llvm::errs()\n"
5238 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5239 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5240 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5241 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5242 getLLVMStyleWithColumns(70));
5243 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5244 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5245 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5246 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5247 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5248 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5249 getLLVMStyleWithColumns(70));
5250
5251 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5252 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5253 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5254 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5255 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5256 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005257 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5258 " (aaaa + aaaa);",
5259 getLLVMStyleWithColumns(40));
5260 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5261 " (aaaaaaa + aaaaa));",
5262 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005263 verifyFormat(
5264 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5265 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5266 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005267}
5268
Daniel Jasperf7935112012-12-03 18:12:45 +00005269TEST_F(FormatTest, UnderstandsEquals) {
5270 verifyFormat(
5271 "aaaaaaaaaaaaaaaaa =\n"
5272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5273 verifyFormat(
5274 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005276 verifyFormat(
5277 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005278 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005279 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5281 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005282
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005283 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5284 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005285}
5286
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005287TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005288 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5289 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005290
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005291 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5292 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005293
5294 verifyFormat(
5295 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5296 " Parameter2);");
5297
5298 verifyFormat(
5299 "ShortObject->shortFunction(\n"
5300 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5301 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5302
5303 verifyFormat("loooooooooooooongFunction(\n"
5304 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5305
5306 verifyFormat(
5307 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5308 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5309
Daniel Jasper687af3b2013-02-14 14:26:07 +00005310 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5311 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005312 verifyFormat("void f() {\n"
5313 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5314 " .Times(2)\n"
5315 " .WillRepeatedly(Return(SomeValue));\n"
5316 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005317 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5318 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005319 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5321 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005322 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005323 verifyFormat("void f() {\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5325 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5326 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005327 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5329 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5330 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5331 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005332 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5333 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5334 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5335 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5336 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005337
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005338 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005339 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005340 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005341 verifyFormat(
5342 "aaaaaaaaaaa->aaaaaaaaa(\n"
5343 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5344 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005345
5346 verifyFormat(
5347 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005349 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5350 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5351 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5352 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005353
Daniel Jasper9b334242013-03-15 14:57:30 +00005354 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5356 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005357
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005358 FormatStyle NoBinPacking = getLLVMStyle();
5359 NoBinPacking.BinPackParameters = false;
5360 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5361 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5362 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5363 " aaaaaaaaaaaaaaaaaaa,\n"
5364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5365 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005366
5367 // If there is a subsequent call, change to hanging indentation.
5368 verifyFormat(
5369 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5370 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5371 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5372 verifyFormat(
5373 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5374 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005375 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5377 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5378 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5380 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005381}
5382
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005383TEST_F(FormatTest, WrapsTemplateDeclarations) {
5384 verifyFormat("template <typename T>\n"
5385 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005386 verifyFormat("template <typename T>\n"
5387 "// T should be one of {A, B}.\n"
5388 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005389 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005390 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005391 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005392 verifyFormat("template <typename T>\n"
5393 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5394 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005395 verifyFormat(
5396 "template <typename T>\n"
5397 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5398 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005399 verifyFormat(
5400 "template <typename T>\n"
5401 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005404 verifyFormat("template <typename T>\n"
5405 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005406 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005407 verifyFormat(
5408 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5409 " typename T4 = char>\n"
5410 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005411 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5412 " template <typename> class cccccccccccccccccccccc,\n"
5413 " typename ddddddddddddd>\n"
5414 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005415 verifyFormat(
5416 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005418
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005419 verifyFormat("void f() {\n"
5420 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5421 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5422 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005423
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005424 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005425 verifyFormat("template <typename T> void f();");
5426 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005427 verifyFormat(
5428 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5431 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5434 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5435 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005436 EXPECT_EQ("static_cast<A< //\n"
5437 " B> *>(\n"
5438 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005439 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005440 format("static_cast<A<//\n"
5441 " B>*>(\n"
5442 "\n"
5443 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005444 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5445 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005446
5447 FormatStyle AlwaysBreak = getLLVMStyle();
5448 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5449 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5450 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5451 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5452 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5453 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5454 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5455 verifyFormat("template <template <typename> class Fooooooo,\n"
5456 " template <typename> class Baaaaaaar>\n"
5457 "struct C {};",
5458 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005459 verifyFormat("template <typename T> // T can be A, B or C.\n"
5460 "struct C {};",
5461 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005462 verifyFormat("template <enum E> class A {\n"
5463 "public:\n"
5464 " E *f();\n"
5465 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005466}
5467
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005468TEST_F(FormatTest, WrapsTemplateParameters) {
5469 FormatStyle Style = getLLVMStyle();
5470 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5471 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5472 verifyFormat(
5473 "template <typename... a> struct q {};\n"
5474 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5475 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5476 " y;",
5477 Style);
5478 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5479 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5480 verifyFormat(
5481 "template <typename... a> struct r {};\n"
5482 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5483 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5484 " y;",
5485 Style);
5486 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5487 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5488 verifyFormat(
5489 "template <typename... a> struct s {};\n"
5490 "extern s<\n"
5491 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5492 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5493 " y;",
5494 Style);
5495 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5496 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5497 verifyFormat(
5498 "template <typename... a> struct t {};\n"
5499 "extern t<\n"
5500 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5501 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5502 " y;",
5503 Style);
5504}
5505
Daniel Jasper45797022013-01-25 10:57:27 +00005506TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5507 verifyFormat(
5508 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5510 verifyFormat(
5511 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5514
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005515 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005516 verifyFormat(
5517 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005520
Daniel Jasper45797022013-01-25 10:57:27 +00005521 verifyFormat(
5522 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005523 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005524
5525 // Breaking at nested name specifiers is generally not desirable.
5526 verifyFormat(
5527 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5528 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005529
5530 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005531 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5532 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005534 " aaaaaaaaaaaaaaaaaaaaa);",
5535 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005536
5537 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5539 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005540}
5541
Daniel Jasperf7935112012-12-03 18:12:45 +00005542TEST_F(FormatTest, UnderstandsTemplateParameters) {
5543 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005544 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005545 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5546 verifyFormat("bool x = a < 1 || 2 > a;");
5547 verifyFormat("bool x = 5 < f<int>();");
5548 verifyFormat("bool x = f<int>() > 5;");
5549 verifyFormat("bool x = 5 < a<int>::x;");
5550 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5551 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5552
5553 verifyGoogleFormat("A<A<int>> a;");
5554 verifyGoogleFormat("A<A<A<int>>> a;");
5555 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005556 verifyGoogleFormat("A<A<int> > a;");
5557 verifyGoogleFormat("A<A<A<int> > > a;");
5558 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005559 verifyGoogleFormat("A<::A<int>> a;");
5560 verifyGoogleFormat("A<::A> a;");
5561 verifyGoogleFormat("A< ::A> a;");
5562 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005563 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5564 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005565 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5566 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005567 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5568 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005569
Nico Weber7533b4d2014-09-24 17:17:32 +00005570 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5571
Daniel Jasperf7935112012-12-03 18:12:45 +00005572 verifyFormat("test >> a >> b;");
5573 verifyFormat("test << a >> b;");
5574
5575 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005576 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005577 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005578 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5579 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005580 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005581 verifyFormat("f(a.operator()<A>());");
5582 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5583 " .template operator()<A>());",
5584 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005585
5586 // Not template parameters.
5587 verifyFormat("return a < b && c > d;");
5588 verifyFormat("void f() {\n"
5589 " while (a < b && c > d) {\n"
5590 " }\n"
5591 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005592 verifyFormat("template <typename... Types>\n"
5593 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005594
5595 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5597 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005598 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005599 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005600 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005601}
5602
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005603TEST_F(FormatTest, BitshiftOperatorWidth) {
5604 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5605 " bar */",
5606 format("int a=1<<2; /* foo\n"
5607 " bar */"));
5608
5609 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5610 " bar */",
5611 format("int b =256>>1 ; /* foo\n"
5612 " bar */"));
5613}
5614
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005615TEST_F(FormatTest, UnderstandsBinaryOperators) {
5616 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005617 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005618}
5619
5620TEST_F(FormatTest, UnderstandsPointersToMembers) {
5621 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005622 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005623 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005624 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005625 verifyFormat("void f() {\n"
5626 " (a->*f)();\n"
5627 " a->*x;\n"
5628 " (a.*f)();\n"
5629 " ((*a).*f)();\n"
5630 " a.*x;\n"
5631 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005632 verifyFormat("void f() {\n"
5633 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5634 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5635 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005636 verifyFormat(
5637 "(aaaaaaaaaa->*bbbbbbb)(\n"
5638 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005639 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005640 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005641 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005642}
5643
Daniel Jasper8dd40472012-12-21 09:41:31 +00005644TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005645 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005646 verifyFormat("f(-1, -2, -3);");
5647 verifyFormat("a[-1] = 5;");
5648 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005649 verifyFormat("if (i == -1) {\n}");
5650 verifyFormat("if (i != -1) {\n}");
5651 verifyFormat("if (i > -1) {\n}");
5652 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005653 verifyFormat("++(a->f());");
5654 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005655 verifyFormat("(a->f())++;");
5656 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005657 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005658
5659 verifyFormat("a-- > b;");
5660 verifyFormat("b ? -a : c;");
5661 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005662 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005663 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005664 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005665
5666 verifyFormat("return -1;");
5667 verifyFormat("switch (a) {\n"
5668 "case -1:\n"
5669 " break;\n"
5670 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005671 verifyFormat("#define X -1");
5672 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005673
Chandler Carruthf8b72662014-03-02 12:37:31 +00005674 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5675 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005676
5677 verifyFormat("int a = /* confusing comment */ -1;");
5678 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5679 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005680}
5681
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005682TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005683 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005684 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005685 "}");
5686 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005687 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005688 verifyFormat("*aaa = aaaaaaa( // break\n"
5689 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005690}
5691
Daniel Jasper8863ada2013-08-26 08:10:17 +00005692TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005693 verifyFormat("bool operator<();");
5694 verifyFormat("bool operator>();");
5695 verifyFormat("bool operator=();");
5696 verifyFormat("bool operator==();");
5697 verifyFormat("bool operator!=();");
5698 verifyFormat("int operator+();");
5699 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005700 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005701 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005702 verifyFormat("bool operator();");
5703 verifyFormat("bool operator()();");
5704 verifyFormat("bool operator[]();");
5705 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005706 verifyFormat("operator int();");
5707 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005708 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005709 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005710 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005711 verifyFormat("void *operator new(std::size_t size);");
5712 verifyFormat("void *operator new[](std::size_t size);");
5713 verifyFormat("void operator delete(void *ptr);");
5714 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005715 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5716 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005717 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005718 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005719
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005720 verifyFormat(
5721 "ostream &operator<<(ostream &OutputStream,\n"
5722 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005723 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5724 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5725 " return left.group < right.group;\n"
5726 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005727 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005728 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005729
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005730 verifyGoogleFormat("operator void*();");
5731 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005732 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005733
5734 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005735 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5736 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005737}
5738
Daniel Jasper1c220482015-02-25 10:30:06 +00005739TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005740 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5741 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5742 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5743 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5744 verifyFormat("Deleted &operator=(const Deleted &) &;");
5745 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5746 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5747 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5748 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5749 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5750 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005751 verifyFormat("void Fn(T const &) const &;");
5752 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005753 verifyFormat("template <typename T>\n"
5754 "void F(T) && = delete;",
5755 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005756
Daniel Jasperaf642c62015-08-25 13:40:51 +00005757 FormatStyle AlignLeft = getLLVMStyle();
5758 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005759 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005760 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5761 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5762 AlignLeft);
5763 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5764 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005765 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5766 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5767 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5768 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005769 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5770 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005771
5772 FormatStyle Spaces = getLLVMStyle();
5773 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005774 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5775 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5776 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5777 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005778
5779 Spaces.SpacesInCStyleCastParentheses = false;
5780 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005781 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5782 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5783 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5784 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005785}
5786
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005787TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005788 verifyFormat("void f() {\n"
5789 " A *a = new A;\n"
5790 " A *a = new (placement) A;\n"
5791 " delete a;\n"
5792 " delete (A *)a;\n"
5793 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005794 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5795 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005796 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5797 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5798 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005799 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005800}
5801
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005802TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005803 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005804 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005805 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005806 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005807 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005808 verifyIndependentOfContext("int a = b * 10;");
5809 verifyIndependentOfContext("int a = 10 * b;");
5810 verifyIndependentOfContext("int a = b * c;");
5811 verifyIndependentOfContext("int a += b * c;");
5812 verifyIndependentOfContext("int a -= b * c;");
5813 verifyIndependentOfContext("int a *= b * c;");
5814 verifyIndependentOfContext("int a /= b * c;");
5815 verifyIndependentOfContext("int a = *b;");
5816 verifyIndependentOfContext("int a = *b * c;");
5817 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005818 verifyIndependentOfContext("int a = b * (10);");
5819 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005820 verifyIndependentOfContext("return 10 * b;");
5821 verifyIndependentOfContext("return *b * *c;");
5822 verifyIndependentOfContext("return a & ~b;");
5823 verifyIndependentOfContext("f(b ? *c : *d);");
5824 verifyIndependentOfContext("int a = b ? *c : *d;");
5825 verifyIndependentOfContext("*b = a;");
5826 verifyIndependentOfContext("a * ~b;");
5827 verifyIndependentOfContext("a * !b;");
5828 verifyIndependentOfContext("a * +b;");
5829 verifyIndependentOfContext("a * -b;");
5830 verifyIndependentOfContext("a * ++b;");
5831 verifyIndependentOfContext("a * --b;");
5832 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005833 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005834 verifyIndependentOfContext("f() * b;");
5835 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005836 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005837 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005838 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005839 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005840 verifyIndependentOfContext("return sizeof(int **);");
5841 verifyIndependentOfContext("return sizeof(int ******);");
5842 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005843 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005844 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005845 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005846 verifyGoogleFormat("return sizeof(int**);");
5847 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5848 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005849 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005850 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005851 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005852 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005853 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005854 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005855 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005856 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005857 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005858 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005859 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005860 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005861 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005862 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005863 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005864 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005865 verifyFormat("void f(const MyOverride &override);");
5866 verifyFormat("void f(const MyFinal &final);");
5867 verifyIndependentOfContext("bool a = f() && override.f();");
5868 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005869
Daniel Jasper5b49f472013-01-23 12:10:53 +00005870 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005871
Daniel Jasper5b49f472013-01-23 12:10:53 +00005872 verifyIndependentOfContext("A<int *> a;");
5873 verifyIndependentOfContext("A<int **> a;");
5874 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005875 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005876 verifyIndependentOfContext(
5877 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005878 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005879 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005880 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005881 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005882 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005883
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005884 verifyFormat(
5885 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5887
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005888 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005889 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005890 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005891 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005892 verifyGoogleFormat("A<int*> a;");
5893 verifyGoogleFormat("A<int**> a;");
5894 verifyGoogleFormat("A<int*, int*> a;");
5895 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005896 verifyGoogleFormat("f(b ? *c : *d);");
5897 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005898 verifyGoogleFormat("Type* t = **x;");
5899 verifyGoogleFormat("Type* t = *++*x;");
5900 verifyGoogleFormat("*++*x;");
5901 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5902 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005903 verifyGoogleFormat(
5904 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005905 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005906 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5907 verifyGoogleFormat("template <typename T>\n"
5908 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005909
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005910 FormatStyle Left = getLLVMStyle();
5911 Left.PointerAlignment = FormatStyle::PAS_Left;
5912 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005913 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005914 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005915 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005916 verifyFormat("delete *x;", Left);
5917 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5918 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5919 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005920
Daniel Jasper5b49f472013-01-23 12:10:53 +00005921 verifyIndependentOfContext("a = *(x + y);");
5922 verifyIndependentOfContext("a = &(x + y);");
5923 verifyIndependentOfContext("*(x + y).call();");
5924 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005925 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005926
Daniel Jasper5b49f472013-01-23 12:10:53 +00005927 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005928 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005929 "int *MyValues = {\n"
5930 " *A, // Operator detection might be confused by the '{'\n"
5931 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005932 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005933
Daniel Jasper5b49f472013-01-23 12:10:53 +00005934 verifyIndependentOfContext("if (int *a = &b)");
5935 verifyIndependentOfContext("if (int &a = *b)");
5936 verifyIndependentOfContext("if (a & b[i])");
5937 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5938 verifyIndependentOfContext("if (*b[i])");
5939 verifyIndependentOfContext("if (int *a = (&b))");
5940 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005941 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005942 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005943 verifyFormat("void f() {\n"
5944 " for (const int &v : Values) {\n"
5945 " }\n"
5946 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005947 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5948 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005949 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005950
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005951 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005952 verifyFormat("#define MACRO \\\n"
5953 " int *i = a * b; \\\n"
5954 " void f(a *b);",
5955 getLLVMStyleWithColumns(19));
5956
Daniel Jasper97b89482013-03-13 07:49:51 +00005957 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005958 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005959 verifyIndependentOfContext("T **t = new T *;");
5960 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005961 verifyGoogleFormat("A = new SomeType*[Length]();");
5962 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005963 verifyGoogleFormat("T** t = new T*;");
5964 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005965
Daniel Jaspera65e8872014-03-25 10:52:45 +00005966 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5967 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005968 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005969 "typename t::if<x && y>::type f() {}");
5970 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005971 verifyFormat("vector<int *> v;");
5972 verifyFormat("vector<int *const> v;");
5973 verifyFormat("vector<int *const **const *> v;");
5974 verifyFormat("vector<int *volatile> v;");
5975 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005976 verifyFormat("foo<b && false>();");
5977 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005978 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005979 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005980 "template <class T, class = typename std::enable_if<\n"
5981 " std::is_integral<T>::value &&\n"
5982 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5983 "void F();",
5984 getLLVMStyleWithColumns(70));
5985 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005986 "template <class T,\n"
5987 " class = typename std::enable_if<\n"
5988 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005989 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5990 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005991 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005992 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005993 verifyFormat(
5994 "template <class T,\n"
5995 " class = typename ::std::enable_if<\n"
5996 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5997 "void F();",
5998 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005999
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006000 verifyIndependentOfContext("MACRO(int *i);");
6001 verifyIndependentOfContext("MACRO(auto *a);");
6002 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006003 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006004 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006005 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006006 // FIXME: Is there a way to make this work?
6007 // verifyIndependentOfContext("MACRO(A *a);");
6008
Daniel Jasper32ccb032014-06-23 07:36:18 +00006009 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006010 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006011
Daniel Jasper866468a2014-04-14 13:15:29 +00006012 EXPECT_EQ("#define OP(x) \\\n"
6013 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6014 " return s << a.DebugString(); \\\n"
6015 " }",
6016 format("#define OP(x) \\\n"
6017 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6018 " return s << a.DebugString(); \\\n"
6019 " }",
6020 getLLVMStyleWithColumns(50)));
6021
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006022 // FIXME: We cannot handle this case yet; we might be able to figure out that
6023 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006024 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006025
6026 FormatStyle PointerMiddle = getLLVMStyle();
6027 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6028 verifyFormat("delete *x;", PointerMiddle);
6029 verifyFormat("int * x;", PointerMiddle);
6030 verifyFormat("template <int * y> f() {}", PointerMiddle);
6031 verifyFormat("int * f(int * a) {}", PointerMiddle);
6032 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6033 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6034 verifyFormat("A<int *> a;", PointerMiddle);
6035 verifyFormat("A<int **> a;", PointerMiddle);
6036 verifyFormat("A<int *, int *> a;", PointerMiddle);
6037 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006038 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6039 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006040 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006041
6042 // Member function reference qualifiers aren't binary operators.
6043 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006044 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006045 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006046 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006047 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006048 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006049}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006050
Daniel Jasperee6d6502013-07-17 20:25:02 +00006051TEST_F(FormatTest, UnderstandsAttributes) {
6052 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006053 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6054 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006055 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006056 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006057 verifyFormat("__attribute__((nodebug)) void\n"
6058 "foo() {}\n",
6059 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006060}
6061
Daniel Jasper10cd5812013-05-06 06:35:44 +00006062TEST_F(FormatTest, UnderstandsEllipsis) {
6063 verifyFormat("int printf(const char *fmt, ...);");
6064 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006065 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6066
6067 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006068 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006069 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006070}
6071
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006072TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006073 EXPECT_EQ("int *a;\n"
6074 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006075 "int *a;",
6076 format("int *a;\n"
6077 "int* a;\n"
6078 "int *a;",
6079 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006080 EXPECT_EQ("int* a;\n"
6081 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006082 "int* a;",
6083 format("int* a;\n"
6084 "int* a;\n"
6085 "int *a;",
6086 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006087 EXPECT_EQ("int *a;\n"
6088 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006089 "int *a;",
6090 format("int *a;\n"
6091 "int * a;\n"
6092 "int * a;",
6093 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006094 EXPECT_EQ("auto x = [] {\n"
6095 " int *a;\n"
6096 " int *a;\n"
6097 " int *a;\n"
6098 "};",
6099 format("auto x=[]{int *a;\n"
6100 "int * a;\n"
6101 "int * a;};",
6102 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006103}
6104
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006105TEST_F(FormatTest, UnderstandsRvalueReferences) {
6106 verifyFormat("int f(int &&a) {}");
6107 verifyFormat("int f(int a, char &&b) {}");
6108 verifyFormat("void f() { int &&a = b; }");
6109 verifyGoogleFormat("int f(int a, char&& b) {}");
6110 verifyGoogleFormat("void f() { int&& a = b; }");
6111
Daniel Jasper1eff9082013-05-27 16:36:33 +00006112 verifyIndependentOfContext("A<int &&> a;");
6113 verifyIndependentOfContext("A<int &&, int &&> a;");
6114 verifyGoogleFormat("A<int&&> a;");
6115 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006116
6117 // Not rvalue references:
6118 verifyFormat("template <bool B, bool C> class A {\n"
6119 " static_assert(B && C, \"Something is wrong\");\n"
6120 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006121 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6122 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006123 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006124}
6125
Manuel Klimekc1237a82013-01-23 14:08:21 +00006126TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6127 verifyFormat("void f() {\n"
6128 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006129 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006130 "}",
6131 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006132}
6133
Daniel Jasperef906a92013-01-13 08:01:36 +00006134TEST_F(FormatTest, FormatsCasts) {
6135 verifyFormat("Type *A = static_cast<Type *>(P);");
6136 verifyFormat("Type *A = (Type *)P;");
6137 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6138 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006139 verifyFormat("int a = (int)2.0f;");
6140 verifyFormat("x[(int32)y];");
6141 verifyFormat("x = (int32)y;");
6142 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6143 verifyFormat("int a = (int)*b;");
6144 verifyFormat("int a = (int)2.0f;");
6145 verifyFormat("int a = (int)~0;");
6146 verifyFormat("int a = (int)++a;");
6147 verifyFormat("int a = (int)sizeof(int);");
6148 verifyFormat("int a = (int)+2;");
6149 verifyFormat("my_int a = (my_int)2.0f;");
6150 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006151 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006152 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006153 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006154 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006155 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006156
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006157 verifyFormat("void f() { my_int a = (my_int)*b; }");
6158 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6159 verifyFormat("my_int a = (my_int)~0;");
6160 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006161 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006162 verifyFormat("my_int a = (my_int)1;");
6163 verifyFormat("my_int a = (my_int *)1;");
6164 verifyFormat("my_int a = (const my_int)-1;");
6165 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006166 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006167 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006168 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006169 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006170
6171 // FIXME: single value wrapped with paren will be treated as cast.
6172 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006173
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006174 verifyFormat("{ (void)F; }");
6175
Daniel Jasper998cabc2013-07-18 14:46:07 +00006176 // Don't break after a cast's
6177 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6178 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6179 " bbbbbbbbbbbbbbbbbbbbbb);");
6180
Daniel Jasperef906a92013-01-13 08:01:36 +00006181 // These are not casts.
6182 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006183 verifyFormat("f(foo)->b;");
6184 verifyFormat("f(foo).b;");
6185 verifyFormat("f(foo)(b);");
6186 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006187 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006188 verifyFormat("(*funptr)(foo)[4];");
6189 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006190 verifyFormat("void f(int *);");
6191 verifyFormat("void f(int *) = 0;");
6192 verifyFormat("void f(SmallVector<int>) {}");
6193 verifyFormat("void f(SmallVector<int>);");
6194 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006195 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006196 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006197 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006198 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6199 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006200 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006201
Daniel Jasperba0bda92013-02-23 08:07:18 +00006202 // These are not casts, but at some point were confused with casts.
6203 verifyFormat("virtual void foo(int *) override;");
6204 verifyFormat("virtual void foo(char &) const;");
6205 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006206 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006207 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006208 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006209 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006210
6211 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6212 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006213 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006214 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006215 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6216 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6217 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006218}
6219
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006220TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006221 verifyFormat("A<bool()> a;");
6222 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006223 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006224 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006225 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006226 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006227 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006228 verifyFormat("template <class CallbackClass>\n"
6229 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006230
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006231 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6232 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006233 verifyGoogleFormat(
6234 "template <class CallbackClass>\n"
6235 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006236
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006237 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006238 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006239 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006240 verifyFormat("some_var = function(*some_pointer_var)[0];");
6241 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006242 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006243 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006244 verifyFormat("std::function<\n"
6245 " LooooooooooongTemplatedType<\n"
6246 " SomeType>*(\n"
6247 " LooooooooooooooooongType type)>\n"
6248 " function;",
6249 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006250}
6251
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006252TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6253 verifyFormat("A (*foo_)[6];");
6254 verifyFormat("vector<int> (*foo_)[6];");
6255}
6256
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006257TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6258 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6259 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6260 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6261 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006262 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6263 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006264
6265 // Different ways of ()-initializiation.
6266 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6267 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6268 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6269 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6270 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6271 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006272 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6273 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006274
6275 // Lambdas should not confuse the variable declaration heuristic.
6276 verifyFormat("LooooooooooooooooongType\n"
6277 " variable(nullptr, [](A *a) {});",
6278 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006279}
6280
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006281TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006282 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006283 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006284 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006286 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006287 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006288 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6289 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006290 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6291 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006292 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6293 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006294 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6295 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006296 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6297 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006298 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6299 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6300 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6301 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006302 FormatStyle Indented = getLLVMStyle();
6303 Indented.IndentWrappedFunctionNames = true;
6304 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6305 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6306 Indented);
6307 verifyFormat(
6308 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6309 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6310 Indented);
6311 verifyFormat(
6312 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6313 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6314 Indented);
6315 verifyFormat(
6316 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6317 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6318 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006319
6320 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006321 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6322 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6323 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006324
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006325 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006326 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006327 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006328 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6329 " SourceLocation L, IdentifierIn *II,\n"
6330 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006331 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006332 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006333 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006334 " const SomeType<string, SomeOtherTemplateParameter>\n"
6335 " &ReallyReallyLongParameterName,\n"
6336 " const SomeType<string, SomeOtherTemplateParameter>\n"
6337 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006338 verifyFormat("template <typename A>\n"
6339 "SomeLoooooooooooooooooooooongType<\n"
6340 " typename some_namespace::SomeOtherType<A>::Type>\n"
6341 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006342
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006343 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006344 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6345 " aaaaaaaaaaaaaaaaaaaaaaa;");
6346 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006347 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6348 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006349 verifyGoogleFormat(
6350 "some_namespace::LongReturnType\n"
6351 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006352 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006353
6354 verifyGoogleFormat("template <typename T>\n"
6355 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006356 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006357 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6358 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006359
6360 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006361 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6362 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006363 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6364 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6365 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6366 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6367 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006370
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006371 verifyFormat("template <typename T> // Templates on own line.\n"
6372 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006373 "MyFunction(int a);",
6374 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006375}
6376
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006377TEST_F(FormatTest, FormatsArrays) {
6378 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6379 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006380 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6381 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006382 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6383 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006384 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6385 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6386 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6387 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6388 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6389 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6390 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6391 verifyFormat(
6392 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6393 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6394 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006395 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6396 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006397
6398 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006400 verifyFormat(
6401 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6402 " .aaaaaaa[0]\n"
6403 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006404 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006405
6406 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006407
6408 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6409 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006410}
6411
Daniel Jaspere9de2602012-12-06 09:56:08 +00006412TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6413 verifyFormat("(a)->b();");
6414 verifyFormat("--a;");
6415}
6416
Daniel Jasper8b529712012-12-04 13:02:32 +00006417TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006418 verifyFormat("#include <string>\n"
6419 "#include <a/b/c.h>\n"
6420 "#include \"a/b/string\"\n"
6421 "#include \"string.h\"\n"
6422 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006423 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006424 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006425 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006426 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006427 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006428 "#include \"some very long include path\"\n"
6429 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006430 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006431 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6432 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006433
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006434 verifyFormat("#import <string>");
6435 verifyFormat("#import <a/b/c.h>");
6436 verifyFormat("#import \"a/b/string\"");
6437 verifyFormat("#import \"string.h\"");
6438 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006439 verifyFormat("#if __has_include(<strstream>)\n"
6440 "#include <strstream>\n"
6441 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006442
Daniel Jasper343643b2014-08-13 08:29:18 +00006443 verifyFormat("#define MY_IMPORT <a/b>");
6444
Nico Weber21088802017-02-10 19:36:52 +00006445 verifyFormat("#if __has_include(<a/b>)");
6446 verifyFormat("#if __has_include_next(<a/b>)");
6447 verifyFormat("#define F __has_include(<a/b>)");
6448 verifyFormat("#define F __has_include_next(<a/b>)");
6449
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006450 // Protocol buffer definition or missing "#".
6451 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6452 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006453
6454 FormatStyle Style = getLLVMStyle();
6455 Style.AlwaysBreakBeforeMultilineStrings = true;
6456 Style.ColumnLimit = 0;
6457 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006458
6459 // But 'import' might also be a regular C++ namespace.
6460 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006462}
6463
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006464//===----------------------------------------------------------------------===//
6465// Error recovery tests.
6466//===----------------------------------------------------------------------===//
6467
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006468TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006469 FormatStyle NoBinPacking = getLLVMStyle();
6470 NoBinPacking.BinPackParameters = false;
6471 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6472 " double *min_x,\n"
6473 " double *max_x,\n"
6474 " double *min_y,\n"
6475 " double *max_y,\n"
6476 " double *min_z,\n"
6477 " double *max_z, ) {}",
6478 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006479}
6480
Daniel Jasper83a54d22013-01-10 09:26:47 +00006481TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006482 verifyFormat("void f() { return; }\n42");
6483 verifyFormat("void f() {\n"
6484 " if (0)\n"
6485 " return;\n"
6486 "}\n"
6487 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006488 verifyFormat("void f() { return }\n42");
6489 verifyFormat("void f() {\n"
6490 " if (0)\n"
6491 " return\n"
6492 "}\n"
6493 "42");
6494}
6495
6496TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6497 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6498 EXPECT_EQ("void f() {\n"
6499 " if (a)\n"
6500 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006501 "}",
6502 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006503 EXPECT_EQ("namespace N {\n"
6504 "void f()\n"
6505 "}",
6506 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006507 EXPECT_EQ("namespace N {\n"
6508 "void f() {}\n"
6509 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006510 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006511 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006512}
6513
Daniel Jasper2df93312013-01-09 10:16:05 +00006514TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6515 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006516 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006517 " b;",
6518 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006519 verifyFormat("function(\n"
6520 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006521 " LoooooooooooongArgument);\n",
6522 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006523}
6524
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006525TEST_F(FormatTest, IncorrectAccessSpecifier) {
6526 verifyFormat("public:");
6527 verifyFormat("class A {\n"
6528 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006529 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006530 "};");
6531 verifyFormat("public\n"
6532 "int qwerty;");
6533 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006534 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006535 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006536 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006537 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006538 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006539}
Daniel Jasperf7935112012-12-03 18:12:45 +00006540
Daniel Jasper291f9362013-03-20 15:58:10 +00006541TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6542 verifyFormat("{");
6543 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006544 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006545}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006546
6547TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006548 verifyFormat("do {\n}");
6549 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006550 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006551 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006552 "wheeee(fun);");
6553 verifyFormat("do {\n"
6554 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006555 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006556}
6557
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006558TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006559 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006560 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006561 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006562 verifyFormat("while {\n foo;\n foo();\n}");
6563 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006564}
6565
Daniel Jasperc0880a92013-01-04 18:52:56 +00006566TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006567 verifyIncompleteFormat("namespace {\n"
6568 "class Foo { Foo (\n"
6569 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006570 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006571}
6572
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006573TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006574 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006575 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6576 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006577 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006578
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006579 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006580 " {\n"
6581 " breakme(\n"
6582 " qwe);\n"
6583 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006584 format("{\n"
6585 " {\n"
6586 " breakme(qwe);\n"
6587 "}\n",
6588 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006589}
6590
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006591TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006592 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006593 " avariable,\n"
6594 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006595 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006596}
6597
Manuel Klimek762dd182013-01-21 10:07:49 +00006598TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006599 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006600}
6601
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006602TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006603 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006604 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006605 " 1,\n"
6606 " 2,\n"
6607 " 3,\n"
6608 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006609 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006610 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6611 verifyFormat("f({1, 2});");
6612 verifyFormat("auto v = Foo{-1};");
6613 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6614 verifyFormat("Class::Class : member{1, 2, 3} {}");
6615 verifyFormat("new vector<int>{1, 2, 3};");
6616 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006617 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006618 verifyFormat("return {arg1, arg2};");
6619 verifyFormat("return {arg1, SomeType{parameter}};");
6620 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6621 verifyFormat("new T{arg1, arg2};");
6622 verifyFormat("f(MyMap[{composite, key}]);");
6623 verifyFormat("class Class {\n"
6624 " T member = {arg1, arg2};\n"
6625 "};");
6626 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006627 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6628 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006629 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6630 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006631
Daniel Jasper438059e2014-05-22 12:11:13 +00006632 verifyFormat("int foo(int i) { return fo1{}(i); }");
6633 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006634 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006635 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006636 verifyFormat("Node n{1, Node{1000}, //\n"
6637 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006638 verifyFormat("Aaaa aaaaaaa{\n"
6639 " {\n"
6640 " aaaa,\n"
6641 " },\n"
6642 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006643 verifyFormat("class C : public D {\n"
6644 " SomeClass SC{2};\n"
6645 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006646 verifyFormat("class C : public A {\n"
6647 " class D : public B {\n"
6648 " void f() { int i{2}; }\n"
6649 " };\n"
6650 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006651 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006652
Francois Ferrandd2130f52017-06-30 20:00:02 +00006653 // Binpacking only if there is no trailing comma
6654 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6655 " cccccccccc, dddddddddd};",
6656 getLLVMStyleWithColumns(50));
6657 verifyFormat("const Aaaaaa aaaaa = {\n"
6658 " aaaaaaaaaaa,\n"
6659 " bbbbbbbbbbb,\n"
6660 " ccccccccccc,\n"
6661 " ddddddddddd,\n"
6662 "};", getLLVMStyleWithColumns(50));
6663
Daniel Jaspere4ada022016-12-13 10:05:03 +00006664 // Cases where distinguising braced lists and blocks is hard.
6665 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6666 verifyFormat("void f() {\n"
6667 " return; // comment\n"
6668 "}\n"
6669 "SomeType t;");
6670 verifyFormat("void f() {\n"
6671 " if (a) {\n"
6672 " f();\n"
6673 " }\n"
6674 "}\n"
6675 "SomeType t;");
6676
Daniel Jasper08434342015-05-26 07:26:26 +00006677 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006678 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006679 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006680 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6681 " bbbbb,\n"
6682 " ccccc,\n"
6683 " ddddd,\n"
6684 " eeeee,\n"
6685 " ffffff,\n"
6686 " ggggg,\n"
6687 " hhhhhh,\n"
6688 " iiiiii,\n"
6689 " jjjjjj,\n"
6690 " kkkkkk};",
6691 NoBinPacking);
6692 verifyFormat("const Aaaaaa aaaaa = {\n"
6693 " aaaaa,\n"
6694 " bbbbb,\n"
6695 " ccccc,\n"
6696 " ddddd,\n"
6697 " eeeee,\n"
6698 " ffffff,\n"
6699 " ggggg,\n"
6700 " hhhhhh,\n"
6701 " iiiiii,\n"
6702 " jjjjjj,\n"
6703 " kkkkkk,\n"
6704 "};",
6705 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006706 verifyFormat(
6707 "const Aaaaaa aaaaa = {\n"
6708 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6709 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6710 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6711 "};",
6712 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006713
Chandler Carruthf8b72662014-03-02 12:37:31 +00006714 // FIXME: The alignment of these trailing comments might be bad. Then again,
6715 // this might be utterly useless in real code.
6716 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006717 " : some_value{ //\n"
6718 " aaaaaaa, //\n"
6719 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006720
Chandler Carruthf8b72662014-03-02 12:37:31 +00006721 // In braced lists, the first comment is always assumed to belong to the
6722 // first element. Thus, it can be moved to the next or previous line as
6723 // appropriate.
6724 EXPECT_EQ("function({// First element:\n"
6725 " 1,\n"
6726 " // Second element:\n"
6727 " 2});",
6728 format("function({\n"
6729 " // First element:\n"
6730 " 1,\n"
6731 " // Second element:\n"
6732 " 2});"));
6733 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6734 " // First element:\n"
6735 " 1,\n"
6736 " // Second element:\n"
6737 " 2};",
6738 format("std::vector<int> MyNumbers{// First element:\n"
6739 " 1,\n"
6740 " // Second element:\n"
6741 " 2};",
6742 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006743 // A trailing comma should still lead to an enforced line break and no
6744 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006745 EXPECT_EQ("vector<int> SomeVector = {\n"
6746 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006747 " 1,\n"
6748 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006749 "};",
6750 format("vector<int> SomeVector = { // aaa\n"
6751 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006752
Chandler Carruthf8b72662014-03-02 12:37:31 +00006753 FormatStyle ExtraSpaces = getLLVMStyle();
6754 ExtraSpaces.Cpp11BracedListStyle = false;
6755 ExtraSpaces.ColumnLimit = 75;
6756 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6757 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6758 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6759 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6760 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6761 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6762 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6763 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6764 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6765 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6766 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6767 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6768 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6769 verifyFormat("class Class {\n"
6770 " T member = { arg1, arg2 };\n"
6771 "};",
6772 ExtraSpaces);
6773 verifyFormat(
6774 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6775 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6776 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6777 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6778 ExtraSpaces);
6779 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006780 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006781 ExtraSpaces);
6782 verifyFormat(
6783 "someFunction(OtherParam,\n"
6784 " BracedList{ // comment 1 (Forcing interesting break)\n"
6785 " param1, param2,\n"
6786 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006787 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006788 ExtraSpaces);
6789 verifyFormat(
6790 "std::this_thread::sleep_for(\n"
6791 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6792 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006793 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006794 " aaaaaaa,\n"
6795 " aaaaaaaaaa,\n"
6796 " aaaaa,\n"
6797 " aaaaaaaaaaaaaaa,\n"
6798 " aaa,\n"
6799 " aaaaaaaaaa,\n"
6800 " a,\n"
6801 " aaaaaaaaaaaaaaaaaaaaa,\n"
6802 " aaaaaaaaaaaa,\n"
6803 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6804 " aaaaaaa,\n"
6805 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006806 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006807 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6808 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006809}
6810
Daniel Jasper33b909c2013-10-25 14:29:37 +00006811TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006812 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6813 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6814 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6815 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6816 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6817 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006818 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006819 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006820 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006821 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6822 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006823 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006824 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6825 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6826 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6827 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6828 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6829 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6830 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006831 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006832 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6833 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006834 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6835 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6836 " // Separating comment.\n"
6837 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6838 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6839 " // Leading comment\n"
6840 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6841 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006842 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6843 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006844 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006845 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6846 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006847 getLLVMStyleWithColumns(38));
6848 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006849 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6850 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006851 verifyFormat(
6852 "static unsigned SomeValues[10][3] = {\n"
6853 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6854 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6855 verifyFormat("static auto fields = new vector<string>{\n"
6856 " \"aaaaaaaaaaaaa\",\n"
6857 " \"aaaaaaaaaaaaa\",\n"
6858 " \"aaaaaaaaaaaa\",\n"
6859 " \"aaaaaaaaaaaaaa\",\n"
6860 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6861 " \"aaaaaaaaaaaa\",\n"
6862 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6863 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006864 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6865 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6866 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6867 " 3, cccccccccccccccccccccc};",
6868 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006869
6870 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006871 verifyFormat("vector<int> x = {\n"
6872 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6873 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006874 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006875 verifyFormat("vector<int> x = {\n"
6876 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006877 "};",
6878 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006879 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6880 " 1, 1, 1, 1,\n"
6881 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006882 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006883
Daniel Jasper60c27072015-05-13 08:16:00 +00006884 // Trailing comment in the first line.
6885 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6886 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6887 " 111111111, 222222222, 3333333333, 444444444, //\n"
6888 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006889 // Trailing comment in the last line.
6890 verifyFormat("int aaaaa[] = {\n"
6891 " 1, 2, 3, // comment\n"
6892 " 4, 5, 6 // comment\n"
6893 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006894
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006895 // With nested lists, we should either format one item per line or all nested
6896 // lists one on line.
6897 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006898 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6899 " {aaaaaaaaaaaaaaaaaaa},\n"
6900 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6901 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006902 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006903 verifyFormat(
6904 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006905 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6906 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6907 " {aaa, aaa},\n"
6908 " {aaa, aaa},\n"
6909 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6910 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6911 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006912
6913 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006914 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006915 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006916
6917 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006918
Daniel Jaspereb65e912015-12-21 18:31:15 +00006919 // No braced initializer here.
6920 verifyFormat("void f() {\n"
6921 " struct Dummy {};\n"
6922 " f(v);\n"
6923 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006924
6925 // Long lists should be formatted in columns even if they are nested.
6926 verifyFormat(
6927 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6928 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6929 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6930 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6931 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6932 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006933
6934 // Allow "single-column" layout even if that violates the column limit. There
6935 // isn't going to be a better way.
6936 verifyFormat("std::vector<int> a = {\n"
6937 " aaaaaaaa,\n"
6938 " aaaaaaaa,\n"
6939 " aaaaaaaa,\n"
6940 " aaaaaaaa,\n"
6941 " aaaaaaaaaa,\n"
6942 " aaaaaaaa,\n"
6943 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6944 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006945 verifyFormat("vector<int> aaaa = {\n"
6946 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6947 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6948 " aaaaaa.aaaaaaa,\n"
6949 " aaaaaa.aaaaaaa,\n"
6950 " aaaaaa.aaaaaaa,\n"
6951 " aaaaaa.aaaaaaa,\n"
6952 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006953
6954 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006955 verifyFormat("someFunction(Param, {List1, List2,\n"
6956 " List3});",
6957 getLLVMStyleWithColumns(35));
6958 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006959 " {List1, List2,\n"
6960 " List3});",
6961 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006962 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6963 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006964}
6965
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006966TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006967 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006968 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006969
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006970 verifyFormat("void f() { return 42; }");
6971 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006972 " return 42;\n"
6973 "}",
6974 DoNotMerge);
6975 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006976 " // Comment\n"
6977 "}");
6978 verifyFormat("{\n"
6979 "#error {\n"
6980 " int a;\n"
6981 "}");
6982 verifyFormat("{\n"
6983 " int a;\n"
6984 "#error {\n"
6985 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006986 verifyFormat("void f() {} // comment");
6987 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006988 verifyFormat("void f() {\n"
6989 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006990 DoNotMerge);
6991 verifyFormat("void f() {\n"
6992 " int a;\n"
6993 "} // comment",
6994 DoNotMerge);
6995 verifyFormat("void f() {\n"
6996 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006997 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006998
6999 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7000 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7001
7002 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7003 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007004 verifyFormat("class C {\n"
7005 " C()\n"
7006 " : iiiiiiii(nullptr),\n"
7007 " kkkkkkk(nullptr),\n"
7008 " mmmmmmm(nullptr),\n"
7009 " nnnnnnn(nullptr) {}\n"
7010 "};",
7011 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007012
7013 FormatStyle NoColumnLimit = getLLVMStyle();
7014 NoColumnLimit.ColumnLimit = 0;
7015 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7016 EXPECT_EQ("class C {\n"
7017 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007018 "};",
7019 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007020 EXPECT_EQ("A()\n"
7021 " : b(0) {\n"
7022 "}",
7023 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7024
7025 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007026 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7027 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007028 EXPECT_EQ("A()\n"
7029 " : b(0) {\n"
7030 "}",
7031 format("A():b(0){}", DoNotMergeNoColumnLimit));
7032 EXPECT_EQ("A()\n"
7033 " : b(0) {\n"
7034 "}",
7035 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007036
7037 verifyFormat("#define A \\\n"
7038 " void f() { \\\n"
7039 " int i; \\\n"
7040 " }",
7041 getLLVMStyleWithColumns(20));
7042 verifyFormat("#define A \\\n"
7043 " void f() { int i; }",
7044 getLLVMStyleWithColumns(21));
7045 verifyFormat("#define A \\\n"
7046 " void f() { \\\n"
7047 " int i; \\\n"
7048 " } \\\n"
7049 " int j;",
7050 getLLVMStyleWithColumns(22));
7051 verifyFormat("#define A \\\n"
7052 " void f() { int i; } \\\n"
7053 " int j;",
7054 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007055}
7056
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007057TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7058 FormatStyle MergeEmptyOnly = getLLVMStyle();
7059 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7060 verifyFormat("class C {\n"
7061 " int f() {}\n"
7062 "};",
7063 MergeEmptyOnly);
7064 verifyFormat("class C {\n"
7065 " int f() {\n"
7066 " return 42;\n"
7067 " }\n"
7068 "};",
7069 MergeEmptyOnly);
7070 verifyFormat("int f() {}", MergeEmptyOnly);
7071 verifyFormat("int f() {\n"
7072 " return 42;\n"
7073 "}",
7074 MergeEmptyOnly);
7075
7076 // Also verify behavior when BraceWrapping.AfterFunction = true
7077 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7078 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7079 verifyFormat("int f() {}", MergeEmptyOnly);
7080 verifyFormat("class C {\n"
7081 " int f() {}\n"
7082 "};",
7083 MergeEmptyOnly);
7084}
7085
Daniel Jasperd74cf402014-04-08 12:46:38 +00007086TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7087 FormatStyle MergeInlineOnly = getLLVMStyle();
7088 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7089 verifyFormat("class C {\n"
7090 " int f() { return 42; }\n"
7091 "};",
7092 MergeInlineOnly);
7093 verifyFormat("int f() {\n"
7094 " return 42;\n"
7095 "}",
7096 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007097
7098 // SFS_Inline implies SFS_Empty
7099 verifyFormat("class C {\n"
7100 " int f() {}\n"
7101 "};",
7102 MergeInlineOnly);
7103 verifyFormat("int f() {}", MergeInlineOnly);
7104
7105 // Also verify behavior when BraceWrapping.AfterFunction = true
7106 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7107 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7108 verifyFormat("class C {\n"
7109 " int f() { return 42; }\n"
7110 "};",
7111 MergeInlineOnly);
7112 verifyFormat("int f()\n"
7113 "{\n"
7114 " return 42;\n"
7115 "}",
7116 MergeInlineOnly);
7117
7118 // SFS_Inline implies SFS_Empty
7119 verifyFormat("int f() {}", MergeInlineOnly);
7120 verifyFormat("class C {\n"
7121 " int f() {}\n"
7122 "};",
7123 MergeInlineOnly);
7124}
7125
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007126TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7127 FormatStyle MergeInlineOnly = getLLVMStyle();
7128 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7129 FormatStyle::SFS_InlineOnly;
7130 verifyFormat("class C {\n"
7131 " int f() { return 42; }\n"
7132 "};",
7133 MergeInlineOnly);
7134 verifyFormat("int f() {\n"
7135 " return 42;\n"
7136 "}",
7137 MergeInlineOnly);
7138
7139 // SFS_InlineOnly does not imply SFS_Empty
7140 verifyFormat("class C {\n"
7141 " int f() {}\n"
7142 "};",
7143 MergeInlineOnly);
7144 verifyFormat("int f() {\n"
7145 "}",
7146 MergeInlineOnly);
7147
7148 // Also verify behavior when BraceWrapping.AfterFunction = true
7149 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7150 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7151 verifyFormat("class C {\n"
7152 " int f() { return 42; }\n"
7153 "};",
7154 MergeInlineOnly);
7155 verifyFormat("int f()\n"
7156 "{\n"
7157 " return 42;\n"
7158 "}",
7159 MergeInlineOnly);
7160
7161 // SFS_InlineOnly does not imply SFS_Empty
7162 verifyFormat("int f()\n"
7163 "{\n"
7164 "}",
7165 MergeInlineOnly);
7166 verifyFormat("class C {\n"
7167 " int f() {}\n"
7168 "};",
7169 MergeInlineOnly);
7170}
7171
Francois Ferrandad722562017-06-30 20:25:55 +00007172TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007173 FormatStyle Style = getLLVMStyle();
7174 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7175 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7176 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007177 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007178 Style.ColumnLimit = 40;
7179
7180 verifyFormat("int f()\n"
7181 "{}",
7182 Style);
7183 verifyFormat("int f()\n"
7184 "{\n"
7185 " return 42;\n"
7186 "}",
7187 Style);
7188 verifyFormat("int f()\n"
7189 "{\n"
7190 " // some comment\n"
7191 "}",
7192 Style);
7193
7194 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7195 verifyFormat("int f() {}", Style);
7196 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7197 "{}",
7198 Style);
7199 verifyFormat("int f()\n"
7200 "{\n"
7201 " return 0;\n"
7202 "}",
7203 Style);
7204
7205 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7206 verifyFormat("class Foo {\n"
7207 " int f() {}\n"
7208 "};\n",
7209 Style);
7210 verifyFormat("class Foo {\n"
7211 " int f() { return 0; }\n"
7212 "};\n",
7213 Style);
7214 verifyFormat("class Foo {\n"
7215 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7216 " {}\n"
7217 "};\n",
7218 Style);
7219 verifyFormat("class Foo {\n"
7220 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7221 " {\n"
7222 " return 0;\n"
7223 " }\n"
7224 "};\n",
7225 Style);
7226
7227 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7228 verifyFormat("int f() {}", Style);
7229 verifyFormat("int f() { return 0; }", Style);
7230 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7231 "{}",
7232 Style);
7233 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7234 "{\n"
7235 " return 0;\n"
7236 "}",
7237 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007238}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007239TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7240 FormatStyle Style = getLLVMStyle();
7241 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7242 verifyFormat("#ifdef A\n"
7243 "int f() {}\n"
7244 "#else\n"
7245 "int g() {}\n"
7246 "#endif",
7247 Style);
7248}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007249
Francois Ferrandad722562017-06-30 20:25:55 +00007250TEST_F(FormatTest, SplitEmptyClass) {
7251 FormatStyle Style = getLLVMStyle();
7252 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7253 Style.BraceWrapping.AfterClass = true;
7254 Style.BraceWrapping.SplitEmptyRecord = false;
7255
7256 verifyFormat("class Foo\n"
7257 "{};",
7258 Style);
7259 verifyFormat("/* something */ class Foo\n"
7260 "{};",
7261 Style);
7262 verifyFormat("template <typename X> class Foo\n"
7263 "{};",
7264 Style);
7265 verifyFormat("class Foo\n"
7266 "{\n"
7267 " Foo();\n"
7268 "};",
7269 Style);
7270 verifyFormat("typedef class Foo\n"
7271 "{\n"
7272 "} Foo_t;",
7273 Style);
7274}
7275
7276TEST_F(FormatTest, SplitEmptyStruct) {
7277 FormatStyle Style = getLLVMStyle();
7278 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7279 Style.BraceWrapping.AfterStruct = true;
7280 Style.BraceWrapping.SplitEmptyRecord = false;
7281
7282 verifyFormat("struct Foo\n"
7283 "{};",
7284 Style);
7285 verifyFormat("/* something */ struct Foo\n"
7286 "{};",
7287 Style);
7288 verifyFormat("template <typename X> struct Foo\n"
7289 "{};",
7290 Style);
7291 verifyFormat("struct Foo\n"
7292 "{\n"
7293 " Foo();\n"
7294 "};",
7295 Style);
7296 verifyFormat("typedef struct Foo\n"
7297 "{\n"
7298 "} Foo_t;",
7299 Style);
7300 //typedef struct Bar {} Bar_t;
7301}
7302
7303TEST_F(FormatTest, SplitEmptyUnion) {
7304 FormatStyle Style = getLLVMStyle();
7305 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7306 Style.BraceWrapping.AfterUnion = true;
7307 Style.BraceWrapping.SplitEmptyRecord = false;
7308
7309 verifyFormat("union Foo\n"
7310 "{};",
7311 Style);
7312 verifyFormat("/* something */ union Foo\n"
7313 "{};",
7314 Style);
7315 verifyFormat("union Foo\n"
7316 "{\n"
7317 " A,\n"
7318 "};",
7319 Style);
7320 verifyFormat("typedef union Foo\n"
7321 "{\n"
7322 "} Foo_t;",
7323 Style);
7324}
7325
7326TEST_F(FormatTest, SplitEmptyNamespace) {
7327 FormatStyle Style = getLLVMStyle();
7328 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7329 Style.BraceWrapping.AfterNamespace = true;
7330 Style.BraceWrapping.SplitEmptyNamespace = false;
7331
7332 verifyFormat("namespace Foo\n"
7333 "{};",
7334 Style);
7335 verifyFormat("/* something */ namespace Foo\n"
7336 "{};",
7337 Style);
7338 verifyFormat("inline namespace Foo\n"
7339 "{};",
7340 Style);
7341 verifyFormat("namespace Foo\n"
7342 "{\n"
7343 "void Bar();\n"
7344 "};",
7345 Style);
7346}
7347
7348TEST_F(FormatTest, NeverMergeShortRecords) {
7349 FormatStyle Style = getLLVMStyle();
7350
7351 verifyFormat("class Foo {\n"
7352 " Foo();\n"
7353 "};",
7354 Style);
7355 verifyFormat("typedef class Foo {\n"
7356 " Foo();\n"
7357 "} Foo_t;",
7358 Style);
7359 verifyFormat("struct Foo {\n"
7360 " Foo();\n"
7361 "};",
7362 Style);
7363 verifyFormat("typedef struct Foo {\n"
7364 " Foo();\n"
7365 "} Foo_t;",
7366 Style);
7367 verifyFormat("union Foo {\n"
7368 " A,\n"
7369 "};",
7370 Style);
7371 verifyFormat("typedef union Foo {\n"
7372 " A,\n"
7373 "} Foo_t;",
7374 Style);
7375 verifyFormat("namespace Foo {\n"
7376 "void Bar();\n"
7377 "};",
7378 Style);
7379
7380 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7381 Style.BraceWrapping.AfterClass = true;
7382 Style.BraceWrapping.AfterStruct = true;
7383 Style.BraceWrapping.AfterUnion = true;
7384 Style.BraceWrapping.AfterNamespace = true;
7385 verifyFormat("class Foo\n"
7386 "{\n"
7387 " Foo();\n"
7388 "};",
7389 Style);
7390 verifyFormat("typedef class Foo\n"
7391 "{\n"
7392 " Foo();\n"
7393 "} Foo_t;",
7394 Style);
7395 verifyFormat("struct Foo\n"
7396 "{\n"
7397 " Foo();\n"
7398 "};",
7399 Style);
7400 verifyFormat("typedef struct Foo\n"
7401 "{\n"
7402 " Foo();\n"
7403 "} Foo_t;",
7404 Style);
7405 verifyFormat("union Foo\n"
7406 "{\n"
7407 " A,\n"
7408 "};",
7409 Style);
7410 verifyFormat("typedef union Foo\n"
7411 "{\n"
7412 " A,\n"
7413 "} Foo_t;",
7414 Style);
7415 verifyFormat("namespace Foo\n"
7416 "{\n"
7417 "void Bar();\n"
7418 "};",
7419 Style);
7420}
7421
Manuel Klimeke01bab52013-01-15 13:38:33 +00007422TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7423 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007424 verifyFormat("struct foo a = {bar};\nint n;");
7425 verifyFormat("class foo a = {bar};\nint n;");
7426 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007427
7428 // Elaborate types inside function definitions.
7429 verifyFormat("struct foo f() {}\nint n;");
7430 verifyFormat("class foo f() {}\nint n;");
7431 verifyFormat("union foo f() {}\nint n;");
7432
7433 // Templates.
7434 verifyFormat("template <class X> void f() {}\nint n;");
7435 verifyFormat("template <struct X> void f() {}\nint n;");
7436 verifyFormat("template <union X> void f() {}\nint n;");
7437
7438 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007439 verifyFormat("struct {\n} n;");
7440 verifyFormat(
7441 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007442 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007443 verifyFormat("class MACRO Z {\n} n;");
7444 verifyFormat("class MACRO(X) Z {\n} n;");
7445 verifyFormat("class __attribute__(X) Z {\n} n;");
7446 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007447 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007448 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007449 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7450 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007451
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007452 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007453 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007454
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007455 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007456 verifyFormat(
7457 "template <typename F>\n"
7458 "Matcher(const Matcher<F> &Other,\n"
7459 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7460 " !is_same<F, T>::value>::type * = 0)\n"
7461 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7462
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007463 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007464 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007465 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007466
7467 // FIXME:
7468 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007469 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007470
Manuel Klimeke01bab52013-01-15 13:38:33 +00007471 // Elaborate types where incorrectly parsing the structural element would
7472 // break the indent.
7473 verifyFormat("if (true)\n"
7474 " class X x;\n"
7475 "else\n"
7476 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007477
7478 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007479 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007480}
7481
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007482TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007483 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7484 format("#error Leave all white!!!!! space* alone!\n"));
7485 EXPECT_EQ(
7486 "#warning Leave all white!!!!! space* alone!\n",
7487 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007488 EXPECT_EQ("#error 1", format(" # error 1"));
7489 EXPECT_EQ("#warning 1", format(" # warning 1"));
7490}
7491
Daniel Jasper4431aa92013-04-23 13:54:04 +00007492TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007493 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007494 verifyFormat("#if (AAAA && BBBB)");
7495 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007496 // FIXME: Come up with a better indentation for #elif.
7497 verifyFormat(
7498 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7499 " defined(BBBBBBBB)\n"
7500 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7501 " defined(BBBBBBBB)\n"
7502 "#endif",
7503 getLLVMStyleWithColumns(65));
7504}
7505
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007506TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7507 FormatStyle AllowsMergedIf = getGoogleStyle();
7508 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7509 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7510 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007511 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7512 EXPECT_EQ("if (true) return 42;",
7513 format("if (true)\nreturn 42;", AllowsMergedIf));
7514 FormatStyle ShortMergedIf = AllowsMergedIf;
7515 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007516 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007517 " if (true) return 42;",
7518 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007519 verifyFormat("#define A \\\n"
7520 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007521 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007522 "#define B",
7523 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007524 verifyFormat("#define A \\\n"
7525 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007526 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007527 "g();",
7528 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007529 verifyFormat("{\n"
7530 "#ifdef A\n"
7531 " // Comment\n"
7532 " if (true) continue;\n"
7533 "#endif\n"
7534 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007535 " if (true) continue;\n"
7536 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007537 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007538 ShortMergedIf.ColumnLimit = 33;
7539 verifyFormat("#define A \\\n"
7540 " if constexpr (true) return 42;",
7541 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007542 ShortMergedIf.ColumnLimit = 29;
7543 verifyFormat("#define A \\\n"
7544 " if (aaaaaaaaaa) return 1; \\\n"
7545 " return 2;",
7546 ShortMergedIf);
7547 ShortMergedIf.ColumnLimit = 28;
7548 verifyFormat("#define A \\\n"
7549 " if (aaaaaaaaaa) \\\n"
7550 " return 1; \\\n"
7551 " return 2;",
7552 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007553 verifyFormat("#define A \\\n"
7554 " if constexpr (aaaaaaa) \\\n"
7555 " return 1; \\\n"
7556 " return 2;",
7557 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007558}
7559
Manuel Klimekd33516e2013-01-23 10:09:28 +00007560TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007561 verifyFormat("void f(int *a);");
7562 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007563 verifyFormat("class A {\n void f(int *a);\n};");
7564 verifyFormat("class A {\n int *a;\n};");
7565 verifyFormat("namespace a {\n"
7566 "namespace b {\n"
7567 "class A {\n"
7568 " void f() {}\n"
7569 " int *a;\n"
7570 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007571 "} // namespace b\n"
7572 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007573}
7574
Manuel Klimekd33516e2013-01-23 10:09:28 +00007575TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7576 verifyFormat("while");
7577 verifyFormat("operator");
7578}
7579
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007580TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7581 // This code would be painfully slow to format if we didn't skip it.
7582 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
7583 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7584 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7585 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7586 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7587 "A(1, 1)\n"
7588 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7589 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7590 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7591 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7592 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7593 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7594 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7595 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7596 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7597 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7598 // Deeply nested part is untouched, rest is formatted.
7599 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7600 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007601 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007602}
7603
Nico Weber7e6a7a12013-01-08 17:56:31 +00007604//===----------------------------------------------------------------------===//
7605// Objective-C tests.
7606//===----------------------------------------------------------------------===//
7607
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007608TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7609 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7610 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7611 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007612 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007613 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7614 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7615 format("-(NSInteger)Method3:(id)anObject;"));
7616 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7617 format("-(NSInteger)Method4:(id)anObject;"));
7618 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7619 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7620 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7621 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007622 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7623 "forAllCells:(BOOL)flag;",
7624 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7625 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007626
7627 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007628 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7629 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007630 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7631 " inRange:(NSRange)range\n"
7632 " outRange:(NSRange)out_range\n"
7633 " outRange1:(NSRange)out_range1\n"
7634 " outRange2:(NSRange)out_range2\n"
7635 " outRange3:(NSRange)out_range3\n"
7636 " outRange4:(NSRange)out_range4\n"
7637 " outRange5:(NSRange)out_range5\n"
7638 " outRange6:(NSRange)out_range6\n"
7639 " outRange7:(NSRange)out_range7\n"
7640 " outRange8:(NSRange)out_range8\n"
7641 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007642
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007643 // When the function name has to be wrapped.
7644 FormatStyle Style = getLLVMStyle();
7645 Style.IndentWrappedFunctionNames = false;
7646 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7647 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7648 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7649 "}",
7650 Style);
7651 Style.IndentWrappedFunctionNames = true;
7652 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7653 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7654 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7655 "}",
7656 Style);
7657
Nico Weberd6f962f2013-01-10 20:18:33 +00007658 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007659 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007660 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7661 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007662 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007663
Daniel Jasper37194282013-05-28 08:33:00 +00007664 verifyFormat("- (int (*)())foo:(int (*)())f;");
7665 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007666
7667 // If there's no return type (very rare in practice!), LLVM and Google style
7668 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007669 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007670 verifyFormat("- foo:(int)f;");
7671 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007672}
7673
Nico Weber0588b502013-02-07 00:19:29 +00007674
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007675TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007676 EXPECT_EQ("\"some text \"\n"
7677 "\"other\";",
7678 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007679 EXPECT_EQ("\"some text \"\n"
7680 "\"other\";",
7681 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007682 EXPECT_EQ(
7683 "#define A \\\n"
7684 " \"some \" \\\n"
7685 " \"text \" \\\n"
7686 " \"other\";",
7687 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7688 EXPECT_EQ(
7689 "#define A \\\n"
7690 " \"so \" \\\n"
7691 " \"text \" \\\n"
7692 " \"other\";",
7693 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7694
7695 EXPECT_EQ("\"some text\"",
7696 format("\"some text\"", getLLVMStyleWithColumns(1)));
7697 EXPECT_EQ("\"some text\"",
7698 format("\"some text\"", getLLVMStyleWithColumns(11)));
7699 EXPECT_EQ("\"some \"\n"
7700 "\"text\"",
7701 format("\"some text\"", getLLVMStyleWithColumns(10)));
7702 EXPECT_EQ("\"some \"\n"
7703 "\"text\"",
7704 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007705 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007706 "\" tex\"\n"
7707 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007708 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007709 EXPECT_EQ("\"some\"\n"
7710 "\" tex\"\n"
7711 "\" and\"",
7712 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7713 EXPECT_EQ("\"some\"\n"
7714 "\"/tex\"\n"
7715 "\"/and\"",
7716 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007717
7718 EXPECT_EQ("variable =\n"
7719 " \"long string \"\n"
7720 " \"literal\";",
7721 format("variable = \"long string literal\";",
7722 getLLVMStyleWithColumns(20)));
7723
7724 EXPECT_EQ("variable = f(\n"
7725 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007726 " \"literal\",\n"
7727 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007728 " loooooooooooooooooooong);",
7729 format("variable = f(\"long string literal\", short, "
7730 "loooooooooooooooooooong);",
7731 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007732
Daniel Jaspera44991332015-04-29 13:06:49 +00007733 EXPECT_EQ(
7734 "f(g(\"long string \"\n"
7735 " \"literal\"),\n"
7736 " b);",
7737 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007738 EXPECT_EQ("f(g(\"long string \"\n"
7739 " \"literal\",\n"
7740 " a),\n"
7741 " b);",
7742 format("f(g(\"long string literal\", a), b);",
7743 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007744 EXPECT_EQ(
7745 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007746 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007747 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7748 EXPECT_EQ("f(\"one two three four five six \"\n"
7749 " \"seven\".split(\n"
7750 " really_looooong_variable));",
7751 format("f(\"one two three four five six seven\"."
7752 "split(really_looooong_variable));",
7753 getLLVMStyleWithColumns(33)));
7754
7755 EXPECT_EQ("f(\"some \"\n"
7756 " \"text\",\n"
7757 " other);",
7758 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007759
7760 // Only break as a last resort.
7761 verifyFormat(
7762 "aaaaaaaaaaaaaaaaaaaa(\n"
7763 " aaaaaaaaaaaaaaaaaaaa,\n"
7764 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007765
Daniel Jaspera44991332015-04-29 13:06:49 +00007766 EXPECT_EQ("\"splitmea\"\n"
7767 "\"trandomp\"\n"
7768 "\"oint\"",
7769 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007770
Daniel Jaspera44991332015-04-29 13:06:49 +00007771 EXPECT_EQ("\"split/\"\n"
7772 "\"pathat/\"\n"
7773 "\"slashes\"",
7774 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007775
Daniel Jaspera44991332015-04-29 13:06:49 +00007776 EXPECT_EQ("\"split/\"\n"
7777 "\"pathat/\"\n"
7778 "\"slashes\"",
7779 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007780 EXPECT_EQ("\"split at \"\n"
7781 "\"spaces/at/\"\n"
7782 "\"slashes.at.any$\"\n"
7783 "\"non-alphanumeric%\"\n"
7784 "\"1111111111characte\"\n"
7785 "\"rs\"",
7786 format("\"split at "
7787 "spaces/at/"
7788 "slashes.at."
7789 "any$non-"
7790 "alphanumeric%"
7791 "1111111111characte"
7792 "rs\"",
7793 getLLVMStyleWithColumns(20)));
7794
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007795 // Verify that splitting the strings understands
7796 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007797 EXPECT_EQ(
7798 "aaaaaaaaaaaa(\n"
7799 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7800 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7801 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7802 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7803 "aaaaaaaaaaaaaaaaaaaaaa\");",
7804 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007805 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7806 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7807 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7808 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7809 "aaaaaaaaaaaaaaaaaaaaaa\";",
7810 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007811 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7812 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7813 format("llvm::outs() << "
7814 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7815 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007816 EXPECT_EQ("ffff(\n"
7817 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7818 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7819 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7820 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7821 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007822
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007823 FormatStyle Style = getLLVMStyleWithColumns(12);
7824 Style.BreakStringLiterals = false;
7825 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7826
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007827 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007828 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007829 EXPECT_EQ("#define A \\\n"
7830 " \"some \" \\\n"
7831 " \"text \" \\\n"
7832 " \"other\";",
7833 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007834}
7835
Manuel Klimek93699f42017-11-29 14:29:43 +00007836TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7837 EXPECT_EQ("C a = \"some more \"\n"
7838 " \"text\";",
7839 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7840}
7841
Manuel Klimek9e321992015-07-28 15:50:24 +00007842TEST_F(FormatTest, FullyRemoveEmptyLines) {
7843 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7844 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7845 EXPECT_EQ("int i = a(b());",
7846 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7847}
7848
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007849TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7850 EXPECT_EQ(
7851 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7852 "(\n"
7853 " \"x\t\");",
7854 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7855 "aaaaaaa("
7856 "\"x\t\");"));
7857}
7858
Daniel Jasper174b0122014-01-09 14:18:12 +00007859TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007860 EXPECT_EQ(
7861 "u8\"utf8 string \"\n"
7862 "u8\"literal\";",
7863 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7864 EXPECT_EQ(
7865 "u\"utf16 string \"\n"
7866 "u\"literal\";",
7867 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7868 EXPECT_EQ(
7869 "U\"utf32 string \"\n"
7870 "U\"literal\";",
7871 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7872 EXPECT_EQ("L\"wide string \"\n"
7873 "L\"literal\";",
7874 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007875 EXPECT_EQ("@\"NSString \"\n"
7876 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007877 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007878 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007879
7880 // This input makes clang-format try to split the incomplete unicode escape
7881 // sequence, which used to lead to a crasher.
7882 verifyNoCrash(
7883 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7884 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007885}
7886
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007887TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7888 FormatStyle Style = getGoogleStyleWithColumns(15);
7889 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7890 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7891 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7892 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7893 EXPECT_EQ("u8R\"x(raw literal)x\";",
7894 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007895}
7896
7897TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7898 FormatStyle Style = getLLVMStyleWithColumns(20);
7899 EXPECT_EQ(
7900 "_T(\"aaaaaaaaaaaaaa\")\n"
7901 "_T(\"aaaaaaaaaaaaaa\")\n"
7902 "_T(\"aaaaaaaaaaaa\")",
7903 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007904 EXPECT_EQ("f(x,\n"
7905 " _T(\"aaaaaaaaaaaa\")\n"
7906 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007907 " z);",
7908 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7909
7910 // FIXME: Handle embedded spaces in one iteration.
7911 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7912 // "_T(\"aaaaaaaaaaaaa\")\n"
7913 // "_T(\"aaaaaaaaaaaaa\")\n"
7914 // "_T(\"a\")",
7915 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7916 // getLLVMStyleWithColumns(20)));
7917 EXPECT_EQ(
7918 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7919 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007920 EXPECT_EQ("f(\n"
7921 "#if !TEST\n"
7922 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7923 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007924 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007925 format("f(\n"
7926 "#if !TEST\n"
7927 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7928 "#endif\n"
7929 ");"));
7930 EXPECT_EQ("f(\n"
7931 "\n"
7932 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7933 format("f(\n"
7934 "\n"
7935 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007936}
7937
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007938TEST_F(FormatTest, BreaksStringLiteralOperands) {
7939 // In a function call with two operands, the second can be broken with no line
7940 // break before it.
7941 EXPECT_EQ("func(a, \"long long \"\n"
7942 " \"long long\");",
7943 format("func(a, \"long long long long\");",
7944 getLLVMStyleWithColumns(24)));
7945 // In a function call with three operands, the second must be broken with a
7946 // line break before it.
7947 EXPECT_EQ("func(a,\n"
7948 " \"long long long \"\n"
7949 " \"long\",\n"
7950 " c);",
7951 format("func(a, \"long long long long\", c);",
7952 getLLVMStyleWithColumns(24)));
7953 // In a function call with three operands, the third must be broken with a
7954 // line break before it.
7955 EXPECT_EQ("func(a, b,\n"
7956 " \"long long long \"\n"
7957 " \"long\");",
7958 format("func(a, b, \"long long long long\");",
7959 getLLVMStyleWithColumns(24)));
7960 // In a function call with three operands, both the second and the third must
7961 // be broken with a line break before them.
7962 EXPECT_EQ("func(a,\n"
7963 " \"long long long \"\n"
7964 " \"long\",\n"
7965 " \"long long long \"\n"
7966 " \"long\");",
7967 format("func(a, \"long long long long\", \"long long long long\");",
7968 getLLVMStyleWithColumns(24)));
7969 // In a chain of << with two operands, the second can be broken with no line
7970 // break before it.
7971 EXPECT_EQ("a << \"line line \"\n"
7972 " \"line\";",
7973 format("a << \"line line line\";",
7974 getLLVMStyleWithColumns(20)));
7975 // In a chain of << with three operands, the second can be broken with no line
7976 // break before it.
7977 EXPECT_EQ("abcde << \"line \"\n"
7978 " \"line line\"\n"
7979 " << c;",
7980 format("abcde << \"line line line\" << c;",
7981 getLLVMStyleWithColumns(20)));
7982 // In a chain of << with three operands, the third must be broken with a line
7983 // break before it.
7984 EXPECT_EQ("a << b\n"
7985 " << \"line line \"\n"
7986 " \"line\";",
7987 format("a << b << \"line line line\";",
7988 getLLVMStyleWithColumns(20)));
7989 // In a chain of << with three operands, the second can be broken with no line
7990 // break before it and the third must be broken with a line break before it.
7991 EXPECT_EQ("abcd << \"line line \"\n"
7992 " \"line\"\n"
7993 " << \"line line \"\n"
7994 " \"line\";",
7995 format("abcd << \"line line line\" << \"line line line\";",
7996 getLLVMStyleWithColumns(20)));
7997 // In a chain of binary operators with two operands, the second can be broken
7998 // with no line break before it.
7999 EXPECT_EQ("abcd + \"line line \"\n"
8000 " \"line line\";",
8001 format("abcd + \"line line line line\";",
8002 getLLVMStyleWithColumns(20)));
8003 // In a chain of binary operators with three operands, the second must be
8004 // broken with a line break before it.
8005 EXPECT_EQ("abcd +\n"
8006 " \"line line \"\n"
8007 " \"line line\" +\n"
8008 " e;",
8009 format("abcd + \"line line line line\" + e;",
8010 getLLVMStyleWithColumns(20)));
8011 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8012 // the first must be broken with a line break before it.
8013 FormatStyle Style = getLLVMStyleWithColumns(25);
8014 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8015 EXPECT_EQ("someFunction(\n"
8016 " \"long long long \"\n"
8017 " \"long\",\n"
8018 " a);",
8019 format("someFunction(\"long long long long\", a);", Style));
8020}
8021
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008022TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008023 EXPECT_EQ(
8024 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8027 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8030}
8031
8032TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8033 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008034 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008035 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8036 "multiline raw string literal xxxxxxxxxxxxxx\n"
8037 ")x\",\n"
8038 " a),\n"
8039 " b);",
8040 format("fffffffffff(g(R\"x(\n"
8041 "multiline raw string literal xxxxxxxxxxxxxx\n"
8042 ")x\", a), b);",
8043 getGoogleStyleWithColumns(20)));
8044 EXPECT_EQ("fffffffffff(\n"
8045 " g(R\"x(qqq\n"
8046 "multiline raw string literal xxxxxxxxxxxxxx\n"
8047 ")x\",\n"
8048 " a),\n"
8049 " b);",
8050 format("fffffffffff(g(R\"x(qqq\n"
8051 "multiline raw string literal xxxxxxxxxxxxxx\n"
8052 ")x\", a), b);",
8053 getGoogleStyleWithColumns(20)));
8054
8055 EXPECT_EQ("fffffffffff(R\"x(\n"
8056 "multiline raw string literal xxxxxxxxxxxxxx\n"
8057 ")x\");",
8058 format("fffffffffff(R\"x(\n"
8059 "multiline raw string literal xxxxxxxxxxxxxx\n"
8060 ")x\");",
8061 getGoogleStyleWithColumns(20)));
8062 EXPECT_EQ("fffffffffff(R\"x(\n"
8063 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008064 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008065 format("fffffffffff(R\"x(\n"
8066 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008067 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008068 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008069 EXPECT_EQ("fffffffffff(\n"
8070 " R\"x(\n"
8071 "multiline raw string literal xxxxxxxxxxxxxx\n"
8072 ")x\" +\n"
8073 " bbbbbb);",
8074 format("fffffffffff(\n"
8075 " R\"x(\n"
8076 "multiline raw string literal xxxxxxxxxxxxxx\n"
8077 ")x\" + bbbbbb);",
8078 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008079}
8080
Alexander Kornienkobe633902013-06-14 11:46:10 +00008081TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008082 verifyFormat("string a = \"unterminated;");
8083 EXPECT_EQ("function(\"unterminated,\n"
8084 " OtherParameter);",
8085 format("function( \"unterminated,\n"
8086 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008087}
8088
8089TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008090 FormatStyle Style = getLLVMStyle();
8091 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008092 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008093 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008094}
8095
Daniel Jaspera44991332015-04-29 13:06:49 +00008096TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008097
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008098TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8099 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8100 " \"ddeeefff\");",
8101 format("someFunction(\"aaabbbcccdddeeefff\");",
8102 getLLVMStyleWithColumns(25)));
8103 EXPECT_EQ("someFunction1234567890(\n"
8104 " \"aaabbbcccdddeeefff\");",
8105 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8106 getLLVMStyleWithColumns(26)));
8107 EXPECT_EQ("someFunction1234567890(\n"
8108 " \"aaabbbcccdddeeeff\"\n"
8109 " \"f\");",
8110 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8111 getLLVMStyleWithColumns(25)));
8112 EXPECT_EQ("someFunction1234567890(\n"
8113 " \"aaabbbcccdddeeeff\"\n"
8114 " \"f\");",
8115 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8116 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008117 EXPECT_EQ("someFunction(\n"
8118 " \"aaabbbcc ddde \"\n"
8119 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008120 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008121 getLLVMStyleWithColumns(25)));
8122 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8123 " \"ddeeefff\");",
8124 format("someFunction(\"aaabbbccc ddeeefff\");",
8125 getLLVMStyleWithColumns(25)));
8126 EXPECT_EQ("someFunction1234567890(\n"
8127 " \"aaabb \"\n"
8128 " \"cccdddeeefff\");",
8129 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8130 getLLVMStyleWithColumns(25)));
8131 EXPECT_EQ("#define A \\\n"
8132 " string s = \\\n"
8133 " \"123456789\" \\\n"
8134 " \"0\"; \\\n"
8135 " int i;",
8136 format("#define A string s = \"1234567890\"; int i;",
8137 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008138 EXPECT_EQ("someFunction(\n"
8139 " \"aaabbbcc \"\n"
8140 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008141 format("someFunction(\"aaabbbcc dddeeefff\");",
8142 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008143}
8144
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008145TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008146 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8147 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008148 EXPECT_EQ("\"test\"\n"
8149 "\"\\n\"",
8150 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8151 EXPECT_EQ("\"tes\\\\\"\n"
8152 "\"n\"",
8153 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8154 EXPECT_EQ("\"\\\\\\\\\"\n"
8155 "\"\\n\"",
8156 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008157 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008158 EXPECT_EQ("\"\\uff01\"\n"
8159 "\"test\"",
8160 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8161 EXPECT_EQ("\"\\Uff01ff02\"",
8162 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8163 EXPECT_EQ("\"\\x000000000001\"\n"
8164 "\"next\"",
8165 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8166 EXPECT_EQ("\"\\x000000000001next\"",
8167 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8168 EXPECT_EQ("\"\\x000000000001\"",
8169 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8170 EXPECT_EQ("\"test\"\n"
8171 "\"\\000000\"\n"
8172 "\"000001\"",
8173 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8174 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008175 "\"00000000\"\n"
8176 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008177 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008178}
8179
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008180TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8181 verifyFormat("void f() {\n"
8182 " return g() {}\n"
8183 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008184 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008185 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008186 "}");
8187}
8188
Manuel Klimek421147e2014-01-24 09:25:23 +00008189TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8190 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008191 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008192}
8193
Manuel Klimek13b97d82013-05-13 08:42:42 +00008194TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8195 verifyFormat("class X {\n"
8196 " void f() {\n"
8197 " }\n"
8198 "};",
8199 getLLVMStyleWithColumns(12));
8200}
8201
8202TEST_F(FormatTest, ConfigurableIndentWidth) {
8203 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8204 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008205 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008206 verifyFormat("void f() {\n"
8207 " someFunction();\n"
8208 " if (true) {\n"
8209 " f();\n"
8210 " }\n"
8211 "}",
8212 EightIndent);
8213 verifyFormat("class X {\n"
8214 " void f() {\n"
8215 " }\n"
8216 "};",
8217 EightIndent);
8218 verifyFormat("int x[] = {\n"
8219 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008220 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008221 EightIndent);
8222}
8223
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008224TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008225 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008226 "f();",
8227 getLLVMStyleWithColumns(8));
8228}
8229
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008230TEST_F(FormatTest, ConfigurableUseOfTab) {
8231 FormatStyle Tab = getLLVMStyleWithColumns(42);
8232 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008233 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008234 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008235
8236 EXPECT_EQ("if (aaaaaaaa && // q\n"
8237 " bb)\t\t// w\n"
8238 "\t;",
8239 format("if (aaaaaaaa &&// q\n"
8240 "bb)// w\n"
8241 ";",
8242 Tab));
8243 EXPECT_EQ("if (aaa && bbb) // w\n"
8244 "\t;",
8245 format("if(aaa&&bbb)// w\n"
8246 ";",
8247 Tab));
8248
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008249 verifyFormat("class X {\n"
8250 "\tvoid f() {\n"
8251 "\t\tsomeFunction(parameter1,\n"
8252 "\t\t\t parameter2);\n"
8253 "\t}\n"
8254 "};",
8255 Tab);
8256 verifyFormat("#define A \\\n"
8257 "\tvoid f() { \\\n"
8258 "\t\tsomeFunction( \\\n"
8259 "\t\t parameter1, \\\n"
8260 "\t\t parameter2); \\\n"
8261 "\t}",
8262 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008263
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008264 Tab.TabWidth = 4;
8265 Tab.IndentWidth = 8;
8266 verifyFormat("class TabWidth4Indent8 {\n"
8267 "\t\tvoid f() {\n"
8268 "\t\t\t\tsomeFunction(parameter1,\n"
8269 "\t\t\t\t\t\t\t parameter2);\n"
8270 "\t\t}\n"
8271 "};",
8272 Tab);
8273
8274 Tab.TabWidth = 4;
8275 Tab.IndentWidth = 4;
8276 verifyFormat("class TabWidth4Indent4 {\n"
8277 "\tvoid f() {\n"
8278 "\t\tsomeFunction(parameter1,\n"
8279 "\t\t\t\t\t parameter2);\n"
8280 "\t}\n"
8281 "};",
8282 Tab);
8283
8284 Tab.TabWidth = 8;
8285 Tab.IndentWidth = 4;
8286 verifyFormat("class TabWidth8Indent4 {\n"
8287 " void f() {\n"
8288 "\tsomeFunction(parameter1,\n"
8289 "\t\t parameter2);\n"
8290 " }\n"
8291 "};",
8292 Tab);
8293
Alexander Kornienko39856b72013-09-10 09:38:25 +00008294 Tab.TabWidth = 8;
8295 Tab.IndentWidth = 8;
8296 EXPECT_EQ("/*\n"
8297 "\t a\t\tcomment\n"
8298 "\t in multiple lines\n"
8299 " */",
8300 format(" /*\t \t \n"
8301 " \t \t a\t\tcomment\t \t\n"
8302 " \t \t in multiple lines\t\n"
8303 " \t */",
8304 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008305
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008306 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008307 verifyFormat("{\n"
8308 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8309 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8310 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8311 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8312 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8313 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008314 "};",
8315 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008316 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008317 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008318 "\ta2,\n"
8319 "\ta3\n"
8320 "};",
8321 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008322 EXPECT_EQ("if (aaaaaaaa && // q\n"
8323 " bb) // w\n"
8324 "\t;",
8325 format("if (aaaaaaaa &&// q\n"
8326 "bb)// w\n"
8327 ";",
8328 Tab));
8329 verifyFormat("class X {\n"
8330 "\tvoid f() {\n"
8331 "\t\tsomeFunction(parameter1,\n"
8332 "\t\t parameter2);\n"
8333 "\t}\n"
8334 "};",
8335 Tab);
8336 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008337 "\tQ(\n"
8338 "\t {\n"
8339 "\t\t int a;\n"
8340 "\t\t someFunction(aaaaaaaa,\n"
8341 "\t\t bbbbbbb);\n"
8342 "\t },\n"
8343 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008344 "}",
8345 Tab);
8346 EXPECT_EQ("{\n"
8347 "\t/* aaaa\n"
8348 "\t bbbb */\n"
8349 "}",
8350 format("{\n"
8351 "/* aaaa\n"
8352 " bbbb */\n"
8353 "}",
8354 Tab));
8355 EXPECT_EQ("{\n"
8356 "\t/*\n"
8357 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8358 "\t bbbbbbbbbbbbb\n"
8359 "\t*/\n"
8360 "}",
8361 format("{\n"
8362 "/*\n"
8363 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8364 "*/\n"
8365 "}",
8366 Tab));
8367 EXPECT_EQ("{\n"
8368 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8369 "\t// bbbbbbbbbbbbb\n"
8370 "}",
8371 format("{\n"
8372 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8373 "}",
8374 Tab));
8375 EXPECT_EQ("{\n"
8376 "\t/*\n"
8377 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8378 "\t bbbbbbbbbbbbb\n"
8379 "\t*/\n"
8380 "}",
8381 format("{\n"
8382 "\t/*\n"
8383 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8384 "\t*/\n"
8385 "}",
8386 Tab));
8387 EXPECT_EQ("{\n"
8388 "\t/*\n"
8389 "\n"
8390 "\t*/\n"
8391 "}",
8392 format("{\n"
8393 "\t/*\n"
8394 "\n"
8395 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008396 "}",
8397 Tab));
8398 EXPECT_EQ("{\n"
8399 "\t/*\n"
8400 " asdf\n"
8401 "\t*/\n"
8402 "}",
8403 format("{\n"
8404 "\t/*\n"
8405 " asdf\n"
8406 "\t*/\n"
8407 "}",
8408 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008409
8410 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008411 EXPECT_EQ("/*\n"
8412 " a\t\tcomment\n"
8413 " in multiple lines\n"
8414 " */",
8415 format(" /*\t \t \n"
8416 " \t \t a\t\tcomment\t \t\n"
8417 " \t \t in multiple lines\t\n"
8418 " \t */",
8419 Tab));
8420 EXPECT_EQ("/* some\n"
8421 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008422 format(" \t \t /* some\n"
8423 " \t \t comment */",
8424 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008425 EXPECT_EQ("int a; /* some\n"
8426 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008427 format(" \t \t int a; /* some\n"
8428 " \t \t comment */",
8429 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008430
Alexander Kornienko39856b72013-09-10 09:38:25 +00008431 EXPECT_EQ("int a; /* some\n"
8432 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008433 format(" \t \t int\ta; /* some\n"
8434 " \t \t comment */",
8435 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008436 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8437 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008438 format(" \t \t f(\"\t\t\"); /* some\n"
8439 " \t \t comment */",
8440 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008441 EXPECT_EQ("{\n"
8442 " /*\n"
8443 " * Comment\n"
8444 " */\n"
8445 " int i;\n"
8446 "}",
8447 format("{\n"
8448 "\t/*\n"
8449 "\t * Comment\n"
8450 "\t */\n"
8451 "\t int i;\n"
8452 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008453
8454 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8455 Tab.TabWidth = 8;
8456 Tab.IndentWidth = 8;
8457 EXPECT_EQ("if (aaaaaaaa && // q\n"
8458 " bb) // w\n"
8459 "\t;",
8460 format("if (aaaaaaaa &&// q\n"
8461 "bb)// w\n"
8462 ";",
8463 Tab));
8464 EXPECT_EQ("if (aaa && bbb) // w\n"
8465 "\t;",
8466 format("if(aaa&&bbb)// w\n"
8467 ";",
8468 Tab));
8469 verifyFormat("class X {\n"
8470 "\tvoid f() {\n"
8471 "\t\tsomeFunction(parameter1,\n"
8472 "\t\t\t parameter2);\n"
8473 "\t}\n"
8474 "};",
8475 Tab);
8476 verifyFormat("#define A \\\n"
8477 "\tvoid f() { \\\n"
8478 "\t\tsomeFunction( \\\n"
8479 "\t\t parameter1, \\\n"
8480 "\t\t parameter2); \\\n"
8481 "\t}",
8482 Tab);
8483 Tab.TabWidth = 4;
8484 Tab.IndentWidth = 8;
8485 verifyFormat("class TabWidth4Indent8 {\n"
8486 "\t\tvoid f() {\n"
8487 "\t\t\t\tsomeFunction(parameter1,\n"
8488 "\t\t\t\t\t\t\t parameter2);\n"
8489 "\t\t}\n"
8490 "};",
8491 Tab);
8492 Tab.TabWidth = 4;
8493 Tab.IndentWidth = 4;
8494 verifyFormat("class TabWidth4Indent4 {\n"
8495 "\tvoid f() {\n"
8496 "\t\tsomeFunction(parameter1,\n"
8497 "\t\t\t\t\t parameter2);\n"
8498 "\t}\n"
8499 "};",
8500 Tab);
8501 Tab.TabWidth = 8;
8502 Tab.IndentWidth = 4;
8503 verifyFormat("class TabWidth8Indent4 {\n"
8504 " void f() {\n"
8505 "\tsomeFunction(parameter1,\n"
8506 "\t\t parameter2);\n"
8507 " }\n"
8508 "};",
8509 Tab);
8510 Tab.TabWidth = 8;
8511 Tab.IndentWidth = 8;
8512 EXPECT_EQ("/*\n"
8513 "\t a\t\tcomment\n"
8514 "\t in multiple lines\n"
8515 " */",
8516 format(" /*\t \t \n"
8517 " \t \t a\t\tcomment\t \t\n"
8518 " \t \t in multiple lines\t\n"
8519 " \t */",
8520 Tab));
8521 verifyFormat("{\n"
8522 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8523 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8524 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8525 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8526 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8527 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8528 "};",
8529 Tab);
8530 verifyFormat("enum AA {\n"
8531 "\ta1, // Force multiple lines\n"
8532 "\ta2,\n"
8533 "\ta3\n"
8534 "};",
8535 Tab);
8536 EXPECT_EQ("if (aaaaaaaa && // q\n"
8537 " bb) // w\n"
8538 "\t;",
8539 format("if (aaaaaaaa &&// q\n"
8540 "bb)// w\n"
8541 ";",
8542 Tab));
8543 verifyFormat("class X {\n"
8544 "\tvoid f() {\n"
8545 "\t\tsomeFunction(parameter1,\n"
8546 "\t\t\t parameter2);\n"
8547 "\t}\n"
8548 "};",
8549 Tab);
8550 verifyFormat("{\n"
8551 "\tQ(\n"
8552 "\t {\n"
8553 "\t\t int a;\n"
8554 "\t\t someFunction(aaaaaaaa,\n"
8555 "\t\t\t\t bbbbbbb);\n"
8556 "\t },\n"
8557 "\t p);\n"
8558 "}",
8559 Tab);
8560 EXPECT_EQ("{\n"
8561 "\t/* aaaa\n"
8562 "\t bbbb */\n"
8563 "}",
8564 format("{\n"
8565 "/* aaaa\n"
8566 " bbbb */\n"
8567 "}",
8568 Tab));
8569 EXPECT_EQ("{\n"
8570 "\t/*\n"
8571 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8572 "\t bbbbbbbbbbbbb\n"
8573 "\t*/\n"
8574 "}",
8575 format("{\n"
8576 "/*\n"
8577 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8578 "*/\n"
8579 "}",
8580 Tab));
8581 EXPECT_EQ("{\n"
8582 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8583 "\t// bbbbbbbbbbbbb\n"
8584 "}",
8585 format("{\n"
8586 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8587 "}",
8588 Tab));
8589 EXPECT_EQ("{\n"
8590 "\t/*\n"
8591 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8592 "\t bbbbbbbbbbbbb\n"
8593 "\t*/\n"
8594 "}",
8595 format("{\n"
8596 "\t/*\n"
8597 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8598 "\t*/\n"
8599 "}",
8600 Tab));
8601 EXPECT_EQ("{\n"
8602 "\t/*\n"
8603 "\n"
8604 "\t*/\n"
8605 "}",
8606 format("{\n"
8607 "\t/*\n"
8608 "\n"
8609 "\t*/\n"
8610 "}",
8611 Tab));
8612 EXPECT_EQ("{\n"
8613 "\t/*\n"
8614 " asdf\n"
8615 "\t*/\n"
8616 "}",
8617 format("{\n"
8618 "\t/*\n"
8619 " asdf\n"
8620 "\t*/\n"
8621 "}",
8622 Tab));
8623 EXPECT_EQ("/*\n"
8624 "\t a\t\tcomment\n"
8625 "\t in multiple lines\n"
8626 " */",
8627 format(" /*\t \t \n"
8628 " \t \t a\t\tcomment\t \t\n"
8629 " \t \t in multiple lines\t\n"
8630 " \t */",
8631 Tab));
8632 EXPECT_EQ("/* some\n"
8633 " comment */",
8634 format(" \t \t /* some\n"
8635 " \t \t comment */",
8636 Tab));
8637 EXPECT_EQ("int a; /* some\n"
8638 " comment */",
8639 format(" \t \t int a; /* some\n"
8640 " \t \t comment */",
8641 Tab));
8642 EXPECT_EQ("int a; /* some\n"
8643 "comment */",
8644 format(" \t \t int\ta; /* some\n"
8645 " \t \t comment */",
8646 Tab));
8647 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8648 " comment */",
8649 format(" \t \t f(\"\t\t\"); /* some\n"
8650 " \t \t comment */",
8651 Tab));
8652 EXPECT_EQ("{\n"
8653 " /*\n"
8654 " * Comment\n"
8655 " */\n"
8656 " int i;\n"
8657 "}",
8658 format("{\n"
8659 "\t/*\n"
8660 "\t * Comment\n"
8661 "\t */\n"
8662 "\t int i;\n"
8663 "}"));
8664 Tab.AlignConsecutiveAssignments = true;
8665 Tab.AlignConsecutiveDeclarations = true;
8666 Tab.TabWidth = 4;
8667 Tab.IndentWidth = 4;
8668 verifyFormat("class Assign {\n"
8669 "\tvoid f() {\n"
8670 "\t\tint x = 123;\n"
8671 "\t\tint random = 4;\n"
8672 "\t\tstd::string alphabet =\n"
8673 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8674 "\t}\n"
8675 "};",
8676 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008677}
8678
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008679TEST_F(FormatTest, CalculatesOriginalColumn) {
8680 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8681 "q\"; /* some\n"
8682 " comment */",
8683 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8684 "q\"; /* some\n"
8685 " comment */",
8686 getLLVMStyle()));
8687 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8688 "/* some\n"
8689 " comment */",
8690 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8691 " /* some\n"
8692 " comment */",
8693 getLLVMStyle()));
8694 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8695 "qqq\n"
8696 "/* some\n"
8697 " comment */",
8698 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8699 "qqq\n"
8700 " /* some\n"
8701 " comment */",
8702 getLLVMStyle()));
8703 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8704 "wwww; /* some\n"
8705 " comment */",
8706 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8707 "wwww; /* some\n"
8708 " comment */",
8709 getLLVMStyle()));
8710}
8711
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008712TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008713 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008714 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008715
8716 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008717 " continue;",
8718 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008719 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008720 " continue;",
8721 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008722 verifyFormat("if(true)\n"
8723 " f();\n"
8724 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008725 " f();",
8726 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008727 verifyFormat("do {\n"
8728 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008729 "} while(something());",
8730 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008731 verifyFormat("switch(x) {\n"
8732 "default:\n"
8733 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008734 "}",
8735 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008736 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008737 verifyFormat("size_t x = sizeof(x);", NoSpace);
8738 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8739 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8740 verifyFormat("alignas(128) char a[128];", NoSpace);
8741 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8742 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8743 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008744 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008745 verifyFormat("T A::operator()();", NoSpace);
8746 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008747
8748 FormatStyle Space = getLLVMStyle();
8749 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8750
8751 verifyFormat("int f ();", Space);
8752 verifyFormat("void f (int a, T b) {\n"
8753 " while (true)\n"
8754 " continue;\n"
8755 "}",
8756 Space);
8757 verifyFormat("if (true)\n"
8758 " f ();\n"
8759 "else if (true)\n"
8760 " f ();",
8761 Space);
8762 verifyFormat("do {\n"
8763 " do_something ();\n"
8764 "} while (something ());",
8765 Space);
8766 verifyFormat("switch (x) {\n"
8767 "default:\n"
8768 " break;\n"
8769 "}",
8770 Space);
8771 verifyFormat("A::A () : a (1) {}", Space);
8772 verifyFormat("void f () __attribute__ ((asdf));", Space);
8773 verifyFormat("*(&a + 1);\n"
8774 "&((&a)[1]);\n"
8775 "a[(b + c) * d];\n"
8776 "(((a + 1) * 2) + 3) * 4;",
8777 Space);
8778 verifyFormat("#define A(x) x", Space);
8779 verifyFormat("#define A (x) x", Space);
8780 verifyFormat("#if defined(x)\n"
8781 "#endif",
8782 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008783 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008784 verifyFormat("size_t x = sizeof (x);", Space);
8785 verifyFormat("auto f (int x) -> decltype (x);", Space);
8786 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8787 verifyFormat("alignas (128) char a[128];", Space);
8788 verifyFormat("size_t x = alignof (MyType);", Space);
8789 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8790 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008791 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008792 verifyFormat("T A::operator() ();", Space);
8793 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008794}
8795
8796TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8797 FormatStyle Spaces = getLLVMStyle();
8798
8799 Spaces.SpacesInParentheses = true;
8800 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008801 verifyFormat("call();", Spaces);
8802 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008803 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8804 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008805 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008806 " continue;",
8807 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008808 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008809 " continue;",
8810 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008811 verifyFormat("if ( true )\n"
8812 " f();\n"
8813 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008814 " f();",
8815 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008816 verifyFormat("do {\n"
8817 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008818 "} while ( something() );",
8819 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008820 verifyFormat("switch ( x ) {\n"
8821 "default:\n"
8822 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008823 "}",
8824 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008825
8826 Spaces.SpacesInParentheses = false;
8827 Spaces.SpacesInCStyleCastParentheses = true;
8828 verifyFormat("Type *A = ( Type * )P;", Spaces);
8829 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8830 verifyFormat("x = ( int32 )y;", Spaces);
8831 verifyFormat("int a = ( int )(2.0f);", Spaces);
8832 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8833 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8834 verifyFormat("#define x (( int )-1)", Spaces);
8835
Daniel Jasper92e09822015-03-18 12:59:19 +00008836 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008837 Spaces.SpacesInParentheses = false;
8838 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008839 Spaces.SpacesInCStyleCastParentheses = true;
8840 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008841 verifyFormat("call( );", Spaces);
8842 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008843 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008844 " continue;",
8845 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008846 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008847 " continue;",
8848 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008849 verifyFormat("if (true)\n"
8850 " f( );\n"
8851 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008852 " f( );",
8853 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008854 verifyFormat("do {\n"
8855 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008856 "} while (something( ));",
8857 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008858 verifyFormat("switch (x) {\n"
8859 "default:\n"
8860 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008861 "}",
8862 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008863
Daniel Jasper92e09822015-03-18 12:59:19 +00008864 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008865 Spaces.SpaceAfterCStyleCast = true;
8866 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008867 verifyFormat("call( );", Spaces);
8868 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008869 verifyFormat("while (( bool ) 1)\n"
8870 " continue;",
8871 Spaces);
8872 verifyFormat("for (;;)\n"
8873 " continue;",
8874 Spaces);
8875 verifyFormat("if (true)\n"
8876 " f( );\n"
8877 "else if (true)\n"
8878 " f( );",
8879 Spaces);
8880 verifyFormat("do {\n"
8881 " do_something(( int ) i);\n"
8882 "} while (something( ));",
8883 Spaces);
8884 verifyFormat("switch (x) {\n"
8885 "default:\n"
8886 " break;\n"
8887 "}",
8888 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008889
8890 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008891 Spaces.SpacesInCStyleCastParentheses = false;
8892 Spaces.SpaceAfterCStyleCast = true;
8893 verifyFormat("while ((bool) 1)\n"
8894 " continue;",
8895 Spaces);
8896 verifyFormat("do {\n"
8897 " do_something((int) i);\n"
8898 "} while (something( ));",
8899 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008900}
8901
Daniel Jasperad981f82014-08-26 11:41:14 +00008902TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8903 verifyFormat("int a[5];");
8904 verifyFormat("a[3] += 42;");
8905
8906 FormatStyle Spaces = getLLVMStyle();
8907 Spaces.SpacesInSquareBrackets = true;
8908 // Lambdas unchanged.
8909 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8910 verifyFormat("return [i, args...] {};", Spaces);
8911
8912 // Not lambdas.
8913 verifyFormat("int a[ 5 ];", Spaces);
8914 verifyFormat("a[ 3 ] += 42;", Spaces);
8915 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8916 verifyFormat("double &operator[](int i) { return 0; }\n"
8917 "int i;",
8918 Spaces);
8919 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8920 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8921 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8922}
8923
Daniel Jasperd94bff32013-09-25 15:15:02 +00008924TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8925 verifyFormat("int a = 5;");
8926 verifyFormat("a += 42;");
8927 verifyFormat("a or_eq 8;");
8928
8929 FormatStyle Spaces = getLLVMStyle();
8930 Spaces.SpaceBeforeAssignmentOperators = false;
8931 verifyFormat("int a= 5;", Spaces);
8932 verifyFormat("a+= 42;", Spaces);
8933 verifyFormat("a or_eq 8;", Spaces);
8934}
8935
Daniel Jaspera44991332015-04-29 13:06:49 +00008936TEST_F(FormatTest, AlignConsecutiveAssignments) {
8937 FormatStyle Alignment = getLLVMStyle();
8938 Alignment.AlignConsecutiveAssignments = false;
8939 verifyFormat("int a = 5;\n"
8940 "int oneTwoThree = 123;",
8941 Alignment);
8942 verifyFormat("int a = 5;\n"
8943 "int oneTwoThree = 123;",
8944 Alignment);
8945
8946 Alignment.AlignConsecutiveAssignments = true;
8947 verifyFormat("int a = 5;\n"
8948 "int oneTwoThree = 123;",
8949 Alignment);
8950 verifyFormat("int a = method();\n"
8951 "int oneTwoThree = 133;",
8952 Alignment);
8953 verifyFormat("a &= 5;\n"
8954 "bcd *= 5;\n"
8955 "ghtyf += 5;\n"
8956 "dvfvdb -= 5;\n"
8957 "a /= 5;\n"
8958 "vdsvsv %= 5;\n"
8959 "sfdbddfbdfbb ^= 5;\n"
8960 "dvsdsv |= 5;\n"
8961 "int dsvvdvsdvvv = 123;",
8962 Alignment);
8963 verifyFormat("int i = 1, j = 10;\n"
8964 "something = 2000;",
8965 Alignment);
8966 verifyFormat("something = 2000;\n"
8967 "int i = 1, j = 10;\n",
8968 Alignment);
8969 verifyFormat("something = 2000;\n"
8970 "another = 911;\n"
8971 "int i = 1, j = 10;\n"
8972 "oneMore = 1;\n"
8973 "i = 2;",
8974 Alignment);
8975 verifyFormat("int a = 5;\n"
8976 "int one = 1;\n"
8977 "method();\n"
8978 "int oneTwoThree = 123;\n"
8979 "int oneTwo = 12;",
8980 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008981 verifyFormat("int oneTwoThree = 123;\n"
8982 "int oneTwo = 12;\n"
8983 "method();\n",
8984 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008985 verifyFormat("int oneTwoThree = 123; // comment\n"
8986 "int oneTwo = 12; // comment",
8987 Alignment);
8988 EXPECT_EQ("int a = 5;\n"
8989 "\n"
8990 "int oneTwoThree = 123;",
8991 format("int a = 5;\n"
8992 "\n"
8993 "int oneTwoThree= 123;",
8994 Alignment));
8995 EXPECT_EQ("int a = 5;\n"
8996 "int one = 1;\n"
8997 "\n"
8998 "int oneTwoThree = 123;",
8999 format("int a = 5;\n"
9000 "int one = 1;\n"
9001 "\n"
9002 "int oneTwoThree = 123;",
9003 Alignment));
9004 EXPECT_EQ("int a = 5;\n"
9005 "int one = 1;\n"
9006 "\n"
9007 "int oneTwoThree = 123;\n"
9008 "int oneTwo = 12;",
9009 format("int a = 5;\n"
9010 "int one = 1;\n"
9011 "\n"
9012 "int oneTwoThree = 123;\n"
9013 "int oneTwo = 12;",
9014 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009015 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9016 verifyFormat("#define A \\\n"
9017 " int aaaa = 12; \\\n"
9018 " int b = 23; \\\n"
9019 " int ccc = 234; \\\n"
9020 " int dddddddddd = 2345;",
9021 Alignment);
9022 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009023 verifyFormat("#define A \\\n"
9024 " int aaaa = 12; \\\n"
9025 " int b = 23; \\\n"
9026 " int ccc = 234; \\\n"
9027 " int dddddddddd = 2345;",
9028 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009029 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009030 verifyFormat("#define A "
9031 " \\\n"
9032 " int aaaa = 12; "
9033 " \\\n"
9034 " int b = 23; "
9035 " \\\n"
9036 " int ccc = 234; "
9037 " \\\n"
9038 " int dddddddddd = 2345;",
9039 Alignment);
9040 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9041 "k = 4, int l = 5,\n"
9042 " int m = 6) {\n"
9043 " int j = 10;\n"
9044 " otherThing = 1;\n"
9045 "}",
9046 Alignment);
9047 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9048 " int i = 1;\n"
9049 " int j = 2;\n"
9050 " int big = 10000;\n"
9051 "}",
9052 Alignment);
9053 verifyFormat("class C {\n"
9054 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009055 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009056 " virtual void f() = 0;\n"
9057 "};",
9058 Alignment);
9059 verifyFormat("int i = 1;\n"
9060 "if (SomeType t = getSomething()) {\n"
9061 "}\n"
9062 "int j = 2;\n"
9063 "int big = 10000;",
9064 Alignment);
9065 verifyFormat("int j = 7;\n"
9066 "for (int k = 0; k < N; ++k) {\n"
9067 "}\n"
9068 "int j = 2;\n"
9069 "int big = 10000;\n"
9070 "}",
9071 Alignment);
9072 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9073 verifyFormat("int i = 1;\n"
9074 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9075 " = someLooooooooooooooooongFunction();\n"
9076 "int j = 2;",
9077 Alignment);
9078 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9079 verifyFormat("int i = 1;\n"
9080 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9081 " someLooooooooooooooooongFunction();\n"
9082 "int j = 2;",
9083 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009084
9085 verifyFormat("auto lambda = []() {\n"
9086 " auto i = 0;\n"
9087 " return 0;\n"
9088 "};\n"
9089 "int i = 0;\n"
9090 "auto v = type{\n"
9091 " i = 1, //\n"
9092 " (i = 2), //\n"
9093 " i = 3 //\n"
9094 "};",
9095 Alignment);
9096
Daniel Jaspera44991332015-04-29 13:06:49 +00009097 verifyFormat(
9098 "int i = 1;\n"
9099 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9100 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009101 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009102 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009103
9104 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9105 " typename B = very_long_type_name_1,\n"
9106 " typename T_2 = very_long_type_name_2>\n"
9107 "auto foo() {}\n",
9108 Alignment);
9109 verifyFormat("int a, b = 1;\n"
9110 "int c = 2;\n"
9111 "int dd = 3;\n",
9112 Alignment);
9113 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9114 "float b[1][] = {{3.f}};\n",
9115 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009116 verifyFormat("for (int i = 0; i < 1; i++)\n"
9117 " int x = 1;\n",
9118 Alignment);
9119 verifyFormat("for (i = 0; i < 1; i++)\n"
9120 " x = 1;\n"
9121 "y = 1;\n",
9122 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009123}
9124
Daniel Jaspere12597c2015-10-01 10:06:54 +00009125TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9126 FormatStyle Alignment = getLLVMStyle();
9127 Alignment.AlignConsecutiveDeclarations = false;
9128 verifyFormat("float const a = 5;\n"
9129 "int oneTwoThree = 123;",
9130 Alignment);
9131 verifyFormat("int a = 5;\n"
9132 "float const oneTwoThree = 123;",
9133 Alignment);
9134
9135 Alignment.AlignConsecutiveDeclarations = true;
9136 verifyFormat("float const a = 5;\n"
9137 "int oneTwoThree = 123;",
9138 Alignment);
9139 verifyFormat("int a = method();\n"
9140 "float const oneTwoThree = 133;",
9141 Alignment);
9142 verifyFormat("int i = 1, j = 10;\n"
9143 "something = 2000;",
9144 Alignment);
9145 verifyFormat("something = 2000;\n"
9146 "int i = 1, j = 10;\n",
9147 Alignment);
9148 verifyFormat("float something = 2000;\n"
9149 "double another = 911;\n"
9150 "int i = 1, j = 10;\n"
9151 "const int *oneMore = 1;\n"
9152 "unsigned i = 2;",
9153 Alignment);
9154 verifyFormat("float a = 5;\n"
9155 "int one = 1;\n"
9156 "method();\n"
9157 "const double oneTwoThree = 123;\n"
9158 "const unsigned int oneTwo = 12;",
9159 Alignment);
9160 verifyFormat("int oneTwoThree{0}; // comment\n"
9161 "unsigned oneTwo; // comment",
9162 Alignment);
9163 EXPECT_EQ("float const a = 5;\n"
9164 "\n"
9165 "int oneTwoThree = 123;",
9166 format("float const a = 5;\n"
9167 "\n"
9168 "int oneTwoThree= 123;",
9169 Alignment));
9170 EXPECT_EQ("float a = 5;\n"
9171 "int one = 1;\n"
9172 "\n"
9173 "unsigned oneTwoThree = 123;",
9174 format("float a = 5;\n"
9175 "int one = 1;\n"
9176 "\n"
9177 "unsigned oneTwoThree = 123;",
9178 Alignment));
9179 EXPECT_EQ("float a = 5;\n"
9180 "int one = 1;\n"
9181 "\n"
9182 "unsigned oneTwoThree = 123;\n"
9183 "int oneTwo = 12;",
9184 format("float a = 5;\n"
9185 "int one = 1;\n"
9186 "\n"
9187 "unsigned oneTwoThree = 123;\n"
9188 "int oneTwo = 12;",
9189 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009190 // Function prototype alignment
9191 verifyFormat("int a();\n"
9192 "double b();",
9193 Alignment);
9194 verifyFormat("int a(int x);\n"
9195 "double b();",
9196 Alignment);
9197 unsigned OldColumnLimit = Alignment.ColumnLimit;
9198 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9199 // otherwise the function parameters will be re-flowed onto a single line.
9200 Alignment.ColumnLimit = 0;
9201 EXPECT_EQ("int a(int x,\n"
9202 " float y);\n"
9203 "double b(int x,\n"
9204 " double y);",
9205 format("int a(int x,\n"
9206 " float y);\n"
9207 "double b(int x,\n"
9208 " double y);",
9209 Alignment));
9210 // This ensures that function parameters of function declarations are
9211 // correctly indented when their owning functions are indented.
9212 // The failure case here is for 'double y' to not be indented enough.
9213 EXPECT_EQ("double a(int x);\n"
9214 "int b(int y,\n"
9215 " double z);",
9216 format("double a(int x);\n"
9217 "int b(int y,\n"
9218 " double z);",
9219 Alignment));
9220 // Set ColumnLimit low so that we induce wrapping immediately after
9221 // the function name and opening paren.
9222 Alignment.ColumnLimit = 13;
9223 verifyFormat("int function(\n"
9224 " int x,\n"
9225 " bool y);",
9226 Alignment);
9227 Alignment.ColumnLimit = OldColumnLimit;
9228 // Ensure function pointers don't screw up recursive alignment
9229 verifyFormat("int a(int x, void (*fp)(int y));\n"
9230 "double b();",
9231 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009232 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009233 // Ensure recursive alignment is broken by function braces, so that the
9234 // "a = 1" does not align with subsequent assignments inside the function
9235 // body.
9236 verifyFormat("int func(int a = 1) {\n"
9237 " int b = 2;\n"
9238 " int cc = 3;\n"
9239 "}",
9240 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009241 verifyFormat("float something = 2000;\n"
9242 "double another = 911;\n"
9243 "int i = 1, j = 10;\n"
9244 "const int *oneMore = 1;\n"
9245 "unsigned i = 2;",
9246 Alignment);
9247 verifyFormat("int oneTwoThree = {0}; // comment\n"
9248 "unsigned oneTwo = 0; // comment",
9249 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009250 // Make sure that scope is correctly tracked, in the absence of braces
9251 verifyFormat("for (int i = 0; i < n; i++)\n"
9252 " j = i;\n"
9253 "double x = 1;\n",
9254 Alignment);
9255 verifyFormat("if (int i = 0)\n"
9256 " j = i;\n"
9257 "double x = 1;\n",
9258 Alignment);
9259 // Ensure operator[] and operator() are comprehended
9260 verifyFormat("struct test {\n"
9261 " long long int foo();\n"
9262 " int operator[](int a);\n"
9263 " double bar();\n"
9264 "};\n",
9265 Alignment);
9266 verifyFormat("struct test {\n"
9267 " long long int foo();\n"
9268 " int operator()(int a);\n"
9269 " double bar();\n"
9270 "};\n",
9271 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009272 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9273 " int const i = 1;\n"
9274 " int * j = 2;\n"
9275 " int big = 10000;\n"
9276 "\n"
9277 " unsigned oneTwoThree = 123;\n"
9278 " int oneTwo = 12;\n"
9279 " method();\n"
9280 " float k = 2;\n"
9281 " int ll = 10000;\n"
9282 "}",
9283 format("void SomeFunction(int parameter= 0) {\n"
9284 " int const i= 1;\n"
9285 " int *j=2;\n"
9286 " int big = 10000;\n"
9287 "\n"
9288 "unsigned oneTwoThree =123;\n"
9289 "int oneTwo = 12;\n"
9290 " method();\n"
9291 "float k= 2;\n"
9292 "int ll=10000;\n"
9293 "}",
9294 Alignment));
9295 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009296 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9297 verifyFormat("#define A \\\n"
9298 " int aaaa = 12; \\\n"
9299 " float b = 23; \\\n"
9300 " const int ccc = 234; \\\n"
9301 " unsigned dddddddddd = 2345;",
9302 Alignment);
9303 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009304 verifyFormat("#define A \\\n"
9305 " int aaaa = 12; \\\n"
9306 " float b = 23; \\\n"
9307 " const int ccc = 234; \\\n"
9308 " unsigned dddddddddd = 2345;",
9309 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009310 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009311 Alignment.ColumnLimit = 30;
9312 verifyFormat("#define A \\\n"
9313 " int aaaa = 12; \\\n"
9314 " float b = 23; \\\n"
9315 " const int ccc = 234; \\\n"
9316 " int dddddddddd = 2345;",
9317 Alignment);
9318 Alignment.ColumnLimit = 80;
9319 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9320 "k = 4, int l = 5,\n"
9321 " int m = 6) {\n"
9322 " const int j = 10;\n"
9323 " otherThing = 1;\n"
9324 "}",
9325 Alignment);
9326 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9327 " int const i = 1;\n"
9328 " int * j = 2;\n"
9329 " int big = 10000;\n"
9330 "}",
9331 Alignment);
9332 verifyFormat("class C {\n"
9333 "public:\n"
9334 " int i = 1;\n"
9335 " virtual void f() = 0;\n"
9336 "};",
9337 Alignment);
9338 verifyFormat("float i = 1;\n"
9339 "if (SomeType t = getSomething()) {\n"
9340 "}\n"
9341 "const unsigned j = 2;\n"
9342 "int big = 10000;",
9343 Alignment);
9344 verifyFormat("float j = 7;\n"
9345 "for (int k = 0; k < N; ++k) {\n"
9346 "}\n"
9347 "unsigned j = 2;\n"
9348 "int big = 10000;\n"
9349 "}",
9350 Alignment);
9351 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9352 verifyFormat("float i = 1;\n"
9353 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9354 " = someLooooooooooooooooongFunction();\n"
9355 "int j = 2;",
9356 Alignment);
9357 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9358 verifyFormat("int i = 1;\n"
9359 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9360 " someLooooooooooooooooongFunction();\n"
9361 "int j = 2;",
9362 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009363
9364 Alignment.AlignConsecutiveAssignments = true;
9365 verifyFormat("auto lambda = []() {\n"
9366 " auto ii = 0;\n"
9367 " float j = 0;\n"
9368 " return 0;\n"
9369 "};\n"
9370 "int i = 0;\n"
9371 "float i2 = 0;\n"
9372 "auto v = type{\n"
9373 " i = 1, //\n"
9374 " (i = 2), //\n"
9375 " i = 3 //\n"
9376 "};",
9377 Alignment);
9378 Alignment.AlignConsecutiveAssignments = false;
9379
Daniel Jaspere12597c2015-10-01 10:06:54 +00009380 verifyFormat(
9381 "int i = 1;\n"
9382 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9383 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009384 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009385 Alignment);
9386
9387 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9388 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009389 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009390 // happens.
9391 Alignment.AlignConsecutiveAssignments = true;
9392 Alignment.ColumnLimit = 30;
9393 verifyFormat("float ii = 1;\n"
9394 "unsigned j = 2;\n"
9395 "int someVerylongVariable = 1;\n"
9396 "AnotherLongType ll = 123456;\n"
9397 "VeryVeryLongType k = 2;\n"
9398 "int myvar = 1;",
9399 Alignment);
9400 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009401 Alignment.AlignConsecutiveAssignments = false;
9402
9403 verifyFormat(
9404 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9405 " typename LongType, typename B>\n"
9406 "auto foo() {}\n",
9407 Alignment);
9408 verifyFormat("float a, b = 1;\n"
9409 "int c = 2;\n"
9410 "int dd = 3;\n",
9411 Alignment);
9412 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9413 "float b[1][] = {{3.f}};\n",
9414 Alignment);
9415 Alignment.AlignConsecutiveAssignments = true;
9416 verifyFormat("float a, b = 1;\n"
9417 "int c = 2;\n"
9418 "int dd = 3;\n",
9419 Alignment);
9420 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9421 "float b[1][] = {{3.f}};\n",
9422 Alignment);
9423 Alignment.AlignConsecutiveAssignments = false;
9424
9425 Alignment.ColumnLimit = 30;
9426 Alignment.BinPackParameters = false;
9427 verifyFormat("void foo(float a,\n"
9428 " float b,\n"
9429 " int c,\n"
9430 " uint32_t *d) {\n"
9431 " int * e = 0;\n"
9432 " float f = 0;\n"
9433 " double g = 0;\n"
9434 "}\n"
9435 "void bar(ino_t a,\n"
9436 " int b,\n"
9437 " uint32_t *c,\n"
9438 " bool d) {}\n",
9439 Alignment);
9440 Alignment.BinPackParameters = true;
9441 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009442
9443 // Bug 33507
9444 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9445 verifyFormat(
9446 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9447 " static const Version verVs2017;\n"
9448 " return true;\n"
9449 "});\n",
9450 Alignment);
9451 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009452}
9453
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009454TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009455 FormatStyle LinuxBraceStyle = getLLVMStyle();
9456 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009457 verifyFormat("namespace a\n"
9458 "{\n"
9459 "class A\n"
9460 "{\n"
9461 " void f()\n"
9462 " {\n"
9463 " if (true) {\n"
9464 " a();\n"
9465 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009466 " } else {\n"
9467 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009468 " }\n"
9469 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009470 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009471 "};\n"
9472 "struct B {\n"
9473 " int x;\n"
9474 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009475 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009476 LinuxBraceStyle);
9477 verifyFormat("enum X {\n"
9478 " Y = 0,\n"
9479 "}\n",
9480 LinuxBraceStyle);
9481 verifyFormat("struct S {\n"
9482 " int Type;\n"
9483 " union {\n"
9484 " int x;\n"
9485 " double y;\n"
9486 " } Value;\n"
9487 " class C\n"
9488 " {\n"
9489 " MyFavoriteType Value;\n"
9490 " } Class;\n"
9491 "}\n",
9492 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009493}
9494
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009495TEST_F(FormatTest, MozillaBraceBreaking) {
9496 FormatStyle MozillaBraceStyle = getLLVMStyle();
9497 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009498 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009499 verifyFormat("namespace a {\n"
9500 "class A\n"
9501 "{\n"
9502 " void f()\n"
9503 " {\n"
9504 " if (true) {\n"
9505 " a();\n"
9506 " b();\n"
9507 " }\n"
9508 " }\n"
9509 " void g() { return; }\n"
9510 "};\n"
9511 "enum E\n"
9512 "{\n"
9513 " A,\n"
9514 " // foo\n"
9515 " B,\n"
9516 " C\n"
9517 "};\n"
9518 "struct B\n"
9519 "{\n"
9520 " int x;\n"
9521 "};\n"
9522 "}\n",
9523 MozillaBraceStyle);
9524 verifyFormat("struct S\n"
9525 "{\n"
9526 " int Type;\n"
9527 " union\n"
9528 " {\n"
9529 " int x;\n"
9530 " double y;\n"
9531 " } Value;\n"
9532 " class C\n"
9533 " {\n"
9534 " MyFavoriteType Value;\n"
9535 " } Class;\n"
9536 "}\n",
9537 MozillaBraceStyle);
9538}
9539
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009540TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009541 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9542 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009543 verifyFormat("namespace a {\n"
9544 "class A {\n"
9545 " void f()\n"
9546 " {\n"
9547 " if (true) {\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 " int x;\n"
9556 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009557 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009558 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009559
Daniel Jasperd9670872014-08-05 12:06:20 +00009560 verifyFormat("void foo()\n"
9561 "{\n"
9562 " if (a) {\n"
9563 " a();\n"
9564 " }\n"
9565 " else {\n"
9566 " b();\n"
9567 " }\n"
9568 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009569 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009570
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009571 verifyFormat("#ifdef _DEBUG\n"
9572 "int foo(int i = 0)\n"
9573 "#else\n"
9574 "int foo(int i = 5)\n"
9575 "#endif\n"
9576 "{\n"
9577 " return i;\n"
9578 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009579 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009580
9581 verifyFormat("void foo() {}\n"
9582 "void bar()\n"
9583 "#ifdef _DEBUG\n"
9584 "{\n"
9585 " foo();\n"
9586 "}\n"
9587 "#else\n"
9588 "{\n"
9589 "}\n"
9590 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009591 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009592
9593 verifyFormat("void foobar() { int i = 5; }\n"
9594 "#ifdef _DEBUG\n"
9595 "void bar() {}\n"
9596 "#else\n"
9597 "void bar() { foobar(); }\n"
9598 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009599 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009600}
9601
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009602TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009603 FormatStyle AllmanBraceStyle = getLLVMStyle();
9604 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009605
9606 EXPECT_EQ("namespace a\n"
9607 "{\n"
9608 "void f();\n"
9609 "void g();\n"
9610 "} // namespace a\n",
9611 format("namespace a\n"
9612 "{\n"
9613 "void f();\n"
9614 "void g();\n"
9615 "}\n",
9616 AllmanBraceStyle));
9617
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009618 verifyFormat("namespace a\n"
9619 "{\n"
9620 "class A\n"
9621 "{\n"
9622 " void f()\n"
9623 " {\n"
9624 " if (true)\n"
9625 " {\n"
9626 " a();\n"
9627 " b();\n"
9628 " }\n"
9629 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009630 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009631 "};\n"
9632 "struct B\n"
9633 "{\n"
9634 " int x;\n"
9635 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009636 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009637 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009638
9639 verifyFormat("void f()\n"
9640 "{\n"
9641 " if (true)\n"
9642 " {\n"
9643 " a();\n"
9644 " }\n"
9645 " else if (false)\n"
9646 " {\n"
9647 " b();\n"
9648 " }\n"
9649 " else\n"
9650 " {\n"
9651 " c();\n"
9652 " }\n"
9653 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009654 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009655
9656 verifyFormat("void f()\n"
9657 "{\n"
9658 " for (int i = 0; i < 10; ++i)\n"
9659 " {\n"
9660 " a();\n"
9661 " }\n"
9662 " while (false)\n"
9663 " {\n"
9664 " b();\n"
9665 " }\n"
9666 " do\n"
9667 " {\n"
9668 " c();\n"
9669 " } while (false)\n"
9670 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009671 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009672
9673 verifyFormat("void f(int a)\n"
9674 "{\n"
9675 " switch (a)\n"
9676 " {\n"
9677 " case 0:\n"
9678 " break;\n"
9679 " case 1:\n"
9680 " {\n"
9681 " break;\n"
9682 " }\n"
9683 " case 2:\n"
9684 " {\n"
9685 " }\n"
9686 " break;\n"
9687 " default:\n"
9688 " break;\n"
9689 " }\n"
9690 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009691 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009692
9693 verifyFormat("enum X\n"
9694 "{\n"
9695 " Y = 0,\n"
9696 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009697 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009698 verifyFormat("enum X\n"
9699 "{\n"
9700 " Y = 0\n"
9701 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009702 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009703
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009704 verifyFormat("@interface BSApplicationController ()\n"
9705 "{\n"
9706 "@private\n"
9707 " id _extraIvar;\n"
9708 "}\n"
9709 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009710 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009711
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009712 verifyFormat("#ifdef _DEBUG\n"
9713 "int foo(int i = 0)\n"
9714 "#else\n"
9715 "int foo(int i = 5)\n"
9716 "#endif\n"
9717 "{\n"
9718 " return i;\n"
9719 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009720 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009721
9722 verifyFormat("void foo() {}\n"
9723 "void bar()\n"
9724 "#ifdef _DEBUG\n"
9725 "{\n"
9726 " foo();\n"
9727 "}\n"
9728 "#else\n"
9729 "{\n"
9730 "}\n"
9731 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009732 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009733
9734 verifyFormat("void foobar() { int i = 5; }\n"
9735 "#ifdef _DEBUG\n"
9736 "void bar() {}\n"
9737 "#else\n"
9738 "void bar() { foobar(); }\n"
9739 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009740 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009741
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009742 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009743 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009744 " // ...\n"
9745 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009746 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009747 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009748 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009749 " // ...\n"
9750 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009751 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009752 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009753 // .. or dict literals.
9754 verifyFormat("void f()\n"
9755 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009756 " // ...\n"
9757 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9758 "}",
9759 AllmanBraceStyle);
9760 verifyFormat("void f()\n"
9761 "{\n"
9762 " // ...\n"
9763 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009764 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009765 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009766 verifyFormat("int f()\n"
9767 "{ // comment\n"
9768 " return 42;\n"
9769 "}",
9770 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009771
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009772 AllmanBraceStyle.ColumnLimit = 19;
9773 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9774 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009775 verifyFormat("void f()\n"
9776 "{\n"
9777 " int i;\n"
9778 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009779 AllmanBraceStyle);
9780 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009781
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009782 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009783 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9784 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9785 verifyFormat("void f(bool b)\n"
9786 "{\n"
9787 " if (b)\n"
9788 " {\n"
9789 " return;\n"
9790 " }\n"
9791 "}\n",
9792 BreakBeforeBraceShortIfs);
9793 verifyFormat("void f(bool b)\n"
9794 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009795 " if constexpr (b)\n"
9796 " {\n"
9797 " return;\n"
9798 " }\n"
9799 "}\n",
9800 BreakBeforeBraceShortIfs);
9801 verifyFormat("void f(bool b)\n"
9802 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009803 " if (b) return;\n"
9804 "}\n",
9805 BreakBeforeBraceShortIfs);
9806 verifyFormat("void f(bool b)\n"
9807 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009808 " if constexpr (b) return;\n"
9809 "}\n",
9810 BreakBeforeBraceShortIfs);
9811 verifyFormat("void f(bool b)\n"
9812 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009813 " while (b)\n"
9814 " {\n"
9815 " return;\n"
9816 " }\n"
9817 "}\n",
9818 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009819}
9820
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009821TEST_F(FormatTest, GNUBraceBreaking) {
9822 FormatStyle GNUBraceStyle = getLLVMStyle();
9823 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9824 verifyFormat("namespace a\n"
9825 "{\n"
9826 "class A\n"
9827 "{\n"
9828 " void f()\n"
9829 " {\n"
9830 " int a;\n"
9831 " {\n"
9832 " int b;\n"
9833 " }\n"
9834 " if (true)\n"
9835 " {\n"
9836 " a();\n"
9837 " b();\n"
9838 " }\n"
9839 " }\n"
9840 " void g() { return; }\n"
9841 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009842 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009843 GNUBraceStyle);
9844
9845 verifyFormat("void f()\n"
9846 "{\n"
9847 " if (true)\n"
9848 " {\n"
9849 " a();\n"
9850 " }\n"
9851 " else if (false)\n"
9852 " {\n"
9853 " b();\n"
9854 " }\n"
9855 " else\n"
9856 " {\n"
9857 " c();\n"
9858 " }\n"
9859 "}\n",
9860 GNUBraceStyle);
9861
9862 verifyFormat("void f()\n"
9863 "{\n"
9864 " for (int i = 0; i < 10; ++i)\n"
9865 " {\n"
9866 " a();\n"
9867 " }\n"
9868 " while (false)\n"
9869 " {\n"
9870 " b();\n"
9871 " }\n"
9872 " do\n"
9873 " {\n"
9874 " c();\n"
9875 " }\n"
9876 " while (false);\n"
9877 "}\n",
9878 GNUBraceStyle);
9879
9880 verifyFormat("void f(int a)\n"
9881 "{\n"
9882 " switch (a)\n"
9883 " {\n"
9884 " case 0:\n"
9885 " break;\n"
9886 " case 1:\n"
9887 " {\n"
9888 " break;\n"
9889 " }\n"
9890 " case 2:\n"
9891 " {\n"
9892 " }\n"
9893 " break;\n"
9894 " default:\n"
9895 " break;\n"
9896 " }\n"
9897 "}\n",
9898 GNUBraceStyle);
9899
9900 verifyFormat("enum X\n"
9901 "{\n"
9902 " Y = 0,\n"
9903 "}\n",
9904 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009905
9906 verifyFormat("@interface BSApplicationController ()\n"
9907 "{\n"
9908 "@private\n"
9909 " id _extraIvar;\n"
9910 "}\n"
9911 "@end\n",
9912 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009913
9914 verifyFormat("#ifdef _DEBUG\n"
9915 "int foo(int i = 0)\n"
9916 "#else\n"
9917 "int foo(int i = 5)\n"
9918 "#endif\n"
9919 "{\n"
9920 " return i;\n"
9921 "}",
9922 GNUBraceStyle);
9923
9924 verifyFormat("void foo() {}\n"
9925 "void bar()\n"
9926 "#ifdef _DEBUG\n"
9927 "{\n"
9928 " foo();\n"
9929 "}\n"
9930 "#else\n"
9931 "{\n"
9932 "}\n"
9933 "#endif",
9934 GNUBraceStyle);
9935
9936 verifyFormat("void foobar() { int i = 5; }\n"
9937 "#ifdef _DEBUG\n"
9938 "void bar() {}\n"
9939 "#else\n"
9940 "void bar() { foobar(); }\n"
9941 "#endif",
9942 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009943}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009944
9945TEST_F(FormatTest, WebKitBraceBreaking) {
9946 FormatStyle WebKitBraceStyle = getLLVMStyle();
9947 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009948 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009949 verifyFormat("namespace a {\n"
9950 "class A {\n"
9951 " void f()\n"
9952 " {\n"
9953 " if (true) {\n"
9954 " a();\n"
9955 " b();\n"
9956 " }\n"
9957 " }\n"
9958 " void g() { return; }\n"
9959 "};\n"
9960 "enum E {\n"
9961 " A,\n"
9962 " // foo\n"
9963 " B,\n"
9964 " C\n"
9965 "};\n"
9966 "struct B {\n"
9967 " int x;\n"
9968 "};\n"
9969 "}\n",
9970 WebKitBraceStyle);
9971 verifyFormat("struct S {\n"
9972 " int Type;\n"
9973 " union {\n"
9974 " int x;\n"
9975 " double y;\n"
9976 " } Value;\n"
9977 " class C {\n"
9978 " MyFavoriteType Value;\n"
9979 " } Class;\n"
9980 "};\n",
9981 WebKitBraceStyle);
9982}
9983
Manuel Klimekd5735502013-08-12 03:51:17 +00009984TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9985 verifyFormat("void f() {\n"
9986 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009987 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009988 " }\n"
9989 "}\n",
9990 getLLVMStyle());
9991}
9992
Daniel Jasper9613c812013-08-07 16:29:23 +00009993TEST_F(FormatTest, UnderstandsPragmas) {
9994 verifyFormat("#pragma omp reduction(| : var)");
9995 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009996
9997 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9998 "(including parentheses).",
9999 format("#pragma mark Any non-hyphenated or hyphenated string "
10000 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010001}
10002
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010003TEST_F(FormatTest, UnderstandPragmaOption) {
10004 verifyFormat("#pragma option -C -A");
10005
10006 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10007}
10008
Manuel Klimek77866142017-11-17 11:17:15 +000010009TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10010 FormatStyle Style = getLLVMStyle();
10011 Style.ColumnLimit = 20;
10012
10013 verifyFormat("int a; // the\n"
10014 " // comment", Style);
10015 EXPECT_EQ("int a; /* first line\n"
10016 " * second\n"
10017 " * line third\n"
10018 " * line\n"
10019 " */",
10020 format("int a; /* first line\n"
10021 " * second\n"
10022 " * line third\n"
10023 " * line\n"
10024 " */",
10025 Style));
10026 EXPECT_EQ("int a; // first line\n"
10027 " // second\n"
10028 " // line third\n"
10029 " // line",
10030 format("int a; // first line\n"
10031 " // second line\n"
10032 " // third line",
10033 Style));
10034
10035 Style.PenaltyExcessCharacter = 90;
10036 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010037 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010038 " // aaa",
10039 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010040 EXPECT_EQ("int a; /* first line\n"
10041 " * second line\n"
10042 " * third line\n"
10043 " */",
10044 format("int a; /* first line\n"
10045 " * second line\n"
10046 " * third line\n"
10047 " */",
10048 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010049 EXPECT_EQ("int a; // first line\n"
10050 " // second line\n"
10051 " // third line",
10052 format("int a; // first line\n"
10053 " // second line\n"
10054 " // third line",
10055 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010056 // FIXME: Investigate why this is not getting the same layout as the test
10057 // above.
10058 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010059 " * second line\n"
10060 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010061 " */",
10062 format("int a; /* first line second line third line"
10063 "\n*/",
10064 Style));
10065
10066 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010067 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010068 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010069 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010070 Style));
10071 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010072 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010073 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010074 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010075 Style));
10076
10077 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10078 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010079 EXPECT_EQ("// foo bar baz bazfoo\n"
10080 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010081 format("// foo bar baz bazfoo bar\n"
10082 "// foo bar\n",
10083 Style));
10084
10085 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010086 "// foo bar baz bazfoo\n"
10087 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010088 format("// foo bar baz bazfoo\n"
10089 "// foo bar baz bazfoo bar\n"
10090 "// foo bar\n",
10091 Style));
10092
Manuel Klimek77866142017-11-17 11:17:15 +000010093 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010094 "// foo bar baz bazfoo\n"
10095 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010096 format("// foo bar baz bazfoo\n"
10097 "// foo bar baz bazfoo bar\n"
10098 "// foo bar\n",
10099 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010100
10101 // Make sure we do not keep protruding characters if strict mode reflow is
10102 // cheaper than keeping protruding characters.
10103 Style.ColumnLimit = 21;
10104 EXPECT_EQ("// foo foo foo foo\n"
10105 "// foo foo foo foo\n"
10106 "// foo foo foo foo\n",
10107 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10108 Style));
10109
10110 EXPECT_EQ("int a = /* long block\n"
10111 " comment */\n"
10112 " 42;",
10113 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010114}
10115
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010116#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10117 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010118 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10119 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010120
10121TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010122 SmallVector<FormatStyle, 3> Styles;
10123 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010124
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010125 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010126 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10127 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10128 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010129
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010130 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010131 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10132 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10133 EXPECT_ALL_STYLES_EQUAL(Styles);
10134
Nico Weber514ecc82014-02-02 20:50:45 +000010135 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010136 EXPECT_TRUE(
10137 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10138 EXPECT_TRUE(
10139 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10140 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010141
Nico Weber514ecc82014-02-02 20:50:45 +000010142 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010143 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10144 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10145 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010146
10147 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010148 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10149 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10150 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010151
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010152 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010153 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10154 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10155 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010156
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010157 Styles[0] = getGNUStyle();
10158 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10159 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10160 EXPECT_ALL_STYLES_EQUAL(Styles);
10161
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010162 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10163}
10164
10165TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10166 SmallVector<FormatStyle, 8> Styles;
10167 Styles.resize(2);
10168
10169 Styles[0] = getGoogleStyle();
10170 Styles[1] = getLLVMStyle();
10171 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10172 EXPECT_ALL_STYLES_EQUAL(Styles);
10173
10174 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010175 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010176 Styles[1] = getLLVMStyle();
10177 Styles[1].Language = FormatStyle::LK_JavaScript;
10178 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10179
10180 Styles[2] = getLLVMStyle();
10181 Styles[2].Language = FormatStyle::LK_JavaScript;
10182 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10183 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010184 &Styles[2])
10185 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010186
10187 Styles[3] = getLLVMStyle();
10188 Styles[3].Language = FormatStyle::LK_JavaScript;
10189 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10190 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010191 &Styles[3])
10192 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010193
10194 Styles[4] = getLLVMStyle();
10195 Styles[4].Language = FormatStyle::LK_JavaScript;
10196 EXPECT_EQ(0, parseConfiguration("---\n"
10197 "BasedOnStyle: LLVM\n"
10198 "IndentWidth: 123\n"
10199 "---\n"
10200 "BasedOnStyle: Google\n"
10201 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010202 &Styles[4])
10203 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010204 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205}
10206
Daniel Jasper91881d92014-09-29 08:07:46 +000010207#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010208 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010209 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010210 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010211 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010212 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010213
Daniel Jasper91881d92014-09-29 08:07:46 +000010214#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10215
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010216#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10217 Style.STRUCT.FIELD = false; \
10218 EXPECT_EQ(0, \
10219 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10220 .value()); \
10221 EXPECT_TRUE(Style.STRUCT.FIELD); \
10222 EXPECT_EQ(0, \
10223 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10224 .value()); \
10225 EXPECT_FALSE(Style.STRUCT.FIELD);
10226
10227#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10228 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10229
Daniel Jasper00853002014-09-16 16:22:30 +000010230#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10231 EXPECT_NE(VALUE, Style.FIELD); \
10232 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10233 EXPECT_EQ(VALUE, Style.FIELD)
10234
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010235TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010236 FormatStyle Style = {};
10237 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010238 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010239 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010240 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010241 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010242 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010243 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010244 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010245 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010246 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010247 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010248 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010249 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010250 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010251 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010252 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010253 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010254 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010255 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010256 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010257 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010258 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010259 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010260 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010261 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010262 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010263 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010264 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010265 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010266 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010267 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010268 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010269 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010270 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010271 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010272 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010273 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010274 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010275 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010276 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010277
10278 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10279 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10280 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10281 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10282 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10283 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10284 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10285 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010286 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010287 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10288 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10289 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010290 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10291 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10292 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010293}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010294
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010295#undef CHECK_PARSE_BOOL
10296
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010297TEST_F(FormatTest, ParsesConfiguration) {
10298 FormatStyle Style = {};
10299 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010300 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010301 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10302 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010303 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010304 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10305 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010306 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10307 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010308 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10309 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010310 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10311 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10312 PenaltyReturnTypeOnItsOwnLine, 1234u);
10313 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10314 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010315 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010316 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010317 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010318
Daniel Jasper553d4872014-06-17 12:40:34 +000010319 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010320 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10321 FormatStyle::PAS_Left);
10322 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10323 FormatStyle::PAS_Right);
10324 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10325 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010326 // For backward compatibility:
10327 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10328 FormatStyle::PAS_Left);
10329 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10330 FormatStyle::PAS_Right);
10331 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10332 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010333
Alexander Kornienkod6538332013-05-07 15:32:14 +000010334 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010335 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10336 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010337 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10338 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10339 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10340
Daniel Jasperac043c92014-09-15 11:11:00 +000010341 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010342 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10343 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010344 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10345 FormatStyle::BOS_None);
10346 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10347 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010348 // For backward compatibility:
10349 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10350 FormatStyle::BOS_None);
10351 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10352 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010353
Francois Ferranda6b6d512017-05-24 11:36:58 +000010354 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10355 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10356 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10357 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10358 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10359 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10360 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10361 // For backward compatibility:
10362 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10363 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10364
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010365 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10366 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10367 FormatStyle::BAS_Align);
10368 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10369 FormatStyle::BAS_DontAlign);
10370 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10371 FormatStyle::BAS_AlwaysBreak);
10372 // For backward compatibility:
10373 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10374 FormatStyle::BAS_DontAlign);
10375 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10376 FormatStyle::BAS_Align);
10377
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010378 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10379 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10380 FormatStyle::ENAS_DontAlign);
10381 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10382 FormatStyle::ENAS_Left);
10383 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10384 FormatStyle::ENAS_Right);
10385 // For backward compatibility:
10386 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10387 FormatStyle::ENAS_Left);
10388 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10389 FormatStyle::ENAS_Right);
10390
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010391 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010392 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10393 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10394 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010395 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10396 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010397 // For backward compatibility:
10398 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10399 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010400
Daniel Jasperd74cf402014-04-08 12:46:38 +000010401 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010402 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10403 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10404 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10405 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010406 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10407 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010408 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10409 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010410 // For backward compatibility:
10411 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10412 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10413 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10414 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010415
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010416 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10417 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10418 FormatStyle::SBPO_Never);
10419 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10420 FormatStyle::SBPO_Always);
10421 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10422 FormatStyle::SBPO_ControlStatements);
10423 // For backward compatibility:
10424 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10425 FormatStyle::SBPO_Never);
10426 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10427 FormatStyle::SBPO_ControlStatements);
10428
Alexander Kornienkod6538332013-05-07 15:32:14 +000010429 Style.ColumnLimit = 123;
10430 FormatStyle BaseStyle = getLLVMStyle();
10431 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10432 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10433
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010434 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10435 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10436 FormatStyle::BS_Attach);
10437 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10438 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010439 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10440 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010441 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10442 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010443 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10444 FormatStyle::BS_Allman);
10445 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010446 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10447 FormatStyle::BS_WebKit);
10448 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10449 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010450
Zachary Turner448592e2015-12-18 22:20:15 +000010451 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10452 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10453 FormatStyle::RTBS_None);
10454 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10455 FormatStyle::RTBS_All);
10456 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010457 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010458 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10459 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10460 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10461 AlwaysBreakAfterReturnType,
10462 FormatStyle::RTBS_TopLevelDefinitions);
10463
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010464 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10465 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10466 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10467 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10468 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10469 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10470 AlwaysBreakAfterDefinitionReturnType,
10471 FormatStyle::DRTBS_TopLevel);
10472
Daniel Jasper65ee3472013-07-31 23:16:02 +000010473 Style.NamespaceIndentation = FormatStyle::NI_All;
10474 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10475 FormatStyle::NI_None);
10476 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10477 FormatStyle::NI_Inner);
10478 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10479 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010480
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010481 // FIXME: This is required because parsing a configuration simply overwrites
10482 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010483 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010484 std::vector<std::string> BoostForeach;
10485 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010486 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010487 std::vector<std::string> BoostAndQForeach;
10488 BoostAndQForeach.push_back("BOOST_FOREACH");
10489 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010490 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10491 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010492
10493 Style.IncludeCategories.clear();
10494 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10495 {".*", 1}};
10496 CHECK_PARSE("IncludeCategories:\n"
10497 " - Regex: abc/.*\n"
10498 " Priority: 2\n"
10499 " - Regex: .*\n"
10500 " Priority: 1",
10501 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010502 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010503
10504 Style.RawStringFormats.clear();
10505 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010506 {
10507 FormatStyle::LK_TextProto,
10508 {"pb", "proto"},
10509 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010510 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010511 "llvm",
10512 },
10513 {
10514 FormatStyle::LK_Cpp,
10515 {"cc", "cpp"},
10516 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010517 /*CanonicalDelimiter=*/"cc",
10518 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010519 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010520 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010521
10522 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010523 " - Language: TextProto\n"
10524 " Delimiters:\n"
10525 " - 'pb'\n"
10526 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010527 " EnclosingFunctions:\n"
10528 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010529 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010530 " - Language: Cpp\n"
10531 " Delimiters:\n"
10532 " - 'cc'\n"
10533 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010534 " EnclosingFunctions:\n"
10535 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010536 " - 'CPPEVAL'\n"
10537 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010538 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010539}
10540
10541TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10542 FormatStyle Style = {};
10543 Style.Language = FormatStyle::LK_Cpp;
10544 CHECK_PARSE("Language: Cpp\n"
10545 "IndentWidth: 12",
10546 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010547 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10548 "IndentWidth: 34",
10549 &Style),
10550 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010551 EXPECT_EQ(12u, Style.IndentWidth);
10552 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10553 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10554
10555 Style.Language = FormatStyle::LK_JavaScript;
10556 CHECK_PARSE("Language: JavaScript\n"
10557 "IndentWidth: 12",
10558 IndentWidth, 12u);
10559 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010560 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10561 "IndentWidth: 34",
10562 &Style),
10563 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010564 EXPECT_EQ(23u, Style.IndentWidth);
10565 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10566 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10567
10568 CHECK_PARSE("BasedOnStyle: LLVM\n"
10569 "IndentWidth: 67",
10570 IndentWidth, 67u);
10571
10572 CHECK_PARSE("---\n"
10573 "Language: JavaScript\n"
10574 "IndentWidth: 12\n"
10575 "---\n"
10576 "Language: Cpp\n"
10577 "IndentWidth: 34\n"
10578 "...\n",
10579 IndentWidth, 12u);
10580
10581 Style.Language = FormatStyle::LK_Cpp;
10582 CHECK_PARSE("---\n"
10583 "Language: JavaScript\n"
10584 "IndentWidth: 12\n"
10585 "---\n"
10586 "Language: Cpp\n"
10587 "IndentWidth: 34\n"
10588 "...\n",
10589 IndentWidth, 34u);
10590 CHECK_PARSE("---\n"
10591 "IndentWidth: 78\n"
10592 "---\n"
10593 "Language: JavaScript\n"
10594 "IndentWidth: 56\n"
10595 "...\n",
10596 IndentWidth, 78u);
10597
10598 Style.ColumnLimit = 123;
10599 Style.IndentWidth = 234;
10600 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10601 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010602 EXPECT_FALSE(parseConfiguration("---\n"
10603 "IndentWidth: 456\n"
10604 "BreakBeforeBraces: Allman\n"
10605 "---\n"
10606 "Language: JavaScript\n"
10607 "IndentWidth: 111\n"
10608 "TabWidth: 111\n"
10609 "---\n"
10610 "Language: Cpp\n"
10611 "BreakBeforeBraces: Stroustrup\n"
10612 "TabWidth: 789\n"
10613 "...\n",
10614 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010615 EXPECT_EQ(123u, Style.ColumnLimit);
10616 EXPECT_EQ(456u, Style.IndentWidth);
10617 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10618 EXPECT_EQ(789u, Style.TabWidth);
10619
Rafael Espindola1f243172014-06-12 11:35:17 +000010620 EXPECT_EQ(parseConfiguration("---\n"
10621 "Language: JavaScript\n"
10622 "IndentWidth: 56\n"
10623 "---\n"
10624 "IndentWidth: 78\n"
10625 "...\n",
10626 &Style),
10627 ParseError::Error);
10628 EXPECT_EQ(parseConfiguration("---\n"
10629 "Language: JavaScript\n"
10630 "IndentWidth: 56\n"
10631 "---\n"
10632 "Language: JavaScript\n"
10633 "IndentWidth: 78\n"
10634 "...\n",
10635 &Style),
10636 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010637
10638 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10639}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010640
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010641#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010642
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010643TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10644 FormatStyle Style = {};
10645 Style.Language = FormatStyle::LK_JavaScript;
10646 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010647 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010648 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010649
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010650 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010651 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010652 "BasedOnStyle: Google\n"
10653 "---\n"
10654 "Language: JavaScript\n"
10655 "IndentWidth: 76\n"
10656 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010657 &Style)
10658 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010659 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010660 EXPECT_EQ(76u, Style.IndentWidth);
10661 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10662}
10663
Alexander Kornienkod6538332013-05-07 15:32:14 +000010664TEST_F(FormatTest, ConfigurationRoundTripTest) {
10665 FormatStyle Style = getLLVMStyle();
10666 std::string YAML = configurationAsText(Style);
10667 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010668 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010669 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10670 EXPECT_EQ(Style, ParsedStyle);
10671}
10672
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010673TEST_F(FormatTest, WorksFor8bitEncodings) {
10674 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10675 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10676 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10677 "\"\xef\xee\xf0\xf3...\"",
10678 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10679 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10680 "\xef\xee\xf0\xf3...\"",
10681 getLLVMStyleWithColumns(12)));
10682}
10683
Alexander Kornienko393e3082013-11-13 14:04:17 +000010684TEST_F(FormatTest, HandlesUTF8BOM) {
10685 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10686 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10687 format("\xef\xbb\xbf#include <iostream>"));
10688 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10689 format("\xef\xbb\xbf\n#include <iostream>"));
10690}
10691
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010692// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10693#if !defined(_MSC_VER)
10694
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010695TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10696 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10697 getLLVMStyleWithColumns(35));
10698 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010699 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010700 verifyFormat("// Однажды в студёную зимнюю пору...",
10701 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010702 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010703 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10704 getLLVMStyleWithColumns(39));
10705 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010706 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010707}
10708
10709TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010710 // Non-printable characters' width is currently considered to be the length in
10711 // bytes in UTF8. The characters can be displayed in very different manner
10712 // (zero-width, single width with a substitution glyph, expanded to their code
10713 // (e.g. "<8d>"), so there's no single correct way to handle them.
10714 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010715 "\"\xc2\x8d\";",
10716 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010717 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010718 "\"\xc2\x8d\";",
10719 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010720 EXPECT_EQ("\"Однажды, в \"\n"
10721 "\"студёную \"\n"
10722 "\"зимнюю \"\n"
10723 "\"пору,\"",
10724 format("\"Однажды, в студёную зимнюю пору,\"",
10725 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010726 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010727 "\"一 二 三 \"\n"
10728 "\"四 五六 \"\n"
10729 "\"七 八 九 \"\n"
10730 "\"十\"",
10731 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010732 EXPECT_EQ("\"一\t\"\n"
10733 "\"二 \t\"\n"
10734 "\"三 四 \"\n"
10735 "\"五\t\"\n"
10736 "\"六 \t\"\n"
10737 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010738 "\"八九十\tqq\"",
10739 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10740 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010741
10742 // UTF8 character in an escape sequence.
10743 EXPECT_EQ("\"aaaaaa\"\n"
10744 "\"\\\xC2\x8D\"",
10745 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010746}
10747
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010748TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10749 EXPECT_EQ("const char *sssss =\n"
10750 " \"一二三四五六七八\\\n"
10751 " 九 十\";",
10752 format("const char *sssss = \"一二三四五六七八\\\n"
10753 " 九 十\";",
10754 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010755}
10756
10757TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010758 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10759 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010760 EXPECT_EQ("// Я из лесу\n"
10761 "// вышел; был\n"
10762 "// сильный\n"
10763 "// мороз.",
10764 format("// Я из лесу вышел; был сильный мороз.",
10765 getLLVMStyleWithColumns(13)));
10766 EXPECT_EQ("// 一二三\n"
10767 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010768 "// 八 九\n"
10769 "// 十",
10770 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010771}
10772
10773TEST_F(FormatTest, SplitsUTF8BlockComments) {
10774 EXPECT_EQ("/* Гляжу,\n"
10775 " * поднимается\n"
10776 " * медленно в\n"
10777 " * гору\n"
10778 " * Лошадка,\n"
10779 " * везущая\n"
10780 " * хворосту\n"
10781 " * воз. */",
10782 format("/* Гляжу, поднимается медленно в гору\n"
10783 " * Лошадка, везущая хворосту воз. */",
10784 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010785 EXPECT_EQ(
10786 "/* 一二三\n"
10787 " * 四五六七\n"
10788 " * 八 九\n"
10789 " * 十 */",
10790 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010791 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10792 " * 𝕓𝕪𝕥𝕖\n"
10793 " * 𝖀𝕿𝕱-𝟠 */",
10794 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010795}
10796
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010797#endif // _MSC_VER
10798
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010799TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10800 FormatStyle Style = getLLVMStyle();
10801
10802 Style.ConstructorInitializerIndentWidth = 4;
10803 verifyFormat(
10804 "SomeClass::Constructor()\n"
10805 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10806 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10807 Style);
10808
10809 Style.ConstructorInitializerIndentWidth = 2;
10810 verifyFormat(
10811 "SomeClass::Constructor()\n"
10812 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10813 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10814 Style);
10815
10816 Style.ConstructorInitializerIndentWidth = 0;
10817 verifyFormat(
10818 "SomeClass::Constructor()\n"
10819 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10820 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10821 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010822 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10823 verifyFormat(
10824 "SomeLongTemplateVariableName<\n"
10825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10826 Style);
10827 verifyFormat(
10828 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10830 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010831}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010832
Daniel Jasper00853002014-09-16 16:22:30 +000010833TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10834 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010835 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010836 Style.ConstructorInitializerIndentWidth = 4;
10837 verifyFormat("SomeClass::Constructor()\n"
10838 " : a(a)\n"
10839 " , b(b)\n"
10840 " , c(c) {}",
10841 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010842 verifyFormat("SomeClass::Constructor()\n"
10843 " : a(a) {}",
10844 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010845
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010846 Style.ColumnLimit = 0;
10847 verifyFormat("SomeClass::Constructor()\n"
10848 " : a(a) {}",
10849 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010850 verifyFormat("SomeClass::Constructor() noexcept\n"
10851 " : a(a) {}",
10852 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010853 verifyFormat("SomeClass::Constructor()\n"
10854 " : a(a)\n"
10855 " , b(b)\n"
10856 " , c(c) {}",
10857 Style);
10858 verifyFormat("SomeClass::Constructor()\n"
10859 " : a(a) {\n"
10860 " foo();\n"
10861 " bar();\n"
10862 "}",
10863 Style);
10864
Daniel Jasperd74cf402014-04-08 12:46:38 +000010865 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010866 verifyFormat("SomeClass::Constructor()\n"
10867 " : a(a)\n"
10868 " , b(b)\n"
10869 " , c(c) {\n}",
10870 Style);
10871 verifyFormat("SomeClass::Constructor()\n"
10872 " : a(a) {\n}",
10873 Style);
10874
10875 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010876 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010877 Style.ConstructorInitializerIndentWidth = 2;
10878 verifyFormat("SomeClass::Constructor()\n"
10879 " : a(a)\n"
10880 " , b(b)\n"
10881 " , c(c) {}",
10882 Style);
10883
10884 Style.ConstructorInitializerIndentWidth = 0;
10885 verifyFormat("SomeClass::Constructor()\n"
10886 ": a(a)\n"
10887 ", b(b)\n"
10888 ", c(c) {}",
10889 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010890
10891 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10892 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010893 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10894 verifyFormat(
10895 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10896 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010897 verifyFormat(
10898 "SomeClass::Constructor()\n"
10899 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10900 Style);
10901 Style.ConstructorInitializerIndentWidth = 4;
10902 Style.ColumnLimit = 60;
10903 verifyFormat("SomeClass::Constructor()\n"
10904 " : aaaaaaaa(aaaaaaaa)\n"
10905 " , aaaaaaaa(aaaaaaaa)\n"
10906 " , aaaaaaaa(aaaaaaaa) {}",
10907 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010908}
10909
Daniel Jasper38efc132014-10-21 07:51:54 +000010910TEST_F(FormatTest, Destructors) {
10911 verifyFormat("void F(int &i) { i.~int(); }");
10912 verifyFormat("void F(int &i) { i->~int(); }");
10913}
10914
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010915TEST_F(FormatTest, FormatsWithWebKitStyle) {
10916 FormatStyle Style = getWebKitStyle();
10917
10918 // Don't indent in outer namespaces.
10919 verifyFormat("namespace outer {\n"
10920 "int i;\n"
10921 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010922 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010923 "} // namespace inner\n"
10924 "} // namespace outer\n"
10925 "namespace other_outer {\n"
10926 "int i;\n"
10927 "}",
10928 Style);
10929
10930 // Don't indent case labels.
10931 verifyFormat("switch (variable) {\n"
10932 "case 1:\n"
10933 "case 2:\n"
10934 " doSomething();\n"
10935 " break;\n"
10936 "default:\n"
10937 " ++variable;\n"
10938 "}",
10939 Style);
10940
10941 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010942 EXPECT_EQ("void f()\n"
10943 "{\n"
10944 " if (aaaaaaaaaaaaaaaa\n"
10945 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10946 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10947 " return;\n"
10948 "}",
10949 format("void f() {\n"
10950 "if (aaaaaaaaaaaaaaaa\n"
10951 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10952 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10953 "return;\n"
10954 "}",
10955 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010956
Daniel Jasper35995672014-04-29 14:05:20 +000010957 // Allow functions on a single line.
10958 verifyFormat("void f() { return; }", Style);
10959
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010960 // Constructor initializers are formatted one per line with the "," on the
10961 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010962 verifyFormat("Constructor()\n"
10963 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10964 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010965 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010966 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10967 "{\n"
10968 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010969 Style);
10970 verifyFormat("SomeClass::Constructor()\n"
10971 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010972 "{\n"
10973 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010974 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010975 EXPECT_EQ("SomeClass::Constructor()\n"
10976 " : a(a)\n"
10977 "{\n"
10978 "}",
10979 format("SomeClass::Constructor():a(a){}", Style));
10980 verifyFormat("SomeClass::Constructor()\n"
10981 " : a(a)\n"
10982 " , b(b)\n"
10983 " , c(c)\n"
10984 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010985 "}",
10986 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010987 verifyFormat("SomeClass::Constructor()\n"
10988 " : a(a)\n"
10989 "{\n"
10990 " foo();\n"
10991 " bar();\n"
10992 "}",
10993 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010994
Daniel Jasper65ee3472013-07-31 23:16:02 +000010995 // Access specifiers should be aligned left.
10996 verifyFormat("class C {\n"
10997 "public:\n"
10998 " int i;\n"
10999 "};",
11000 Style);
11001
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011002 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011003 verifyFormat("int a; // Do not\n"
11004 "double b; // align comments.",
11005 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011006
Daniel Jasper3219e432014-12-02 13:24:51 +000011007 // Do not align operands.
11008 EXPECT_EQ("ASSERT(aaaa\n"
11009 " || bbbb);",
11010 format("ASSERT ( aaaa\n||bbbb);", Style));
11011
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011012 // Accept input's line breaks.
11013 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11014 " || bbbbbbbbbbbbbbb) {\n"
11015 " i++;\n"
11016 "}",
11017 format("if (aaaaaaaaaaaaaaa\n"
11018 "|| bbbbbbbbbbbbbbb) { i++; }",
11019 Style));
11020 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11021 " i++;\n"
11022 "}",
11023 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011024
11025 // Don't automatically break all macro definitions (llvm.org/PR17842).
11026 verifyFormat("#define aNumber 10", Style);
11027 // However, generally keep the line breaks that the user authored.
11028 EXPECT_EQ("#define aNumber \\\n"
11029 " 10",
11030 format("#define aNumber \\\n"
11031 " 10",
11032 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011033
11034 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011035 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11036 " copyItems:YES];",
11037 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11038 "copyItems:YES];",
11039 Style));
11040 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11041 " copyItems:YES];",
11042 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11043 " copyItems:YES];",
11044 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011045 // FIXME: This does not seem right, there should be more indentation before
11046 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011047 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011048 " @\"a\",\n"
11049 " @\"a\"\n"
11050 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011051 " copyItems:YES];",
11052 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11053 " @\"a\",\n"
11054 " @\"a\"\n"
11055 " ]\n"
11056 " copyItems:YES];",
11057 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011058 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011059 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11060 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011061 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11062 " copyItems:YES];",
11063 Style));
11064
11065 verifyFormat("[self.a b:c c:d];", Style);
11066 EXPECT_EQ("[self.a b:c\n"
11067 " c:d];",
11068 format("[self.a b:c\n"
11069 "c:d];",
11070 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011071}
11072
Manuel Klimekffdeb592013-09-03 15:10:01 +000011073TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011074 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11075 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11076 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11077 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11078 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011079 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011080 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11081 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011082 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011083 verifyFormat("void f() {\n"
11084 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11085 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011086 verifyFormat("void f() {\n"
11087 " other(x.begin(), //\n"
11088 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011089 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011090 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011091 verifyFormat("SomeFunction([]() { // A cool function...\n"
11092 " return 43;\n"
11093 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011094 EXPECT_EQ("SomeFunction([]() {\n"
11095 "#define A a\n"
11096 " return 43;\n"
11097 "});",
11098 format("SomeFunction([](){\n"
11099 "#define A a\n"
11100 "return 43;\n"
11101 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011102 verifyFormat("void f() {\n"
11103 " SomeFunction([](decltype(x), A *a) {});\n"
11104 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011105 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11106 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011107 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11108 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11109 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011110 verifyFormat("Constructor()\n"
11111 " : Field([] { // comment\n"
11112 " int i;\n"
11113 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011114 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11115 " return some_parameter.size();\n"
11116 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011117 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11118 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011119 verifyFormat("int i = aaaaaa ? 1 //\n"
11120 " : [] {\n"
11121 " return 2; //\n"
11122 " }();");
11123 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11124 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11125 " return x == 2; // force break\n"
11126 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011127 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11128 " [=](int iiiiiiiiiiii) {\n"
11129 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11130 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11131 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011132 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011133 verifyFormat("SomeFunction({[&] {\n"
11134 " // comment\n"
11135 " },\n"
11136 " [&] {\n"
11137 " // comment\n"
11138 " }});");
11139 verifyFormat("SomeFunction({[&] {\n"
11140 " // comment\n"
11141 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011142 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11143 " [&]() { return true; },\n"
11144 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011145
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011146 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011147 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011148 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011149 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11150 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011151 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011152 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011153 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11154 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011155 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011156 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11157 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011158 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011159 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011160 verifyFormat(
11161 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11162 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11163 " return aaaaaaaaaaaaaaaaa;\n"
11164 " });",
11165 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011166 verifyFormat("[]() //\n"
11167 " -> int {\n"
11168 " return 1; //\n"
11169 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011170
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011171 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011172 verifyFormat("SomeFunction(\n"
11173 " []() {\n"
11174 " int i = 42;\n"
11175 " return i;\n"
11176 " },\n"
11177 " []() {\n"
11178 " int j = 43;\n"
11179 " return j;\n"
11180 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011181
Daniel Jasperda18fd82014-06-10 06:39:03 +000011182 // More complex introducers.
11183 verifyFormat("return [i, args...] {};");
11184
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011185 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011186 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011187 verifyFormat("double &operator[](int i) { return 0; }\n"
11188 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011189 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011190 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011191 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011192
11193 // Other corner cases.
11194 verifyFormat("void f() {\n"
11195 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011196 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011197 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011198
11199 // Lambdas created through weird macros.
11200 verifyFormat("void f() {\n"
11201 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011202 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011203 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011204
11205 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11206 " doo_dah();\n"
11207 " doo_dah();\n"
11208 " })) {\n"
11209 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011210 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11211 " doo_dah();\n"
11212 " doo_dah();\n"
11213 " })) {\n"
11214 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011215 verifyFormat("auto lambda = []() {\n"
11216 " int a = 2\n"
11217 "#if A\n"
11218 " + 2\n"
11219 "#endif\n"
11220 " ;\n"
11221 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011222
11223 // Lambdas with complex multiline introducers.
11224 verifyFormat(
11225 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11226 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11227 " -> ::std::unordered_set<\n"
11228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11229 " //\n"
11230 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011231}
11232
Martin Probsta004b3f2017-11-17 18:06:33 +000011233TEST_F(FormatTest, EmptyLinesInLambdas) {
11234 verifyFormat("auto lambda = []() {\n"
11235 " x(); //\n"
11236 "};",
11237 "auto lambda = []() {\n"
11238 "\n"
11239 " x(); //\n"
11240 "\n"
11241 "};");
11242}
11243
Manuel Klimek516e0542013-09-04 13:25:30 +000011244TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011245 FormatStyle ShortBlocks = getLLVMStyle();
11246 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11247 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11248 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11249 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11250 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11251 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11252 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011253
Daniel Jasper76284682014-10-22 09:12:44 +000011254 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11255 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11256 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011257
Daniel Jasper76284682014-10-22 09:12:44 +000011258 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011259 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011260 "}];");
11261 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011262 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011263 "}]};");
11264 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011265 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011266 "}];");
11267 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011268 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011269 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011270 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011271 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011272 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011273 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011274 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011275
11276 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011277 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011278 "}];",
11279 getLLVMStyleWithColumns(60));
11280 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011281 " NSString *path = [self sessionFilePath];\n"
11282 " if (path) {\n"
11283 " // ...\n"
11284 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011285 "});");
11286 verifyFormat("[[SessionService sharedService]\n"
11287 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011288 " if (window) {\n"
11289 " [self windowDidLoad:window];\n"
11290 " } else {\n"
11291 " [self errorLoadingWindow];\n"
11292 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011293 " }];");
11294 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011295 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011296 "};\n",
11297 getLLVMStyleWithColumns(40));
11298 verifyFormat("[[SessionService sharedService]\n"
11299 " loadWindowWithCompletionBlock: //\n"
11300 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011301 " if (window) {\n"
11302 " [self windowDidLoad:window];\n"
11303 " } else {\n"
11304 " [self errorLoadingWindow];\n"
11305 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011306 " }];",
11307 getLLVMStyleWithColumns(60));
11308 verifyFormat("[myObject doSomethingWith:arg1\n"
11309 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011310 " // ...\n"
11311 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011312 " }\n"
11313 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011314 " // ...\n"
11315 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011316 " }\n"
11317 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011318 " // ...\n"
11319 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011320 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011321 verifyFormat("[myObject doSomethingWith:arg1\n"
11322 " firstBlock:-1\n"
11323 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011324 " // ...\n"
11325 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011326 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011327
11328 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011329 " @autoreleasepool {\n"
11330 " if (a) {\n"
11331 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011332 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011333 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011334 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011335 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011336 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11337 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011338
11339 FormatStyle FourIndent = getLLVMStyle();
11340 FourIndent.ObjCBlockIndentWidth = 4;
11341 verifyFormat("[operation setCompletionBlock:^{\n"
11342 " [self onOperationDone];\n"
11343 "}];",
11344 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011345}
11346
Daniel Jasper289afc02015-04-23 09:23:17 +000011347TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11348 FormatStyle ZeroColumn = getLLVMStyle();
11349 ZeroColumn.ColumnLimit = 0;
11350
11351 verifyFormat("[[SessionService sharedService] "
11352 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11353 " if (window) {\n"
11354 " [self windowDidLoad:window];\n"
11355 " } else {\n"
11356 " [self errorLoadingWindow];\n"
11357 " }\n"
11358 "}];",
11359 ZeroColumn);
11360 EXPECT_EQ("[[SessionService sharedService]\n"
11361 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11362 " if (window) {\n"
11363 " [self windowDidLoad:window];\n"
11364 " } else {\n"
11365 " [self errorLoadingWindow];\n"
11366 " }\n"
11367 " }];",
11368 format("[[SessionService sharedService]\n"
11369 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11370 " if (window) {\n"
11371 " [self windowDidLoad:window];\n"
11372 " } else {\n"
11373 " [self errorLoadingWindow];\n"
11374 " }\n"
11375 "}];",
11376 ZeroColumn));
11377 verifyFormat("[myObject doSomethingWith:arg1\n"
11378 " firstBlock:^(Foo *a) {\n"
11379 " // ...\n"
11380 " int i;\n"
11381 " }\n"
11382 " secondBlock:^(Bar *b) {\n"
11383 " // ...\n"
11384 " int i;\n"
11385 " }\n"
11386 " thirdBlock:^Foo(Bar *b) {\n"
11387 " // ...\n"
11388 " int i;\n"
11389 " }];",
11390 ZeroColumn);
11391 verifyFormat("f(^{\n"
11392 " @autoreleasepool {\n"
11393 " if (a) {\n"
11394 " g();\n"
11395 " }\n"
11396 " }\n"
11397 "});",
11398 ZeroColumn);
11399 verifyFormat("void (^largeBlock)(void) = ^{\n"
11400 " // ...\n"
11401 "};",
11402 ZeroColumn);
11403
11404 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11405 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011406 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011407 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11408 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11409 " int i;\n"
11410 "};",
11411 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11412}
11413
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011414TEST_F(FormatTest, SupportsCRLF) {
11415 EXPECT_EQ("int a;\r\n"
11416 "int b;\r\n"
11417 "int c;\r\n",
11418 format("int a;\r\n"
11419 " int b;\r\n"
11420 " int c;\r\n",
11421 getLLVMStyle()));
11422 EXPECT_EQ("int a;\r\n"
11423 "int b;\r\n"
11424 "int c;\r\n",
11425 format("int a;\r\n"
11426 " int b;\n"
11427 " int c;\r\n",
11428 getLLVMStyle()));
11429 EXPECT_EQ("int a;\n"
11430 "int b;\n"
11431 "int c;\n",
11432 format("int a;\r\n"
11433 " int b;\n"
11434 " int c;\n",
11435 getLLVMStyle()));
11436 EXPECT_EQ("\"aaaaaaa \"\r\n"
11437 "\"bbbbbbb\";\r\n",
11438 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11439 EXPECT_EQ("#define A \\\r\n"
11440 " b; \\\r\n"
11441 " c; \\\r\n"
11442 " d;\r\n",
11443 format("#define A \\\r\n"
11444 " b; \\\r\n"
11445 " c; d; \r\n",
11446 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011447
11448 EXPECT_EQ("/*\r\n"
11449 "multi line block comments\r\n"
11450 "should not introduce\r\n"
11451 "an extra carriage return\r\n"
11452 "*/\r\n",
11453 format("/*\r\n"
11454 "multi line block comments\r\n"
11455 "should not introduce\r\n"
11456 "an extra carriage return\r\n"
11457 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011458}
11459
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011460TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11461 verifyFormat("MY_CLASS(C) {\n"
11462 " int i;\n"
11463 " int j;\n"
11464 "};");
11465}
11466
Daniel Jasper6633ab82013-10-18 10:38:14 +000011467TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11468 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11469 TwoIndent.ContinuationIndentWidth = 2;
11470
11471 EXPECT_EQ("int i =\n"
11472 " longFunction(\n"
11473 " arg);",
11474 format("int i = longFunction(arg);", TwoIndent));
11475
11476 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11477 SixIndent.ContinuationIndentWidth = 6;
11478
11479 EXPECT_EQ("int i =\n"
11480 " longFunction(\n"
11481 " arg);",
11482 format("int i = longFunction(arg);", SixIndent));
11483}
11484
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011485TEST_F(FormatTest, SpacesInAngles) {
11486 FormatStyle Spaces = getLLVMStyle();
11487 Spaces.SpacesInAngles = true;
11488
11489 verifyFormat("static_cast< int >(arg);", Spaces);
11490 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11491 verifyFormat("f< int, float >();", Spaces);
11492 verifyFormat("template <> g() {}", Spaces);
11493 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011494 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11495 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11496 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011497
11498 Spaces.Standard = FormatStyle::LS_Cpp03;
11499 Spaces.SpacesInAngles = true;
11500 verifyFormat("A< A< int > >();", Spaces);
11501
11502 Spaces.SpacesInAngles = false;
11503 verifyFormat("A<A<int> >();", Spaces);
11504
11505 Spaces.Standard = FormatStyle::LS_Cpp11;
11506 Spaces.SpacesInAngles = true;
11507 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011508
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011509 Spaces.SpacesInAngles = false;
11510 verifyFormat("A<A<int>>();", Spaces);
11511}
11512
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011513TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11514 FormatStyle Style = getLLVMStyle();
11515 Style.SpaceAfterTemplateKeyword = false;
11516 verifyFormat("template<int> void foo();", Style);
11517}
11518
Jacques Pienaarfc275112015-02-18 23:48:37 +000011519TEST_F(FormatTest, TripleAngleBrackets) {
11520 verifyFormat("f<<<1, 1>>>();");
11521 verifyFormat("f<<<1, 1, 1, s>>>();");
11522 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011523 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011524 verifyFormat("f<param><<<1, 1>>>();");
11525 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011526 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011527 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11528 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011529 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11530 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011531}
11532
11533TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011534 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011535 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011536 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11537 "aaallvm::outs() <<");
11538 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11539 "aaaallvm::outs()\n <<");
11540}
11541
Manuel Klimek819788d2014-03-18 11:22:45 +000011542TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11543 std::string code = "#if A\n"
11544 "#if B\n"
11545 "a.\n"
11546 "#endif\n"
11547 " a = 1;\n"
11548 "#else\n"
11549 "#endif\n"
11550 "#if C\n"
11551 "#else\n"
11552 "#endif\n";
11553 EXPECT_EQ(code, format(code));
11554}
11555
Manuel Klimek68b03042014-04-14 09:14:11 +000011556TEST_F(FormatTest, HandleConflictMarkers) {
11557 // Git/SVN conflict markers.
11558 EXPECT_EQ("int a;\n"
11559 "void f() {\n"
11560 " callme(some(parameter1,\n"
11561 "<<<<<<< text by the vcs\n"
11562 " parameter2),\n"
11563 "||||||| text by the vcs\n"
11564 " parameter2),\n"
11565 " parameter3,\n"
11566 "======= text by the vcs\n"
11567 " parameter2, parameter3),\n"
11568 ">>>>>>> text by the vcs\n"
11569 " otherparameter);\n",
11570 format("int a;\n"
11571 "void f() {\n"
11572 " callme(some(parameter1,\n"
11573 "<<<<<<< text by the vcs\n"
11574 " parameter2),\n"
11575 "||||||| text by the vcs\n"
11576 " parameter2),\n"
11577 " parameter3,\n"
11578 "======= text by the vcs\n"
11579 " parameter2,\n"
11580 " parameter3),\n"
11581 ">>>>>>> text by the vcs\n"
11582 " otherparameter);\n"));
11583
11584 // Perforce markers.
11585 EXPECT_EQ("void f() {\n"
11586 " function(\n"
11587 ">>>> text by the vcs\n"
11588 " parameter,\n"
11589 "==== text by the vcs\n"
11590 " parameter,\n"
11591 "==== text by the vcs\n"
11592 " parameter,\n"
11593 "<<<< text by the vcs\n"
11594 " parameter);\n",
11595 format("void f() {\n"
11596 " function(\n"
11597 ">>>> text by the vcs\n"
11598 " parameter,\n"
11599 "==== text by the vcs\n"
11600 " parameter,\n"
11601 "==== text by the vcs\n"
11602 " parameter,\n"
11603 "<<<< text by the vcs\n"
11604 " parameter);\n"));
11605
11606 EXPECT_EQ("<<<<<<<\n"
11607 "|||||||\n"
11608 "=======\n"
11609 ">>>>>>>",
11610 format("<<<<<<<\n"
11611 "|||||||\n"
11612 "=======\n"
11613 ">>>>>>>"));
11614
11615 EXPECT_EQ("<<<<<<<\n"
11616 "|||||||\n"
11617 "int i;\n"
11618 "=======\n"
11619 ">>>>>>>",
11620 format("<<<<<<<\n"
11621 "|||||||\n"
11622 "int i;\n"
11623 "=======\n"
11624 ">>>>>>>"));
11625
11626 // FIXME: Handle parsing of macros around conflict markers correctly:
11627 EXPECT_EQ("#define Macro \\\n"
11628 "<<<<<<<\n"
11629 "Something \\\n"
11630 "|||||||\n"
11631 "Else \\\n"
11632 "=======\n"
11633 "Other \\\n"
11634 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011635 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011636 format("#define Macro \\\n"
11637 "<<<<<<<\n"
11638 " Something \\\n"
11639 "|||||||\n"
11640 " Else \\\n"
11641 "=======\n"
11642 " Other \\\n"
11643 ">>>>>>>\n"
11644 " End\n"
11645 "int i;\n"));
11646}
11647
Daniel Jasper471894432014-08-06 13:40:26 +000011648TEST_F(FormatTest, DisableRegions) {
11649 EXPECT_EQ("int i;\n"
11650 "// clang-format off\n"
11651 " int j;\n"
11652 "// clang-format on\n"
11653 "int k;",
11654 format(" int i;\n"
11655 " // clang-format off\n"
11656 " int j;\n"
11657 " // clang-format on\n"
11658 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011659 EXPECT_EQ("int i;\n"
11660 "/* clang-format off */\n"
11661 " int j;\n"
11662 "/* clang-format on */\n"
11663 "int k;",
11664 format(" int i;\n"
11665 " /* clang-format off */\n"
11666 " int j;\n"
11667 " /* clang-format on */\n"
11668 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011669
11670 // Don't reflow comments within disabled regions.
11671 EXPECT_EQ(
11672 "// clang-format off\n"
11673 "// long long long long long long line\n"
11674 "/* clang-format on */\n"
11675 "/* long long long\n"
11676 " * long long long\n"
11677 " * line */\n"
11678 "int i;\n"
11679 "/* clang-format off */\n"
11680 "/* long long long long long long line */\n",
11681 format("// clang-format off\n"
11682 "// long long long long long long line\n"
11683 "/* clang-format on */\n"
11684 "/* long long long long long long line */\n"
11685 "int i;\n"
11686 "/* clang-format off */\n"
11687 "/* long long long long long long line */\n",
11688 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011689}
11690
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011691TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11692 format("? ) =");
11693 verifyNoCrash("#define a\\\n /**/}");
11694}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011695
Daniel Jasper498f5582015-12-25 08:53:31 +000011696TEST_F(FormatTest, FormatsTableGenCode) {
11697 FormatStyle Style = getLLVMStyle();
11698 Style.Language = FormatStyle::LK_TableGen;
11699 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11700}
11701
Nico Weberb2673a12016-11-10 21:49:25 +000011702TEST_F(FormatTest, ArrayOfTemplates) {
11703 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11704 format("auto a = new unique_ptr<int > [ 10];"));
11705
11706 FormatStyle Spaces = getLLVMStyle();
11707 Spaces.SpacesInSquareBrackets = true;
11708 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11709 format("auto a = new unique_ptr<int > [10];", Spaces));
11710}
11711
11712TEST_F(FormatTest, ArrayAsTemplateType) {
11713 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11714 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11715
11716 FormatStyle Spaces = getLLVMStyle();
11717 Spaces.SpacesInSquareBrackets = true;
11718 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11719 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11720}
11721
Martin Probstc9c51c42017-03-16 10:21:35 +000011722TEST_F(FormatTest, NoSpaceAfterSuper) {
11723 verifyFormat("__super::FooBar();");
11724}
11725
Ben Hamilton07e58362018-02-21 21:27:27 +000011726TEST(FormatStyle, GetStyleWithEmptyFileName) {
11727 auto Style1 = getStyle("file", "", "Google");
11728 ASSERT_TRUE((bool)Style1);
11729 ASSERT_EQ(*Style1, getGoogleStyle());
11730}
11731
Eric Liu547d8792016-03-24 13:22:42 +000011732TEST(FormatStyle, GetStyleOfFile) {
11733 vfs::InMemoryFileSystem FS;
11734 // Test 1: format file in the same directory.
11735 ASSERT_TRUE(
11736 FS.addFile("/a/.clang-format", 0,
11737 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11738 ASSERT_TRUE(
11739 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011740 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011741 ASSERT_TRUE((bool)Style1);
11742 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011743
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011744 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011745 ASSERT_TRUE(
11746 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011747 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011748 ASSERT_TRUE((bool)Style2);
11749 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011750
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011751 // Test 2.2: no format on 'none' fallback style.
11752 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11753 ASSERT_TRUE((bool)Style2);
11754 ASSERT_EQ(*Style2, getNoStyle());
11755
11756 // Test 2.3: format if config is found with no based style while fallback is
11757 // 'none'.
11758 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11759 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11760 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11761 ASSERT_TRUE((bool)Style2);
11762 ASSERT_EQ(*Style2, getLLVMStyle());
11763
11764 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11765 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11766 ASSERT_TRUE((bool)Style2);
11767 ASSERT_EQ(*Style2, getLLVMStyle());
11768
Eric Liu547d8792016-03-24 13:22:42 +000011769 // Test 3: format file in parent directory.
11770 ASSERT_TRUE(
11771 FS.addFile("/c/.clang-format", 0,
11772 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11773 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11774 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011775 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011776 ASSERT_TRUE((bool)Style3);
11777 ASSERT_EQ(*Style3, getGoogleStyle());
11778
11779 // Test 4: error on invalid fallback style
11780 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11781 ASSERT_FALSE((bool)Style4);
11782 llvm::consumeError(Style4.takeError());
11783
11784 // Test 5: error on invalid yaml on command line
11785 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11786 ASSERT_FALSE((bool)Style5);
11787 llvm::consumeError(Style5.takeError());
11788
11789 // Test 6: error on invalid style
11790 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11791 ASSERT_FALSE((bool)Style6);
11792 llvm::consumeError(Style6.takeError());
11793
11794 // Test 7: found config file, error on parsing it
11795 ASSERT_TRUE(
11796 FS.addFile("/d/.clang-format", 0,
11797 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11798 "InvalidKey: InvalidValue")));
11799 ASSERT_TRUE(
11800 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11801 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11802 ASSERT_FALSE((bool)Style7);
11803 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011804}
11805
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011806TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11807 // Column limit is 20.
11808 std::string Code = "Type *a =\n"
11809 " new Type();\n"
11810 "g(iiiii, 0, jjjjj,\n"
11811 " 0, kkkkk, 0, mm);\n"
11812 "int bad = format ;";
11813 std::string Expected = "auto a = new Type();\n"
11814 "g(iiiii, nullptr,\n"
11815 " jjjjj, nullptr,\n"
11816 " kkkkk, nullptr,\n"
11817 " mm);\n"
11818 "int bad = format ;";
11819 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011820 tooling::Replacements Replaces = toReplacements(
11821 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11822 "auto "),
11823 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11824 "nullptr"),
11825 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11826 "nullptr"),
11827 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11828 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011829
11830 format::FormatStyle Style = format::getLLVMStyle();
11831 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011832 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11833 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11834 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11835 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11836 EXPECT_TRUE(static_cast<bool>(Result));
11837 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011838}
11839
Eric Liubaf58c22016-05-18 13:43:48 +000011840TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11841 std::string Code = "#include \"a.h\"\n"
11842 "#include \"c.h\"\n"
11843 "\n"
11844 "int main() {\n"
11845 " return 0;\n"
11846 "}";
11847 std::string Expected = "#include \"a.h\"\n"
11848 "#include \"b.h\"\n"
11849 "#include \"c.h\"\n"
11850 "\n"
11851 "int main() {\n"
11852 " return 0;\n"
11853 "}";
11854 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011855 tooling::Replacements Replaces = toReplacements(
11856 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11857 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011858
11859 format::FormatStyle Style = format::getLLVMStyle();
11860 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011861 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11862 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11863 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11864 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11865 EXPECT_TRUE(static_cast<bool>(Result));
11866 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011867}
11868
Krasimir Georgievac16a202017-06-23 11:46:03 +000011869TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11870 EXPECT_EQ("using std::cin;\n"
11871 "using std::cout;",
11872 format("using std::cout;\n"
11873 "using std::cin;", getGoogleStyle()));
11874}
11875
Nico Weberdc065182017-04-05 18:10:42 +000011876TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11877 format::FormatStyle Style = format::getLLVMStyle();
11878 Style.Standard = FormatStyle::LS_Cpp03;
11879 // cpp03 recognize this string as identifier u8 and literal character 'a'
11880 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11881}
11882
11883TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11884 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11885 // all modes, including C++11, C++14 and C++17
11886 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11887}
11888
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000011889TEST_F(FormatTest, DoNotFormatLikelyXml) {
11890 EXPECT_EQ("<!-- ;> -->",
11891 format("<!-- ;> -->", getGoogleStyle()));
11892 EXPECT_EQ(" <!-- >; -->",
11893 format(" <!-- >; -->", getGoogleStyle()));
11894}
11895
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011896TEST_F(FormatTest, StructuredBindings) {
11897 // Structured bindings is a C++17 feature.
11898 // all modes, including C++11, C++14 and C++17
11899 verifyFormat("auto [a, b] = f();");
11900 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
11901 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
11902 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
11903 EXPECT_EQ("auto const volatile [a, b] = f();",
11904 format("auto const volatile[a, b] = f();"));
11905 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011906 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011907 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011908 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011909 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011910 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
11911 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011912 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011913 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
11914 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
11915 EXPECT_EQ("const auto volatile &&[a, b] = f();",
11916 format("const auto volatile &&[a, b] = f();"));
11917 EXPECT_EQ("volatile const auto &&[a, b] = f();",
11918 format("volatile const auto &&[a, b] = f();"));
11919 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011920
Manuel Klimeke411aa82017-09-20 09:29:37 +000011921 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011922 FormatStyle PointerMiddle = getLLVMStyle();
11923 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
11924 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
11925 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
11926 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
11927 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
11928 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
11929 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
11930 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
11931 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
11932 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
11933 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
11934 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
11935 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
11936
11937 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
11938 format("for (const auto && [a, b] : some_range) {\n}"));
11939 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
11940 format("for (const auto & [a, b] : some_range) {\n}"));
11941 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
11942 format("for (const auto[a, b] : some_range) {\n}"));
11943 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
11944 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
11945 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
11946 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
11947 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
11948 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
11949 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
11950 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000011951
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011952 format::FormatStyle Spaces = format::getLLVMStyle();
11953 Spaces.SpacesInSquareBrackets = true;
11954 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000011955 verifyFormat("auto &&[ a, b ] = f();", Spaces);
11956 verifyFormat("auto &[ a, b ] = f();", Spaces);
11957 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
11958 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000011959}
11960
Ben Hamilton3b345c32018-02-21 15:54:31 +000011961struct GuessLanguageTestCase {
11962 const char *const FileName;
11963 const char *const Code;
11964 const FormatStyle::LanguageKind ExpectedResult;
11965};
11966
11967class GuessLanguageTest
11968 : public FormatTest,
11969 public ::testing::WithParamInterface<GuessLanguageTestCase> {};
11970
11971TEST_P(GuessLanguageTest, FileAndCode) {
11972 auto TestCase = GetParam();
11973 EXPECT_EQ(TestCase.ExpectedResult,
11974 guessLanguage(TestCase.FileName, TestCase.Code));
11975}
11976
11977static const GuessLanguageTestCase TestCases[] = {
11978 {"foo.cc", "", FormatStyle::LK_Cpp},
11979 {"foo.m", "", FormatStyle::LK_ObjC},
11980 {"foo.mm", "", FormatStyle::LK_ObjC},
11981 {"foo.h", "", FormatStyle::LK_Cpp},
11982 {"foo.h", "@interface Foo\n@end\n", FormatStyle::LK_ObjC},
11983 {"foo", "", FormatStyle::LK_Cpp},
11984 {"foo", "@interface Foo\n@end\n", FormatStyle::LK_ObjC},
11985};
11986INSTANTIATE_TEST_CASE_P(ValidLanguages, GuessLanguageTest,
11987 ::testing::ValuesIn(TestCases));
11988
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011989} // end namespace
11990} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011991} // end namespace clang