blob: 2d20bc03651c7d07018ead793b52d1ad25a532d3 [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
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000279 // 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"
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000298 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000299 "} // 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
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000745 // These should not be formatted as Objective-C for-in loops.
746 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
747 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
748 verifyFormat("Foo *x;\nfor (x in y) {\n}");
749 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
750
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000751 FormatStyle NoBinPacking = getLLVMStyle();
752 NoBinPacking.BinPackParameters = false;
753 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
754 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
755 " aaaaaaaaaaaaaaaa,\n"
756 " aaaaaaaaaaaaaaaa,\n"
757 " aaaaaaaaaaaaaaaa);\n"
758 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
759 "}",
760 NoBinPacking);
761 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000762 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
763 " E = UnwrappedLines.end();\n"
764 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000765 " ++I) {\n}",
766 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000767
768 FormatStyle AlignLeft = getLLVMStyle();
769 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
770 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000771}
772
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000773TEST_F(FormatTest, RangeBasedForLoops) {
774 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
776 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
777 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000778 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000780 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
781 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000782}
783
Daniel Jaspere1e43192014-04-01 12:55:11 +0000784TEST_F(FormatTest, ForEachLoops) {
785 verifyFormat("void f() {\n"
786 " foreach (Item *item, itemlist) {}\n"
787 " Q_FOREACH (Item *item, itemlist) {}\n"
788 " BOOST_FOREACH (Item *item, itemlist) {}\n"
789 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
790 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000791
792 // 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");
797
798 // Not as function-like macros.
799 verifyFormat("#define foreach (x, y)\n"
800 "#define Q_FOREACH (x, y)\n"
801 "#define BOOST_FOREACH (x, y)\n"
802 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000803}
804
Daniel Jasperf7935112012-12-03 18:12:45 +0000805TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000806 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000807 verifyFormat("while (true)\n"
808 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000809 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000810 verifyFormat("while () {\n"
811 " f();\n"
812 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000813}
814
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000815TEST_F(FormatTest, FormatsDoWhile) {
816 verifyFormat("do {\n"
817 " do_something();\n"
818 "} while (something());");
819 verifyFormat("do\n"
820 " do_something();\n"
821 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000822}
823
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000824TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000825 verifyFormat("switch (x) {\n"
826 "case 1:\n"
827 " f();\n"
828 " break;\n"
829 "case kFoo:\n"
830 "case ns::kBar:\n"
831 "case kBaz:\n"
832 " break;\n"
833 "default:\n"
834 " g();\n"
835 " break;\n"
836 "}");
837 verifyFormat("switch (x) {\n"
838 "case 1: {\n"
839 " f();\n"
840 " break;\n"
841 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000842 "case 2: {\n"
843 " break;\n"
844 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000845 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000846 verifyFormat("switch (x) {\n"
847 "case 1: {\n"
848 " f();\n"
849 " {\n"
850 " g();\n"
851 " h();\n"
852 " }\n"
853 " break;\n"
854 "}\n"
855 "}");
856 verifyFormat("switch (x) {\n"
857 "case 1: {\n"
858 " f();\n"
859 " if (foo) {\n"
860 " g();\n"
861 " h();\n"
862 " }\n"
863 " break;\n"
864 "}\n"
865 "}");
866 verifyFormat("switch (x) {\n"
867 "case 1: {\n"
868 " f();\n"
869 " g();\n"
870 "} break;\n"
871 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000872 verifyFormat("switch (test)\n"
873 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000874 verifyFormat("switch (x) {\n"
875 "default: {\n"
876 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000877 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000878 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000879 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000880 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000881 "// if 1, do f()\n"
882 "case 1:\n"
883 " f();\n"
884 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000885 verifyFormat("switch (x) {\n"
886 "case 1:\n"
887 " // Do amazing stuff\n"
888 " {\n"
889 " f();\n"
890 " g();\n"
891 " }\n"
892 " break;\n"
893 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000894 verifyFormat("#define A \\\n"
895 " switch (x) { \\\n"
896 " case a: \\\n"
897 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000898 " }",
899 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000900 verifyFormat("#define OPERATION_CASE(name) \\\n"
901 " case OP_name: \\\n"
902 " return operations::Operation##name\n",
903 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000904 verifyFormat("switch (x) {\n"
905 "case 1:;\n"
906 "default:;\n"
907 " int i;\n"
908 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000909
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000910 verifyGoogleFormat("switch (x) {\n"
911 " case 1:\n"
912 " f();\n"
913 " break;\n"
914 " case kFoo:\n"
915 " case ns::kBar:\n"
916 " case kBaz:\n"
917 " break;\n"
918 " default:\n"
919 " g();\n"
920 " break;\n"
921 "}");
922 verifyGoogleFormat("switch (x) {\n"
923 " case 1: {\n"
924 " f();\n"
925 " break;\n"
926 " }\n"
927 "}");
928 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000929 " ;");
930
931 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
932 " case OP_name: \\\n"
933 " return operations::Operation##name\n");
934 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
935 " // Get the correction operation class.\n"
936 " switch (OpCode) {\n"
937 " CASE(Add);\n"
938 " CASE(Subtract);\n"
939 " default:\n"
940 " return operations::Unknown;\n"
941 " }\n"
942 "#undef OPERATION_CASE\n"
943 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000944 verifyFormat("DEBUG({\n"
945 " switch (x) {\n"
946 " case A:\n"
947 " f();\n"
948 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000949 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000950 " case B:\n"
951 " g();\n"
952 " break;\n"
953 " }\n"
954 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000955 EXPECT_EQ("DEBUG({\n"
956 " switch (x) {\n"
957 " case A:\n"
958 " f();\n"
959 " break;\n"
960 " // On B:\n"
961 " case B:\n"
962 " g();\n"
963 " break;\n"
964 " }\n"
965 "});",
966 format("DEBUG({\n"
967 " switch (x) {\n"
968 " case A:\n"
969 " f();\n"
970 " break;\n"
971 " // On B:\n"
972 " case B:\n"
973 " g();\n"
974 " break;\n"
975 " }\n"
976 "});",
977 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000978 verifyFormat("switch (a) {\n"
979 "case (b):\n"
980 " return;\n"
981 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000982
983 verifyFormat("switch (a) {\n"
984 "case some_namespace::\n"
985 " some_constant:\n"
986 " return;\n"
987 "}",
988 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000989}
990
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000991TEST_F(FormatTest, CaseRanges) {
992 verifyFormat("switch (x) {\n"
993 "case 'A' ... 'Z':\n"
994 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000995 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000996 " break;\n"
997 "}");
998}
999
Daniel Jasperb87899b2014-09-10 13:11:45 +00001000TEST_F(FormatTest, ShortCaseLabels) {
1001 FormatStyle Style = getLLVMStyle();
1002 Style.AllowShortCaseLabelsOnASingleLine = true;
1003 verifyFormat("switch (a) {\n"
1004 "case 1: x = 1; break;\n"
1005 "case 2: return;\n"
1006 "case 3:\n"
1007 "case 4:\n"
1008 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001009 "case 6: // comment\n"
1010 " return;\n"
1011 "case 7:\n"
1012 " // comment\n"
1013 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001014 "case 8:\n"
1015 " x = 8; // comment\n"
1016 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001017 "default: y = 1; break;\n"
1018 "}",
1019 Style);
1020 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001021 "case 0: return; // comment\n"
1022 "case 1: break; // comment\n"
1023 "case 2: return;\n"
1024 "// comment\n"
1025 "case 3: return;\n"
1026 "// comment 1\n"
1027 "// comment 2\n"
1028 "// comment 3\n"
1029 "case 4: break; /* comment */\n"
1030 "case 5:\n"
1031 " // comment\n"
1032 " break;\n"
1033 "case 6: /* comment */ x = 1; break;\n"
1034 "case 7: x = /* comment */ 1; break;\n"
1035 "case 8:\n"
1036 " x = 1; /* comment */\n"
1037 " break;\n"
1038 "case 9:\n"
1039 " break; // comment line 1\n"
1040 " // comment line 2\n"
1041 "}",
1042 Style);
1043 EXPECT_EQ("switch (a) {\n"
1044 "case 1:\n"
1045 " x = 8;\n"
1046 " // fall through\n"
1047 "case 2: x = 8;\n"
1048 "// comment\n"
1049 "case 3:\n"
1050 " return; /* comment line 1\n"
1051 " * comment line 2 */\n"
1052 "case 4: i = 8;\n"
1053 "// something else\n"
1054 "#if FOO\n"
1055 "case 5: break;\n"
1056 "#endif\n"
1057 "}",
1058 format("switch (a) {\n"
1059 "case 1: x = 8;\n"
1060 " // fall through\n"
1061 "case 2:\n"
1062 " x = 8;\n"
1063 "// comment\n"
1064 "case 3:\n"
1065 " return; /* comment line 1\n"
1066 " * comment line 2 */\n"
1067 "case 4:\n"
1068 " i = 8;\n"
1069 "// something else\n"
1070 "#if FOO\n"
1071 "case 5: break;\n"
1072 "#endif\n"
1073 "}",
1074 Style));
1075 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1076 " return; // long long long long long long long long long long long long comment\n"
1077 " // line\n" "}",
1078 format("switch (a) {\n"
1079 "case 0: return; // long long long long long long long long long long long long comment line\n"
1080 "}",
1081 Style));
1082 EXPECT_EQ("switch (a) {\n"
1083 "case 0:\n"
1084 " return; /* long long long long long long long long long long long long comment\n"
1085 " line */\n"
1086 "}",
1087 format("switch (a) {\n"
1088 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1089 "}",
1090 Style));
1091 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001092 "#if FOO\n"
1093 "case 0: return 0;\n"
1094 "#endif\n"
1095 "}",
1096 Style);
1097 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001098 "case 1: {\n"
1099 "}\n"
1100 "case 2: {\n"
1101 " return;\n"
1102 "}\n"
1103 "case 3: {\n"
1104 " x = 1;\n"
1105 " return;\n"
1106 "}\n"
1107 "case 4:\n"
1108 " if (x)\n"
1109 " return;\n"
1110 "}",
1111 Style);
1112 Style.ColumnLimit = 21;
1113 verifyFormat("switch (a) {\n"
1114 "case 1: x = 1; break;\n"
1115 "case 2: return;\n"
1116 "case 3:\n"
1117 "case 4:\n"
1118 "case 5: return;\n"
1119 "default:\n"
1120 " y = 1;\n"
1121 " break;\n"
1122 "}",
1123 Style);
1124}
1125
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001126TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001127 verifyFormat("void f() {\n"
1128 " some_code();\n"
1129 "test_label:\n"
1130 " some_other_code();\n"
1131 " {\n"
1132 " some_more_code();\n"
1133 " another_label:\n"
1134 " some_more_code();\n"
1135 " }\n"
1136 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001137 verifyFormat("{\n"
1138 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001139 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001140 " some_other_code();\n"
1141 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001142 verifyFormat("{\n"
1143 " some_code();\n"
1144 "test_label:;\n"
1145 " int i = 0;\n"
1146 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001147}
1148
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001149//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001150// Tests for classes, namespaces, etc.
1151//===----------------------------------------------------------------------===//
1152
1153TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001154 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001155}
1156
1157TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1158 verifyFormat("class A {\n"
1159 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001160 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001161 "protected:\n"
1162 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001163 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001164 "};");
1165 verifyGoogleFormat("class A {\n"
1166 " public:\n"
1167 " protected:\n"
1168 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001169 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001170 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001171 verifyFormat("class A {\n"
1172 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001173 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001174 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001175 " void f2() {}\n"
1176 "protected slots:\n"
1177 " void f3() {}\n"
1178 "protected Q_SLOTS:\n"
1179 " void f4() {}\n"
1180 "private slots:\n"
1181 " void f5() {}\n"
1182 "private Q_SLOTS:\n"
1183 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001184 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001185 " void g1();\n"
1186 "Q_SIGNALS:\n"
1187 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001188 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001189
1190 // Don't interpret 'signals' the wrong way.
1191 verifyFormat("signals.set();");
1192 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001193 verifyFormat("{\n"
1194 " signals.set(); // This needs indentation.\n"
1195 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001196 verifyFormat("void f() {\n"
1197 "label:\n"
1198 " signals.baz();\n"
1199 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001200}
1201
Alexander Kornienkofd433362013-03-27 17:08:02 +00001202TEST_F(FormatTest, SeparatesLogicalBlocks) {
1203 EXPECT_EQ("class A {\n"
1204 "public:\n"
1205 " void f();\n"
1206 "\n"
1207 "private:\n"
1208 " void g() {}\n"
1209 " // test\n"
1210 "protected:\n"
1211 " int h;\n"
1212 "};",
1213 format("class A {\n"
1214 "public:\n"
1215 "void f();\n"
1216 "private:\n"
1217 "void g() {}\n"
1218 "// test\n"
1219 "protected:\n"
1220 "int h;\n"
1221 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001222 EXPECT_EQ("class A {\n"
1223 "protected:\n"
1224 "public:\n"
1225 " void f();\n"
1226 "};",
1227 format("class A {\n"
1228 "protected:\n"
1229 "\n"
1230 "public:\n"
1231 "\n"
1232 " void f();\n"
1233 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001234
1235 // Even ensure proper spacing inside macros.
1236 EXPECT_EQ("#define B \\\n"
1237 " class A { \\\n"
1238 " protected: \\\n"
1239 " public: \\\n"
1240 " void f(); \\\n"
1241 " };",
1242 format("#define B \\\n"
1243 " class A { \\\n"
1244 " protected: \\\n"
1245 " \\\n"
1246 " public: \\\n"
1247 " \\\n"
1248 " void f(); \\\n"
1249 " };",
1250 getGoogleStyle()));
1251 // But don't remove empty lines after macros ending in access specifiers.
1252 EXPECT_EQ("#define A private:\n"
1253 "\n"
1254 "int i;",
1255 format("#define A private:\n"
1256 "\n"
1257 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001258}
1259
Daniel Jasper83193602013-04-05 17:22:09 +00001260TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001261 verifyFormat("class A : public B {};");
1262 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001263
1264 verifyFormat(
1265 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001266 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001267 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1268 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001269 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001270 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001271 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001272 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1273 " public C,\n"
1274 " public D,\n"
1275 " public E,\n"
1276 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001277 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001278
1279 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001280 " ReallyReallyLongClassName {\n"
1281 " int i;\n"
1282 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001283 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001284 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1285 " aaaaaaaaaaaaaaaa> {};");
1286 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1287 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1288 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001289 verifyFormat("template <class R, class C>\n"
1290 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1291 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001292 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001293}
1294
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001295TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1296 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1297 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1298
1299 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1300 verifyFormat("class MyClass\n"
1301 " : public X\n"
1302 " , public Y {};",
1303 StyleWithInheritanceBreak);
1304}
1305
Manuel Klimek28cacc72013-01-07 18:10:23 +00001306TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001307 verifyFormat("class A {\n} a, b;");
1308 verifyFormat("struct A {\n} a, b;");
1309 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001310}
1311
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001312TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001313 verifyFormat("enum {\n"
1314 " Zero,\n"
1315 " One = 1,\n"
1316 " Two = One + 1,\n"
1317 " Three = (One + Two),\n"
1318 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1319 " Five = (One, Two, Three, Four, 5)\n"
1320 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001321 verifyGoogleFormat("enum {\n"
1322 " Zero,\n"
1323 " One = 1,\n"
1324 " Two = One + 1,\n"
1325 " Three = (One + Two),\n"
1326 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1327 " Five = (One, Two, Three, Four, 5)\n"
1328 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001329 verifyFormat("enum Enum {};");
1330 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001331 verifyFormat("enum X E {} d;");
1332 verifyFormat("enum __attribute__((...)) E {} d;");
1333 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001334 verifyFormat("enum {\n"
1335 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001336 "};",
1337 getLLVMStyleWithColumns(30));
1338
1339 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001340 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001341
1342 EXPECT_EQ("enum KeepEmptyLines {\n"
1343 " ONE,\n"
1344 "\n"
1345 " TWO,\n"
1346 "\n"
1347 " THREE\n"
1348 "}",
1349 format("enum KeepEmptyLines {\n"
1350 " ONE,\n"
1351 "\n"
1352 " TWO,\n"
1353 "\n"
1354 "\n"
1355 " THREE\n"
1356 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001357 verifyFormat("enum E { // comment\n"
1358 " ONE,\n"
1359 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001360 "};\n"
1361 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001362 // Not enums.
1363 verifyFormat("enum X f() {\n"
1364 " a();\n"
1365 " return 42;\n"
1366 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001367 verifyFormat("enum X Type::f() {\n"
1368 " a();\n"
1369 " return 42;\n"
1370 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001371 verifyFormat("enum ::X f() {\n"
1372 " a();\n"
1373 " return 42;\n"
1374 "}");
1375 verifyFormat("enum ns::X f() {\n"
1376 " a();\n"
1377 " return 42;\n"
1378 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001379}
1380
Daniel Jasperb7150872013-08-30 10:10:19 +00001381TEST_F(FormatTest, FormatsEnumsWithErrors) {
1382 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001383 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001384 " Two = 1;\n"
1385 "};");
1386 verifyFormat("namespace n {\n"
1387 "enum Type {\n"
1388 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001389 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001390 " int i;\n"
1391 "}\n"
1392 "void g() {}");
1393}
1394
Daniel Jasper2b41a822013-08-20 12:42:50 +00001395TEST_F(FormatTest, FormatsEnumStruct) {
1396 verifyFormat("enum struct {\n"
1397 " Zero,\n"
1398 " One = 1,\n"
1399 " Two = One + 1,\n"
1400 " Three = (One + Two),\n"
1401 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1402 " Five = (One, Two, Three, Four, 5)\n"
1403 "};");
1404 verifyFormat("enum struct Enum {};");
1405 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001406 verifyFormat("enum struct X E {} d;");
1407 verifyFormat("enum struct __attribute__((...)) E {} d;");
1408 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001409 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1410}
1411
1412TEST_F(FormatTest, FormatsEnumClass) {
1413 verifyFormat("enum class {\n"
1414 " Zero,\n"
1415 " One = 1,\n"
1416 " Two = One + 1,\n"
1417 " Three = (One + Two),\n"
1418 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1419 " Five = (One, Two, Three, Four, 5)\n"
1420 "};");
1421 verifyFormat("enum class Enum {};");
1422 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001423 verifyFormat("enum class X E {} d;");
1424 verifyFormat("enum class __attribute__((...)) E {} d;");
1425 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001426 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1427}
1428
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001429TEST_F(FormatTest, FormatsEnumTypes) {
1430 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001431 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001432 " B\n"
1433 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001434 verifyFormat("enum X : int { A, B };");
1435 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001436}
1437
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001438TEST_F(FormatTest, FormatsTypedefEnum) {
1439 FormatStyle Style = getLLVMStyle();
1440 Style.ColumnLimit = 40;
1441 verifyFormat("typedef enum {} EmptyEnum;");
1442 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1443 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001444 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001445 " ONE = 1,\n"
1446 " TWO = 2,\n"
1447 " THREE = 3\n"
1448 "} LongEnum;",
1449 Style);
1450 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1451 Style.BraceWrapping.AfterEnum = true;
1452 verifyFormat("typedef enum {} EmptyEnum;");
1453 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1454 verifyFormat("typedef enum\n"
1455 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001456 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001457 " ONE = 1,\n"
1458 " TWO = 2,\n"
1459 " THREE = 3\n"
1460 "} LongEnum;",
1461 Style);
1462}
1463
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001464TEST_F(FormatTest, FormatsNSEnums) {
1465 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1466 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1467 " // Information about someDecentlyLongValue.\n"
1468 " someDecentlyLongValue,\n"
1469 " // Information about anotherDecentlyLongValue.\n"
1470 " anotherDecentlyLongValue,\n"
1471 " // Information about aThirdDecentlyLongValue.\n"
1472 " aThirdDecentlyLongValue\n"
1473 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001474 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1475 " a = 1,\n"
1476 " b = 2,\n"
1477 " c = 3,\n"
1478 "};");
1479 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1480 " a = 1,\n"
1481 " b = 2,\n"
1482 " c = 3,\n"
1483 "};");
1484 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1485 " a = 1,\n"
1486 " b = 2,\n"
1487 " c = 3,\n"
1488 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001489}
1490
Nico Weber7769a902013-01-14 05:49:49 +00001491TEST_F(FormatTest, FormatsBitfields) {
1492 verifyFormat("struct Bitfields {\n"
1493 " unsigned sClass : 8;\n"
1494 " unsigned ValueKind : 2;\n"
1495 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001496 verifyFormat("struct A {\n"
1497 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1498 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1499 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001500 verifyFormat("struct MyStruct {\n"
1501 " uchar data;\n"
1502 " uchar : 8;\n"
1503 " uchar : 8;\n"
1504 " uchar other;\n"
1505 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001506}
1507
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001508TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001509 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1510 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1511
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001512 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001513 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001514 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001515 "}",
1516 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001517 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001518 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001519 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001520 "}",
1521 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001522 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001523 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001524 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001525 "}",
1526 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001527 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001528 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001529 "void f() { f(); }",
1530 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001531
1532 // This code is more common than we thought; if we
1533 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001534 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001535 verifyFormat("namespace {};",
1536 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001537 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001538 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001539 "};",
1540 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001541
1542 verifyFormat("namespace {\n"
1543 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001544 "} // namespace",
1545 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001546 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1547 "#define HEADER_GUARD\n"
1548 "namespace my_namespace {\n"
1549 "int i;\n"
1550 "} // my_namespace\n"
1551 "#endif // HEADER_GUARD",
1552 format("#ifndef HEADER_GUARD\n"
1553 " #define HEADER_GUARD\n"
1554 " namespace my_namespace {\n"
1555 "int i;\n"
1556 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001557 "#endif // HEADER_GUARD",
1558 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001559
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001560 EXPECT_EQ("namespace A::B {\n"
1561 "class C {};\n"
1562 "}",
1563 format("namespace A::B {\n"
1564 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001565 "}",
1566 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001567
Daniel Jasper65ee3472013-07-31 23:16:02 +00001568 FormatStyle Style = getLLVMStyle();
1569 Style.NamespaceIndentation = FormatStyle::NI_All;
1570 EXPECT_EQ("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 format("namespace out {\n"
1577 "int i;\n"
1578 "namespace in {\n"
1579 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001580 "} // namespace in\n"
1581 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001582 Style));
1583
1584 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1585 EXPECT_EQ("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 format("namespace out {\n"
1592 "int i;\n"
1593 "namespace in {\n"
1594 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001595 "} // namespace in\n"
1596 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001597 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001598}
1599
Francois Ferrande56a8292017-06-14 12:29:47 +00001600TEST_F(FormatTest, FormatsCompactNamespaces) {
1601 FormatStyle Style = getLLVMStyle();
1602 Style.CompactNamespaces = true;
1603
1604 verifyFormat("namespace A { namespace B {\n"
1605 "}} // namespace A::B",
1606 Style);
1607
1608 EXPECT_EQ("namespace out { namespace in {\n"
1609 "}} // namespace out::in",
1610 format("namespace out {\n"
1611 "namespace in {\n"
1612 "} // namespace in\n"
1613 "} // namespace out",
1614 Style));
1615
1616 // Only namespaces which have both consecutive opening and end get compacted
1617 EXPECT_EQ("namespace out {\n"
1618 "namespace in1 {\n"
1619 "} // namespace in1\n"
1620 "namespace in2 {\n"
1621 "} // namespace in2\n"
1622 "} // namespace out",
1623 format("namespace out {\n"
1624 "namespace in1 {\n"
1625 "} // namespace in1\n"
1626 "namespace in2 {\n"
1627 "} // namespace in2\n"
1628 "} // namespace out",
1629 Style));
1630
1631 EXPECT_EQ("namespace out {\n"
1632 "int i;\n"
1633 "namespace in {\n"
1634 "int j;\n"
1635 "} // namespace in\n"
1636 "int k;\n"
1637 "} // namespace out",
1638 format("namespace out { int i;\n"
1639 "namespace in { int j; } // namespace in\n"
1640 "int k; } // namespace out",
1641 Style));
1642
1643 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1644 "}}} // namespace A::B::C\n",
1645 format("namespace A { namespace B {\n"
1646 "namespace C {\n"
1647 "}} // namespace B::C\n"
1648 "} // namespace A\n",
1649 Style));
1650
1651 Style.ColumnLimit = 40;
1652 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1653 "namespace bbbbbbbbbb {\n"
1654 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1655 format("namespace aaaaaaaaaa {\n"
1656 "namespace bbbbbbbbbb {\n"
1657 "} // namespace bbbbbbbbbb\n"
1658 "} // namespace aaaaaaaaaa",
1659 Style));
1660
1661 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1662 "namespace cccccc {\n"
1663 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1664 format("namespace aaaaaa {\n"
1665 "namespace bbbbbb {\n"
1666 "namespace cccccc {\n"
1667 "} // namespace cccccc\n"
1668 "} // namespace bbbbbb\n"
1669 "} // namespace aaaaaa",
1670 Style));
1671 Style.ColumnLimit = 80;
1672
1673 // Extra semicolon after 'inner' closing brace prevents merging
1674 EXPECT_EQ("namespace out { namespace in {\n"
1675 "}; } // namespace out::in",
1676 format("namespace out {\n"
1677 "namespace in {\n"
1678 "}; // namespace in\n"
1679 "} // namespace out",
1680 Style));
1681
1682 // Extra semicolon after 'outer' closing brace is conserved
1683 EXPECT_EQ("namespace out { namespace in {\n"
1684 "}}; // namespace out::in",
1685 format("namespace out {\n"
1686 "namespace in {\n"
1687 "} // namespace in\n"
1688 "}; // namespace out",
1689 Style));
1690
1691 Style.NamespaceIndentation = FormatStyle::NI_All;
1692 EXPECT_EQ("namespace out { namespace in {\n"
1693 " int i;\n"
1694 "}} // namespace out::in",
1695 format("namespace out {\n"
1696 "namespace in {\n"
1697 "int i;\n"
1698 "} // namespace in\n"
1699 "} // namespace out",
1700 Style));
1701 EXPECT_EQ("namespace out { namespace mid {\n"
1702 " namespace in {\n"
1703 " int j;\n"
1704 " } // namespace in\n"
1705 " int k;\n"
1706 "}} // namespace out::mid",
1707 format("namespace out { namespace mid {\n"
1708 "namespace in { int j; } // namespace in\n"
1709 "int k; }} // namespace out::mid",
1710 Style));
1711
1712 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1713 EXPECT_EQ("namespace out { namespace in {\n"
1714 " int i;\n"
1715 "}} // namespace out::in",
1716 format("namespace out {\n"
1717 "namespace in {\n"
1718 "int i;\n"
1719 "} // namespace in\n"
1720 "} // namespace out",
1721 Style));
1722 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1723 " int i;\n"
1724 "}}} // namespace out::mid::in",
1725 format("namespace out {\n"
1726 "namespace mid {\n"
1727 "namespace in {\n"
1728 "int i;\n"
1729 "} // namespace in\n"
1730 "} // namespace mid\n"
1731 "} // namespace out",
1732 Style));
1733}
1734
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001735TEST_F(FormatTest, FormatsExternC) {
1736 verifyFormat("extern \"C\" {\nint a;");
1737 verifyFormat("extern \"C\" {}");
1738 verifyFormat("extern \"C\" {\n"
1739 "int foo();\n"
1740 "}");
1741 verifyFormat("extern \"C\" int foo() {}");
1742 verifyFormat("extern \"C\" int foo();");
1743 verifyFormat("extern \"C\" int foo() {\n"
1744 " int i = 42;\n"
1745 " return i;\n"
1746 "}");
1747
1748 FormatStyle Style = getLLVMStyle();
1749 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1750 Style.BraceWrapping.AfterFunction = true;
1751 verifyFormat("extern \"C\" int foo() {}", Style);
1752 verifyFormat("extern \"C\" int foo();", Style);
1753 verifyFormat("extern \"C\" int foo()\n"
1754 "{\n"
1755 " int i = 42;\n"
1756 " return i;\n"
1757 "}",
1758 Style);
1759
1760 Style.BraceWrapping.AfterExternBlock = true;
1761 Style.BraceWrapping.SplitEmptyRecord = false;
1762 verifyFormat("extern \"C\"\n"
1763 "{}",
1764 Style);
1765 verifyFormat("extern \"C\"\n"
1766 "{\n"
1767 " int foo();\n"
1768 "}",
1769 Style);
1770}
Manuel Klimekae610d12013-01-21 14:32:05 +00001771
Daniel Jasper40aacf42013-03-14 13:45:21 +00001772TEST_F(FormatTest, FormatsInlineASM) {
1773 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001774 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001775 verifyFormat(
1776 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1777 " \"cpuid\\n\\t\"\n"
1778 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001779 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001780 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001781 EXPECT_EQ(
1782 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001783 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001784 " mov edx,[that] // vtable in edx\n"
1785 " mov eax,methodIndex\n"
1786 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001787 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001788 "}",
1789 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1790 " __asm {\n"
1791 " mov edx,[that] // vtable in edx\n"
1792 " mov eax,methodIndex\n"
1793 " call [edx][eax*4] // stdcall\n"
1794 " }\n"
1795 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001796 EXPECT_EQ("_asm {\n"
1797 " xor eax, eax;\n"
1798 " cpuid;\n"
1799 "}",
1800 format("_asm {\n"
1801 " xor eax, eax;\n"
1802 " cpuid;\n"
1803 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001804 verifyFormat("void function() {\n"
1805 " // comment\n"
1806 " asm(\"\");\n"
1807 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001808 EXPECT_EQ("__asm {\n"
1809 "}\n"
1810 "int i;",
1811 format("__asm {\n"
1812 "}\n"
1813 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001814}
1815
Nico Weberd5650bd2013-01-07 16:36:17 +00001816TEST_F(FormatTest, FormatTryCatch) {
1817 verifyFormat("try {\n"
1818 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001819 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001820 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001821 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001822 " exit(42);\n"
1823 "}");
1824
1825 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001826 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001827 " return 5;\n"
1828 "}");
1829 verifyFormat("class A {\n"
1830 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001831 " A() try : a(0) {\n"
1832 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001833 " throw;\n"
1834 " }\n"
1835 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001836
1837 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001838 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001839}
1840
Nico Weberfac23712015-02-04 15:26:27 +00001841TEST_F(FormatTest, FormatSEHTryCatch) {
1842 verifyFormat("__try {\n"
1843 " int a = b * c;\n"
1844 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1845 " // Do nothing.\n"
1846 "}");
1847
1848 verifyFormat("__try {\n"
1849 " int a = b * c;\n"
1850 "} __finally {\n"
1851 " // Do nothing.\n"
1852 "}");
1853
1854 verifyFormat("DEBUG({\n"
1855 " __try {\n"
1856 " } __finally {\n"
1857 " }\n"
1858 "});\n");
1859}
1860
Daniel Jasper04a71a42014-05-08 11:58:24 +00001861TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1862 verifyFormat("try {\n"
1863 " f();\n"
1864 "} catch {\n"
1865 " g();\n"
1866 "}");
1867 verifyFormat("try {\n"
1868 " f();\n"
1869 "} catch (A a) MACRO(x) {\n"
1870 " g();\n"
1871 "} catch (B b) MACRO(x) {\n"
1872 " g();\n"
1873 "}");
1874}
1875
1876TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1877 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001878 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1879 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001880 Style.BreakBeforeBraces = BraceStyle;
1881 verifyFormat("try {\n"
1882 " // something\n"
1883 "} catch (...) {\n"
1884 " // something\n"
1885 "}",
1886 Style);
1887 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001888 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1889 verifyFormat("try {\n"
1890 " // something\n"
1891 "}\n"
1892 "catch (...) {\n"
1893 " // something\n"
1894 "}",
1895 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001896 verifyFormat("__try {\n"
1897 " // something\n"
1898 "}\n"
1899 "__finally {\n"
1900 " // something\n"
1901 "}",
1902 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001903 verifyFormat("@try {\n"
1904 " // something\n"
1905 "}\n"
1906 "@finally {\n"
1907 " // something\n"
1908 "}",
1909 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001910 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1911 verifyFormat("try\n"
1912 "{\n"
1913 " // something\n"
1914 "}\n"
1915 "catch (...)\n"
1916 "{\n"
1917 " // something\n"
1918 "}",
1919 Style);
1920 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1921 verifyFormat("try\n"
1922 " {\n"
1923 " // something\n"
1924 " }\n"
1925 "catch (...)\n"
1926 " {\n"
1927 " // something\n"
1928 " }",
1929 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001930 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1931 Style.BraceWrapping.BeforeCatch = true;
1932 verifyFormat("try {\n"
1933 " // something\n"
1934 "}\n"
1935 "catch (...) {\n"
1936 " // something\n"
1937 "}",
1938 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001939}
1940
Daniel Jaspere25509f2012-12-17 11:29:41 +00001941TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001942 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001943
Daniel Jaspera44991332015-04-29 13:06:49 +00001944 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1945 " 100000000, "
1946 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001947
Daniel Jasper473c62c2013-05-17 09:35:01 +00001948 // Here, everything other than the "}" would fit on a line.
1949 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001950 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001951 EXPECT_EQ("S s = {a,\n"
1952 "\n"
1953 " b};",
1954 format("S s = {\n"
1955 " a,\n"
1956 "\n"
1957 " b\n"
1958 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001959
1960 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1961 // line. However, the formatting looks a bit off and this probably doesn't
1962 // happen often in practice.
1963 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001964 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001965 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001966}
1967
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001968TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001969 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1970 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1971 " .bbbbbbbbbb = 2,\n"
1972 " .cccccccccc = 3,\n"
1973 " .dddddddddd = 4,\n"
1974 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001975 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001976 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1977 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1978 " .ccccccccccccccccccccccccccc = 3,\n"
1979 " .ddddddddddddddddddddddddddd = 4,\n"
1980 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001981
1982 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001983
1984 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1985 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1986 " [2] = bbbbbbbbbb,\n"
1987 " [3] = cccccccccc,\n"
1988 " [4] = dddddddddd,\n"
1989 " [5] = eeeeeeeeee};");
1990 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1991 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1992 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1993 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1994 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1995 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001996}
1997
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001998TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001999 verifyFormat("static A x = {{{}}};\n");
2000 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2001 " {init1, init2, init3, init4}}};",
2002 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002003
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002004 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002005 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2006 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2007 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2008 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002009 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002010 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2011 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2012 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002013 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2014 " {rect.fRight - rect.fLeft, rect.fBottom - "
2015 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002016
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002017 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002018 "SomeArrayOfSomeType a = {\n"
2019 " {{1, 2, 3},\n"
2020 " {1, 2, 3},\n"
2021 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2022 " 333333333333333333333333333333},\n"
2023 " {1, 2, 3},\n"
2024 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002025 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002026 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002027 " {{1, 2, 3}},\n"
2028 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002029 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2030 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002031 " {{1, 2, 3}},\n"
2032 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002033
Daniel Jaspera44991332015-04-29 13:06:49 +00002034 verifyFormat("struct {\n"
2035 " unsigned bit;\n"
2036 " const char *const name;\n"
2037 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2038 " {kOsWin, \"Windows\"},\n"
2039 " {kOsLinux, \"Linux\"},\n"
2040 " {kOsCrOS, \"Chrome OS\"}};");
2041 verifyFormat("struct {\n"
2042 " unsigned bit;\n"
2043 " const char *const name;\n"
2044 "} kBitsToOs[] = {\n"
2045 " {kOsMac, \"Mac\"},\n"
2046 " {kOsWin, \"Windows\"},\n"
2047 " {kOsLinux, \"Linux\"},\n"
2048 " {kOsCrOS, \"Chrome OS\"},\n"
2049 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002050}
2051
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002052TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2053 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2054 " \\\n"
2055 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2056}
2057
Daniel Jasperda16db32013-01-07 10:48:50 +00002058TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002059 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2060 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002061
2062 // Do break defaulted and deleted functions.
2063 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2064 " default;",
2065 getLLVMStyleWithColumns(40));
2066 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2067 " delete;",
2068 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002069}
2070
2071TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2072 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2073 getLLVMStyleWithColumns(40));
2074 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2075 getLLVMStyleWithColumns(40));
2076 EXPECT_EQ("#define Q \\\n"
2077 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2078 " \"aaaaaaaa.cpp\"",
2079 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2080 getLLVMStyleWithColumns(40)));
2081}
2082
2083TEST_F(FormatTest, UnderstandsLinePPDirective) {
2084 EXPECT_EQ("# 123 \"A string literal\"",
2085 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002086}
2087
Manuel Klimek591b5802013-01-31 15:58:48 +00002088TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002089 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002090 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002091}
2092
2093TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2094 EXPECT_EQ("#line 42 \"test\"\n",
2095 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002096 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2097 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002098}
2099
2100TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2101 EXPECT_EQ("#line 42 \"test\"",
2102 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002103 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002104}
2105
Daniel Jasper877615c2013-10-11 19:45:02 +00002106TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2107 verifyFormat("#define A \\x20");
2108 verifyFormat("#define A \\ x20");
2109 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2110 verifyFormat("#define A ''");
2111 verifyFormat("#define A ''qqq");
2112 verifyFormat("#define A `qqq");
2113 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002114 EXPECT_EQ("const char *c = STRINGIFY(\n"
2115 "\\na : b);",
2116 format("const char * c = STRINGIFY(\n"
2117 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002118
2119 verifyFormat("a\r\\");
2120 verifyFormat("a\v\\");
2121 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002122}
2123
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002124TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002125 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2126 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002127 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002128 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002129 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002130
2131 verifyFormat("#define A A\n#define A A");
2132 verifyFormat("#define A(X) A\n#define A A");
2133
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002134 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2135 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002136}
2137
2138TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002139 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002140 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002141 "#define A( \\\n"
2142 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002143 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002144 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002145 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002146 " #include \"a.h\"\n"
2147 "#define A(A,\\\n"
2148 " B)\n"
2149 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002150 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002151 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002152}
2153
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002154TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002155
2156TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2157 EXPECT_EQ("#define A \\\n"
2158 " c; \\\n"
2159 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002160 "f;",
2161 format("#define A c; e;\n"
2162 "f;",
2163 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002164}
2165
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002166TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002167
Manuel Klimek1abf7892013-01-04 23:34:14 +00002168TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002169 EXPECT_EQ("int x,\n"
2170 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002171 " y;",
2172 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002173}
2174
Manuel Klimek09e07972013-01-05 21:34:55 +00002175TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002176 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002177 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002178 verifyFormat("#define A \\\n"
2179 " { \\\n"
2180 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002181 " }",
2182 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002183
2184 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002185 " void function##X()",
2186 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002187
2188 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002189 " void a##b##c()",
2190 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002191
Daniel Jasper39825ea2013-01-14 15:40:57 +00002192 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002193}
2194
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002195TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002196 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2197 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002198}
2199
Manuel Klimek0c137952013-02-11 12:33:24 +00002200TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2201 EXPECT_EQ("#define A b;", format("#define A \\\n"
2202 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002203 " b;",
2204 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002205 EXPECT_EQ("#define A \\\n"
2206 " \\\n"
2207 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002208 " b;",
2209 format("#define A \\\n"
2210 " \\\n"
2211 " a; \\\n"
2212 " b;",
2213 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002214 EXPECT_EQ("#define A \\\n"
2215 " a; \\\n"
2216 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002217 " b;",
2218 format("#define A \\\n"
2219 " a; \\\n"
2220 " \\\n"
2221 " b;",
2222 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002223}
2224
Daniel Jasper00475962013-02-19 17:14:38 +00002225TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002226 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002227 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002228 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002229 " case 2\n",
2230 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002231 verifyFormat("#define MACRO(a) \\\n"
2232 " if (a) \\\n"
2233 " f(); \\\n"
2234 " else \\\n"
2235 " g()",
2236 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002237 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002238 verifyIncompleteFormat("#define STR(x) #x\n"
2239 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002240 verifyFormat("#pragma omp threadprivate( \\\n"
2241 " y)), // expected-warning",
2242 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002243 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002244 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002245 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002246 "#define b \\\n"
2247 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002248 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002249 "a",
2250 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002251 verifyFormat("#define A \\\n"
2252 " { \\\n"
2253 " {\n"
2254 "#define B \\\n"
2255 " } \\\n"
2256 " }",
2257 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002258 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002259 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002260 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002261 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002262}
2263
Daniel Jasper40e19212013-05-29 13:16:10 +00002264TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2265 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2266 EXPECT_EQ("class A : public QObject {\n"
2267 " Q_OBJECT\n"
2268 "\n"
2269 " A() {}\n"
2270 "};",
2271 format("class A : public QObject {\n"
2272 " Q_OBJECT\n"
2273 "\n"
2274 " A() {\n}\n"
2275 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002276 EXPECT_EQ("MACRO\n"
2277 "/*static*/ int i;",
2278 format("MACRO\n"
2279 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002280 EXPECT_EQ("SOME_MACRO\n"
2281 "namespace {\n"
2282 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002283 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002284 format("SOME_MACRO\n"
2285 " namespace {\n"
2286 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002287 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002288 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002289 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2290 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002291 // Only if everything is upper case.
2292 EXPECT_EQ("class A : public QObject {\n"
2293 " Q_Object A() {}\n"
2294 "};",
2295 format("class A : public QObject {\n"
2296 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002297 " A() {\n}\n"
2298 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002299
2300 // Only if the next line can actually start an unwrapped line.
2301 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2302 format("SOME_WEIRD_LOG_MACRO\n"
2303 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002304
2305 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002306 "(n, buffers))\n",
2307 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002308}
2309
Alexander Kornienkode644272013-04-08 22:16:06 +00002310TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2311 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2312 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2313 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002314 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002315 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2316 "int *createScopDetectionPass() { return 0; }",
2317 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2318 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2319 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2320 " class X {};\n"
2321 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2322 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002323 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2324 // braces, so that inner block is indented one level more.
2325 EXPECT_EQ("int q() {\n"
2326 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2327 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2328 " IPC_END_MESSAGE_MAP()\n"
2329 "}",
2330 format("int q() {\n"
2331 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2332 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2333 " IPC_END_MESSAGE_MAP()\n"
2334 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002335
Daniel Jasper352dae12014-01-03 11:50:46 +00002336 // Same inside macros.
2337 EXPECT_EQ("#define LIST(L) \\\n"
2338 " L(A) \\\n"
2339 " L(B) \\\n"
2340 " L(C)",
2341 format("#define LIST(L) \\\n"
2342 " L(A) \\\n"
2343 " L(B) \\\n"
2344 " L(C)",
2345 getGoogleStyle()));
2346
Daniel Jasper545c6522013-09-17 09:26:07 +00002347 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002348 EXPECT_EQ("int q() {\n"
2349 " f(x);\n"
2350 " f(x) {}\n"
2351 " f(x)->g();\n"
2352 " f(x)->*g();\n"
2353 " f(x).g();\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) %= x;\n"
2360 " f(x) &= x;\n"
2361 " f(x) |= x;\n"
2362 " f(x) ^= x;\n"
2363 " f(x) >>= x;\n"
2364 " f(x) <<= x;\n"
2365 " f(x)[y].z();\n"
2366 " LOG(INFO) << x;\n"
2367 " ifstream(x) >> x;\n"
2368 "}\n",
2369 format("int q() {\n"
2370 " f(x)\n;\n"
2371 " f(x)\n {}\n"
2372 " f(x)\n->g();\n"
2373 " f(x)\n->*g();\n"
2374 " f(x)\n.g();\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 %= x;\n"
2381 " f(x)\n &= x;\n"
2382 " f(x)\n |= x;\n"
2383 " f(x)\n ^= x;\n"
2384 " f(x)\n >>= x;\n"
2385 " f(x)\n <<= x;\n"
2386 " f(x)\n[y].z();\n"
2387 " LOG(INFO)\n << x;\n"
2388 " ifstream(x)\n >> x;\n"
2389 "}\n"));
2390 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002391 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002392 " if (1) {\n"
2393 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002394 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002395 " while (1) {\n"
2396 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002397 " F(x)\n"
2398 " G(x);\n"
2399 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002400 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002401 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002402 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002403 " }\n"
2404 "}\n",
2405 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002406 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002407 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002408 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002409 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002410 "F(x)\n"
2411 "G(x);\n"
2412 "F(x)\n"
2413 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002414 "}\n"));
2415 EXPECT_EQ("class A {\n"
2416 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002417 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002418 " A(X x)\n" // FIXME: function-level try blocks are broken.
2419 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002420 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002421 " }\n"
2422 "};",
2423 format("class A {\n"
2424 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002425 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002426 " A(X x)\n"
2427 " try : t(0) {} catch (...) {}\n"
2428 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002429 EXPECT_EQ("class SomeClass {\n"
2430 "public:\n"
2431 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2432 "};",
2433 format("class SomeClass {\n"
2434 "public:\n"
2435 " SomeClass()\n"
2436 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2437 "};"));
2438 EXPECT_EQ("class SomeClass {\n"
2439 "public:\n"
2440 " SomeClass()\n"
2441 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2442 "};",
2443 format("class SomeClass {\n"
2444 "public:\n"
2445 " SomeClass()\n"
2446 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2447 "};",
2448 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002449
2450 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002451}
2452
Manuel Klimek4fe43002013-05-22 12:51:29 +00002453TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2454 verifyFormat("#define A \\\n"
2455 " f({ \\\n"
2456 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002457 " });",
2458 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002459}
2460
Krasimir Georgievad47c902017-08-30 14:34:57 +00002461TEST_F(FormatTest, IndentPreprocessorDirectives) {
2462 FormatStyle Style = getLLVMStyle();
2463 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2464 Style.ColumnLimit = 40;
2465 verifyFormat("#ifdef _WIN32\n"
2466 "#define A 0\n"
2467 "#ifdef VAR2\n"
2468 "#define B 1\n"
2469 "#include <someheader.h>\n"
2470 "#define MACRO \\\n"
2471 " some_very_long_func_aaaaaaaaaa();\n"
2472 "#endif\n"
2473 "#else\n"
2474 "#define A 1\n"
2475 "#endif",
2476 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002477 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2478 verifyFormat("#ifdef _WIN32\n"
2479 "# define A 0\n"
2480 "# ifdef VAR2\n"
2481 "# define B 1\n"
2482 "# include <someheader.h>\n"
2483 "# define MACRO \\\n"
2484 " some_very_long_func_aaaaaaaaaa();\n"
2485 "# endif\n"
2486 "#else\n"
2487 "# define A 1\n"
2488 "#endif",
2489 Style);
2490 verifyFormat("#if A\n"
2491 "# define MACRO \\\n"
2492 " void a(int x) { \\\n"
2493 " b(); \\\n"
2494 " c(); \\\n"
2495 " d(); \\\n"
2496 " e(); \\\n"
2497 " f(); \\\n"
2498 " }\n"
2499 "#endif",
2500 Style);
2501 // Comments before include guard.
2502 verifyFormat("// file comment\n"
2503 "// file comment\n"
2504 "#ifndef HEADER_H\n"
2505 "#define HEADER_H\n"
2506 "code();\n"
2507 "#endif",
2508 Style);
2509 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002510 verifyFormat("#ifndef HEADER_H\n"
2511 "#define HEADER_H\n"
2512 "code();\n"
2513 "#endif",
2514 Style);
2515 // Include guards must have a #define with the same variable immediately
2516 // after #ifndef.
2517 verifyFormat("#ifndef NOT_GUARD\n"
2518 "# define FOO\n"
2519 "code();\n"
2520 "#endif",
2521 Style);
2522
2523 // Include guards must cover the entire file.
2524 verifyFormat("code();\n"
2525 "code();\n"
2526 "#ifndef NOT_GUARD\n"
2527 "# define NOT_GUARD\n"
2528 "code();\n"
2529 "#endif",
2530 Style);
2531 verifyFormat("#ifndef NOT_GUARD\n"
2532 "# define NOT_GUARD\n"
2533 "code();\n"
2534 "#endif\n"
2535 "code();",
2536 Style);
2537 // Test with trailing blank lines.
2538 verifyFormat("#ifndef HEADER_H\n"
2539 "#define HEADER_H\n"
2540 "code();\n"
2541 "#endif\n",
2542 Style);
2543 // Include guards don't have #else.
2544 verifyFormat("#ifndef NOT_GUARD\n"
2545 "# define NOT_GUARD\n"
2546 "code();\n"
2547 "#else\n"
2548 "#endif",
2549 Style);
2550 verifyFormat("#ifndef NOT_GUARD\n"
2551 "# define NOT_GUARD\n"
2552 "code();\n"
2553 "#elif FOO\n"
2554 "#endif",
2555 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002556 // Non-identifier #define after potential include guard.
2557 verifyFormat("#ifndef FOO\n"
2558 "# define 1\n"
2559 "#endif\n",
2560 Style);
2561 // #if closes past last non-preprocessor line.
2562 verifyFormat("#ifndef FOO\n"
2563 "#define FOO\n"
2564 "#if 1\n"
2565 "int i;\n"
2566 "# define A 0\n"
2567 "#endif\n"
2568 "#endif\n",
2569 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002570 // FIXME: This doesn't handle the case where there's code between the
2571 // #ifndef and #define but all other conditions hold. This is because when
2572 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2573 // previous code line yet, so we can't detect it.
2574 EXPECT_EQ("#ifndef NOT_GUARD\n"
2575 "code();\n"
2576 "#define NOT_GUARD\n"
2577 "code();\n"
2578 "#endif",
2579 format("#ifndef NOT_GUARD\n"
2580 "code();\n"
2581 "# define NOT_GUARD\n"
2582 "code();\n"
2583 "#endif",
2584 Style));
2585 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2586 // be outside an include guard. Examples are #pragma once and
2587 // #pragma GCC diagnostic, or anything else that does not change the meaning
2588 // of the file if it's included multiple times.
2589 EXPECT_EQ("#ifdef WIN32\n"
2590 "# pragma once\n"
2591 "#endif\n"
2592 "#ifndef HEADER_H\n"
2593 "# define HEADER_H\n"
2594 "code();\n"
2595 "#endif",
2596 format("#ifdef WIN32\n"
2597 "# pragma once\n"
2598 "#endif\n"
2599 "#ifndef HEADER_H\n"
2600 "#define HEADER_H\n"
2601 "code();\n"
2602 "#endif",
2603 Style));
2604 // FIXME: This does not detect when there is a single non-preprocessor line
2605 // in front of an include-guard-like structure where other conditions hold
2606 // because ScopedLineState hides the line.
2607 EXPECT_EQ("code();\n"
2608 "#ifndef HEADER_H\n"
2609 "#define HEADER_H\n"
2610 "code();\n"
2611 "#endif",
2612 format("code();\n"
2613 "#ifndef HEADER_H\n"
2614 "# define HEADER_H\n"
2615 "code();\n"
2616 "#endif",
2617 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002618 // Keep comments aligned with #, otherwise indent comments normally. These
2619 // tests cannot use verifyFormat because messUp manipulates leading
2620 // whitespace.
2621 {
2622 const char *Expected = ""
2623 "void f() {\n"
2624 "#if 1\n"
2625 "// Preprocessor aligned.\n"
2626 "# define A 0\n"
2627 " // Code. Separated by blank line.\n"
2628 "\n"
2629 "# define B 0\n"
2630 " // Code. Not aligned with #\n"
2631 "# define C 0\n"
2632 "#endif";
2633 const char *ToFormat = ""
2634 "void f() {\n"
2635 "#if 1\n"
2636 "// Preprocessor aligned.\n"
2637 "# define A 0\n"
2638 "// Code. Separated by blank line.\n"
2639 "\n"
2640 "# define B 0\n"
2641 " // Code. Not aligned with #\n"
2642 "# define C 0\n"
2643 "#endif";
2644 EXPECT_EQ(Expected, format(ToFormat, Style));
2645 EXPECT_EQ(Expected, format(Expected, Style));
2646 }
2647 // Keep block quotes aligned.
2648 {
2649 const char *Expected = ""
2650 "void f() {\n"
2651 "#if 1\n"
2652 "/* Preprocessor aligned. */\n"
2653 "# define A 0\n"
2654 " /* Code. Separated by blank line. */\n"
2655 "\n"
2656 "# define B 0\n"
2657 " /* Code. Not aligned with # */\n"
2658 "# define C 0\n"
2659 "#endif";
2660 const char *ToFormat = ""
2661 "void f() {\n"
2662 "#if 1\n"
2663 "/* Preprocessor aligned. */\n"
2664 "# define A 0\n"
2665 "/* Code. Separated by blank line. */\n"
2666 "\n"
2667 "# define B 0\n"
2668 " /* Code. Not aligned with # */\n"
2669 "# define C 0\n"
2670 "#endif";
2671 EXPECT_EQ(Expected, format(ToFormat, Style));
2672 EXPECT_EQ(Expected, format(Expected, Style));
2673 }
2674 // Keep comments aligned with un-indented directives.
2675 {
2676 const char *Expected = ""
2677 "void f() {\n"
2678 "// Preprocessor aligned.\n"
2679 "#define A 0\n"
2680 " // Code. Separated by blank line.\n"
2681 "\n"
2682 "#define B 0\n"
2683 " // Code. Not aligned with #\n"
2684 "#define C 0\n";
2685 const char *ToFormat = ""
2686 "void f() {\n"
2687 "// Preprocessor aligned.\n"
2688 "#define A 0\n"
2689 "// Code. Separated by blank line.\n"
2690 "\n"
2691 "#define B 0\n"
2692 " // Code. Not aligned with #\n"
2693 "#define C 0\n";
2694 EXPECT_EQ(Expected, format(ToFormat, Style));
2695 EXPECT_EQ(Expected, format(Expected, Style));
2696 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002697 // Test with tabs.
2698 Style.UseTab = FormatStyle::UT_Always;
2699 Style.IndentWidth = 8;
2700 Style.TabWidth = 8;
2701 verifyFormat("#ifdef _WIN32\n"
2702 "#\tdefine A 0\n"
2703 "#\tifdef VAR2\n"
2704 "#\t\tdefine B 1\n"
2705 "#\t\tinclude <someheader.h>\n"
2706 "#\t\tdefine MACRO \\\n"
2707 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2708 "#\tendif\n"
2709 "#else\n"
2710 "#\tdefine A 1\n"
2711 "#endif",
2712 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002713
2714 // Regression test: Multiline-macro inside include guards.
2715 verifyFormat("#ifndef HEADER_H\n"
2716 "#define HEADER_H\n"
2717 "#define A() \\\n"
2718 " int i; \\\n"
2719 " int j;\n"
2720 "#endif // HEADER_H",
2721 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002722}
2723
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002724TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002725 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002726}
2727
Manuel Klimek1058d982013-01-06 20:07:31 +00002728TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2729 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2730 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2731 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2732 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2733}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002734
Daniel Jaspere2408e32015-05-06 11:16:43 +00002735TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002736 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2737 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2738 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002739 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002740 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002741 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002742 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002743
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002744 FormatStyle AlignLeft = getLLVMStyle();
2745 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2746 EXPECT_EQ("#define MACRO(x) \\\n"
2747 "private: \\\n"
2748 " int x(int a);\n",
2749 format("#define MACRO(x) \\\n"
2750 "private: \\\n"
2751 " int x(int a);\n",
2752 AlignLeft));
2753
2754 // CRLF line endings
2755 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2756 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2757 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2758 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2759 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2760 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2761 EXPECT_EQ("#define MACRO(x) \\\r\n"
2762 "private: \\\r\n"
2763 " int x(int a);\r\n",
2764 format("#define MACRO(x) \\\r\n"
2765 "private: \\\r\n"
2766 " int x(int a);\r\n",
2767 AlignLeft));
2768
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002769 FormatStyle DontAlign = getLLVMStyle();
2770 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2771 DontAlign.MaxEmptyLinesToKeep = 3;
2772 // FIXME: can't use verifyFormat here because the newline before
2773 // "public:" is not inserted the first time it's reformatted
2774 EXPECT_EQ("#define A \\\n"
2775 " class Foo { \\\n"
2776 " void bar(); \\\n"
2777 "\\\n"
2778 "\\\n"
2779 "\\\n"
2780 " public: \\\n"
2781 " void baz(); \\\n"
2782 " };",
2783 format("#define A \\\n"
2784 " class Foo { \\\n"
2785 " void bar(); \\\n"
2786 "\\\n"
2787 "\\\n"
2788 "\\\n"
2789 " public: \\\n"
2790 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002791 " };",
2792 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002793}
2794
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002795TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2796 verifyFormat("#define A \\\n"
2797 " int v( \\\n"
2798 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002799 " int i;",
2800 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002801}
2802
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002803TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002804 EXPECT_EQ(
2805 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2806 " \\\n"
2807 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2808 "\n"
2809 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2810 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2811 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2812 "\\\n"
2813 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2814 " \n"
2815 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2816 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002817}
2818
Manuel Klimek52b15152013-01-09 15:25:02 +00002819TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2820 EXPECT_EQ("int\n"
2821 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002822 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002823 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002824 verifyFormat("functionCallTo(\n"
2825 " someOtherFunction(\n"
2826 " withSomeParameters, whichInSequence,\n"
2827 " areLongerThanALine(andAnotherCall,\n"
2828 "#define A B\n"
2829 " withMoreParamters,\n"
2830 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002831 " andMoreParameters),\n"
2832 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002833 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002834 verifyFormat("Foo::Foo()\n"
2835 "#ifdef BAR\n"
2836 " : baz(0)\n"
2837 "#endif\n"
2838 "{\n"
2839 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002840 verifyFormat("void f() {\n"
2841 " if (true)\n"
2842 "#ifdef A\n"
2843 " f(42);\n"
2844 " x();\n"
2845 "#else\n"
2846 " g();\n"
2847 " x();\n"
2848 "#endif\n"
2849 "}");
2850 verifyFormat("void f(param1, param2,\n"
2851 " param3,\n"
2852 "#ifdef A\n"
2853 " param4(param5,\n"
2854 "#ifdef A1\n"
2855 " param6,\n"
2856 "#ifdef A2\n"
2857 " param7),\n"
2858 "#else\n"
2859 " param8),\n"
2860 " param9,\n"
2861 "#endif\n"
2862 " param10,\n"
2863 "#endif\n"
2864 " param11)\n"
2865 "#else\n"
2866 " param12)\n"
2867 "#endif\n"
2868 "{\n"
2869 " x();\n"
2870 "}",
2871 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002872 verifyFormat("#if 1\n"
2873 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002874 verifyFormat("#if 1\n"
2875 "#endif\n"
2876 "#if 1\n"
2877 "#else\n"
2878 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002879 verifyFormat("DEBUG({\n"
2880 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2882 "});\n"
2883 "#if a\n"
2884 "#else\n"
2885 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002886
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002887 verifyIncompleteFormat("void f(\n"
2888 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002889 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002890 "#else\n"
2891 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002892}
2893
Manuel Klimek14bd9172014-01-29 08:49:02 +00002894TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2895 verifyFormat("#endif\n"
2896 "#if B");
2897}
2898
Manuel Klimek88033d72013-10-21 08:11:15 +00002899TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2900 FormatStyle SingleLine = getLLVMStyle();
2901 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002902 verifyFormat("#if 0\n"
2903 "#elif 1\n"
2904 "#endif\n"
2905 "void foo() {\n"
2906 " if (test) foo2();\n"
2907 "}",
2908 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002909}
2910
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002911TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002912 verifyFormat("functionCall({ int i; });");
2913 verifyFormat("functionCall({\n"
2914 " int i;\n"
2915 " int j;\n"
2916 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002917 verifyFormat("functionCall(\n"
2918 " {\n"
2919 " int i;\n"
2920 " int j;\n"
2921 " },\n"
2922 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002923 verifyFormat("functionA(functionB({\n"
2924 " int i;\n"
2925 " int j;\n"
2926 " }),\n"
2927 " aaaa, bbbb, cccc);");
2928 verifyFormat("functionCall(\n"
2929 " {\n"
2930 " int i;\n"
2931 " int j;\n"
2932 " },\n"
2933 " aaaa, bbbb, // comment\n"
2934 " cccc);");
2935 verifyFormat("functionA(functionB({\n"
2936 " int i;\n"
2937 " int j;\n"
2938 " }),\n"
2939 " aaaa, bbbb, // comment\n"
2940 " cccc);");
2941 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2942 verifyFormat("functionCall(aaaa, bbbb, {\n"
2943 " int i;\n"
2944 " int j;\n"
2945 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002946 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002947 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002948 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002949 " int i; // break\n"
2950 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2952 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002953 verifyFormat("DEBUG({\n"
2954 " if (a)\n"
2955 " f();\n"
2956 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002957}
2958
2959TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002960 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002961 "int i;",
2962 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002963}
2964
2965TEST_F(FormatTest, LayoutNestedBlocks) {
2966 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2967 " struct s {\n"
2968 " int i;\n"
2969 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002970 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002971 " for (int i = 0; i < 10; ++i)\n"
2972 " return;\n"
2973 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002974 verifyFormat("call(parameter, {\n"
2975 " something();\n"
2976 " // Comment using all columns.\n"
2977 " somethingelse();\n"
2978 "});",
2979 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002980 verifyFormat("DEBUG( //\n"
2981 " { f(); }, a);");
2982 verifyFormat("DEBUG( //\n"
2983 " {\n"
2984 " f(); //\n"
2985 " },\n"
2986 " a);");
2987
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002988 EXPECT_EQ("call(parameter, {\n"
2989 " something();\n"
2990 " // Comment too\n"
2991 " // looooooooooong.\n"
2992 " somethingElse();\n"
2993 "});",
2994 format("call(parameter, {\n"
2995 " something();\n"
2996 " // Comment too looooooooooong.\n"
2997 " somethingElse();\n"
2998 "});",
2999 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003000 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003001 EXPECT_EQ("DEBUG({ // comment\n"
3002 " int i;\n"
3003 "});",
3004 format("DEBUG({ // comment\n"
3005 "int i;\n"
3006 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003007 EXPECT_EQ("DEBUG({\n"
3008 " int i;\n"
3009 "\n"
3010 " // comment\n"
3011 " int j;\n"
3012 "});",
3013 format("DEBUG({\n"
3014 " int i;\n"
3015 "\n"
3016 " // comment\n"
3017 " int j;\n"
3018 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003019
3020 verifyFormat("DEBUG({\n"
3021 " if (a)\n"
3022 " return;\n"
3023 "});");
3024 verifyGoogleFormat("DEBUG({\n"
3025 " if (a) return;\n"
3026 "});");
3027 FormatStyle Style = getGoogleStyle();
3028 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003029 verifyFormat("Debug(aaaaa,\n"
3030 " {\n"
3031 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3032 " },\n"
3033 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003034 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003035
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003036 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3037
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003038 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003039}
3040
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003041TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3042 EXPECT_EQ("#define MACRO() \\\n"
3043 " Debug(aaa, /* force line break */ \\\n"
3044 " { \\\n"
3045 " int i; \\\n"
3046 " int j; \\\n"
3047 " })",
3048 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3049 " { int i; int j; })",
3050 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003051
3052 EXPECT_EQ("#define A \\\n"
3053 " [] { \\\n"
3054 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3055 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3056 " }",
3057 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3058 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3059 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003060}
3061
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003062TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3063 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003064 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003065 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003066}
3067
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003068TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3069 FormatStyle Style = getLLVMStyle();
3070 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3071 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3072 verifyFormat("FOO_BEGIN\n"
3073 " FOO_ENTRY\n"
3074 "FOO_END", Style);
3075 verifyFormat("FOO_BEGIN\n"
3076 " NESTED_FOO_BEGIN\n"
3077 " NESTED_FOO_ENTRY\n"
3078 " NESTED_FOO_END\n"
3079 "FOO_END", Style);
3080 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3081 " int x;\n"
3082 " x = 1;\n"
3083 "FOO_END(Baz)", Style);
3084}
3085
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003086//===----------------------------------------------------------------------===//
3087// Line break tests.
3088//===----------------------------------------------------------------------===//
3089
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003090TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003091 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003092 "void f() {\n"
3093 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3094 " parameter, parameter, parameter)),\n"
3095 " SecondLongCall(parameter));\n"
3096 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003097 verifyFormat(
3098 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3099 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3101 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3102 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003103 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3104 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3105 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3106 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003107 verifyFormat(
3108 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3109 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3111 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003112 verifyFormat("int a = bbbb && ccc &&\n"
3113 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003114 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003115 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003116}
3117
Daniel Jasperd69fc772013-05-08 14:12:04 +00003118TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3119 verifyFormat(
3120 "bool aaaaaaa =\n"
3121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3122 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003123 verifyFormat(
3124 "bool aaaaaaa =\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3126 " bbbbbbbb();");
3127
Daniel Jasperd69fc772013-05-08 14:12:04 +00003128 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3130 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003131 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3133 " ccccccccc == ddddddddddd;");
3134 verifyFormat(
3135 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3137 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003138
3139 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3140 " aaaaaa) &&\n"
3141 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003142 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3143 " aaaaaa) >>\n"
3144 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003145 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003146 " SourceMgr.getSpellingColumnNumber(\n"
3147 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3148 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003149
Daniel Jasper68d888c2013-06-03 08:42:05 +00003150 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3151 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3152 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003153 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3154 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3155 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003156 verifyFormat("b = a &&\n"
3157 " // Comment\n"
3158 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003159
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003160 // If the LHS of a comparison is not a binary expression itself, the
3161 // additional linebreak confuses many people.
3162 verifyFormat(
3163 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3165 "}");
3166 verifyFormat(
3167 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3169 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003170 verifyFormat(
3171 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3173 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003174 verifyFormat(
3175 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3177 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003178 // Even explicit parentheses stress the precedence enough to make the
3179 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003180 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3182 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003183 // This cases is borderline, but with the indentation it is still readable.
3184 verifyFormat(
3185 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3186 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3188 "}",
3189 getLLVMStyleWithColumns(75));
3190
3191 // If the LHS is a binary expression, we should still use the additional break
3192 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003193 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3195 " 5) {\n"
3196 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003197 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3199 " 5) {\n"
3200 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003201
Daniel Jasper571f1af2013-05-14 20:39:56 +00003202 FormatStyle OnePerLine = getLLVMStyle();
3203 OnePerLine.BinPackParameters = false;
3204 verifyFormat(
3205 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3206 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3208 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003209
3210 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3211 " .aaa(aaaaaaaaaaaaa) *\n"
3212 " aaaaaaa +\n"
3213 " aaaaaaa;",
3214 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003215}
3216
Daniel Jasper6bee6822013-04-08 20:33:42 +00003217TEST_F(FormatTest, ExpressionIndentation) {
3218 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3222 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3223 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3224 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3226 " ccccccccccccccccccccccccccccccccccccccccc;");
3227 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3230 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3231 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3234 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3235 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3238 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003239 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003240 "} else if (aaaaa && bbbbb > // break\n"
3241 " ccccc) {\n"
3242 "}");
3243 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003244 "} else if (aaaaa &&\n"
3245 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003246 " ccccc &&\n"
3247 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003248 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003249
3250 // Presence of a trailing comment used to change indentation of b.
3251 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3252 " b;\n"
3253 "return aaaaaaaaaaaaaaaaaaa +\n"
3254 " b; //",
3255 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003256}
3257
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003258TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3259 // Not sure what the best system is here. Like this, the LHS can be found
3260 // immediately above an operator (everything with the same or a higher
3261 // indent). The RHS is aligned right of the operator and so compasses
3262 // everything until something with the same indent as the operator is found.
3263 // FIXME: Is this a good system?
3264 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003265 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003266 verifyFormat(
3267 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003268 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3269 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3270 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3271 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3272 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003273 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003274 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3275 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003276 Style);
3277 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003278 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3279 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003280 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3281 Style);
3282 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003283 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3284 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003285 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3286 Style);
3287 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3288 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003289 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3290 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003291 Style);
3292 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003293 "} else if (aaaaa\n"
3294 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003295 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003296 "}",
3297 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003298 verifyFormat("return (a)\n"
3299 " // comment\n"
3300 " + b;",
3301 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003302 verifyFormat(
3303 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3304 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3305 " + cc;",
3306 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003307
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003308 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3309 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3310 Style);
3311
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003312 // Forced by comments.
3313 verifyFormat(
3314 "unsigned ContentSize =\n"
3315 " sizeof(int16_t) // DWARF ARange version number\n"
3316 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3317 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3318 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003319
3320 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3321 " == boost::fusion::at_c<1>(iiii).second;",
3322 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003323
3324 Style.ColumnLimit = 60;
3325 verifyFormat("zzzzzzzzzz\n"
3326 " = bbbbbbbbbbbbbbbbb\n"
3327 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3328 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003329}
3330
Daniel Jasperb1270392017-02-01 23:27:37 +00003331TEST_F(FormatTest, EnforcedOperatorWraps) {
3332 // Here we'd like to wrap after the || operators, but a comment is forcing an
3333 // earlier wrap.
3334 verifyFormat("bool x = aaaaa //\n"
3335 " || bbbbb\n"
3336 " //\n"
3337 " || cccc;");
3338}
3339
Daniel Jasper3219e432014-12-02 13:24:51 +00003340TEST_F(FormatTest, NoOperandAlignment) {
3341 FormatStyle Style = getLLVMStyle();
3342 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003343 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3346 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003347 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003348 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3349 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3350 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3351 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3352 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3353 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3354 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3355 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3356 " > ccccccccccccccccccccccccccccccccccccccccc;",
3357 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003358
3359 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3360 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3361 " + cc;",
3362 Style);
3363 verifyFormat("int a = aa\n"
3364 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003365 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003366 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003367
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003368 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003369 verifyFormat("return (a > b\n"
3370 " // comment1\n"
3371 " // comment2\n"
3372 " || c);",
3373 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003374}
3375
Daniel Jasperac043c92014-09-15 11:11:00 +00003376TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3377 FormatStyle Style = getLLVMStyle();
3378 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3379 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003381 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3382 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003383}
3384
Daniel Jasper988e7e42017-05-08 15:07:52 +00003385TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3386 FormatStyle Style = getLLVMStyle();
3387 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3388 Style.BinPackArguments = false;
3389 Style.ColumnLimit = 40;
3390 verifyFormat("void test() {\n"
3391 " someFunction(\n"
3392 " this + argument + is + quite\n"
3393 " + long + so + it + gets + wrapped\n"
3394 " + but + remains + bin - packed);\n"
3395 "}",
3396 Style);
3397 verifyFormat("void test() {\n"
3398 " someFunction(arg1,\n"
3399 " this + argument + is\n"
3400 " + quite + long + so\n"
3401 " + it + gets + wrapped\n"
3402 " + but + remains + bin\n"
3403 " - packed,\n"
3404 " arg3);\n"
3405 "}",
3406 Style);
3407 verifyFormat("void test() {\n"
3408 " someFunction(\n"
3409 " arg1,\n"
3410 " this + argument + has\n"
3411 " + anotherFunc(nested,\n"
3412 " calls + whose\n"
3413 " + arguments\n"
3414 " + are + also\n"
3415 " + wrapped,\n"
3416 " in + addition)\n"
3417 " + to + being + bin - packed,\n"
3418 " arg3);\n"
3419 "}",
3420 Style);
3421
3422 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3423 verifyFormat("void test() {\n"
3424 " someFunction(\n"
3425 " arg1,\n"
3426 " this + argument + has +\n"
3427 " anotherFunc(nested,\n"
3428 " calls + whose +\n"
3429 " arguments +\n"
3430 " are + also +\n"
3431 " wrapped,\n"
3432 " in + addition) +\n"
3433 " to + being + bin - packed,\n"
3434 " arg3);\n"
3435 "}",
3436 Style);
3437}
3438
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003439TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003440 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003441 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3442 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003443 verifyFormat("Constructor()\n"
3444 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003445 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003446 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003447 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003448 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003449
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003450 verifyFormat("template <typename T>\n"
3451 "Constructor() : Initializer(FitsOnTheLine) {}",
3452 getLLVMStyleWithColumns(45));
3453
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003454 verifyFormat(
3455 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003456 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003457
3458 verifyFormat(
3459 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003460 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003461 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003462 verifyFormat(
3463 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003464 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003465 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003466 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3467 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3468 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003469
3470 verifyFormat("Constructor()\n"
3471 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3472 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3473 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003474 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003475
Daniel Jasper65585ed2013-01-28 13:31:35 +00003476 verifyFormat("Constructor()\n"
3477 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003479
Daniel Jasper62e68172013-02-25 15:59:54 +00003480 verifyFormat("Constructor(int Parameter = 0)\n"
3481 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3482 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003483 verifyFormat("Constructor()\n"
3484 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3485 "}",
3486 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003487 verifyFormat("Constructor()\n"
3488 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3489 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003490
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003491 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003492 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003493 verifyFormat("Constructor()\n"
3494 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3495 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3496 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003497
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003498 FormatStyle OnePerLine = getLLVMStyle();
3499 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003500 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003501 verifyFormat("SomeClass::Constructor()\n"
3502 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3503 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003504 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003505 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003506 verifyFormat("SomeClass::Constructor()\n"
3507 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3508 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003509 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003510 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003511 verifyFormat("MyClass::MyClass(int var)\n"
3512 " : some_var_(var), // 4 space indent\n"
3513 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003514 "}",
3515 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003516 verifyFormat("Constructor()\n"
3517 " : aaaaa(aaaaaa),\n"
3518 " aaaaa(aaaaaa),\n"
3519 " aaaaa(aaaaaa),\n"
3520 " aaaaa(aaaaaa),\n"
3521 " aaaaa(aaaaaa) {}",
3522 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003523 verifyFormat("Constructor()\n"
3524 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3525 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3526 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003527 OnePerLine.BinPackParameters = false;
3528 verifyFormat(
3529 "Constructor()\n"
3530 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3531 " aaaaaaaaaaa().aaa(),\n"
3532 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3533 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003534 OnePerLine.ColumnLimit = 60;
3535 verifyFormat("Constructor()\n"
3536 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3537 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3538 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003539
3540 EXPECT_EQ("Constructor()\n"
3541 " : // Comment forcing unwanted break.\n"
3542 " aaaa(aaaa) {}",
3543 format("Constructor() :\n"
3544 " // Comment forcing unwanted break.\n"
3545 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003546}
3547
Francois Ferranda6b6d512017-05-24 11:36:58 +00003548TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3549 FormatStyle Style = getLLVMStyle();
3550 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3551
3552 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3553 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3554 getStyleWithColumns(Style, 45));
3555 verifyFormat("Constructor() :\n"
3556 " Initializer(FitsOnTheLine) {}",
3557 getStyleWithColumns(Style, 44));
3558 verifyFormat("Constructor() :\n"
3559 " Initializer(FitsOnTheLine) {}",
3560 getStyleWithColumns(Style, 43));
3561
3562 verifyFormat("template <typename T>\n"
3563 "Constructor() : Initializer(FitsOnTheLine) {}",
3564 getStyleWithColumns(Style, 50));
3565
3566 verifyFormat(
3567 "SomeClass::Constructor() :\n"
3568 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3569 Style);
3570
3571 verifyFormat(
3572 "SomeClass::Constructor() :\n"
3573 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3574 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3575 Style);
3576 verifyFormat(
3577 "SomeClass::Constructor() :\n"
3578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3579 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3580 Style);
3581 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3582 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3583 " aaaaaaaaaa(aaaaaa) {}",
3584 Style);
3585
3586 verifyFormat("Constructor() :\n"
3587 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3588 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3590 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3591 Style);
3592
3593 verifyFormat("Constructor() :\n"
3594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3596 Style);
3597
3598 verifyFormat("Constructor(int Parameter = 0) :\n"
3599 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3600 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3601 Style);
3602 verifyFormat("Constructor() :\n"
3603 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3604 "}",
3605 getStyleWithColumns(Style, 60));
3606 verifyFormat("Constructor() :\n"
3607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3608 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3609 Style);
3610
3611 // Here a line could be saved by splitting the second initializer onto two
3612 // lines, but that is not desirable.
3613 verifyFormat("Constructor() :\n"
3614 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3615 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3616 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3617 Style);
3618
3619 FormatStyle OnePerLine = Style;
3620 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3621 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3622 verifyFormat("SomeClass::Constructor() :\n"
3623 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3624 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3625 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3626 OnePerLine);
3627 verifyFormat("SomeClass::Constructor() :\n"
3628 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3629 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3630 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3631 OnePerLine);
3632 verifyFormat("MyClass::MyClass(int var) :\n"
3633 " some_var_(var), // 4 space indent\n"
3634 " some_other_var_(var + 1) { // lined up\n"
3635 "}",
3636 OnePerLine);
3637 verifyFormat("Constructor() :\n"
3638 " aaaaa(aaaaaa),\n"
3639 " aaaaa(aaaaaa),\n"
3640 " aaaaa(aaaaaa),\n"
3641 " aaaaa(aaaaaa),\n"
3642 " aaaaa(aaaaaa) {}",
3643 OnePerLine);
3644 verifyFormat("Constructor() :\n"
3645 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3646 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3647 OnePerLine);
3648 OnePerLine.BinPackParameters = false;
3649 verifyFormat(
3650 "Constructor() :\n"
3651 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3652 " aaaaaaaaaaa().aaa(),\n"
3653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3654 OnePerLine);
3655 OnePerLine.ColumnLimit = 60;
3656 verifyFormat("Constructor() :\n"
3657 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3658 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3659 OnePerLine);
3660
3661 EXPECT_EQ("Constructor() :\n"
3662 " // Comment forcing unwanted break.\n"
3663 " aaaa(aaaa) {}",
3664 format("Constructor() :\n"
3665 " // Comment forcing unwanted break.\n"
3666 " aaaa(aaaa) {}",
3667 Style));
3668
3669 Style.ColumnLimit = 0;
3670 verifyFormat("SomeClass::Constructor() :\n"
3671 " a(a) {}",
3672 Style);
3673 verifyFormat("SomeClass::Constructor() noexcept :\n"
3674 " a(a) {}",
3675 Style);
3676 verifyFormat("SomeClass::Constructor() :\n"
3677 " a(a), b(b), c(c) {}",
3678 Style);
3679 verifyFormat("SomeClass::Constructor() :\n"
3680 " a(a) {\n"
3681 " foo();\n"
3682 " bar();\n"
3683 "}",
3684 Style);
3685
3686 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3687 verifyFormat("SomeClass::Constructor() :\n"
3688 " a(a), b(b), c(c) {\n"
3689 "}",
3690 Style);
3691 verifyFormat("SomeClass::Constructor() :\n"
3692 " a(a) {\n"
3693 "}",
3694 Style);
3695
3696 Style.ColumnLimit = 80;
3697 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3698 Style.ConstructorInitializerIndentWidth = 2;
3699 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3700 Style);
3701 verifyFormat("SomeClass::Constructor() :\n"
3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3703 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3704 Style);
3705}
3706
David Blaikieea95dd72017-08-31 18:49:34 +00003707#ifndef EXPENSIVE_CHECKS
3708// Expensive checks enables libstdc++ checking which includes validating the
3709// state of ranges used in std::priority_queue - this blows out the
3710// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003711TEST_F(FormatTest, MemoizationTests) {
3712 // This breaks if the memoization lookup does not take \c Indent and
3713 // \c LastSpace into account.
3714 verifyFormat(
3715 "extern CFRunLoopTimerRef\n"
3716 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3717 " CFTimeInterval interval, CFOptionFlags flags,\n"
3718 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003719 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003720
3721 // Deep nesting somewhat works around our memoization.
3722 verifyFormat(
3723 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3724 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3725 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3726 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3727 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3728 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003729 verifyFormat(
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(\n"
3749 " aaaaa,\n"
3750 " aaaaa(\n"
3751 " aaaaa,\n"
3752 " aaaaa(\n"
3753 " aaaaa,\n"
3754 " aaaaa))))))))))));",
3755 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003756 verifyFormat(
3757 "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"
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),\n"
3769 " a),\n"
3770 " a),\n"
3771 " a),\n"
3772 " a),\n"
3773 " a),\n"
3774 " a)",
3775 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003776
3777 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003778 FormatStyle OnePerLine = getLLVMStyle();
3779 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003780 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003781 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003782 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003783 for (unsigned i = 0, e = 80; i != e; ++i) {
3784 input += " a,\n";
3785 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003786 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003787 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003788}
David Blaikieea95dd72017-08-31 18:49:34 +00003789#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003790
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003791TEST_F(FormatTest, BreaksAsHighAsPossible) {
3792 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003793 "void f() {\n"
3794 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3795 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3796 " f();\n"
3797 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003798 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003799 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003800}
3801
Daniel Jasper6728fc12013-04-11 14:29:13 +00003802TEST_F(FormatTest, BreaksFunctionDeclarations) {
3803 // Principially, we break function declarations in a certain order:
3804 // 1) break amongst arguments.
3805 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3806 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003807 verifyFormat("template <class TemplateIt>\n"
3808 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3809 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003810
3811 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003812 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003813 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003814 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003815 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003816
3817 // 3) break after (.
3818 verifyFormat(
3819 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003820 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3821 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003822
3823 // 4) break before after nested name specifiers.
3824 verifyFormat(
3825 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003826 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3827 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003828 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003829
3830 // However, there are exceptions, if a sufficient amount of lines can be
3831 // saved.
3832 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3833 // more adjusting.
3834 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3835 " Cccccccccccccc cccccccccc,\n"
3836 " Cccccccccccccc cccccccccc,\n"
3837 " Cccccccccccccc cccccccccc,\n"
3838 " Cccccccccccccc cccccccccc);");
3839 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003840 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003841 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3842 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3843 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003844 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003845 verifyFormat(
3846 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc,\n"
3848 " Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc,\n"
3850 " Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc,\n"
3852 " Cccccccccccccc cccccccccc);");
3853 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3854 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3855 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3856 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3857 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003858
3859 // Break after multi-line parameters.
3860 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3861 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3863 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003864 verifyFormat("void SomeLoooooooooooongFunction(\n"
3865 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3866 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3867 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003868
3869 // Treat overloaded operators like other functions.
3870 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3871 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003872 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3873 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003874 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3875 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3876 verifyGoogleFormat(
3877 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3878 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003879 verifyGoogleFormat(
3880 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3881 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003882 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3883 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3884 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3885 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003886 verifyGoogleFormat(
3887 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3888 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3889 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003890 verifyGoogleFormat(
3891 "template <typename T>\n"
3892 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3893 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3894 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003895
3896 FormatStyle Style = getLLVMStyle();
3897 Style.PointerAlignment = FormatStyle::PAS_Left;
3898 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3899 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3900 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003901 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3902 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3903 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003904}
3905
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003906TEST_F(FormatTest, TrailingReturnType) {
3907 verifyFormat("auto foo() -> int;\n");
3908 verifyFormat("struct S {\n"
3909 " auto bar() const -> int;\n"
3910 "};");
3911 verifyFormat("template <size_t Order, typename T>\n"
3912 "auto load_img(const std::string &filename)\n"
3913 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003914 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3915 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003916 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003917 verifyFormat("template <typename T>\n"
3918 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3919 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003920
3921 // Not trailing return types.
3922 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003923}
3924
Daniel Jasper5be31f72013-05-21 09:16:31 +00003925TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003926 // Avoid breaking before trailing 'const' or other trailing annotations, if
3927 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003928 FormatStyle Style = getGoogleStyle();
3929 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003930 verifyFormat("void someLongFunction(\n"
3931 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003932 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003933 verifyFormat("LoooooongReturnType\n"
3934 "someLoooooooongFunction() const {}",
3935 getLLVMStyleWithColumns(47));
3936 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3937 " const {}",
3938 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003939 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3940 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3941 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3942 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3943 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3944 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003945 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3946 " aaaaaaaaaaa aaaaa) const override;");
3947 verifyGoogleFormat(
3948 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3949 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003950
Daniel Jasper5550de62014-02-17 07:57:46 +00003951 // Even if the first parameter has to be wrapped.
3952 verifyFormat("void someLongFunction(\n"
3953 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003954 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003955 verifyFormat("void someLongFunction(\n"
3956 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003957 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003958 verifyFormat("void someLongFunction(\n"
3959 " int someLongParameter) override {}",
3960 Style);
3961 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003962 " int someLongParameter) OVERRIDE {}",
3963 Style);
3964 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003965 " int someLongParameter) final {}",
3966 Style);
3967 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003968 " int someLongParameter) FINAL {}",
3969 Style);
3970 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003971 " int parameter) const override {}",
3972 Style);
3973
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003974 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3975 verifyFormat("void someLongFunction(\n"
3976 " int someLongParameter) const\n"
3977 "{\n"
3978 "}",
3979 Style);
3980
Daniel Jasper5550de62014-02-17 07:57:46 +00003981 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003982 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3983 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3984 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003985
3986 // Breaking before function-like trailing annotations is fine to keep them
3987 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003988 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3989 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3990 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3991 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3992 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3993 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003994 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3995 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003996 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003997
3998 verifyFormat(
3999 "void aaaaaaaaaaaaaaaaaa()\n"
4000 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4001 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4002 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4003 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004004 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004005 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004006 " GUARDED_BY(aaaaaaaaaaaa);");
4007 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004008 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004009 " GUARDED_BY(aaaaaaaaaaaa);");
4010 verifyGoogleFormat(
4011 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4012 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004013 verifyGoogleFormat(
4014 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4015 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004016}
4017
Daniel Jasperf090f032015-05-18 09:47:22 +00004018TEST_F(FormatTest, FunctionAnnotations) {
4019 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004020 "int OldFunction(const string &parameter) {}");
4021 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004022 "string OldFunction(const string &parameter) {}");
4023 verifyFormat("template <typename T>\n"
4024 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4025 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004026
4027 // Not function annotations.
4028 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4029 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004030 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4031 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004032 verifyFormat("MACRO(abc).function() // wrap\n"
4033 " << abc;");
4034 verifyFormat("MACRO(abc)->function() // wrap\n"
4035 " << abc;");
4036 verifyFormat("MACRO(abc)::function() // wrap\n"
4037 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004038}
4039
Daniel Jasperf7935112012-12-03 18:12:45 +00004040TEST_F(FormatTest, BreaksDesireably) {
4041 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4042 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004043 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004044 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4046 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004047
4048 verifyFormat(
4049 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004051
4052 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004055
4056 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004057 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4058 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004060 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4061 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004062
4063 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4064 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4065
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004066 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004067 "void f() {\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4070 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004071 verifyFormat(
4072 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4074 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004075 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4077 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004078 "aaaaaa(aaa,\n"
4079 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4081 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004082 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004085
Daniel Jasper739b85f2015-06-29 10:42:59 +00004086 // Indent consistently independent of call expression and unary operator.
4087 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4088 " dddddddddddddddddddddddddddddd));");
4089 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4090 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004091 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004092 " dddddddddddddddddddddddddddddd));");
4093
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004094 // This test case breaks on an incorrect memoization, i.e. an optimization not
4095 // taking into account the StopAt value.
4096 verifyFormat(
4097 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004098 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4099 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4100 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004101
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004102 verifyFormat("{\n {\n {\n"
4103 " Annotation.SpaceRequiredBefore =\n"
4104 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4105 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4106 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004107
4108 // Break on an outer level if there was a break on an inner level.
4109 EXPECT_EQ("f(g(h(a, // comment\n"
4110 " b, c),\n"
4111 " d, e),\n"
4112 " x, y);",
4113 format("f(g(h(a, // comment\n"
4114 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004115
4116 // Prefer breaking similar line breaks.
4117 verifyFormat(
4118 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4119 " NSTrackingMouseEnteredAndExited |\n"
4120 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004121}
4122
Daniel Jasper18210d72014-10-09 09:52:05 +00004123TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4124 FormatStyle NoBinPacking = getGoogleStyle();
4125 NoBinPacking.BinPackParameters = false;
4126 NoBinPacking.BinPackArguments = true;
4127 verifyFormat("void f() {\n"
4128 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4130 "}",
4131 NoBinPacking);
4132 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4133 " int aaaaaaaaaaaaaaaaaaaa,\n"
4134 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4135 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004136
Daniel Jasper00693b082016-01-09 15:56:47 +00004137 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4138 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4139 " vector<int> bbbbbbbbbbbbbbb);",
4140 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004141 // FIXME: This behavior difference is probably not wanted. However, currently
4142 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4143 // template arguments from BreakBeforeParameter being set because of the
4144 // one-per-line formatting.
4145 verifyFormat(
4146 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4147 " aaaaaaaaaa> aaaaaaaaaa);",
4148 NoBinPacking);
4149 verifyFormat(
4150 "void fffffffffff(\n"
4151 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4152 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004153}
4154
Daniel Jasper9278eb92013-01-16 14:59:02 +00004155TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004156 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004157 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004158 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004159 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4160 " aaaaaaaaaaaaaaaaaaaa,\n"
4161 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4162 NoBinPacking);
4163 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4164 " aaaaaaaaaaaaa,\n"
4165 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4166 NoBinPacking);
4167 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004168 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4169 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4171 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4173 NoBinPacking);
4174 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4175 " .aaaaaaaaaaaaaaaaaa();",
4176 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004177 verifyFormat("void f() {\n"
4178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4179 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4180 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004181 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004182
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004183 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004184 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4185 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004186 " aaaaaaaaaaaa);",
4187 NoBinPacking);
4188 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004189 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4190 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004191 " test);",
4192 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004193
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004194 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4195 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004196 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4197 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004198 NoBinPacking);
4199 verifyFormat("a(\"a\"\n"
4200 " \"a\",\n"
4201 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004202
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004203 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004204 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004205 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004206 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004207 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004208 verifyFormat(
4209 "void f() {\n"
4210 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4211 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004212 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004213 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004214 verifyFormat(
4215 "template <class SomeType, class SomeOtherType>\n"
4216 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4217 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004218}
4219
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004220TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4221 FormatStyle Style = getLLVMStyleWithColumns(15);
4222 Style.ExperimentalAutoDetectBinPacking = true;
4223 EXPECT_EQ("aaa(aaaa,\n"
4224 " aaaa,\n"
4225 " aaaa);\n"
4226 "aaa(aaaa,\n"
4227 " aaaa,\n"
4228 " aaaa);",
4229 format("aaa(aaaa,\n" // one-per-line
4230 " aaaa,\n"
4231 " aaaa );\n"
4232 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4233 Style));
4234 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4235 " aaaa);\n"
4236 "aaa(aaaa, aaaa,\n"
4237 " aaaa);",
4238 format("aaa(aaaa, aaaa,\n" // bin-packed
4239 " aaaa );\n"
4240 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4241 Style));
4242}
4243
Daniel Jasper04468962013-01-18 10:56:38 +00004244TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004245 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4246 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4247 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4248 " .StartsWith(\".init\", ORDER_INIT)\n"
4249 " .StartsWith(\".fini\", ORDER_FINI)\n"
4250 " .StartsWith(\".hash\", ORDER_HASH)\n"
4251 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004252
Daniel Jaspereb50c672013-02-15 20:33:06 +00004253 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004254 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004255 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004256 "aaaaaaa->aaaaaaa\n"
4257 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004259 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004260 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004261 "aaaaaaa->aaaaaaa\n"
4262 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4263 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4264 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004265 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004266 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004267 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004268 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4269 " aaaaaa->aaaaaaaaaaaa()\n"
4270 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004272 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004273 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004274 "void f() {\n"
4275 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004276 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004277 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004278 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004279 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004280 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004281 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004282 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004283 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004284 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004285 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004286 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004287
4288 verifyFormat(
4289 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4290 verifyFormat("aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa()\n"
4292 " .aaaaaaaaaaaaaaa()\n"
4293 " .aaaaaaaaaaaaaaa()\n"
4294 " .aaaaaaaaaaaaaaa();");
4295 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4296 " .aaaaaaaaaaaaaaa()\n"
4297 " .aaaaaaaaaaaaaaa()\n"
4298 " .aaaaaaaaaaaaaaa();");
4299 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4300 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4301 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004302 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4303 " ->aaaaaaaaaaaaaae(0)\n"
4304 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004305
Daniel Jasper775954b2015-04-24 10:08:09 +00004306 // Don't linewrap after very short segments.
4307 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4310 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4311 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4313 verifyFormat("aaa()\n"
4314 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4315 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4316 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4317
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004318 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4319 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4320 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4321 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4322 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004323 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004324
Daniel Jaspera41aa532014-09-19 08:01:25 +00004325 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004326 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4327 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004328
4329 // Prefer not to create "hanging" indents.
4330 verifyFormat(
4331 "return !soooooooooooooome_map\n"
4332 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4333 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004334 verifyFormat(
4335 "return aaaaaaaaaaaaaaaa\n"
4336 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4337 " .aaaa(aaaaaaaaaaaaaa);");
4338 // No hanging indent here.
4339 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4341 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004343 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4344 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4345 getLLVMStyleWithColumns(60));
4346 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4347 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4348 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4349 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004350 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4351 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4352 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004353}
4354
Daniel Jasperde5c2072012-12-24 00:13:23 +00004355TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4356 verifyFormat(
4357 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004358 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004359 verifyFormat(
4360 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4361 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4362
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004363 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004364 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004365 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4366 " ccccccccccccccccccccccccc) {\n}");
4367
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004368 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004369 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004370 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4371 " ccccccccccccccccccccccccc) {\n}");
4372
Daniel Jasperde5c2072012-12-24 00:13:23 +00004373 verifyFormat(
4374 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004375 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004376 verifyFormat(
4377 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4378 " ccccccccccccccccccccccccc) {\n}");
4379
Daniel Jasper400adc62013-02-08 15:28:42 +00004380 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4381 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4382 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4383 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004384 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4385 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4386 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4387 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4388
Daniel Jasper400adc62013-02-08 15:28:42 +00004389 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4390 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4391 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004392 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4393 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4394 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004395}
4396
Daniel Jasper43b65482013-01-23 12:27:43 +00004397TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004398 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004399 "unsigned Cost =\n"
4400 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4401 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004402 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004403 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4404 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004405
4406 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004407 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4408 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004409 verifyFormat("unsigned OriginalStartColumn =\n"
4410 " SourceMgr.getSpellingColumnNumber(\n"
4411 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4412 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004413}
4414
Francois Ferrand9976efa2017-05-22 08:28:17 +00004415TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4416 FormatStyle Style = getLLVMStyle();
4417 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4418 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4419 Style);
4420
4421 Style.PenaltyBreakAssignment = 20;
4422 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4423 " cccccccccccccccccccccccccc;",
4424 Style);
4425}
4426
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004427TEST_F(FormatTest, AlignsAfterAssignments) {
4428 verifyFormat(
4429 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004430 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004431 verifyFormat(
4432 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004433 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004434 verifyFormat(
4435 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004436 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004437 verifyFormat(
4438 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004439 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004440 verifyFormat(
4441 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4442 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4443 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004444}
4445
4446TEST_F(FormatTest, AlignsAfterReturn) {
4447 verifyFormat(
4448 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4449 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4450 verifyFormat(
4451 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4452 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004453 verifyFormat(
4454 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004455 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004456 verifyFormat(
4457 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004458 " aaaaaaaaaaaaaaaaaaaaaa());");
4459 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4461 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004464 verifyFormat("return\n"
4465 " // true if code is one of a or b.\n"
4466 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004467}
4468
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004469TEST_F(FormatTest, AlignsAfterOpenBracket) {
4470 verifyFormat(
4471 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4472 " aaaaaaaaa aaaaaaa) {}");
4473 verifyFormat(
4474 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4475 " aaaaaaaaaaa aaaaaaaaa);");
4476 verifyFormat(
4477 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4478 " aaaaaaaaaaaaaaaaaaaaa));");
4479 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004480 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004481 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4482 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4483 Style);
4484 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4485 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4486 Style);
4487 verifyFormat("SomeLongVariableName->someFunction(\n"
4488 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4489 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004490 verifyFormat(
4491 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4492 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4493 Style);
4494 verifyFormat(
4495 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4496 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4497 Style);
4498 verifyFormat(
4499 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4500 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4501 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004502
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004503 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4504 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4505 " b));",
4506 Style);
4507
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004508 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4509 Style.BinPackArguments = false;
4510 Style.BinPackParameters = false;
4511 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4512 " aaaaaaaaaaa aaaaaaaa,\n"
4513 " aaaaaaaaa aaaaaaa,\n"
4514 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4515 Style);
4516 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4517 " aaaaaaaaaaa aaaaaaaaa,\n"
4518 " aaaaaaaaaaa aaaaaaaaa,\n"
4519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4520 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004521 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4522 " aaaaaaaaaaaaaaa,\n"
4523 " aaaaaaaaaaaaaaaaaaaaa,\n"
4524 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004525 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004526 verifyFormat(
4527 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4528 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4529 Style);
4530 verifyFormat(
4531 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4532 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4533 Style);
4534 verifyFormat(
4535 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaaaaaaaaaaaa(\n"
4537 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4538 " aaaaaaaaaaaaaaaa);",
4539 Style);
4540 verifyFormat(
4541 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4542 " aaaaaaaaaaaaaaaaaaaaa(\n"
4543 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4544 " aaaaaaaaaaaaaaaa);",
4545 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004546}
4547
Daniel Jasper3219e432014-12-02 13:24:51 +00004548TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4549 FormatStyle Style = getLLVMStyleWithColumns(40);
4550 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4551 " bbbbbbbbbbbbbbbbbbbbbb);",
4552 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004553 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004554 Style.AlignOperands = false;
4555 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4556 " bbbbbbbbbbbbbbbbbbbbbb);",
4557 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004558 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004559 Style.AlignOperands = true;
4560 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4561 " bbbbbbbbbbbbbbbbbbbbbb);",
4562 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004563 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004564 Style.AlignOperands = false;
4565 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4566 " bbbbbbbbbbbbbbbbbbbbbb);",
4567 Style);
4568}
4569
Daniel Jasper399d24b2013-01-09 07:06:56 +00004570TEST_F(FormatTest, BreaksConditionalExpressions) {
4571 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004572 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4573 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4574 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4575 verifyFormat(
4576 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004577 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4578 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004579 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004580 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4581 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4582 verifyFormat(
4583 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004584 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4585 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004586 verifyFormat(
4587 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4588 " : aaaaaaaaaaaaa);");
4589 verifyFormat(
4590 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004591 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004592 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4593 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004594 verifyFormat(
4595 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4596 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4597 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004598 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4599 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4600 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4601 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4603 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4605 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4607 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4609 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004610 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4612 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4614 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004615 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4616 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4617 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004618 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4620 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4621 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004622 verifyFormat(
4623 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4624 " ? aaaaaaaaaaaaaaa\n"
4625 " : aaaaaaaaaaaaaaa;");
4626 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004627 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004628 " ? b\n"
4629 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004630 verifyFormat("return aaaa == bbbb\n"
4631 " // comment\n"
4632 " ? aaaa\n"
4633 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004634 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004635 " format(TheLine.First,\n"
4636 " IndentForLevel[TheLine.Level] >= 0\n"
4637 " ? IndentForLevel[TheLine.Level]\n"
4638 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004639 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004640 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004641 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4642 " ? aaaaaaaaaaaaaaa\n"
4643 " : bbbbbbbbbbbbbbb //\n"
4644 " ? ccccccccccccccc\n"
4645 " : ddddddddddddddd;");
4646 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4647 " ? aaaaaaaaaaaaaaa\n"
4648 " : (bbbbbbbbbbbbbbb //\n"
4649 " ? ccccccccccccccc\n"
4650 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004651 verifyFormat(
4652 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4653 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4654 " aaaaaaaaaaaaaaaaaaaaa +\n"
4655 " aaaaaaaaaaaaaaaaaaaaa\n"
4656 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004657 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004658 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4659 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4660 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004661
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004662 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004663 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004664 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004665 "void f() {\n"
4666 " g(aaa,\n"
4667 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4669 " ? aaaaaaaaaaaaaaa\n"
4670 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004671 "}",
4672 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004673 verifyFormat(
4674 "void f() {\n"
4675 " g(aaa,\n"
4676 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4678 " ?: aaaaaaaaaaaaaaa);\n"
4679 "}",
4680 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004681
4682 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4683 " // comment.\n"
4684 " ccccccccccccccccccccccccccccccccccccccc\n"
4685 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4686 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004687
4688 // Assignments in conditional expressions. Apparently not uncommon :-(.
4689 verifyFormat("return a != b\n"
4690 " // comment\n"
4691 " ? a = b\n"
4692 " : a = b;");
4693 verifyFormat("return a != b\n"
4694 " // comment\n"
4695 " ? a = a != b\n"
4696 " // comment\n"
4697 " ? a = b\n"
4698 " : a\n"
4699 " : a;\n");
4700 verifyFormat("return a != b\n"
4701 " // comment\n"
4702 " ? a\n"
4703 " : a = a != b\n"
4704 " // comment\n"
4705 " ? a = b\n"
4706 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004707}
4708
Daniel Jasper165b29e2013-11-08 00:57:11 +00004709TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4710 FormatStyle Style = getLLVMStyle();
4711 Style.BreakBeforeTernaryOperators = false;
4712 Style.ColumnLimit = 70;
4713 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004714 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4717 Style);
4718 verifyFormat(
4719 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004720 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004722 Style);
4723 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004724 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4726 Style);
4727 verifyFormat(
4728 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004729 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004731 Style);
4732 verifyFormat(
4733 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4734 " aaaaaaaaaaaaa);",
4735 Style);
4736 verifyFormat(
4737 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4738 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4740 " aaaaaaaaaaaaa);",
4741 Style);
4742 verifyFormat(
4743 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4744 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4745 " aaaaaaaaaaaaa);",
4746 Style);
4747 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4752 Style);
4753 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4760 Style);
4761 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4765 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4766 Style);
4767 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4769 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4770 Style);
4771 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4775 Style);
4776 verifyFormat(
4777 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4778 " aaaaaaaaaaaaaaa :\n"
4779 " aaaaaaaaaaaaaaa;",
4780 Style);
4781 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4782 " aaaaaaaaa ?\n"
4783 " b :\n"
4784 " c);",
4785 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004786 verifyFormat("unsigned Indent =\n"
4787 " format(TheLine.First,\n"
4788 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4789 " IndentForLevel[TheLine.Level] :\n"
4790 " TheLine * 2,\n"
4791 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4792 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004793 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4794 " aaaaaaaaaaaaaaa :\n"
4795 " bbbbbbbbbbbbbbb ? //\n"
4796 " ccccccccccccccc :\n"
4797 " ddddddddddddddd;",
4798 Style);
4799 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4800 " aaaaaaaaaaaaaaa :\n"
4801 " (bbbbbbbbbbbbbbb ? //\n"
4802 " ccccccccccccccc :\n"
4803 " ddddddddddddddd);",
4804 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004805 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4806 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4807 " ccccccccccccccccccccccccccc;",
4808 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004809 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4810 " aaaaa :\n"
4811 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4812 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004813}
4814
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004815TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4816 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4817 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4818 verifyFormat("bool a = true, b = false;");
4819
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004820 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004822 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004823 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004824 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004825 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004826 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004827 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004828 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4829 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4830 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4831 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4832 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4833 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004834
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004835 FormatStyle Style = getGoogleStyle();
4836 Style.PointerAlignment = FormatStyle::PAS_Left;
4837 Style.DerivePointerAlignment = false;
4838 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4839 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4840 " *b = bbbbbbbbbbbbbbbbbbb;",
4841 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004842 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4843 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4844 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004845 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004846 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004847}
4848
Nico Weber4a5030c2013-01-12 01:28:06 +00004849TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4850 verifyFormat("arr[foo ? bar : baz];");
4851 verifyFormat("f()[foo ? bar : baz];");
4852 verifyFormat("(a + b)[foo ? bar : baz];");
4853 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4854}
4855
Daniel Jasperf7935112012-12-03 18:12:45 +00004856TEST_F(FormatTest, AlignsStringLiterals) {
4857 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4858 " \"short literal\");");
4859 verifyFormat(
4860 "looooooooooooooooooooooooongFunction(\n"
4861 " \"short literal\"\n"
4862 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004863 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4864 " \" string literals\",\n"
4865 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004866 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4867 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004868 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004869 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004870 getLLVMStyleWithColumns(28)));
4871 EXPECT_EQ(
4872 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4873 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4874 " \"aaaaaaaaaaaaaaaa\";",
4875 format("aaaaaa ="
4876 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4877 "aaaaaaaaaaaaaaaaaaaaa\" "
4878 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004879 verifyFormat("a = a + \"a\"\n"
4880 " \"a\"\n"
4881 " \"a\";");
4882 verifyFormat("f(\"a\", \"b\"\n"
4883 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004884
4885 verifyFormat(
4886 "#define LL_FORMAT \"ll\"\n"
4887 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4888 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004889
4890 verifyFormat("#define A(X) \\\n"
4891 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4892 " \"ccccc\"",
4893 getLLVMStyleWithColumns(23));
4894 verifyFormat("#define A \"def\"\n"
4895 "f(\"abc\" A \"ghi\"\n"
4896 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004897
4898 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004899 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004900 verifyFormat("#define A(X) \\\n"
4901 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4902 " L\"ccccc\"",
4903 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004904
4905 verifyFormat("f(@\"a\"\n"
4906 " @\"b\");");
4907 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004908 " @\"b\"\n"
4909 " @\"c\";");
4910 verifyFormat("NSString s = @\"a\"\n"
4911 " \"b\"\n"
4912 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004913}
4914
Zachary Turner448592e2015-12-18 22:20:15 +00004915TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004916 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004917 // No declarations or definitions should be moved to own line.
4918 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4919 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004920 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004921 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004922 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004923 "int f() { return 1; }\n"
4924 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004925 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004926
4927 // All declarations and definitions should have the return type moved to its
4928 // own
4929 // line.
4930 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4931 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004932 " int\n"
4933 " f() {\n"
4934 " return 1;\n"
4935 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004936 " int\n"
4937 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004938 "};\n"
4939 "int\n"
4940 "f() {\n"
4941 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004942 "}\n"
4943 "int\n"
4944 "g();\n",
4945 Style);
4946
4947 // Top-level definitions, and no kinds of declarations should have the
4948 // return type moved to its own line.
4949 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4950 verifyFormat("class B {\n"
4951 " int f() { return 1; }\n"
4952 " int g();\n"
4953 "};\n"
4954 "int\n"
4955 "f() {\n"
4956 " return 1;\n"
4957 "}\n"
4958 "int g();\n",
4959 Style);
4960
4961 // Top-level definitions and declarations should have the return type moved
4962 // to its own line.
4963 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4964 verifyFormat("class C {\n"
4965 " int f() { return 1; }\n"
4966 " int g();\n"
4967 "};\n"
4968 "int\n"
4969 "f() {\n"
4970 " return 1;\n"
4971 "}\n"
4972 "int\n"
4973 "g();\n",
4974 Style);
4975
4976 // All definitions should have the return type moved to its own line, but no
4977 // kinds of declarations.
4978 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4979 verifyFormat("class D {\n"
4980 " int\n"
4981 " f() {\n"
4982 " return 1;\n"
4983 " }\n"
4984 " int g();\n"
4985 "};\n"
4986 "int\n"
4987 "f() {\n"
4988 " return 1;\n"
4989 "}\n"
4990 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004991 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004992 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004993 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004994 " return \"\";\n"
4995 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004996 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004997 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004998 verifyFormat("template <class T>\n"
4999 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005000 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005001 " return NULL;\n"
5002 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005003 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005004 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005005 verifyFormat("class C {\n"
5006 " int\n"
5007 " operator+() {\n"
5008 " return 1;\n"
5009 " }\n"
5010 " int\n"
5011 " operator()() {\n"
5012 " return 1;\n"
5013 " }\n"
5014 "};\n",
5015 Style);
5016 verifyFormat("void\n"
5017 "A::operator()() {}\n"
5018 "void\n"
5019 "A::operator>>() {}\n"
5020 "void\n"
5021 "A::operator+() {}\n",
5022 Style);
5023 verifyFormat("void *operator new(std::size_t s);", // No break here.
5024 Style);
5025 verifyFormat("void *\n"
5026 "operator new(std::size_t s) {}",
5027 Style);
5028 verifyFormat("void *\n"
5029 "operator delete[](void *ptr) {}",
5030 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005031 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005032 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005033 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005034 "{\n"
5035 " return \"\";\n"
5036 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005037 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005038 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005039 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005040 "T *\n" // Problem here: no line break
5041 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005042 "{\n"
5043 " return NULL;\n"
5044 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005045 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005046 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005047}
5048
Alexander Kornienko58611712013-07-04 12:02:44 +00005049TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5050 FormatStyle NoBreak = getLLVMStyle();
5051 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5052 FormatStyle Break = getLLVMStyle();
5053 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005054 verifyFormat("aaaa = \"bbbb\"\n"
5055 " \"cccc\";",
5056 NoBreak);
5057 verifyFormat("aaaa =\n"
5058 " \"bbbb\"\n"
5059 " \"cccc\";",
5060 Break);
5061 verifyFormat("aaaa(\"bbbb\"\n"
5062 " \"cccc\");",
5063 NoBreak);
5064 verifyFormat("aaaa(\n"
5065 " \"bbbb\"\n"
5066 " \"cccc\");",
5067 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005068 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5069 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005070 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005071 verifyFormat("aaaa(qqq,\n"
5072 " \"bbbb\"\n"
5073 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005074 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005075 verifyFormat("aaaa(qqq,\n"
5076 " L\"bbbb\"\n"
5077 " L\"cccc\");",
5078 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005079 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5080 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005081 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005082 verifyFormat("string s = someFunction(\n"
5083 " \"abc\"\n"
5084 " \"abc\");",
5085 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005086
Daniel Jasper3251fff2014-06-10 06:27:23 +00005087 // As we break before unary operators, breaking right after them is bad.
5088 verifyFormat("string foo = abc ? \"x\"\n"
5089 " \"blah blah blah blah blah blah\"\n"
5090 " : \"y\";",
5091 Break);
5092
Daniel Jasperc834c702013-07-17 15:38:19 +00005093 // Don't break if there is no column gain.
5094 verifyFormat("f(\"aaaa\"\n"
5095 " \"bbbb\");",
5096 Break);
5097
5098 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005099 EXPECT_EQ("x = \"a\\\n"
5100 "b\\\n"
5101 "c\";",
5102 format("x = \"a\\\n"
5103 "b\\\n"
5104 "c\";",
5105 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005106 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005107 " \"a\\\n"
5108 "b\\\n"
5109 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005110 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005111 "b\\\n"
5112 "c\";",
5113 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005114
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005115 EXPECT_EQ("NSString *const kString =\n"
5116 " @\"aaaa\"\n"
5117 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005118 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005119 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005120 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005121
5122 Break.ColumnLimit = 0;
5123 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005124}
5125
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005126TEST_F(FormatTest, AlignsPipes) {
5127 verifyFormat(
5128 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5129 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5131 verifyFormat(
5132 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5133 " << aaaaaaaaaaaaaaaaaaaa;");
5134 verifyFormat(
5135 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5136 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5137 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005138 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5139 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5140 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005141 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5142 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5143 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5144 verifyFormat(
5145 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5146 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5147 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005148 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5151 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005152 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5153 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005154 verifyFormat(
5155 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005157 verifyFormat(
5158 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5159 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005160
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005161 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5162 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005163 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5165 " aaaaaaaaaaaaaaaaaaaaa)\n"
5166 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005167 verifyFormat("LOG_IF(aaa == //\n"
5168 " bbb)\n"
5169 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005170
Daniel Jasper467ddb12013-08-12 12:58:05 +00005171 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005172 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5173 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005174 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5175 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5176 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005177 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5178 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005179 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5180 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5182 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5183 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5185 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005186
Daniel Jasperc238c872013-04-02 14:33:13 +00005187 verifyFormat(
5188 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5189 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005190
5191 // Incomplete string literal.
5192 EXPECT_EQ("llvm::errs() << \"\n"
5193 " << a;",
5194 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005195
5196 verifyFormat("void f() {\n"
5197 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5198 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5199 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005200
5201 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005202 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5203 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5204 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005205
5206 // Handle '\n'.
5207 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5208 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5209 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5210 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5211 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5212 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5213 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005214}
5215
Daniel Jasper7209bb92016-12-13 11:16:42 +00005216TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5217 verifyFormat("return out << \"somepacket = {\\n\"\n"
5218 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5219 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5220 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5221 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5222 " << \"}\";");
5223
5224 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5225 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5226 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5227 verifyFormat(
5228 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5229 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5230 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5231 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5232 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5233 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5234 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5235 verifyFormat(
5236 "void f() {\n"
5237 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5238 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5239 "}");
5240
5241 // Breaking before the first "<<" is generally not desirable.
5242 verifyFormat(
5243 "llvm::errs()\n"
5244 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5245 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5246 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5247 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5248 getLLVMStyleWithColumns(70));
5249 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5250 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5251 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5252 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5253 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5254 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5255 getLLVMStyleWithColumns(70));
5256
5257 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5258 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5259 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5260 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5261 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5262 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005263 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5264 " (aaaa + aaaa);",
5265 getLLVMStyleWithColumns(40));
5266 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5267 " (aaaaaaa + aaaaa));",
5268 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005269 verifyFormat(
5270 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5271 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5272 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005273}
5274
Daniel Jasperf7935112012-12-03 18:12:45 +00005275TEST_F(FormatTest, UnderstandsEquals) {
5276 verifyFormat(
5277 "aaaaaaaaaaaaaaaaa =\n"
5278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5279 verifyFormat(
5280 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005282 verifyFormat(
5283 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005284 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005285 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5287 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005288
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005289 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5290 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005291}
5292
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005293TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005294 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5295 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005296
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005297 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5298 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005299
5300 verifyFormat(
5301 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5302 " Parameter2);");
5303
5304 verifyFormat(
5305 "ShortObject->shortFunction(\n"
5306 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5307 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5308
5309 verifyFormat("loooooooooooooongFunction(\n"
5310 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5311
5312 verifyFormat(
5313 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5314 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5315
Daniel Jasper687af3b2013-02-14 14:26:07 +00005316 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5317 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005318 verifyFormat("void f() {\n"
5319 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5320 " .Times(2)\n"
5321 " .WillRepeatedly(Return(SomeValue));\n"
5322 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005323 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5324 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005325 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5327 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005328 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005329 verifyFormat("void f() {\n"
5330 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5331 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5332 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005333 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5335 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5336 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5337 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005338 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5339 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5340 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5341 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5342 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005343
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005344 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005345 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005346 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005347 verifyFormat(
5348 "aaaaaaaaaaa->aaaaaaaaa(\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5350 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005351
5352 verifyFormat(
5353 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005355 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5356 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5357 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5358 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005359
Daniel Jasper9b334242013-03-15 14:57:30 +00005360 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5362 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005363
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005364 FormatStyle NoBinPacking = getLLVMStyle();
5365 NoBinPacking.BinPackParameters = false;
5366 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5367 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5368 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5369 " aaaaaaaaaaaaaaaaaaa,\n"
5370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5371 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005372
5373 // If there is a subsequent call, change to hanging indentation.
5374 verifyFormat(
5375 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5376 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5377 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5378 verifyFormat(
5379 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5380 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005381 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5383 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5384 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5386 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005387}
5388
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005389TEST_F(FormatTest, WrapsTemplateDeclarations) {
5390 verifyFormat("template <typename T>\n"
5391 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005392 verifyFormat("template <typename T>\n"
5393 "// T should be one of {A, B}.\n"
5394 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005395 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005396 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005397 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005398 verifyFormat("template <typename T>\n"
5399 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5400 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005401 verifyFormat(
5402 "template <typename T>\n"
5403 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5404 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005405 verifyFormat(
5406 "template <typename T>\n"
5407 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5408 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5409 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005410 verifyFormat("template <typename T>\n"
5411 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005412 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005413 verifyFormat(
5414 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5415 " typename T4 = char>\n"
5416 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005417 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5418 " template <typename> class cccccccccccccccccccccc,\n"
5419 " typename ddddddddddddd>\n"
5420 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005421 verifyFormat(
5422 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005424
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005425 verifyFormat("void f() {\n"
5426 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5427 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5428 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005429
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005430 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005431 verifyFormat("template <typename T> void f();");
5432 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005433 verifyFormat(
5434 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5437 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5440 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5441 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005442 EXPECT_EQ("static_cast<A< //\n"
5443 " B> *>(\n"
5444 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005445 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005446 format("static_cast<A<//\n"
5447 " B>*>(\n"
5448 "\n"
5449 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005450 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5451 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005452
5453 FormatStyle AlwaysBreak = getLLVMStyle();
5454 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5455 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5456 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5457 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5458 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5459 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5460 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5461 verifyFormat("template <template <typename> class Fooooooo,\n"
5462 " template <typename> class Baaaaaaar>\n"
5463 "struct C {};",
5464 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005465 verifyFormat("template <typename T> // T can be A, B or C.\n"
5466 "struct C {};",
5467 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005468 verifyFormat("template <enum E> class A {\n"
5469 "public:\n"
5470 " E *f();\n"
5471 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005472}
5473
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005474TEST_F(FormatTest, WrapsTemplateParameters) {
5475 FormatStyle Style = getLLVMStyle();
5476 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5477 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5478 verifyFormat(
5479 "template <typename... a> struct q {};\n"
5480 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5481 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5482 " y;",
5483 Style);
5484 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5485 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5486 verifyFormat(
5487 "template <typename... a> struct r {};\n"
5488 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5489 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5490 " y;",
5491 Style);
5492 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5493 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5494 verifyFormat(
5495 "template <typename... a> struct s {};\n"
5496 "extern s<\n"
5497 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5498 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5499 " y;",
5500 Style);
5501 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5502 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5503 verifyFormat(
5504 "template <typename... a> struct t {};\n"
5505 "extern t<\n"
5506 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5507 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5508 " y;",
5509 Style);
5510}
5511
Daniel Jasper45797022013-01-25 10:57:27 +00005512TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5513 verifyFormat(
5514 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5515 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5516 verifyFormat(
5517 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5520
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005521 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005522 verifyFormat(
5523 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5524 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005525 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005526
Daniel Jasper45797022013-01-25 10:57:27 +00005527 verifyFormat(
5528 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005529 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005530
5531 // Breaking at nested name specifiers is generally not desirable.
5532 verifyFormat(
5533 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5534 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005535
5536 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005537 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005540 " aaaaaaaaaaaaaaaaaaaaa);",
5541 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005542
5543 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5545 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005546}
5547
Daniel Jasperf7935112012-12-03 18:12:45 +00005548TEST_F(FormatTest, UnderstandsTemplateParameters) {
5549 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005550 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005551 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5552 verifyFormat("bool x = a < 1 || 2 > a;");
5553 verifyFormat("bool x = 5 < f<int>();");
5554 verifyFormat("bool x = f<int>() > 5;");
5555 verifyFormat("bool x = 5 < a<int>::x;");
5556 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5557 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5558
5559 verifyGoogleFormat("A<A<int>> a;");
5560 verifyGoogleFormat("A<A<A<int>>> a;");
5561 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005562 verifyGoogleFormat("A<A<int> > a;");
5563 verifyGoogleFormat("A<A<A<int> > > a;");
5564 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005565 verifyGoogleFormat("A<::A<int>> a;");
5566 verifyGoogleFormat("A<::A> a;");
5567 verifyGoogleFormat("A< ::A> a;");
5568 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005569 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5570 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005571 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5572 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005573 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5574 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005575
Nico Weber7533b4d2014-09-24 17:17:32 +00005576 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5577
Daniel Jasperf7935112012-12-03 18:12:45 +00005578 verifyFormat("test >> a >> b;");
5579 verifyFormat("test << a >> b;");
5580
5581 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005582 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005583 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005584 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5585 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005586 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005587 verifyFormat("f(a.operator()<A>());");
5588 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5589 " .template operator()<A>());",
5590 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005591
5592 // Not template parameters.
5593 verifyFormat("return a < b && c > d;");
5594 verifyFormat("void f() {\n"
5595 " while (a < b && c > d) {\n"
5596 " }\n"
5597 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005598 verifyFormat("template <typename... Types>\n"
5599 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005600
5601 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5603 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005604 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005605 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005606 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005607}
5608
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005609TEST_F(FormatTest, BitshiftOperatorWidth) {
5610 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5611 " bar */",
5612 format("int a=1<<2; /* foo\n"
5613 " bar */"));
5614
5615 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5616 " bar */",
5617 format("int b =256>>1 ; /* foo\n"
5618 " bar */"));
5619}
5620
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005621TEST_F(FormatTest, UnderstandsBinaryOperators) {
5622 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005623 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005624}
5625
5626TEST_F(FormatTest, UnderstandsPointersToMembers) {
5627 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005628 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005629 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005630 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005631 verifyFormat("void f() {\n"
5632 " (a->*f)();\n"
5633 " a->*x;\n"
5634 " (a.*f)();\n"
5635 " ((*a).*f)();\n"
5636 " a.*x;\n"
5637 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005638 verifyFormat("void f() {\n"
5639 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5640 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5641 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005642 verifyFormat(
5643 "(aaaaaaaaaa->*bbbbbbb)(\n"
5644 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005645 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005646 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005647 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005648}
5649
Daniel Jasper8dd40472012-12-21 09:41:31 +00005650TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005651 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005652 verifyFormat("f(-1, -2, -3);");
5653 verifyFormat("a[-1] = 5;");
5654 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005655 verifyFormat("if (i == -1) {\n}");
5656 verifyFormat("if (i != -1) {\n}");
5657 verifyFormat("if (i > -1) {\n}");
5658 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005659 verifyFormat("++(a->f());");
5660 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005661 verifyFormat("(a->f())++;");
5662 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005663 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005664 verifyFormat("if (!+i) {\n}");
5665 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005666
5667 verifyFormat("a-- > b;");
5668 verifyFormat("b ? -a : c;");
5669 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005670 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005671 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005672 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005673
5674 verifyFormat("return -1;");
5675 verifyFormat("switch (a) {\n"
5676 "case -1:\n"
5677 " break;\n"
5678 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005679 verifyFormat("#define X -1");
5680 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005681
Chandler Carruthf8b72662014-03-02 12:37:31 +00005682 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5683 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005684
5685 verifyFormat("int a = /* confusing comment */ -1;");
5686 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5687 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005688}
5689
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005690TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005691 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005692 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005693 "}");
5694 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005695 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005696 verifyFormat("*aaa = aaaaaaa( // break\n"
5697 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005698}
5699
Daniel Jasper8863ada2013-08-26 08:10:17 +00005700TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005701 verifyFormat("bool operator<();");
5702 verifyFormat("bool operator>();");
5703 verifyFormat("bool operator=();");
5704 verifyFormat("bool operator==();");
5705 verifyFormat("bool operator!=();");
5706 verifyFormat("int operator+();");
5707 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005708 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005709 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005710 verifyFormat("bool operator();");
5711 verifyFormat("bool operator()();");
5712 verifyFormat("bool operator[]();");
5713 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005714 verifyFormat("operator int();");
5715 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005716 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005717 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005718 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005719 verifyFormat("void *operator new(std::size_t size);");
5720 verifyFormat("void *operator new[](std::size_t size);");
5721 verifyFormat("void operator delete(void *ptr);");
5722 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005723 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5724 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005725 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005726 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005727
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005728 verifyFormat(
5729 "ostream &operator<<(ostream &OutputStream,\n"
5730 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005731 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5732 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5733 " return left.group < right.group;\n"
5734 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005735 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005736 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005737
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005738 verifyGoogleFormat("operator void*();");
5739 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005740 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005741
5742 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005743 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5744 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005745}
5746
Daniel Jasper1c220482015-02-25 10:30:06 +00005747TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005748 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5749 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5750 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5751 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5752 verifyFormat("Deleted &operator=(const Deleted &) &;");
5753 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5754 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5755 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5756 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5757 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5758 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005759 verifyFormat("void Fn(T const &) const &;");
5760 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005761 verifyFormat("template <typename T>\n"
5762 "void F(T) && = delete;",
5763 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005764
Daniel Jasperaf642c62015-08-25 13:40:51 +00005765 FormatStyle AlignLeft = getLLVMStyle();
5766 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005767 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005768 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5769 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5770 AlignLeft);
5771 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5772 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005773 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5774 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5775 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5776 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005777 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5778 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005779
5780 FormatStyle Spaces = getLLVMStyle();
5781 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005782 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5783 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5784 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5785 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005786
5787 Spaces.SpacesInCStyleCastParentheses = false;
5788 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005789 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5790 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5791 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5792 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005793}
5794
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005795TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005796 verifyFormat("void f() {\n"
5797 " A *a = new A;\n"
5798 " A *a = new (placement) A;\n"
5799 " delete a;\n"
5800 " delete (A *)a;\n"
5801 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005802 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5803 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005804 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5805 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5806 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005807 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005808}
5809
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005810TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005811 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005812 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005813 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005814 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005815 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005816 verifyIndependentOfContext("int a = b * 10;");
5817 verifyIndependentOfContext("int a = 10 * b;");
5818 verifyIndependentOfContext("int a = b * c;");
5819 verifyIndependentOfContext("int a += b * c;");
5820 verifyIndependentOfContext("int a -= b * c;");
5821 verifyIndependentOfContext("int a *= b * c;");
5822 verifyIndependentOfContext("int a /= b * c;");
5823 verifyIndependentOfContext("int a = *b;");
5824 verifyIndependentOfContext("int a = *b * c;");
5825 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005826 verifyIndependentOfContext("int a = b * (10);");
5827 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005828 verifyIndependentOfContext("return 10 * b;");
5829 verifyIndependentOfContext("return *b * *c;");
5830 verifyIndependentOfContext("return a & ~b;");
5831 verifyIndependentOfContext("f(b ? *c : *d);");
5832 verifyIndependentOfContext("int a = b ? *c : *d;");
5833 verifyIndependentOfContext("*b = a;");
5834 verifyIndependentOfContext("a * ~b;");
5835 verifyIndependentOfContext("a * !b;");
5836 verifyIndependentOfContext("a * +b;");
5837 verifyIndependentOfContext("a * -b;");
5838 verifyIndependentOfContext("a * ++b;");
5839 verifyIndependentOfContext("a * --b;");
5840 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005841 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005842 verifyIndependentOfContext("f() * b;");
5843 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005844 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005845 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005846 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005847 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005848 verifyIndependentOfContext("return sizeof(int **);");
5849 verifyIndependentOfContext("return sizeof(int ******);");
5850 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005851 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005852 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005853 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005854 verifyGoogleFormat("return sizeof(int**);");
5855 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5856 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005857 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005858 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005859 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005860 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005861 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005862 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005863 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005864 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005865 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005866 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005867 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005868 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005869 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005870 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005871 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005872 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005873 verifyFormat("void f(const MyOverride &override);");
5874 verifyFormat("void f(const MyFinal &final);");
5875 verifyIndependentOfContext("bool a = f() && override.f();");
5876 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005877
Daniel Jasper5b49f472013-01-23 12:10:53 +00005878 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005879
Daniel Jasper5b49f472013-01-23 12:10:53 +00005880 verifyIndependentOfContext("A<int *> a;");
5881 verifyIndependentOfContext("A<int **> a;");
5882 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005883 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005884 verifyIndependentOfContext(
5885 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005886 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005887 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005888 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005889 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005890 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005891
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005892 verifyFormat(
5893 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5895
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005896 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005897 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005898 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005899 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005900 verifyGoogleFormat("A<int*> a;");
5901 verifyGoogleFormat("A<int**> a;");
5902 verifyGoogleFormat("A<int*, int*> a;");
5903 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005904 verifyGoogleFormat("f(b ? *c : *d);");
5905 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005906 verifyGoogleFormat("Type* t = **x;");
5907 verifyGoogleFormat("Type* t = *++*x;");
5908 verifyGoogleFormat("*++*x;");
5909 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5910 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005911 verifyGoogleFormat(
5912 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005913 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005914 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5915 verifyGoogleFormat("template <typename T>\n"
5916 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005917
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005918 FormatStyle Left = getLLVMStyle();
5919 Left.PointerAlignment = FormatStyle::PAS_Left;
5920 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005921 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005922 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005923 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005924 verifyFormat("delete *x;", Left);
5925 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5926 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5927 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005928
Daniel Jasper5b49f472013-01-23 12:10:53 +00005929 verifyIndependentOfContext("a = *(x + y);");
5930 verifyIndependentOfContext("a = &(x + y);");
5931 verifyIndependentOfContext("*(x + y).call();");
5932 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005933 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005934
Daniel Jasper5b49f472013-01-23 12:10:53 +00005935 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005936 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005937 "int *MyValues = {\n"
5938 " *A, // Operator detection might be confused by the '{'\n"
5939 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005940 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005941
Daniel Jasper5b49f472013-01-23 12:10:53 +00005942 verifyIndependentOfContext("if (int *a = &b)");
5943 verifyIndependentOfContext("if (int &a = *b)");
5944 verifyIndependentOfContext("if (a & b[i])");
5945 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5946 verifyIndependentOfContext("if (*b[i])");
5947 verifyIndependentOfContext("if (int *a = (&b))");
5948 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005949 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005950 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005951 verifyFormat("void f() {\n"
5952 " for (const int &v : Values) {\n"
5953 " }\n"
5954 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005955 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5956 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005957 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005958
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005959 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005960 verifyFormat("#define MACRO \\\n"
5961 " int *i = a * b; \\\n"
5962 " void f(a *b);",
5963 getLLVMStyleWithColumns(19));
5964
Daniel Jasper97b89482013-03-13 07:49:51 +00005965 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005966 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005967 verifyIndependentOfContext("T **t = new T *;");
5968 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005969 verifyGoogleFormat("A = new SomeType*[Length]();");
5970 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005971 verifyGoogleFormat("T** t = new T*;");
5972 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005973
Daniel Jaspera65e8872014-03-25 10:52:45 +00005974 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5975 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005976 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005977 "typename t::if<x && y>::type f() {}");
5978 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005979 verifyFormat("vector<int *> v;");
5980 verifyFormat("vector<int *const> v;");
5981 verifyFormat("vector<int *const **const *> v;");
5982 verifyFormat("vector<int *volatile> v;");
5983 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005984 verifyFormat("foo<b && false>();");
5985 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005986 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005987 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005988 "template <class T, class = typename std::enable_if<\n"
5989 " std::is_integral<T>::value &&\n"
5990 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5991 "void F();",
5992 getLLVMStyleWithColumns(70));
5993 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005994 "template <class T,\n"
5995 " class = typename std::enable_if<\n"
5996 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005997 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5998 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005999 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006000 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006001 verifyFormat(
6002 "template <class T,\n"
6003 " class = typename ::std::enable_if<\n"
6004 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6005 "void F();",
6006 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006007
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006008 verifyIndependentOfContext("MACRO(int *i);");
6009 verifyIndependentOfContext("MACRO(auto *a);");
6010 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006011 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006012 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006013 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006014 // FIXME: Is there a way to make this work?
6015 // verifyIndependentOfContext("MACRO(A *a);");
6016
Daniel Jasper32ccb032014-06-23 07:36:18 +00006017 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006018 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006019
Daniel Jasper866468a2014-04-14 13:15:29 +00006020 EXPECT_EQ("#define OP(x) \\\n"
6021 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6022 " return s << a.DebugString(); \\\n"
6023 " }",
6024 format("#define OP(x) \\\n"
6025 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6026 " return s << a.DebugString(); \\\n"
6027 " }",
6028 getLLVMStyleWithColumns(50)));
6029
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006030 // FIXME: We cannot handle this case yet; we might be able to figure out that
6031 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006032 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006033
6034 FormatStyle PointerMiddle = getLLVMStyle();
6035 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6036 verifyFormat("delete *x;", PointerMiddle);
6037 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006038 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006039 verifyFormat("template <int * y> f() {}", PointerMiddle);
6040 verifyFormat("int * f(int * a) {}", PointerMiddle);
6041 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6042 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6043 verifyFormat("A<int *> a;", PointerMiddle);
6044 verifyFormat("A<int **> a;", PointerMiddle);
6045 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006046 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006047 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6048 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006049 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006050
6051 // Member function reference qualifiers aren't binary operators.
6052 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006053 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006054 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006055 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006056 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006057 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006058}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006059
Daniel Jasperee6d6502013-07-17 20:25:02 +00006060TEST_F(FormatTest, UnderstandsAttributes) {
6061 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006062 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6063 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006064 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006065 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006066 verifyFormat("__attribute__((nodebug)) void\n"
6067 "foo() {}\n",
6068 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006069}
6070
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006071TEST_F(FormatTest, UnderstandsSquareAttributes) {
6072 verifyFormat("SomeType s [[unused]] (InitValue);");
6073 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6074 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6075 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6076 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6077 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6078 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6079}
6080
Daniel Jasper10cd5812013-05-06 06:35:44 +00006081TEST_F(FormatTest, UnderstandsEllipsis) {
6082 verifyFormat("int printf(const char *fmt, ...);");
6083 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006084 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6085
6086 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006087 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006088 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006089}
6090
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006091TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006092 EXPECT_EQ("int *a;\n"
6093 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006094 "int *a;",
6095 format("int *a;\n"
6096 "int* a;\n"
6097 "int *a;",
6098 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006099 EXPECT_EQ("int* a;\n"
6100 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006101 "int* a;",
6102 format("int* a;\n"
6103 "int* a;\n"
6104 "int *a;",
6105 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006106 EXPECT_EQ("int *a;\n"
6107 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006108 "int *a;",
6109 format("int *a;\n"
6110 "int * a;\n"
6111 "int * a;",
6112 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006113 EXPECT_EQ("auto x = [] {\n"
6114 " int *a;\n"
6115 " int *a;\n"
6116 " int *a;\n"
6117 "};",
6118 format("auto x=[]{int *a;\n"
6119 "int * a;\n"
6120 "int * a;};",
6121 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006122}
6123
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006124TEST_F(FormatTest, UnderstandsRvalueReferences) {
6125 verifyFormat("int f(int &&a) {}");
6126 verifyFormat("int f(int a, char &&b) {}");
6127 verifyFormat("void f() { int &&a = b; }");
6128 verifyGoogleFormat("int f(int a, char&& b) {}");
6129 verifyGoogleFormat("void f() { int&& a = b; }");
6130
Daniel Jasper1eff9082013-05-27 16:36:33 +00006131 verifyIndependentOfContext("A<int &&> a;");
6132 verifyIndependentOfContext("A<int &&, int &&> a;");
6133 verifyGoogleFormat("A<int&&> a;");
6134 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006135
6136 // Not rvalue references:
6137 verifyFormat("template <bool B, bool C> class A {\n"
6138 " static_assert(B && C, \"Something is wrong\");\n"
6139 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006140 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6141 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006142 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006143}
6144
Manuel Klimekc1237a82013-01-23 14:08:21 +00006145TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6146 verifyFormat("void f() {\n"
6147 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006148 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006149 "}",
6150 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006151}
6152
Daniel Jasperef906a92013-01-13 08:01:36 +00006153TEST_F(FormatTest, FormatsCasts) {
6154 verifyFormat("Type *A = static_cast<Type *>(P);");
6155 verifyFormat("Type *A = (Type *)P;");
6156 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6157 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006158 verifyFormat("int a = (int)2.0f;");
6159 verifyFormat("x[(int32)y];");
6160 verifyFormat("x = (int32)y;");
6161 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6162 verifyFormat("int a = (int)*b;");
6163 verifyFormat("int a = (int)2.0f;");
6164 verifyFormat("int a = (int)~0;");
6165 verifyFormat("int a = (int)++a;");
6166 verifyFormat("int a = (int)sizeof(int);");
6167 verifyFormat("int a = (int)+2;");
6168 verifyFormat("my_int a = (my_int)2.0f;");
6169 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006170 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006171 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006172 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006173 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006174 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006175
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006176 verifyFormat("void f() { my_int a = (my_int)*b; }");
6177 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6178 verifyFormat("my_int a = (my_int)~0;");
6179 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006180 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006181 verifyFormat("my_int a = (my_int)1;");
6182 verifyFormat("my_int a = (my_int *)1;");
6183 verifyFormat("my_int a = (const my_int)-1;");
6184 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006185 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006186 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006187 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006188 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006189
6190 // FIXME: single value wrapped with paren will be treated as cast.
6191 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006192
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006193 verifyFormat("{ (void)F; }");
6194
Daniel Jasper998cabc2013-07-18 14:46:07 +00006195 // Don't break after a cast's
6196 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6197 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6198 " bbbbbbbbbbbbbbbbbbbbbb);");
6199
Daniel Jasperef906a92013-01-13 08:01:36 +00006200 // These are not casts.
6201 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006202 verifyFormat("f(foo)->b;");
6203 verifyFormat("f(foo).b;");
6204 verifyFormat("f(foo)(b);");
6205 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006206 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006207 verifyFormat("(*funptr)(foo)[4];");
6208 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006209 verifyFormat("void f(int *);");
6210 verifyFormat("void f(int *) = 0;");
6211 verifyFormat("void f(SmallVector<int>) {}");
6212 verifyFormat("void f(SmallVector<int>);");
6213 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006214 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006215 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006216 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006217 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6218 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006219 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006220
Daniel Jasperba0bda92013-02-23 08:07:18 +00006221 // These are not casts, but at some point were confused with casts.
6222 verifyFormat("virtual void foo(int *) override;");
6223 verifyFormat("virtual void foo(char &) const;");
6224 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006225 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006226 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006227 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006228 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006229
6230 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6231 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006232 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006233 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006234 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6235 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6236 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006237}
6238
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006239TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006240 verifyFormat("A<bool()> a;");
6241 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006242 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006243 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006244 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006245 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006246 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006247 verifyFormat("template <class CallbackClass>\n"
6248 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006249
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006250 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6251 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006252 verifyGoogleFormat(
6253 "template <class CallbackClass>\n"
6254 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006255
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006256 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006257 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006258 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006259 verifyFormat("some_var = function(*some_pointer_var)[0];");
6260 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006261 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006262 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006263 verifyFormat("std::function<\n"
6264 " LooooooooooongTemplatedType<\n"
6265 " SomeType>*(\n"
6266 " LooooooooooooooooongType type)>\n"
6267 " function;",
6268 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006269}
6270
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006271TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6272 verifyFormat("A (*foo_)[6];");
6273 verifyFormat("vector<int> (*foo_)[6];");
6274}
6275
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006276TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6277 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6278 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6279 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6280 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006281 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6282 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006283
6284 // Different ways of ()-initializiation.
6285 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6286 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6287 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6288 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6289 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6290 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006291 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6292 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006293
6294 // Lambdas should not confuse the variable declaration heuristic.
6295 verifyFormat("LooooooooooooooooongType\n"
6296 " variable(nullptr, [](A *a) {});",
6297 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006298}
6299
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006300TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006301 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006302 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006303 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006305 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006306 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006307 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6308 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006309 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6310 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006311 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6312 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006313 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6314 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006315 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6316 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006317 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6318 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6319 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6320 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006321 FormatStyle Indented = getLLVMStyle();
6322 Indented.IndentWrappedFunctionNames = true;
6323 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6324 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6325 Indented);
6326 verifyFormat(
6327 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6328 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6329 Indented);
6330 verifyFormat(
6331 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6332 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6333 Indented);
6334 verifyFormat(
6335 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6336 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6337 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006338
6339 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006340 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6341 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6342 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006343
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006344 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006345 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006346 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006347 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6348 " SourceLocation L, IdentifierIn *II,\n"
6349 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006350 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006351 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006352 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006353 " const SomeType<string, SomeOtherTemplateParameter>\n"
6354 " &ReallyReallyLongParameterName,\n"
6355 " const SomeType<string, SomeOtherTemplateParameter>\n"
6356 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006357 verifyFormat("template <typename A>\n"
6358 "SomeLoooooooooooooooooooooongType<\n"
6359 " typename some_namespace::SomeOtherType<A>::Type>\n"
6360 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006361
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006362 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006363 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6364 " aaaaaaaaaaaaaaaaaaaaaaa;");
6365 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006366 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6367 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006368 verifyGoogleFormat(
6369 "some_namespace::LongReturnType\n"
6370 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006371 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006372
6373 verifyGoogleFormat("template <typename T>\n"
6374 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006375 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006376 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6377 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006378
6379 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006380 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6381 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006382 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6383 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6384 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6385 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6386 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006389
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006390 verifyFormat("template <typename T> // Templates on own line.\n"
6391 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006392 "MyFunction(int a);",
6393 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006394}
6395
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006396TEST_F(FormatTest, FormatsArrays) {
6397 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6398 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006399 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6400 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006401 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6402 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006403 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6404 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6405 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6406 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6407 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6408 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6409 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6410 verifyFormat(
6411 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6412 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6413 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6415 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006416
6417 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006419 verifyFormat(
6420 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6421 " .aaaaaaa[0]\n"
6422 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006423 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006424
6425 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006426
6427 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6428 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006429}
6430
Daniel Jaspere9de2602012-12-06 09:56:08 +00006431TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6432 verifyFormat("(a)->b();");
6433 verifyFormat("--a;");
6434}
6435
Daniel Jasper8b529712012-12-04 13:02:32 +00006436TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006437 verifyFormat("#include <string>\n"
6438 "#include <a/b/c.h>\n"
6439 "#include \"a/b/string\"\n"
6440 "#include \"string.h\"\n"
6441 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006442 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006443 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006444 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006445 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006446 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006447 "#include \"some very long include path\"\n"
6448 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006449 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006450 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6451 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006452
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006453 verifyFormat("#import <string>");
6454 verifyFormat("#import <a/b/c.h>");
6455 verifyFormat("#import \"a/b/string\"");
6456 verifyFormat("#import \"string.h\"");
6457 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006458 verifyFormat("#if __has_include(<strstream>)\n"
6459 "#include <strstream>\n"
6460 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006461
Daniel Jasper343643b2014-08-13 08:29:18 +00006462 verifyFormat("#define MY_IMPORT <a/b>");
6463
Nico Weber21088802017-02-10 19:36:52 +00006464 verifyFormat("#if __has_include(<a/b>)");
6465 verifyFormat("#if __has_include_next(<a/b>)");
6466 verifyFormat("#define F __has_include(<a/b>)");
6467 verifyFormat("#define F __has_include_next(<a/b>)");
6468
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006469 // Protocol buffer definition or missing "#".
6470 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6471 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006472
6473 FormatStyle Style = getLLVMStyle();
6474 Style.AlwaysBreakBeforeMultilineStrings = true;
6475 Style.ColumnLimit = 0;
6476 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006477
6478 // But 'import' might also be a regular C++ namespace.
6479 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006481}
6482
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006483//===----------------------------------------------------------------------===//
6484// Error recovery tests.
6485//===----------------------------------------------------------------------===//
6486
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006487TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006488 FormatStyle NoBinPacking = getLLVMStyle();
6489 NoBinPacking.BinPackParameters = false;
6490 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6491 " double *min_x,\n"
6492 " double *max_x,\n"
6493 " double *min_y,\n"
6494 " double *max_y,\n"
6495 " double *min_z,\n"
6496 " double *max_z, ) {}",
6497 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006498}
6499
Daniel Jasper83a54d22013-01-10 09:26:47 +00006500TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006501 verifyFormat("void f() { return; }\n42");
6502 verifyFormat("void f() {\n"
6503 " if (0)\n"
6504 " return;\n"
6505 "}\n"
6506 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006507 verifyFormat("void f() { return }\n42");
6508 verifyFormat("void f() {\n"
6509 " if (0)\n"
6510 " return\n"
6511 "}\n"
6512 "42");
6513}
6514
6515TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6516 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6517 EXPECT_EQ("void f() {\n"
6518 " if (a)\n"
6519 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006520 "}",
6521 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006522 EXPECT_EQ("namespace N {\n"
6523 "void f()\n"
6524 "}",
6525 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006526 EXPECT_EQ("namespace N {\n"
6527 "void f() {}\n"
6528 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006529 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006530 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006531}
6532
Daniel Jasper2df93312013-01-09 10:16:05 +00006533TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6534 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006535 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006536 " b;",
6537 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006538 verifyFormat("function(\n"
6539 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006540 " LoooooooooooongArgument);\n",
6541 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006542}
6543
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006544TEST_F(FormatTest, IncorrectAccessSpecifier) {
6545 verifyFormat("public:");
6546 verifyFormat("class A {\n"
6547 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006548 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006549 "};");
6550 verifyFormat("public\n"
6551 "int qwerty;");
6552 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006553 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006554 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006555 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006556 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006557 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006558}
Daniel Jasperf7935112012-12-03 18:12:45 +00006559
Daniel Jasper291f9362013-03-20 15:58:10 +00006560TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6561 verifyFormat("{");
6562 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006563 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006564}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006565
6566TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006567 verifyFormat("do {\n}");
6568 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006569 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006570 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006571 "wheeee(fun);");
6572 verifyFormat("do {\n"
6573 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006574 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006575}
6576
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006577TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006578 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006579 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006580 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006581 verifyFormat("while {\n foo;\n foo();\n}");
6582 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006583}
6584
Daniel Jasperc0880a92013-01-04 18:52:56 +00006585TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006586 verifyIncompleteFormat("namespace {\n"
6587 "class Foo { Foo (\n"
6588 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006589 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006590}
6591
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006592TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006593 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006594 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6595 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006596 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006597
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006598 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006599 " {\n"
6600 " breakme(\n"
6601 " qwe);\n"
6602 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006603 format("{\n"
6604 " {\n"
6605 " breakme(qwe);\n"
6606 "}\n",
6607 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006608}
6609
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006610TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006611 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006612 " avariable,\n"
6613 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006614 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006615}
6616
Manuel Klimek762dd182013-01-21 10:07:49 +00006617TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006618 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006619}
6620
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006621TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006622 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006623 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006624 " 1,\n"
6625 " 2,\n"
6626 " 3,\n"
6627 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006628 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006629 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6630 verifyFormat("f({1, 2});");
6631 verifyFormat("auto v = Foo{-1};");
6632 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6633 verifyFormat("Class::Class : member{1, 2, 3} {}");
6634 verifyFormat("new vector<int>{1, 2, 3};");
6635 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006636 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006637 verifyFormat("return {arg1, arg2};");
6638 verifyFormat("return {arg1, SomeType{parameter}};");
6639 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6640 verifyFormat("new T{arg1, arg2};");
6641 verifyFormat("f(MyMap[{composite, key}]);");
6642 verifyFormat("class Class {\n"
6643 " T member = {arg1, arg2};\n"
6644 "};");
6645 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006646 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6647 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006648 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6649 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006650
Daniel Jasper438059e2014-05-22 12:11:13 +00006651 verifyFormat("int foo(int i) { return fo1{}(i); }");
6652 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006653 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006654 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006655 verifyFormat("Node n{1, Node{1000}, //\n"
6656 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006657 verifyFormat("Aaaa aaaaaaa{\n"
6658 " {\n"
6659 " aaaa,\n"
6660 " },\n"
6661 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006662 verifyFormat("class C : public D {\n"
6663 " SomeClass SC{2};\n"
6664 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006665 verifyFormat("class C : public A {\n"
6666 " class D : public B {\n"
6667 " void f() { int i{2}; }\n"
6668 " };\n"
6669 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006670 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006671
Francois Ferrandd2130f52017-06-30 20:00:02 +00006672 // Binpacking only if there is no trailing comma
6673 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6674 " cccccccccc, dddddddddd};",
6675 getLLVMStyleWithColumns(50));
6676 verifyFormat("const Aaaaaa aaaaa = {\n"
6677 " aaaaaaaaaaa,\n"
6678 " bbbbbbbbbbb,\n"
6679 " ccccccccccc,\n"
6680 " ddddddddddd,\n"
6681 "};", getLLVMStyleWithColumns(50));
6682
Daniel Jaspere4ada022016-12-13 10:05:03 +00006683 // Cases where distinguising braced lists and blocks is hard.
6684 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6685 verifyFormat("void f() {\n"
6686 " return; // comment\n"
6687 "}\n"
6688 "SomeType t;");
6689 verifyFormat("void f() {\n"
6690 " if (a) {\n"
6691 " f();\n"
6692 " }\n"
6693 "}\n"
6694 "SomeType t;");
6695
Daniel Jasper08434342015-05-26 07:26:26 +00006696 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006697 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006698 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006699 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6700 " bbbbb,\n"
6701 " ccccc,\n"
6702 " ddddd,\n"
6703 " eeeee,\n"
6704 " ffffff,\n"
6705 " ggggg,\n"
6706 " hhhhhh,\n"
6707 " iiiiii,\n"
6708 " jjjjjj,\n"
6709 " kkkkkk};",
6710 NoBinPacking);
6711 verifyFormat("const Aaaaaa aaaaa = {\n"
6712 " aaaaa,\n"
6713 " bbbbb,\n"
6714 " ccccc,\n"
6715 " ddddd,\n"
6716 " eeeee,\n"
6717 " ffffff,\n"
6718 " ggggg,\n"
6719 " hhhhhh,\n"
6720 " iiiiii,\n"
6721 " jjjjjj,\n"
6722 " kkkkkk,\n"
6723 "};",
6724 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006725 verifyFormat(
6726 "const Aaaaaa aaaaa = {\n"
6727 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6728 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6729 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6730 "};",
6731 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006732
Chandler Carruthf8b72662014-03-02 12:37:31 +00006733 // FIXME: The alignment of these trailing comments might be bad. Then again,
6734 // this might be utterly useless in real code.
6735 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006736 " : some_value{ //\n"
6737 " aaaaaaa, //\n"
6738 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006739
Chandler Carruthf8b72662014-03-02 12:37:31 +00006740 // In braced lists, the first comment is always assumed to belong to the
6741 // first element. Thus, it can be moved to the next or previous line as
6742 // appropriate.
6743 EXPECT_EQ("function({// First element:\n"
6744 " 1,\n"
6745 " // Second element:\n"
6746 " 2});",
6747 format("function({\n"
6748 " // First element:\n"
6749 " 1,\n"
6750 " // Second element:\n"
6751 " 2});"));
6752 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6753 " // First element:\n"
6754 " 1,\n"
6755 " // Second element:\n"
6756 " 2};",
6757 format("std::vector<int> MyNumbers{// First element:\n"
6758 " 1,\n"
6759 " // Second element:\n"
6760 " 2};",
6761 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006762 // A trailing comma should still lead to an enforced line break and no
6763 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006764 EXPECT_EQ("vector<int> SomeVector = {\n"
6765 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006766 " 1,\n"
6767 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006768 "};",
6769 format("vector<int> SomeVector = { // aaa\n"
6770 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006771
Chandler Carruthf8b72662014-03-02 12:37:31 +00006772 FormatStyle ExtraSpaces = getLLVMStyle();
6773 ExtraSpaces.Cpp11BracedListStyle = false;
6774 ExtraSpaces.ColumnLimit = 75;
6775 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6776 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6777 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6778 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6779 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6780 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6781 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6782 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6783 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6784 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6785 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6786 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6787 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6788 verifyFormat("class Class {\n"
6789 " T member = { arg1, arg2 };\n"
6790 "};",
6791 ExtraSpaces);
6792 verifyFormat(
6793 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6794 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6795 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6796 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6797 ExtraSpaces);
6798 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006799 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006800 ExtraSpaces);
6801 verifyFormat(
6802 "someFunction(OtherParam,\n"
6803 " BracedList{ // comment 1 (Forcing interesting break)\n"
6804 " param1, param2,\n"
6805 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006806 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006807 ExtraSpaces);
6808 verifyFormat(
6809 "std::this_thread::sleep_for(\n"
6810 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6811 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006812 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006813 " aaaaaaa,\n"
6814 " aaaaaaaaaa,\n"
6815 " aaaaa,\n"
6816 " aaaaaaaaaaaaaaa,\n"
6817 " aaa,\n"
6818 " aaaaaaaaaa,\n"
6819 " a,\n"
6820 " aaaaaaaaaaaaaaaaaaaaa,\n"
6821 " aaaaaaaaaaaa,\n"
6822 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6823 " aaaaaaa,\n"
6824 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006825 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006826 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6827 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006828}
6829
Daniel Jasper33b909c2013-10-25 14:29:37 +00006830TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006831 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6832 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6833 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6834 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6835 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6836 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006837 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006838 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006839 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006840 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6841 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006842 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006843 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6844 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6845 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6846 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6847 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6848 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6849 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006850 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006851 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6852 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006853 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6854 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6855 " // Separating comment.\n"
6856 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6857 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6858 " // Leading comment\n"
6859 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6860 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006861 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6862 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006863 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006864 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6865 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006866 getLLVMStyleWithColumns(38));
6867 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006868 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6869 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006870 verifyFormat(
6871 "static unsigned SomeValues[10][3] = {\n"
6872 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6873 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6874 verifyFormat("static auto fields = new vector<string>{\n"
6875 " \"aaaaaaaaaaaaa\",\n"
6876 " \"aaaaaaaaaaaaa\",\n"
6877 " \"aaaaaaaaaaaa\",\n"
6878 " \"aaaaaaaaaaaaaa\",\n"
6879 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6880 " \"aaaaaaaaaaaa\",\n"
6881 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6882 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006883 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6884 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6885 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6886 " 3, cccccccccccccccccccccc};",
6887 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006888
6889 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006890 verifyFormat("vector<int> x = {\n"
6891 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6892 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006893 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006894 verifyFormat("vector<int> x = {\n"
6895 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006896 "};",
6897 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006898 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6899 " 1, 1, 1, 1,\n"
6900 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006901 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006902
Daniel Jasper60c27072015-05-13 08:16:00 +00006903 // Trailing comment in the first line.
6904 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6905 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6906 " 111111111, 222222222, 3333333333, 444444444, //\n"
6907 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006908 // Trailing comment in the last line.
6909 verifyFormat("int aaaaa[] = {\n"
6910 " 1, 2, 3, // comment\n"
6911 " 4, 5, 6 // comment\n"
6912 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006913
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006914 // With nested lists, we should either format one item per line or all nested
6915 // lists one on line.
6916 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006917 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6918 " {aaaaaaaaaaaaaaaaaaa},\n"
6919 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6920 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006921 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006922 verifyFormat(
6923 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006924 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6925 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6926 " {aaa, aaa},\n"
6927 " {aaa, aaa},\n"
6928 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6929 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6930 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006931
6932 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006933 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006934 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006935
6936 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006937
Daniel Jaspereb65e912015-12-21 18:31:15 +00006938 // No braced initializer here.
6939 verifyFormat("void f() {\n"
6940 " struct Dummy {};\n"
6941 " f(v);\n"
6942 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006943
6944 // Long lists should be formatted in columns even if they are nested.
6945 verifyFormat(
6946 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6947 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6948 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6949 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6950 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6951 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006952
6953 // Allow "single-column" layout even if that violates the column limit. There
6954 // isn't going to be a better way.
6955 verifyFormat("std::vector<int> a = {\n"
6956 " aaaaaaaa,\n"
6957 " aaaaaaaa,\n"
6958 " aaaaaaaa,\n"
6959 " aaaaaaaa,\n"
6960 " aaaaaaaaaa,\n"
6961 " aaaaaaaa,\n"
6962 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6963 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006964 verifyFormat("vector<int> aaaa = {\n"
6965 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6966 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6967 " aaaaaa.aaaaaaa,\n"
6968 " aaaaaa.aaaaaaa,\n"
6969 " aaaaaa.aaaaaaa,\n"
6970 " aaaaaa.aaaaaaa,\n"
6971 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006972
6973 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006974 verifyFormat("someFunction(Param, {List1, List2,\n"
6975 " List3});",
6976 getLLVMStyleWithColumns(35));
6977 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006978 " {List1, List2,\n"
6979 " List3});",
6980 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006981 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6982 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006983}
6984
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006985TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006986 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006987 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006988
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006989 verifyFormat("void f() { return 42; }");
6990 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006991 " return 42;\n"
6992 "}",
6993 DoNotMerge);
6994 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006995 " // Comment\n"
6996 "}");
6997 verifyFormat("{\n"
6998 "#error {\n"
6999 " int a;\n"
7000 "}");
7001 verifyFormat("{\n"
7002 " int a;\n"
7003 "#error {\n"
7004 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007005 verifyFormat("void f() {} // comment");
7006 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007007 verifyFormat("void f() {\n"
7008 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007009 DoNotMerge);
7010 verifyFormat("void f() {\n"
7011 " int a;\n"
7012 "} // comment",
7013 DoNotMerge);
7014 verifyFormat("void f() {\n"
7015 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007016 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007017
7018 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7019 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7020
7021 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7022 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007023 verifyFormat("class C {\n"
7024 " C()\n"
7025 " : iiiiiiii(nullptr),\n"
7026 " kkkkkkk(nullptr),\n"
7027 " mmmmmmm(nullptr),\n"
7028 " nnnnnnn(nullptr) {}\n"
7029 "};",
7030 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007031
7032 FormatStyle NoColumnLimit = getLLVMStyle();
7033 NoColumnLimit.ColumnLimit = 0;
7034 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7035 EXPECT_EQ("class C {\n"
7036 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007037 "};",
7038 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007039 EXPECT_EQ("A()\n"
7040 " : b(0) {\n"
7041 "}",
7042 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7043
7044 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007045 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7046 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007047 EXPECT_EQ("A()\n"
7048 " : b(0) {\n"
7049 "}",
7050 format("A():b(0){}", DoNotMergeNoColumnLimit));
7051 EXPECT_EQ("A()\n"
7052 " : b(0) {\n"
7053 "}",
7054 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007055
7056 verifyFormat("#define A \\\n"
7057 " void f() { \\\n"
7058 " int i; \\\n"
7059 " }",
7060 getLLVMStyleWithColumns(20));
7061 verifyFormat("#define A \\\n"
7062 " void f() { int i; }",
7063 getLLVMStyleWithColumns(21));
7064 verifyFormat("#define A \\\n"
7065 " void f() { \\\n"
7066 " int i; \\\n"
7067 " } \\\n"
7068 " int j;",
7069 getLLVMStyleWithColumns(22));
7070 verifyFormat("#define A \\\n"
7071 " void f() { int i; } \\\n"
7072 " int j;",
7073 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007074}
7075
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007076TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7077 FormatStyle MergeEmptyOnly = getLLVMStyle();
7078 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7079 verifyFormat("class C {\n"
7080 " int f() {}\n"
7081 "};",
7082 MergeEmptyOnly);
7083 verifyFormat("class C {\n"
7084 " int f() {\n"
7085 " return 42;\n"
7086 " }\n"
7087 "};",
7088 MergeEmptyOnly);
7089 verifyFormat("int f() {}", MergeEmptyOnly);
7090 verifyFormat("int f() {\n"
7091 " return 42;\n"
7092 "}",
7093 MergeEmptyOnly);
7094
7095 // Also verify behavior when BraceWrapping.AfterFunction = true
7096 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7097 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7098 verifyFormat("int f() {}", MergeEmptyOnly);
7099 verifyFormat("class C {\n"
7100 " int f() {}\n"
7101 "};",
7102 MergeEmptyOnly);
7103}
7104
Daniel Jasperd74cf402014-04-08 12:46:38 +00007105TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7106 FormatStyle MergeInlineOnly = getLLVMStyle();
7107 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7108 verifyFormat("class C {\n"
7109 " int f() { return 42; }\n"
7110 "};",
7111 MergeInlineOnly);
7112 verifyFormat("int f() {\n"
7113 " return 42;\n"
7114 "}",
7115 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007116
7117 // SFS_Inline implies SFS_Empty
7118 verifyFormat("class C {\n"
7119 " int f() {}\n"
7120 "};",
7121 MergeInlineOnly);
7122 verifyFormat("int f() {}", MergeInlineOnly);
7123
7124 // Also verify behavior when BraceWrapping.AfterFunction = true
7125 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7126 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7127 verifyFormat("class C {\n"
7128 " int f() { return 42; }\n"
7129 "};",
7130 MergeInlineOnly);
7131 verifyFormat("int f()\n"
7132 "{\n"
7133 " return 42;\n"
7134 "}",
7135 MergeInlineOnly);
7136
7137 // SFS_Inline implies SFS_Empty
7138 verifyFormat("int f() {}", MergeInlineOnly);
7139 verifyFormat("class C {\n"
7140 " int f() {}\n"
7141 "};",
7142 MergeInlineOnly);
7143}
7144
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007145TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7146 FormatStyle MergeInlineOnly = getLLVMStyle();
7147 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7148 FormatStyle::SFS_InlineOnly;
7149 verifyFormat("class C {\n"
7150 " int f() { return 42; }\n"
7151 "};",
7152 MergeInlineOnly);
7153 verifyFormat("int f() {\n"
7154 " return 42;\n"
7155 "}",
7156 MergeInlineOnly);
7157
7158 // SFS_InlineOnly does not imply SFS_Empty
7159 verifyFormat("class C {\n"
7160 " int f() {}\n"
7161 "};",
7162 MergeInlineOnly);
7163 verifyFormat("int f() {\n"
7164 "}",
7165 MergeInlineOnly);
7166
7167 // Also verify behavior when BraceWrapping.AfterFunction = true
7168 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7169 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7170 verifyFormat("class C {\n"
7171 " int f() { return 42; }\n"
7172 "};",
7173 MergeInlineOnly);
7174 verifyFormat("int f()\n"
7175 "{\n"
7176 " return 42;\n"
7177 "}",
7178 MergeInlineOnly);
7179
7180 // SFS_InlineOnly does not imply SFS_Empty
7181 verifyFormat("int f()\n"
7182 "{\n"
7183 "}",
7184 MergeInlineOnly);
7185 verifyFormat("class C {\n"
7186 " int f() {}\n"
7187 "};",
7188 MergeInlineOnly);
7189}
7190
Francois Ferrandad722562017-06-30 20:25:55 +00007191TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007192 FormatStyle Style = getLLVMStyle();
7193 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7194 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7195 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007196 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007197 Style.ColumnLimit = 40;
7198
7199 verifyFormat("int f()\n"
7200 "{}",
7201 Style);
7202 verifyFormat("int f()\n"
7203 "{\n"
7204 " return 42;\n"
7205 "}",
7206 Style);
7207 verifyFormat("int f()\n"
7208 "{\n"
7209 " // some comment\n"
7210 "}",
7211 Style);
7212
7213 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7214 verifyFormat("int f() {}", Style);
7215 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7216 "{}",
7217 Style);
7218 verifyFormat("int f()\n"
7219 "{\n"
7220 " return 0;\n"
7221 "}",
7222 Style);
7223
7224 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7225 verifyFormat("class Foo {\n"
7226 " int f() {}\n"
7227 "};\n",
7228 Style);
7229 verifyFormat("class Foo {\n"
7230 " int f() { return 0; }\n"
7231 "};\n",
7232 Style);
7233 verifyFormat("class Foo {\n"
7234 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7235 " {}\n"
7236 "};\n",
7237 Style);
7238 verifyFormat("class Foo {\n"
7239 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7240 " {\n"
7241 " return 0;\n"
7242 " }\n"
7243 "};\n",
7244 Style);
7245
7246 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7247 verifyFormat("int f() {}", Style);
7248 verifyFormat("int f() { return 0; }", Style);
7249 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7250 "{}",
7251 Style);
7252 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7253 "{\n"
7254 " return 0;\n"
7255 "}",
7256 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007257}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007258TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7259 FormatStyle Style = getLLVMStyle();
7260 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7261 verifyFormat("#ifdef A\n"
7262 "int f() {}\n"
7263 "#else\n"
7264 "int g() {}\n"
7265 "#endif",
7266 Style);
7267}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007268
Francois Ferrandad722562017-06-30 20:25:55 +00007269TEST_F(FormatTest, SplitEmptyClass) {
7270 FormatStyle Style = getLLVMStyle();
7271 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7272 Style.BraceWrapping.AfterClass = true;
7273 Style.BraceWrapping.SplitEmptyRecord = false;
7274
7275 verifyFormat("class Foo\n"
7276 "{};",
7277 Style);
7278 verifyFormat("/* something */ class Foo\n"
7279 "{};",
7280 Style);
7281 verifyFormat("template <typename X> class Foo\n"
7282 "{};",
7283 Style);
7284 verifyFormat("class Foo\n"
7285 "{\n"
7286 " Foo();\n"
7287 "};",
7288 Style);
7289 verifyFormat("typedef class Foo\n"
7290 "{\n"
7291 "} Foo_t;",
7292 Style);
7293}
7294
7295TEST_F(FormatTest, SplitEmptyStruct) {
7296 FormatStyle Style = getLLVMStyle();
7297 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7298 Style.BraceWrapping.AfterStruct = true;
7299 Style.BraceWrapping.SplitEmptyRecord = false;
7300
7301 verifyFormat("struct Foo\n"
7302 "{};",
7303 Style);
7304 verifyFormat("/* something */ struct Foo\n"
7305 "{};",
7306 Style);
7307 verifyFormat("template <typename X> struct Foo\n"
7308 "{};",
7309 Style);
7310 verifyFormat("struct Foo\n"
7311 "{\n"
7312 " Foo();\n"
7313 "};",
7314 Style);
7315 verifyFormat("typedef struct Foo\n"
7316 "{\n"
7317 "} Foo_t;",
7318 Style);
7319 //typedef struct Bar {} Bar_t;
7320}
7321
7322TEST_F(FormatTest, SplitEmptyUnion) {
7323 FormatStyle Style = getLLVMStyle();
7324 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7325 Style.BraceWrapping.AfterUnion = true;
7326 Style.BraceWrapping.SplitEmptyRecord = false;
7327
7328 verifyFormat("union Foo\n"
7329 "{};",
7330 Style);
7331 verifyFormat("/* something */ union Foo\n"
7332 "{};",
7333 Style);
7334 verifyFormat("union Foo\n"
7335 "{\n"
7336 " A,\n"
7337 "};",
7338 Style);
7339 verifyFormat("typedef union Foo\n"
7340 "{\n"
7341 "} Foo_t;",
7342 Style);
7343}
7344
7345TEST_F(FormatTest, SplitEmptyNamespace) {
7346 FormatStyle Style = getLLVMStyle();
7347 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7348 Style.BraceWrapping.AfterNamespace = true;
7349 Style.BraceWrapping.SplitEmptyNamespace = false;
7350
7351 verifyFormat("namespace Foo\n"
7352 "{};",
7353 Style);
7354 verifyFormat("/* something */ namespace Foo\n"
7355 "{};",
7356 Style);
7357 verifyFormat("inline namespace Foo\n"
7358 "{};",
7359 Style);
7360 verifyFormat("namespace Foo\n"
7361 "{\n"
7362 "void Bar();\n"
7363 "};",
7364 Style);
7365}
7366
7367TEST_F(FormatTest, NeverMergeShortRecords) {
7368 FormatStyle Style = getLLVMStyle();
7369
7370 verifyFormat("class Foo {\n"
7371 " Foo();\n"
7372 "};",
7373 Style);
7374 verifyFormat("typedef class Foo {\n"
7375 " Foo();\n"
7376 "} Foo_t;",
7377 Style);
7378 verifyFormat("struct Foo {\n"
7379 " Foo();\n"
7380 "};",
7381 Style);
7382 verifyFormat("typedef struct Foo {\n"
7383 " Foo();\n"
7384 "} Foo_t;",
7385 Style);
7386 verifyFormat("union Foo {\n"
7387 " A,\n"
7388 "};",
7389 Style);
7390 verifyFormat("typedef union Foo {\n"
7391 " A,\n"
7392 "} Foo_t;",
7393 Style);
7394 verifyFormat("namespace Foo {\n"
7395 "void Bar();\n"
7396 "};",
7397 Style);
7398
7399 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7400 Style.BraceWrapping.AfterClass = true;
7401 Style.BraceWrapping.AfterStruct = true;
7402 Style.BraceWrapping.AfterUnion = true;
7403 Style.BraceWrapping.AfterNamespace = true;
7404 verifyFormat("class Foo\n"
7405 "{\n"
7406 " Foo();\n"
7407 "};",
7408 Style);
7409 verifyFormat("typedef class Foo\n"
7410 "{\n"
7411 " Foo();\n"
7412 "} Foo_t;",
7413 Style);
7414 verifyFormat("struct Foo\n"
7415 "{\n"
7416 " Foo();\n"
7417 "};",
7418 Style);
7419 verifyFormat("typedef struct Foo\n"
7420 "{\n"
7421 " Foo();\n"
7422 "} Foo_t;",
7423 Style);
7424 verifyFormat("union Foo\n"
7425 "{\n"
7426 " A,\n"
7427 "};",
7428 Style);
7429 verifyFormat("typedef union Foo\n"
7430 "{\n"
7431 " A,\n"
7432 "} Foo_t;",
7433 Style);
7434 verifyFormat("namespace Foo\n"
7435 "{\n"
7436 "void Bar();\n"
7437 "};",
7438 Style);
7439}
7440
Manuel Klimeke01bab52013-01-15 13:38:33 +00007441TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7442 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007443 verifyFormat("struct foo a = {bar};\nint n;");
7444 verifyFormat("class foo a = {bar};\nint n;");
7445 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007446
7447 // Elaborate types inside function definitions.
7448 verifyFormat("struct foo f() {}\nint n;");
7449 verifyFormat("class foo f() {}\nint n;");
7450 verifyFormat("union foo f() {}\nint n;");
7451
7452 // Templates.
7453 verifyFormat("template <class X> void f() {}\nint n;");
7454 verifyFormat("template <struct X> void f() {}\nint n;");
7455 verifyFormat("template <union X> void f() {}\nint n;");
7456
7457 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007458 verifyFormat("struct {\n} n;");
7459 verifyFormat(
7460 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007461 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007462 verifyFormat("class MACRO Z {\n} n;");
7463 verifyFormat("class MACRO(X) Z {\n} n;");
7464 verifyFormat("class __attribute__(X) Z {\n} n;");
7465 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007466 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007467 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007468 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7469 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007470
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007471 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007472 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007473
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007474 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007475 verifyFormat(
7476 "template <typename F>\n"
7477 "Matcher(const Matcher<F> &Other,\n"
7478 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7479 " !is_same<F, T>::value>::type * = 0)\n"
7480 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7481
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007482 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007483 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007484 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007485
7486 // FIXME:
7487 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007488 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007489
Manuel Klimeke01bab52013-01-15 13:38:33 +00007490 // Elaborate types where incorrectly parsing the structural element would
7491 // break the indent.
7492 verifyFormat("if (true)\n"
7493 " class X x;\n"
7494 "else\n"
7495 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007496
7497 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007498 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007499}
7500
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007501TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007502 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7503 format("#error Leave all white!!!!! space* alone!\n"));
7504 EXPECT_EQ(
7505 "#warning Leave all white!!!!! space* alone!\n",
7506 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007507 EXPECT_EQ("#error 1", format(" # error 1"));
7508 EXPECT_EQ("#warning 1", format(" # warning 1"));
7509}
7510
Daniel Jasper4431aa92013-04-23 13:54:04 +00007511TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007512 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007513 verifyFormat("#if (AAAA && BBBB)");
7514 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007515 // FIXME: Come up with a better indentation for #elif.
7516 verifyFormat(
7517 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7518 " defined(BBBBBBBB)\n"
7519 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7520 " defined(BBBBBBBB)\n"
7521 "#endif",
7522 getLLVMStyleWithColumns(65));
7523}
7524
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007525TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7526 FormatStyle AllowsMergedIf = getGoogleStyle();
7527 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7528 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7529 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007530 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7531 EXPECT_EQ("if (true) return 42;",
7532 format("if (true)\nreturn 42;", AllowsMergedIf));
7533 FormatStyle ShortMergedIf = AllowsMergedIf;
7534 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007535 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007536 " if (true) return 42;",
7537 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007538 verifyFormat("#define A \\\n"
7539 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007540 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007541 "#define B",
7542 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007543 verifyFormat("#define A \\\n"
7544 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007545 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007546 "g();",
7547 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007548 verifyFormat("{\n"
7549 "#ifdef A\n"
7550 " // Comment\n"
7551 " if (true) continue;\n"
7552 "#endif\n"
7553 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007554 " if (true) continue;\n"
7555 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007556 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007557 ShortMergedIf.ColumnLimit = 33;
7558 verifyFormat("#define A \\\n"
7559 " if constexpr (true) return 42;",
7560 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007561 ShortMergedIf.ColumnLimit = 29;
7562 verifyFormat("#define A \\\n"
7563 " if (aaaaaaaaaa) return 1; \\\n"
7564 " return 2;",
7565 ShortMergedIf);
7566 ShortMergedIf.ColumnLimit = 28;
7567 verifyFormat("#define A \\\n"
7568 " if (aaaaaaaaaa) \\\n"
7569 " return 1; \\\n"
7570 " return 2;",
7571 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007572 verifyFormat("#define A \\\n"
7573 " if constexpr (aaaaaaa) \\\n"
7574 " return 1; \\\n"
7575 " return 2;",
7576 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007577}
7578
Manuel Klimekd33516e2013-01-23 10:09:28 +00007579TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007580 verifyFormat("void f(int *a);");
7581 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007582 verifyFormat("class A {\n void f(int *a);\n};");
7583 verifyFormat("class A {\n int *a;\n};");
7584 verifyFormat("namespace a {\n"
7585 "namespace b {\n"
7586 "class A {\n"
7587 " void f() {}\n"
7588 " int *a;\n"
7589 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007590 "} // namespace b\n"
7591 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007592}
7593
Manuel Klimekd33516e2013-01-23 10:09:28 +00007594TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7595 verifyFormat("while");
7596 verifyFormat("operator");
7597}
7598
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007599TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7600 // This code would be painfully slow to format if we didn't skip it.
7601 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
7602 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7603 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7604 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7605 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7606 "A(1, 1)\n"
7607 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7608 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7609 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7610 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7611 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7612 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7613 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7614 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7615 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7616 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7617 // Deeply nested part is untouched, rest is formatted.
7618 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7619 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007620 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007621}
7622
Nico Weber7e6a7a12013-01-08 17:56:31 +00007623//===----------------------------------------------------------------------===//
7624// Objective-C tests.
7625//===----------------------------------------------------------------------===//
7626
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007627TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7628 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7629 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7630 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007631 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007632 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7633 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7634 format("-(NSInteger)Method3:(id)anObject;"));
7635 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7636 format("-(NSInteger)Method4:(id)anObject;"));
7637 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7638 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7639 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7640 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007641 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7642 "forAllCells:(BOOL)flag;",
7643 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7644 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007645
7646 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007647 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7648 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007649 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7650 " inRange:(NSRange)range\n"
7651 " outRange:(NSRange)out_range\n"
7652 " outRange1:(NSRange)out_range1\n"
7653 " outRange2:(NSRange)out_range2\n"
7654 " outRange3:(NSRange)out_range3\n"
7655 " outRange4:(NSRange)out_range4\n"
7656 " outRange5:(NSRange)out_range5\n"
7657 " outRange6:(NSRange)out_range6\n"
7658 " outRange7:(NSRange)out_range7\n"
7659 " outRange8:(NSRange)out_range8\n"
7660 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007661
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007662 // When the function name has to be wrapped.
7663 FormatStyle Style = getLLVMStyle();
7664 Style.IndentWrappedFunctionNames = false;
7665 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7666 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7667 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7668 "}",
7669 Style);
7670 Style.IndentWrappedFunctionNames = true;
7671 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7672 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7673 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7674 "}",
7675 Style);
7676
Nico Weberd6f962f2013-01-10 20:18:33 +00007677 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007678 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007679 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7680 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007681 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007682
Daniel Jasper37194282013-05-28 08:33:00 +00007683 verifyFormat("- (int (*)())foo:(int (*)())f;");
7684 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007685
7686 // If there's no return type (very rare in practice!), LLVM and Google style
7687 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007688 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007689 verifyFormat("- foo:(int)f;");
7690 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007691}
7692
Nico Weber0588b502013-02-07 00:19:29 +00007693
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007694TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007695 EXPECT_EQ("\"some text \"\n"
7696 "\"other\";",
7697 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007698 EXPECT_EQ("\"some text \"\n"
7699 "\"other\";",
7700 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007701 EXPECT_EQ(
7702 "#define A \\\n"
7703 " \"some \" \\\n"
7704 " \"text \" \\\n"
7705 " \"other\";",
7706 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7707 EXPECT_EQ(
7708 "#define A \\\n"
7709 " \"so \" \\\n"
7710 " \"text \" \\\n"
7711 " \"other\";",
7712 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7713
7714 EXPECT_EQ("\"some text\"",
7715 format("\"some text\"", getLLVMStyleWithColumns(1)));
7716 EXPECT_EQ("\"some text\"",
7717 format("\"some text\"", getLLVMStyleWithColumns(11)));
7718 EXPECT_EQ("\"some \"\n"
7719 "\"text\"",
7720 format("\"some text\"", getLLVMStyleWithColumns(10)));
7721 EXPECT_EQ("\"some \"\n"
7722 "\"text\"",
7723 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007724 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007725 "\" tex\"\n"
7726 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007727 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007728 EXPECT_EQ("\"some\"\n"
7729 "\" tex\"\n"
7730 "\" and\"",
7731 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7732 EXPECT_EQ("\"some\"\n"
7733 "\"/tex\"\n"
7734 "\"/and\"",
7735 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007736
7737 EXPECT_EQ("variable =\n"
7738 " \"long string \"\n"
7739 " \"literal\";",
7740 format("variable = \"long string literal\";",
7741 getLLVMStyleWithColumns(20)));
7742
7743 EXPECT_EQ("variable = f(\n"
7744 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007745 " \"literal\",\n"
7746 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007747 " loooooooooooooooooooong);",
7748 format("variable = f(\"long string literal\", short, "
7749 "loooooooooooooooooooong);",
7750 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007751
Daniel Jaspera44991332015-04-29 13:06:49 +00007752 EXPECT_EQ(
7753 "f(g(\"long string \"\n"
7754 " \"literal\"),\n"
7755 " b);",
7756 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007757 EXPECT_EQ("f(g(\"long string \"\n"
7758 " \"literal\",\n"
7759 " a),\n"
7760 " b);",
7761 format("f(g(\"long string literal\", a), b);",
7762 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007763 EXPECT_EQ(
7764 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007765 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007766 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7767 EXPECT_EQ("f(\"one two three four five six \"\n"
7768 " \"seven\".split(\n"
7769 " really_looooong_variable));",
7770 format("f(\"one two three four five six seven\"."
7771 "split(really_looooong_variable));",
7772 getLLVMStyleWithColumns(33)));
7773
7774 EXPECT_EQ("f(\"some \"\n"
7775 " \"text\",\n"
7776 " other);",
7777 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007778
7779 // Only break as a last resort.
7780 verifyFormat(
7781 "aaaaaaaaaaaaaaaaaaaa(\n"
7782 " aaaaaaaaaaaaaaaaaaaa,\n"
7783 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007784
Daniel Jaspera44991332015-04-29 13:06:49 +00007785 EXPECT_EQ("\"splitmea\"\n"
7786 "\"trandomp\"\n"
7787 "\"oint\"",
7788 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007789
Daniel Jaspera44991332015-04-29 13:06:49 +00007790 EXPECT_EQ("\"split/\"\n"
7791 "\"pathat/\"\n"
7792 "\"slashes\"",
7793 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007794
Daniel Jaspera44991332015-04-29 13:06:49 +00007795 EXPECT_EQ("\"split/\"\n"
7796 "\"pathat/\"\n"
7797 "\"slashes\"",
7798 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007799 EXPECT_EQ("\"split at \"\n"
7800 "\"spaces/at/\"\n"
7801 "\"slashes.at.any$\"\n"
7802 "\"non-alphanumeric%\"\n"
7803 "\"1111111111characte\"\n"
7804 "\"rs\"",
7805 format("\"split at "
7806 "spaces/at/"
7807 "slashes.at."
7808 "any$non-"
7809 "alphanumeric%"
7810 "1111111111characte"
7811 "rs\"",
7812 getLLVMStyleWithColumns(20)));
7813
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007814 // Verify that splitting the strings understands
7815 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007816 EXPECT_EQ(
7817 "aaaaaaaaaaaa(\n"
7818 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7819 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7820 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7821 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7822 "aaaaaaaaaaaaaaaaaaaaaa\");",
7823 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007824 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7825 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7826 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7827 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7828 "aaaaaaaaaaaaaaaaaaaaaa\";",
7829 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007830 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7831 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7832 format("llvm::outs() << "
7833 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7834 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007835 EXPECT_EQ("ffff(\n"
7836 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7837 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7838 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7839 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7840 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007841
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007842 FormatStyle Style = getLLVMStyleWithColumns(12);
7843 Style.BreakStringLiterals = false;
7844 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7845
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007846 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007847 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007848 EXPECT_EQ("#define A \\\n"
7849 " \"some \" \\\n"
7850 " \"text \" \\\n"
7851 " \"other\";",
7852 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007853}
7854
Manuel Klimek93699f42017-11-29 14:29:43 +00007855TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7856 EXPECT_EQ("C a = \"some more \"\n"
7857 " \"text\";",
7858 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7859}
7860
Manuel Klimek9e321992015-07-28 15:50:24 +00007861TEST_F(FormatTest, FullyRemoveEmptyLines) {
7862 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7863 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7864 EXPECT_EQ("int i = a(b());",
7865 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7866}
7867
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007868TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7869 EXPECT_EQ(
7870 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7871 "(\n"
7872 " \"x\t\");",
7873 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7874 "aaaaaaa("
7875 "\"x\t\");"));
7876}
7877
Daniel Jasper174b0122014-01-09 14:18:12 +00007878TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007879 EXPECT_EQ(
7880 "u8\"utf8 string \"\n"
7881 "u8\"literal\";",
7882 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7883 EXPECT_EQ(
7884 "u\"utf16 string \"\n"
7885 "u\"literal\";",
7886 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7887 EXPECT_EQ(
7888 "U\"utf32 string \"\n"
7889 "U\"literal\";",
7890 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7891 EXPECT_EQ("L\"wide string \"\n"
7892 "L\"literal\";",
7893 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007894 EXPECT_EQ("@\"NSString \"\n"
7895 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007896 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007897 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007898
7899 // This input makes clang-format try to split the incomplete unicode escape
7900 // sequence, which used to lead to a crasher.
7901 verifyNoCrash(
7902 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7903 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007904}
7905
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007906TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7907 FormatStyle Style = getGoogleStyleWithColumns(15);
7908 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7909 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7910 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7911 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7912 EXPECT_EQ("u8R\"x(raw literal)x\";",
7913 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007914}
7915
7916TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7917 FormatStyle Style = getLLVMStyleWithColumns(20);
7918 EXPECT_EQ(
7919 "_T(\"aaaaaaaaaaaaaa\")\n"
7920 "_T(\"aaaaaaaaaaaaaa\")\n"
7921 "_T(\"aaaaaaaaaaaa\")",
7922 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007923 EXPECT_EQ("f(x,\n"
7924 " _T(\"aaaaaaaaaaaa\")\n"
7925 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007926 " z);",
7927 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7928
7929 // FIXME: Handle embedded spaces in one iteration.
7930 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7931 // "_T(\"aaaaaaaaaaaaa\")\n"
7932 // "_T(\"aaaaaaaaaaaaa\")\n"
7933 // "_T(\"a\")",
7934 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7935 // getLLVMStyleWithColumns(20)));
7936 EXPECT_EQ(
7937 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7938 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007939 EXPECT_EQ("f(\n"
7940 "#if !TEST\n"
7941 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7942 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007943 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007944 format("f(\n"
7945 "#if !TEST\n"
7946 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7947 "#endif\n"
7948 ");"));
7949 EXPECT_EQ("f(\n"
7950 "\n"
7951 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7952 format("f(\n"
7953 "\n"
7954 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007955}
7956
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007957TEST_F(FormatTest, BreaksStringLiteralOperands) {
7958 // In a function call with two operands, the second can be broken with no line
7959 // break before it.
7960 EXPECT_EQ("func(a, \"long long \"\n"
7961 " \"long long\");",
7962 format("func(a, \"long long long long\");",
7963 getLLVMStyleWithColumns(24)));
7964 // In a function call with three operands, the second must be broken with a
7965 // line break before it.
7966 EXPECT_EQ("func(a,\n"
7967 " \"long long long \"\n"
7968 " \"long\",\n"
7969 " c);",
7970 format("func(a, \"long long long long\", c);",
7971 getLLVMStyleWithColumns(24)));
7972 // In a function call with three operands, the third must be broken with a
7973 // line break before it.
7974 EXPECT_EQ("func(a, b,\n"
7975 " \"long long long \"\n"
7976 " \"long\");",
7977 format("func(a, b, \"long long long long\");",
7978 getLLVMStyleWithColumns(24)));
7979 // In a function call with three operands, both the second and the third must
7980 // be broken with a line break before them.
7981 EXPECT_EQ("func(a,\n"
7982 " \"long long long \"\n"
7983 " \"long\",\n"
7984 " \"long long long \"\n"
7985 " \"long\");",
7986 format("func(a, \"long long long long\", \"long long long long\");",
7987 getLLVMStyleWithColumns(24)));
7988 // In a chain of << with two operands, the second can be broken with no line
7989 // break before it.
7990 EXPECT_EQ("a << \"line line \"\n"
7991 " \"line\";",
7992 format("a << \"line line line\";",
7993 getLLVMStyleWithColumns(20)));
7994 // In a chain of << with three operands, the second can be broken with no line
7995 // break before it.
7996 EXPECT_EQ("abcde << \"line \"\n"
7997 " \"line line\"\n"
7998 " << c;",
7999 format("abcde << \"line line line\" << c;",
8000 getLLVMStyleWithColumns(20)));
8001 // In a chain of << with three operands, the third must be broken with a line
8002 // break before it.
8003 EXPECT_EQ("a << b\n"
8004 " << \"line line \"\n"
8005 " \"line\";",
8006 format("a << b << \"line line line\";",
8007 getLLVMStyleWithColumns(20)));
8008 // In a chain of << with three operands, the second can be broken with no line
8009 // break before it and the third must be broken with a line break before it.
8010 EXPECT_EQ("abcd << \"line line \"\n"
8011 " \"line\"\n"
8012 " << \"line line \"\n"
8013 " \"line\";",
8014 format("abcd << \"line line line\" << \"line line line\";",
8015 getLLVMStyleWithColumns(20)));
8016 // In a chain of binary operators with two operands, the second can be broken
8017 // with no line break before it.
8018 EXPECT_EQ("abcd + \"line line \"\n"
8019 " \"line line\";",
8020 format("abcd + \"line line line line\";",
8021 getLLVMStyleWithColumns(20)));
8022 // In a chain of binary operators with three operands, the second must be
8023 // broken with a line break before it.
8024 EXPECT_EQ("abcd +\n"
8025 " \"line line \"\n"
8026 " \"line line\" +\n"
8027 " e;",
8028 format("abcd + \"line line line line\" + e;",
8029 getLLVMStyleWithColumns(20)));
8030 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8031 // the first must be broken with a line break before it.
8032 FormatStyle Style = getLLVMStyleWithColumns(25);
8033 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8034 EXPECT_EQ("someFunction(\n"
8035 " \"long long long \"\n"
8036 " \"long\",\n"
8037 " a);",
8038 format("someFunction(\"long long long long\", a);", Style));
8039}
8040
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008041TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008042 EXPECT_EQ(
8043 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8046 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8049}
8050
8051TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8052 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008053 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008054 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8055 "multiline raw string literal xxxxxxxxxxxxxx\n"
8056 ")x\",\n"
8057 " a),\n"
8058 " b);",
8059 format("fffffffffff(g(R\"x(\n"
8060 "multiline raw string literal xxxxxxxxxxxxxx\n"
8061 ")x\", a), b);",
8062 getGoogleStyleWithColumns(20)));
8063 EXPECT_EQ("fffffffffff(\n"
8064 " g(R\"x(qqq\n"
8065 "multiline raw string literal xxxxxxxxxxxxxx\n"
8066 ")x\",\n"
8067 " a),\n"
8068 " b);",
8069 format("fffffffffff(g(R\"x(qqq\n"
8070 "multiline raw string literal xxxxxxxxxxxxxx\n"
8071 ")x\", a), b);",
8072 getGoogleStyleWithColumns(20)));
8073
8074 EXPECT_EQ("fffffffffff(R\"x(\n"
8075 "multiline raw string literal xxxxxxxxxxxxxx\n"
8076 ")x\");",
8077 format("fffffffffff(R\"x(\n"
8078 "multiline raw string literal xxxxxxxxxxxxxx\n"
8079 ")x\");",
8080 getGoogleStyleWithColumns(20)));
8081 EXPECT_EQ("fffffffffff(R\"x(\n"
8082 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008083 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008084 format("fffffffffff(R\"x(\n"
8085 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008086 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008087 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008088 EXPECT_EQ("fffffffffff(\n"
8089 " R\"x(\n"
8090 "multiline raw string literal xxxxxxxxxxxxxx\n"
8091 ")x\" +\n"
8092 " bbbbbb);",
8093 format("fffffffffff(\n"
8094 " R\"x(\n"
8095 "multiline raw string literal xxxxxxxxxxxxxx\n"
8096 ")x\" + bbbbbb);",
8097 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008098 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8099 format("fffffffffff(\n"
8100 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008101}
8102
Alexander Kornienkobe633902013-06-14 11:46:10 +00008103TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008104 verifyFormat("string a = \"unterminated;");
8105 EXPECT_EQ("function(\"unterminated,\n"
8106 " OtherParameter);",
8107 format("function( \"unterminated,\n"
8108 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008109}
8110
8111TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008112 FormatStyle Style = getLLVMStyle();
8113 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008114 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008115 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008116}
8117
Daniel Jaspera44991332015-04-29 13:06:49 +00008118TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008119
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008120TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8121 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8122 " \"ddeeefff\");",
8123 format("someFunction(\"aaabbbcccdddeeefff\");",
8124 getLLVMStyleWithColumns(25)));
8125 EXPECT_EQ("someFunction1234567890(\n"
8126 " \"aaabbbcccdddeeefff\");",
8127 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8128 getLLVMStyleWithColumns(26)));
8129 EXPECT_EQ("someFunction1234567890(\n"
8130 " \"aaabbbcccdddeeeff\"\n"
8131 " \"f\");",
8132 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8133 getLLVMStyleWithColumns(25)));
8134 EXPECT_EQ("someFunction1234567890(\n"
8135 " \"aaabbbcccdddeeeff\"\n"
8136 " \"f\");",
8137 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8138 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008139 EXPECT_EQ("someFunction(\n"
8140 " \"aaabbbcc ddde \"\n"
8141 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008142 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008143 getLLVMStyleWithColumns(25)));
8144 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8145 " \"ddeeefff\");",
8146 format("someFunction(\"aaabbbccc ddeeefff\");",
8147 getLLVMStyleWithColumns(25)));
8148 EXPECT_EQ("someFunction1234567890(\n"
8149 " \"aaabb \"\n"
8150 " \"cccdddeeefff\");",
8151 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8152 getLLVMStyleWithColumns(25)));
8153 EXPECT_EQ("#define A \\\n"
8154 " string s = \\\n"
8155 " \"123456789\" \\\n"
8156 " \"0\"; \\\n"
8157 " int i;",
8158 format("#define A string s = \"1234567890\"; int i;",
8159 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008160 EXPECT_EQ("someFunction(\n"
8161 " \"aaabbbcc \"\n"
8162 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008163 format("someFunction(\"aaabbbcc dddeeefff\");",
8164 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008165}
8166
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008167TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008168 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8169 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008170 EXPECT_EQ("\"test\"\n"
8171 "\"\\n\"",
8172 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8173 EXPECT_EQ("\"tes\\\\\"\n"
8174 "\"n\"",
8175 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8176 EXPECT_EQ("\"\\\\\\\\\"\n"
8177 "\"\\n\"",
8178 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008179 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008180 EXPECT_EQ("\"\\uff01\"\n"
8181 "\"test\"",
8182 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8183 EXPECT_EQ("\"\\Uff01ff02\"",
8184 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8185 EXPECT_EQ("\"\\x000000000001\"\n"
8186 "\"next\"",
8187 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8188 EXPECT_EQ("\"\\x000000000001next\"",
8189 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8190 EXPECT_EQ("\"\\x000000000001\"",
8191 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8192 EXPECT_EQ("\"test\"\n"
8193 "\"\\000000\"\n"
8194 "\"000001\"",
8195 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8196 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008197 "\"00000000\"\n"
8198 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008199 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008200}
8201
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008202TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8203 verifyFormat("void f() {\n"
8204 " return g() {}\n"
8205 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008206 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008207 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008208 "}");
8209}
8210
Manuel Klimek421147e2014-01-24 09:25:23 +00008211TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8212 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008213 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008214}
8215
Manuel Klimek13b97d82013-05-13 08:42:42 +00008216TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8217 verifyFormat("class X {\n"
8218 " void f() {\n"
8219 " }\n"
8220 "};",
8221 getLLVMStyleWithColumns(12));
8222}
8223
8224TEST_F(FormatTest, ConfigurableIndentWidth) {
8225 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8226 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008227 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008228 verifyFormat("void f() {\n"
8229 " someFunction();\n"
8230 " if (true) {\n"
8231 " f();\n"
8232 " }\n"
8233 "}",
8234 EightIndent);
8235 verifyFormat("class X {\n"
8236 " void f() {\n"
8237 " }\n"
8238 "};",
8239 EightIndent);
8240 verifyFormat("int x[] = {\n"
8241 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008242 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008243 EightIndent);
8244}
8245
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008246TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008247 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008248 "f();",
8249 getLLVMStyleWithColumns(8));
8250}
8251
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008252TEST_F(FormatTest, ConfigurableUseOfTab) {
8253 FormatStyle Tab = getLLVMStyleWithColumns(42);
8254 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008255 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008256 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008257
8258 EXPECT_EQ("if (aaaaaaaa && // q\n"
8259 " bb)\t\t// w\n"
8260 "\t;",
8261 format("if (aaaaaaaa &&// q\n"
8262 "bb)// w\n"
8263 ";",
8264 Tab));
8265 EXPECT_EQ("if (aaa && bbb) // w\n"
8266 "\t;",
8267 format("if(aaa&&bbb)// w\n"
8268 ";",
8269 Tab));
8270
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008271 verifyFormat("class X {\n"
8272 "\tvoid f() {\n"
8273 "\t\tsomeFunction(parameter1,\n"
8274 "\t\t\t parameter2);\n"
8275 "\t}\n"
8276 "};",
8277 Tab);
8278 verifyFormat("#define A \\\n"
8279 "\tvoid f() { \\\n"
8280 "\t\tsomeFunction( \\\n"
8281 "\t\t parameter1, \\\n"
8282 "\t\t parameter2); \\\n"
8283 "\t}",
8284 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008285
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008286 Tab.TabWidth = 4;
8287 Tab.IndentWidth = 8;
8288 verifyFormat("class TabWidth4Indent8 {\n"
8289 "\t\tvoid f() {\n"
8290 "\t\t\t\tsomeFunction(parameter1,\n"
8291 "\t\t\t\t\t\t\t parameter2);\n"
8292 "\t\t}\n"
8293 "};",
8294 Tab);
8295
8296 Tab.TabWidth = 4;
8297 Tab.IndentWidth = 4;
8298 verifyFormat("class TabWidth4Indent4 {\n"
8299 "\tvoid f() {\n"
8300 "\t\tsomeFunction(parameter1,\n"
8301 "\t\t\t\t\t parameter2);\n"
8302 "\t}\n"
8303 "};",
8304 Tab);
8305
8306 Tab.TabWidth = 8;
8307 Tab.IndentWidth = 4;
8308 verifyFormat("class TabWidth8Indent4 {\n"
8309 " void f() {\n"
8310 "\tsomeFunction(parameter1,\n"
8311 "\t\t parameter2);\n"
8312 " }\n"
8313 "};",
8314 Tab);
8315
Alexander Kornienko39856b72013-09-10 09:38:25 +00008316 Tab.TabWidth = 8;
8317 Tab.IndentWidth = 8;
8318 EXPECT_EQ("/*\n"
8319 "\t a\t\tcomment\n"
8320 "\t in multiple lines\n"
8321 " */",
8322 format(" /*\t \t \n"
8323 " \t \t a\t\tcomment\t \t\n"
8324 " \t \t in multiple lines\t\n"
8325 " \t */",
8326 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008327
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008328 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008329 verifyFormat("{\n"
8330 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8331 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8332 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8333 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8334 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8335 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008336 "};",
8337 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008338 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008339 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008340 "\ta2,\n"
8341 "\ta3\n"
8342 "};",
8343 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008344 EXPECT_EQ("if (aaaaaaaa && // q\n"
8345 " bb) // w\n"
8346 "\t;",
8347 format("if (aaaaaaaa &&// q\n"
8348 "bb)// w\n"
8349 ";",
8350 Tab));
8351 verifyFormat("class X {\n"
8352 "\tvoid f() {\n"
8353 "\t\tsomeFunction(parameter1,\n"
8354 "\t\t parameter2);\n"
8355 "\t}\n"
8356 "};",
8357 Tab);
8358 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008359 "\tQ(\n"
8360 "\t {\n"
8361 "\t\t int a;\n"
8362 "\t\t someFunction(aaaaaaaa,\n"
8363 "\t\t bbbbbbb);\n"
8364 "\t },\n"
8365 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008366 "}",
8367 Tab);
8368 EXPECT_EQ("{\n"
8369 "\t/* aaaa\n"
8370 "\t bbbb */\n"
8371 "}",
8372 format("{\n"
8373 "/* aaaa\n"
8374 " bbbb */\n"
8375 "}",
8376 Tab));
8377 EXPECT_EQ("{\n"
8378 "\t/*\n"
8379 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8380 "\t bbbbbbbbbbbbb\n"
8381 "\t*/\n"
8382 "}",
8383 format("{\n"
8384 "/*\n"
8385 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8386 "*/\n"
8387 "}",
8388 Tab));
8389 EXPECT_EQ("{\n"
8390 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8391 "\t// bbbbbbbbbbbbb\n"
8392 "}",
8393 format("{\n"
8394 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8395 "}",
8396 Tab));
8397 EXPECT_EQ("{\n"
8398 "\t/*\n"
8399 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8400 "\t bbbbbbbbbbbbb\n"
8401 "\t*/\n"
8402 "}",
8403 format("{\n"
8404 "\t/*\n"
8405 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8406 "\t*/\n"
8407 "}",
8408 Tab));
8409 EXPECT_EQ("{\n"
8410 "\t/*\n"
8411 "\n"
8412 "\t*/\n"
8413 "}",
8414 format("{\n"
8415 "\t/*\n"
8416 "\n"
8417 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008418 "}",
8419 Tab));
8420 EXPECT_EQ("{\n"
8421 "\t/*\n"
8422 " asdf\n"
8423 "\t*/\n"
8424 "}",
8425 format("{\n"
8426 "\t/*\n"
8427 " asdf\n"
8428 "\t*/\n"
8429 "}",
8430 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008431
8432 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008433 EXPECT_EQ("/*\n"
8434 " a\t\tcomment\n"
8435 " in multiple lines\n"
8436 " */",
8437 format(" /*\t \t \n"
8438 " \t \t a\t\tcomment\t \t\n"
8439 " \t \t in multiple lines\t\n"
8440 " \t */",
8441 Tab));
8442 EXPECT_EQ("/* some\n"
8443 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008444 format(" \t \t /* some\n"
8445 " \t \t comment */",
8446 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008447 EXPECT_EQ("int a; /* some\n"
8448 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008449 format(" \t \t int a; /* some\n"
8450 " \t \t comment */",
8451 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008452
Alexander Kornienko39856b72013-09-10 09:38:25 +00008453 EXPECT_EQ("int a; /* some\n"
8454 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008455 format(" \t \t int\ta; /* some\n"
8456 " \t \t comment */",
8457 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008458 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8459 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008460 format(" \t \t f(\"\t\t\"); /* some\n"
8461 " \t \t comment */",
8462 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008463 EXPECT_EQ("{\n"
8464 " /*\n"
8465 " * Comment\n"
8466 " */\n"
8467 " int i;\n"
8468 "}",
8469 format("{\n"
8470 "\t/*\n"
8471 "\t * Comment\n"
8472 "\t */\n"
8473 "\t int i;\n"
8474 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008475
8476 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8477 Tab.TabWidth = 8;
8478 Tab.IndentWidth = 8;
8479 EXPECT_EQ("if (aaaaaaaa && // q\n"
8480 " bb) // w\n"
8481 "\t;",
8482 format("if (aaaaaaaa &&// q\n"
8483 "bb)// w\n"
8484 ";",
8485 Tab));
8486 EXPECT_EQ("if (aaa && bbb) // w\n"
8487 "\t;",
8488 format("if(aaa&&bbb)// w\n"
8489 ";",
8490 Tab));
8491 verifyFormat("class X {\n"
8492 "\tvoid f() {\n"
8493 "\t\tsomeFunction(parameter1,\n"
8494 "\t\t\t parameter2);\n"
8495 "\t}\n"
8496 "};",
8497 Tab);
8498 verifyFormat("#define A \\\n"
8499 "\tvoid f() { \\\n"
8500 "\t\tsomeFunction( \\\n"
8501 "\t\t parameter1, \\\n"
8502 "\t\t parameter2); \\\n"
8503 "\t}",
8504 Tab);
8505 Tab.TabWidth = 4;
8506 Tab.IndentWidth = 8;
8507 verifyFormat("class TabWidth4Indent8 {\n"
8508 "\t\tvoid f() {\n"
8509 "\t\t\t\tsomeFunction(parameter1,\n"
8510 "\t\t\t\t\t\t\t parameter2);\n"
8511 "\t\t}\n"
8512 "};",
8513 Tab);
8514 Tab.TabWidth = 4;
8515 Tab.IndentWidth = 4;
8516 verifyFormat("class TabWidth4Indent4 {\n"
8517 "\tvoid f() {\n"
8518 "\t\tsomeFunction(parameter1,\n"
8519 "\t\t\t\t\t parameter2);\n"
8520 "\t}\n"
8521 "};",
8522 Tab);
8523 Tab.TabWidth = 8;
8524 Tab.IndentWidth = 4;
8525 verifyFormat("class TabWidth8Indent4 {\n"
8526 " void f() {\n"
8527 "\tsomeFunction(parameter1,\n"
8528 "\t\t parameter2);\n"
8529 " }\n"
8530 "};",
8531 Tab);
8532 Tab.TabWidth = 8;
8533 Tab.IndentWidth = 8;
8534 EXPECT_EQ("/*\n"
8535 "\t a\t\tcomment\n"
8536 "\t in multiple lines\n"
8537 " */",
8538 format(" /*\t \t \n"
8539 " \t \t a\t\tcomment\t \t\n"
8540 " \t \t in multiple lines\t\n"
8541 " \t */",
8542 Tab));
8543 verifyFormat("{\n"
8544 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8545 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8546 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8547 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8548 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8549 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8550 "};",
8551 Tab);
8552 verifyFormat("enum AA {\n"
8553 "\ta1, // Force multiple lines\n"
8554 "\ta2,\n"
8555 "\ta3\n"
8556 "};",
8557 Tab);
8558 EXPECT_EQ("if (aaaaaaaa && // q\n"
8559 " bb) // w\n"
8560 "\t;",
8561 format("if (aaaaaaaa &&// q\n"
8562 "bb)// w\n"
8563 ";",
8564 Tab));
8565 verifyFormat("class X {\n"
8566 "\tvoid f() {\n"
8567 "\t\tsomeFunction(parameter1,\n"
8568 "\t\t\t parameter2);\n"
8569 "\t}\n"
8570 "};",
8571 Tab);
8572 verifyFormat("{\n"
8573 "\tQ(\n"
8574 "\t {\n"
8575 "\t\t int a;\n"
8576 "\t\t someFunction(aaaaaaaa,\n"
8577 "\t\t\t\t bbbbbbb);\n"
8578 "\t },\n"
8579 "\t p);\n"
8580 "}",
8581 Tab);
8582 EXPECT_EQ("{\n"
8583 "\t/* aaaa\n"
8584 "\t bbbb */\n"
8585 "}",
8586 format("{\n"
8587 "/* aaaa\n"
8588 " bbbb */\n"
8589 "}",
8590 Tab));
8591 EXPECT_EQ("{\n"
8592 "\t/*\n"
8593 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8594 "\t bbbbbbbbbbbbb\n"
8595 "\t*/\n"
8596 "}",
8597 format("{\n"
8598 "/*\n"
8599 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8600 "*/\n"
8601 "}",
8602 Tab));
8603 EXPECT_EQ("{\n"
8604 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8605 "\t// bbbbbbbbbbbbb\n"
8606 "}",
8607 format("{\n"
8608 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8609 "}",
8610 Tab));
8611 EXPECT_EQ("{\n"
8612 "\t/*\n"
8613 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8614 "\t bbbbbbbbbbbbb\n"
8615 "\t*/\n"
8616 "}",
8617 format("{\n"
8618 "\t/*\n"
8619 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8620 "\t*/\n"
8621 "}",
8622 Tab));
8623 EXPECT_EQ("{\n"
8624 "\t/*\n"
8625 "\n"
8626 "\t*/\n"
8627 "}",
8628 format("{\n"
8629 "\t/*\n"
8630 "\n"
8631 "\t*/\n"
8632 "}",
8633 Tab));
8634 EXPECT_EQ("{\n"
8635 "\t/*\n"
8636 " asdf\n"
8637 "\t*/\n"
8638 "}",
8639 format("{\n"
8640 "\t/*\n"
8641 " asdf\n"
8642 "\t*/\n"
8643 "}",
8644 Tab));
8645 EXPECT_EQ("/*\n"
8646 "\t a\t\tcomment\n"
8647 "\t in multiple lines\n"
8648 " */",
8649 format(" /*\t \t \n"
8650 " \t \t a\t\tcomment\t \t\n"
8651 " \t \t in multiple lines\t\n"
8652 " \t */",
8653 Tab));
8654 EXPECT_EQ("/* some\n"
8655 " comment */",
8656 format(" \t \t /* some\n"
8657 " \t \t comment */",
8658 Tab));
8659 EXPECT_EQ("int a; /* some\n"
8660 " comment */",
8661 format(" \t \t int a; /* some\n"
8662 " \t \t comment */",
8663 Tab));
8664 EXPECT_EQ("int a; /* some\n"
8665 "comment */",
8666 format(" \t \t int\ta; /* some\n"
8667 " \t \t comment */",
8668 Tab));
8669 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8670 " comment */",
8671 format(" \t \t f(\"\t\t\"); /* some\n"
8672 " \t \t comment */",
8673 Tab));
8674 EXPECT_EQ("{\n"
8675 " /*\n"
8676 " * Comment\n"
8677 " */\n"
8678 " int i;\n"
8679 "}",
8680 format("{\n"
8681 "\t/*\n"
8682 "\t * Comment\n"
8683 "\t */\n"
8684 "\t int i;\n"
8685 "}"));
8686 Tab.AlignConsecutiveAssignments = true;
8687 Tab.AlignConsecutiveDeclarations = true;
8688 Tab.TabWidth = 4;
8689 Tab.IndentWidth = 4;
8690 verifyFormat("class Assign {\n"
8691 "\tvoid f() {\n"
8692 "\t\tint x = 123;\n"
8693 "\t\tint random = 4;\n"
8694 "\t\tstd::string alphabet =\n"
8695 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8696 "\t}\n"
8697 "};",
8698 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008699}
8700
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008701TEST_F(FormatTest, CalculatesOriginalColumn) {
8702 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8703 "q\"; /* some\n"
8704 " comment */",
8705 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8706 "q\"; /* some\n"
8707 " comment */",
8708 getLLVMStyle()));
8709 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8710 "/* some\n"
8711 " comment */",
8712 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8713 " /* some\n"
8714 " comment */",
8715 getLLVMStyle()));
8716 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8717 "qqq\n"
8718 "/* some\n"
8719 " comment */",
8720 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8721 "qqq\n"
8722 " /* some\n"
8723 " comment */",
8724 getLLVMStyle()));
8725 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8726 "wwww; /* some\n"
8727 " comment */",
8728 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8729 "wwww; /* some\n"
8730 " comment */",
8731 getLLVMStyle()));
8732}
8733
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008734TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008735 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008736 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008737
8738 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008739 " continue;",
8740 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008741 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008742 " continue;",
8743 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008744 verifyFormat("if(true)\n"
8745 " f();\n"
8746 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008747 " f();",
8748 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008749 verifyFormat("do {\n"
8750 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008751 "} while(something());",
8752 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008753 verifyFormat("switch(x) {\n"
8754 "default:\n"
8755 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008756 "}",
8757 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008758 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008759 verifyFormat("size_t x = sizeof(x);", NoSpace);
8760 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8761 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8762 verifyFormat("alignas(128) char a[128];", NoSpace);
8763 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8764 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8765 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008766 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008767 verifyFormat("T A::operator()();", NoSpace);
8768 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008769
8770 FormatStyle Space = getLLVMStyle();
8771 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8772
8773 verifyFormat("int f ();", Space);
8774 verifyFormat("void f (int a, T b) {\n"
8775 " while (true)\n"
8776 " continue;\n"
8777 "}",
8778 Space);
8779 verifyFormat("if (true)\n"
8780 " f ();\n"
8781 "else if (true)\n"
8782 " f ();",
8783 Space);
8784 verifyFormat("do {\n"
8785 " do_something ();\n"
8786 "} while (something ());",
8787 Space);
8788 verifyFormat("switch (x) {\n"
8789 "default:\n"
8790 " break;\n"
8791 "}",
8792 Space);
8793 verifyFormat("A::A () : a (1) {}", Space);
8794 verifyFormat("void f () __attribute__ ((asdf));", Space);
8795 verifyFormat("*(&a + 1);\n"
8796 "&((&a)[1]);\n"
8797 "a[(b + c) * d];\n"
8798 "(((a + 1) * 2) + 3) * 4;",
8799 Space);
8800 verifyFormat("#define A(x) x", Space);
8801 verifyFormat("#define A (x) x", Space);
8802 verifyFormat("#if defined(x)\n"
8803 "#endif",
8804 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008805 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008806 verifyFormat("size_t x = sizeof (x);", Space);
8807 verifyFormat("auto f (int x) -> decltype (x);", Space);
8808 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8809 verifyFormat("alignas (128) char a[128];", Space);
8810 verifyFormat("size_t x = alignof (MyType);", Space);
8811 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8812 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008813 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008814 verifyFormat("T A::operator() ();", Space);
8815 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008816}
8817
8818TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8819 FormatStyle Spaces = getLLVMStyle();
8820
8821 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00008822 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008823 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008824 verifyFormat("call();", Spaces);
8825 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008826 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8827 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008828 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008829 " continue;",
8830 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008831 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008832 " continue;",
8833 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008834 verifyFormat("if ( true )\n"
8835 " f();\n"
8836 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008837 " f();",
8838 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008839 verifyFormat("do {\n"
8840 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008841 "} while ( something() );",
8842 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008843 verifyFormat("switch ( x ) {\n"
8844 "default:\n"
8845 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008846 "}",
8847 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008848
8849 Spaces.SpacesInParentheses = false;
8850 Spaces.SpacesInCStyleCastParentheses = true;
8851 verifyFormat("Type *A = ( Type * )P;", Spaces);
8852 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8853 verifyFormat("x = ( int32 )y;", Spaces);
8854 verifyFormat("int a = ( int )(2.0f);", Spaces);
8855 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8856 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8857 verifyFormat("#define x (( int )-1)", Spaces);
8858
Daniel Jasper92e09822015-03-18 12:59:19 +00008859 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008860 Spaces.SpacesInParentheses = false;
8861 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008862 Spaces.SpacesInCStyleCastParentheses = true;
8863 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008864 verifyFormat("call( );", Spaces);
8865 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008866 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008867 " continue;",
8868 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008869 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008870 " continue;",
8871 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008872 verifyFormat("if (true)\n"
8873 " f( );\n"
8874 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008875 " f( );",
8876 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008877 verifyFormat("do {\n"
8878 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008879 "} while (something( ));",
8880 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008881 verifyFormat("switch (x) {\n"
8882 "default:\n"
8883 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008884 "}",
8885 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008886
Daniel Jasper92e09822015-03-18 12:59:19 +00008887 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008888 Spaces.SpaceAfterCStyleCast = true;
8889 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008890 verifyFormat("call( );", Spaces);
8891 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008892 verifyFormat("while (( bool ) 1)\n"
8893 " continue;",
8894 Spaces);
8895 verifyFormat("for (;;)\n"
8896 " continue;",
8897 Spaces);
8898 verifyFormat("if (true)\n"
8899 " f( );\n"
8900 "else if (true)\n"
8901 " f( );",
8902 Spaces);
8903 verifyFormat("do {\n"
8904 " do_something(( int ) i);\n"
8905 "} while (something( ));",
8906 Spaces);
8907 verifyFormat("switch (x) {\n"
8908 "default:\n"
8909 " break;\n"
8910 "}",
8911 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008912
8913 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008914 Spaces.SpacesInCStyleCastParentheses = false;
8915 Spaces.SpaceAfterCStyleCast = true;
8916 verifyFormat("while ((bool) 1)\n"
8917 " continue;",
8918 Spaces);
8919 verifyFormat("do {\n"
8920 " do_something((int) i);\n"
8921 "} while (something( ));",
8922 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008923}
8924
Daniel Jasperad981f82014-08-26 11:41:14 +00008925TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8926 verifyFormat("int a[5];");
8927 verifyFormat("a[3] += 42;");
8928
8929 FormatStyle Spaces = getLLVMStyle();
8930 Spaces.SpacesInSquareBrackets = true;
8931 // Lambdas unchanged.
8932 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8933 verifyFormat("return [i, args...] {};", Spaces);
8934
8935 // Not lambdas.
8936 verifyFormat("int a[ 5 ];", Spaces);
8937 verifyFormat("a[ 3 ] += 42;", Spaces);
8938 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8939 verifyFormat("double &operator[](int i) { return 0; }\n"
8940 "int i;",
8941 Spaces);
8942 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8943 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8944 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8945}
8946
Daniel Jasperd94bff32013-09-25 15:15:02 +00008947TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8948 verifyFormat("int a = 5;");
8949 verifyFormat("a += 42;");
8950 verifyFormat("a or_eq 8;");
8951
8952 FormatStyle Spaces = getLLVMStyle();
8953 Spaces.SpaceBeforeAssignmentOperators = false;
8954 verifyFormat("int a= 5;", Spaces);
8955 verifyFormat("a+= 42;", Spaces);
8956 verifyFormat("a or_eq 8;", Spaces);
8957}
8958
Francois Ferrand2a9ea782018-03-01 10:09:13 +00008959TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
8960 verifyFormat("class Foo : public Bar {};");
8961 verifyFormat("Foo::Foo() : foo(1) {}");
8962 verifyFormat("for (auto a : b) {\n}");
8963 verifyFormat("int x = a ? b : c;");
8964 verifyFormat("{\n"
8965 "label0:\n"
8966 " int x = 0;\n"
8967 "}");
8968 verifyFormat("switch (x) {\n"
8969 "case 1:\n"
8970 "default:\n"
8971 "}");
8972
8973 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
8974 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
8975 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
8976 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
8977 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
8978 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
8979 verifyFormat("{\n"
8980 "label1:\n"
8981 " int x = 0;\n"
8982 "}",
8983 CtorInitializerStyle);
8984 verifyFormat("switch (x) {\n"
8985 "case 1:\n"
8986 "default:\n"
8987 "}",
8988 CtorInitializerStyle);
8989 CtorInitializerStyle.BreakConstructorInitializers =
8990 FormatStyle::BCIS_AfterColon;
8991 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
8992 " aaaaaaaaaaaaaaaa(1),\n"
8993 " bbbbbbbbbbbbbbbb(2) {}",
8994 CtorInitializerStyle);
8995 CtorInitializerStyle.BreakConstructorInitializers =
8996 FormatStyle::BCIS_BeforeComma;
8997 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
8998 " : aaaaaaaaaaaaaaaa(1)\n"
8999 " , bbbbbbbbbbbbbbbb(2) {}",
9000 CtorInitializerStyle);
9001 CtorInitializerStyle.BreakConstructorInitializers =
9002 FormatStyle::BCIS_BeforeColon;
9003 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9004 " : aaaaaaaaaaaaaaaa(1),\n"
9005 " bbbbbbbbbbbbbbbb(2) {}",
9006 CtorInitializerStyle);
9007 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9008 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9009 ": aaaaaaaaaaaaaaaa(1),\n"
9010 " bbbbbbbbbbbbbbbb(2) {}",
9011 CtorInitializerStyle);
9012
9013 FormatStyle InheritanceStyle = getLLVMStyle();
9014 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9015 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9016 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9017 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9018 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9019 verifyFormat("{\n"
9020 "label2:\n"
9021 " int x = 0;\n"
9022 "}",
9023 InheritanceStyle);
9024 verifyFormat("switch (x) {\n"
9025 "case 1:\n"
9026 "default:\n"
9027 "}",
9028 InheritanceStyle);
9029
9030 FormatStyle ForLoopStyle = getLLVMStyle();
9031 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9032 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9033 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9034 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9035 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9036 verifyFormat("{\n"
9037 "label2:\n"
9038 " int x = 0;\n"
9039 "}",
9040 ForLoopStyle);
9041 verifyFormat("switch (x) {\n"
9042 "case 1:\n"
9043 "default:\n"
9044 "}",
9045 ForLoopStyle);
9046
9047 FormatStyle NoSpaceStyle = getLLVMStyle();
9048 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9049 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9050 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9051 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9052 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9053 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9054 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9055 verifyFormat("{\n"
9056 "label3:\n"
9057 " int x = 0;\n"
9058 "}",
9059 NoSpaceStyle);
9060 verifyFormat("switch (x) {\n"
9061 "case 1:\n"
9062 "default:\n"
9063 "}",
9064 NoSpaceStyle);
9065}
9066
Daniel Jaspera44991332015-04-29 13:06:49 +00009067TEST_F(FormatTest, AlignConsecutiveAssignments) {
9068 FormatStyle Alignment = getLLVMStyle();
9069 Alignment.AlignConsecutiveAssignments = false;
9070 verifyFormat("int a = 5;\n"
9071 "int oneTwoThree = 123;",
9072 Alignment);
9073 verifyFormat("int a = 5;\n"
9074 "int oneTwoThree = 123;",
9075 Alignment);
9076
9077 Alignment.AlignConsecutiveAssignments = true;
9078 verifyFormat("int a = 5;\n"
9079 "int oneTwoThree = 123;",
9080 Alignment);
9081 verifyFormat("int a = method();\n"
9082 "int oneTwoThree = 133;",
9083 Alignment);
9084 verifyFormat("a &= 5;\n"
9085 "bcd *= 5;\n"
9086 "ghtyf += 5;\n"
9087 "dvfvdb -= 5;\n"
9088 "a /= 5;\n"
9089 "vdsvsv %= 5;\n"
9090 "sfdbddfbdfbb ^= 5;\n"
9091 "dvsdsv |= 5;\n"
9092 "int dsvvdvsdvvv = 123;",
9093 Alignment);
9094 verifyFormat("int i = 1, j = 10;\n"
9095 "something = 2000;",
9096 Alignment);
9097 verifyFormat("something = 2000;\n"
9098 "int i = 1, j = 10;\n",
9099 Alignment);
9100 verifyFormat("something = 2000;\n"
9101 "another = 911;\n"
9102 "int i = 1, j = 10;\n"
9103 "oneMore = 1;\n"
9104 "i = 2;",
9105 Alignment);
9106 verifyFormat("int a = 5;\n"
9107 "int one = 1;\n"
9108 "method();\n"
9109 "int oneTwoThree = 123;\n"
9110 "int oneTwo = 12;",
9111 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009112 verifyFormat("int oneTwoThree = 123;\n"
9113 "int oneTwo = 12;\n"
9114 "method();\n",
9115 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009116 verifyFormat("int oneTwoThree = 123; // comment\n"
9117 "int oneTwo = 12; // comment",
9118 Alignment);
9119 EXPECT_EQ("int a = 5;\n"
9120 "\n"
9121 "int oneTwoThree = 123;",
9122 format("int a = 5;\n"
9123 "\n"
9124 "int oneTwoThree= 123;",
9125 Alignment));
9126 EXPECT_EQ("int a = 5;\n"
9127 "int one = 1;\n"
9128 "\n"
9129 "int oneTwoThree = 123;",
9130 format("int a = 5;\n"
9131 "int one = 1;\n"
9132 "\n"
9133 "int oneTwoThree = 123;",
9134 Alignment));
9135 EXPECT_EQ("int a = 5;\n"
9136 "int one = 1;\n"
9137 "\n"
9138 "int oneTwoThree = 123;\n"
9139 "int oneTwo = 12;",
9140 format("int a = 5;\n"
9141 "int one = 1;\n"
9142 "\n"
9143 "int oneTwoThree = 123;\n"
9144 "int oneTwo = 12;",
9145 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009146 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9147 verifyFormat("#define A \\\n"
9148 " int aaaa = 12; \\\n"
9149 " int b = 23; \\\n"
9150 " int ccc = 234; \\\n"
9151 " int dddddddddd = 2345;",
9152 Alignment);
9153 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009154 verifyFormat("#define A \\\n"
9155 " int aaaa = 12; \\\n"
9156 " int b = 23; \\\n"
9157 " int ccc = 234; \\\n"
9158 " int dddddddddd = 2345;",
9159 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009160 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009161 verifyFormat("#define A "
9162 " \\\n"
9163 " int aaaa = 12; "
9164 " \\\n"
9165 " int b = 23; "
9166 " \\\n"
9167 " int ccc = 234; "
9168 " \\\n"
9169 " int dddddddddd = 2345;",
9170 Alignment);
9171 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9172 "k = 4, int l = 5,\n"
9173 " int m = 6) {\n"
9174 " int j = 10;\n"
9175 " otherThing = 1;\n"
9176 "}",
9177 Alignment);
9178 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9179 " int i = 1;\n"
9180 " int j = 2;\n"
9181 " int big = 10000;\n"
9182 "}",
9183 Alignment);
9184 verifyFormat("class C {\n"
9185 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009186 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009187 " virtual void f() = 0;\n"
9188 "};",
9189 Alignment);
9190 verifyFormat("int i = 1;\n"
9191 "if (SomeType t = getSomething()) {\n"
9192 "}\n"
9193 "int j = 2;\n"
9194 "int big = 10000;",
9195 Alignment);
9196 verifyFormat("int j = 7;\n"
9197 "for (int k = 0; k < N; ++k) {\n"
9198 "}\n"
9199 "int j = 2;\n"
9200 "int big = 10000;\n"
9201 "}",
9202 Alignment);
9203 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9204 verifyFormat("int i = 1;\n"
9205 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9206 " = someLooooooooooooooooongFunction();\n"
9207 "int j = 2;",
9208 Alignment);
9209 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9210 verifyFormat("int i = 1;\n"
9211 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9212 " someLooooooooooooooooongFunction();\n"
9213 "int j = 2;",
9214 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009215
9216 verifyFormat("auto lambda = []() {\n"
9217 " auto i = 0;\n"
9218 " return 0;\n"
9219 "};\n"
9220 "int i = 0;\n"
9221 "auto v = type{\n"
9222 " i = 1, //\n"
9223 " (i = 2), //\n"
9224 " i = 3 //\n"
9225 "};",
9226 Alignment);
9227
Daniel Jaspera44991332015-04-29 13:06:49 +00009228 verifyFormat(
9229 "int i = 1;\n"
9230 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9231 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009232 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009233 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009234
9235 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9236 " typename B = very_long_type_name_1,\n"
9237 " typename T_2 = very_long_type_name_2>\n"
9238 "auto foo() {}\n",
9239 Alignment);
9240 verifyFormat("int a, b = 1;\n"
9241 "int c = 2;\n"
9242 "int dd = 3;\n",
9243 Alignment);
9244 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9245 "float b[1][] = {{3.f}};\n",
9246 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009247 verifyFormat("for (int i = 0; i < 1; i++)\n"
9248 " int x = 1;\n",
9249 Alignment);
9250 verifyFormat("for (i = 0; i < 1; i++)\n"
9251 " x = 1;\n"
9252 "y = 1;\n",
9253 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009254}
9255
Daniel Jaspere12597c2015-10-01 10:06:54 +00009256TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9257 FormatStyle Alignment = getLLVMStyle();
9258 Alignment.AlignConsecutiveDeclarations = false;
9259 verifyFormat("float const a = 5;\n"
9260 "int oneTwoThree = 123;",
9261 Alignment);
9262 verifyFormat("int a = 5;\n"
9263 "float const oneTwoThree = 123;",
9264 Alignment);
9265
9266 Alignment.AlignConsecutiveDeclarations = true;
9267 verifyFormat("float const a = 5;\n"
9268 "int oneTwoThree = 123;",
9269 Alignment);
9270 verifyFormat("int a = method();\n"
9271 "float const oneTwoThree = 133;",
9272 Alignment);
9273 verifyFormat("int i = 1, j = 10;\n"
9274 "something = 2000;",
9275 Alignment);
9276 verifyFormat("something = 2000;\n"
9277 "int i = 1, j = 10;\n",
9278 Alignment);
9279 verifyFormat("float something = 2000;\n"
9280 "double another = 911;\n"
9281 "int i = 1, j = 10;\n"
9282 "const int *oneMore = 1;\n"
9283 "unsigned i = 2;",
9284 Alignment);
9285 verifyFormat("float a = 5;\n"
9286 "int one = 1;\n"
9287 "method();\n"
9288 "const double oneTwoThree = 123;\n"
9289 "const unsigned int oneTwo = 12;",
9290 Alignment);
9291 verifyFormat("int oneTwoThree{0}; // comment\n"
9292 "unsigned oneTwo; // comment",
9293 Alignment);
9294 EXPECT_EQ("float const a = 5;\n"
9295 "\n"
9296 "int oneTwoThree = 123;",
9297 format("float const a = 5;\n"
9298 "\n"
9299 "int oneTwoThree= 123;",
9300 Alignment));
9301 EXPECT_EQ("float a = 5;\n"
9302 "int one = 1;\n"
9303 "\n"
9304 "unsigned oneTwoThree = 123;",
9305 format("float a = 5;\n"
9306 "int one = 1;\n"
9307 "\n"
9308 "unsigned oneTwoThree = 123;",
9309 Alignment));
9310 EXPECT_EQ("float a = 5;\n"
9311 "int one = 1;\n"
9312 "\n"
9313 "unsigned oneTwoThree = 123;\n"
9314 "int oneTwo = 12;",
9315 format("float a = 5;\n"
9316 "int one = 1;\n"
9317 "\n"
9318 "unsigned oneTwoThree = 123;\n"
9319 "int oneTwo = 12;",
9320 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009321 // Function prototype alignment
9322 verifyFormat("int a();\n"
9323 "double b();",
9324 Alignment);
9325 verifyFormat("int a(int x);\n"
9326 "double b();",
9327 Alignment);
9328 unsigned OldColumnLimit = Alignment.ColumnLimit;
9329 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9330 // otherwise the function parameters will be re-flowed onto a single line.
9331 Alignment.ColumnLimit = 0;
9332 EXPECT_EQ("int a(int x,\n"
9333 " float y);\n"
9334 "double b(int x,\n"
9335 " double y);",
9336 format("int a(int x,\n"
9337 " float y);\n"
9338 "double b(int x,\n"
9339 " double y);",
9340 Alignment));
9341 // This ensures that function parameters of function declarations are
9342 // correctly indented when their owning functions are indented.
9343 // The failure case here is for 'double y' to not be indented enough.
9344 EXPECT_EQ("double a(int x);\n"
9345 "int b(int y,\n"
9346 " double z);",
9347 format("double a(int x);\n"
9348 "int b(int y,\n"
9349 " double z);",
9350 Alignment));
9351 // Set ColumnLimit low so that we induce wrapping immediately after
9352 // the function name and opening paren.
9353 Alignment.ColumnLimit = 13;
9354 verifyFormat("int function(\n"
9355 " int x,\n"
9356 " bool y);",
9357 Alignment);
9358 Alignment.ColumnLimit = OldColumnLimit;
9359 // Ensure function pointers don't screw up recursive alignment
9360 verifyFormat("int a(int x, void (*fp)(int y));\n"
9361 "double b();",
9362 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009363 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009364 // Ensure recursive alignment is broken by function braces, so that the
9365 // "a = 1" does not align with subsequent assignments inside the function
9366 // body.
9367 verifyFormat("int func(int a = 1) {\n"
9368 " int b = 2;\n"
9369 " int cc = 3;\n"
9370 "}",
9371 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009372 verifyFormat("float something = 2000;\n"
9373 "double another = 911;\n"
9374 "int i = 1, j = 10;\n"
9375 "const int *oneMore = 1;\n"
9376 "unsigned i = 2;",
9377 Alignment);
9378 verifyFormat("int oneTwoThree = {0}; // comment\n"
9379 "unsigned oneTwo = 0; // comment",
9380 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009381 // Make sure that scope is correctly tracked, in the absence of braces
9382 verifyFormat("for (int i = 0; i < n; i++)\n"
9383 " j = i;\n"
9384 "double x = 1;\n",
9385 Alignment);
9386 verifyFormat("if (int i = 0)\n"
9387 " j = i;\n"
9388 "double x = 1;\n",
9389 Alignment);
9390 // Ensure operator[] and operator() are comprehended
9391 verifyFormat("struct test {\n"
9392 " long long int foo();\n"
9393 " int operator[](int a);\n"
9394 " double bar();\n"
9395 "};\n",
9396 Alignment);
9397 verifyFormat("struct test {\n"
9398 " long long int foo();\n"
9399 " int operator()(int a);\n"
9400 " double bar();\n"
9401 "};\n",
9402 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009403 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9404 " int const i = 1;\n"
9405 " int * j = 2;\n"
9406 " int big = 10000;\n"
9407 "\n"
9408 " unsigned oneTwoThree = 123;\n"
9409 " int oneTwo = 12;\n"
9410 " method();\n"
9411 " float k = 2;\n"
9412 " int ll = 10000;\n"
9413 "}",
9414 format("void SomeFunction(int parameter= 0) {\n"
9415 " int const i= 1;\n"
9416 " int *j=2;\n"
9417 " int big = 10000;\n"
9418 "\n"
9419 "unsigned oneTwoThree =123;\n"
9420 "int oneTwo = 12;\n"
9421 " method();\n"
9422 "float k= 2;\n"
9423 "int ll=10000;\n"
9424 "}",
9425 Alignment));
9426 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009427 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9428 verifyFormat("#define A \\\n"
9429 " int aaaa = 12; \\\n"
9430 " float b = 23; \\\n"
9431 " const int ccc = 234; \\\n"
9432 " unsigned dddddddddd = 2345;",
9433 Alignment);
9434 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009435 verifyFormat("#define A \\\n"
9436 " int aaaa = 12; \\\n"
9437 " float b = 23; \\\n"
9438 " const int ccc = 234; \\\n"
9439 " unsigned dddddddddd = 2345;",
9440 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009441 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009442 Alignment.ColumnLimit = 30;
9443 verifyFormat("#define A \\\n"
9444 " int aaaa = 12; \\\n"
9445 " float b = 23; \\\n"
9446 " const int ccc = 234; \\\n"
9447 " int dddddddddd = 2345;",
9448 Alignment);
9449 Alignment.ColumnLimit = 80;
9450 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9451 "k = 4, int l = 5,\n"
9452 " int m = 6) {\n"
9453 " const int j = 10;\n"
9454 " otherThing = 1;\n"
9455 "}",
9456 Alignment);
9457 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9458 " int const i = 1;\n"
9459 " int * j = 2;\n"
9460 " int big = 10000;\n"
9461 "}",
9462 Alignment);
9463 verifyFormat("class C {\n"
9464 "public:\n"
9465 " int i = 1;\n"
9466 " virtual void f() = 0;\n"
9467 "};",
9468 Alignment);
9469 verifyFormat("float i = 1;\n"
9470 "if (SomeType t = getSomething()) {\n"
9471 "}\n"
9472 "const unsigned j = 2;\n"
9473 "int big = 10000;",
9474 Alignment);
9475 verifyFormat("float j = 7;\n"
9476 "for (int k = 0; k < N; ++k) {\n"
9477 "}\n"
9478 "unsigned j = 2;\n"
9479 "int big = 10000;\n"
9480 "}",
9481 Alignment);
9482 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9483 verifyFormat("float i = 1;\n"
9484 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9485 " = someLooooooooooooooooongFunction();\n"
9486 "int j = 2;",
9487 Alignment);
9488 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9489 verifyFormat("int i = 1;\n"
9490 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9491 " someLooooooooooooooooongFunction();\n"
9492 "int j = 2;",
9493 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009494
9495 Alignment.AlignConsecutiveAssignments = true;
9496 verifyFormat("auto lambda = []() {\n"
9497 " auto ii = 0;\n"
9498 " float j = 0;\n"
9499 " return 0;\n"
9500 "};\n"
9501 "int i = 0;\n"
9502 "float i2 = 0;\n"
9503 "auto v = type{\n"
9504 " i = 1, //\n"
9505 " (i = 2), //\n"
9506 " i = 3 //\n"
9507 "};",
9508 Alignment);
9509 Alignment.AlignConsecutiveAssignments = false;
9510
Daniel Jaspere12597c2015-10-01 10:06:54 +00009511 verifyFormat(
9512 "int i = 1;\n"
9513 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9514 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009515 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009516 Alignment);
9517
9518 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9519 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009520 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009521 // happens.
9522 Alignment.AlignConsecutiveAssignments = true;
9523 Alignment.ColumnLimit = 30;
9524 verifyFormat("float ii = 1;\n"
9525 "unsigned j = 2;\n"
9526 "int someVerylongVariable = 1;\n"
9527 "AnotherLongType ll = 123456;\n"
9528 "VeryVeryLongType k = 2;\n"
9529 "int myvar = 1;",
9530 Alignment);
9531 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009532 Alignment.AlignConsecutiveAssignments = false;
9533
9534 verifyFormat(
9535 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9536 " typename LongType, typename B>\n"
9537 "auto foo() {}\n",
9538 Alignment);
9539 verifyFormat("float a, b = 1;\n"
9540 "int c = 2;\n"
9541 "int dd = 3;\n",
9542 Alignment);
9543 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9544 "float b[1][] = {{3.f}};\n",
9545 Alignment);
9546 Alignment.AlignConsecutiveAssignments = true;
9547 verifyFormat("float a, b = 1;\n"
9548 "int c = 2;\n"
9549 "int dd = 3;\n",
9550 Alignment);
9551 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9552 "float b[1][] = {{3.f}};\n",
9553 Alignment);
9554 Alignment.AlignConsecutiveAssignments = false;
9555
9556 Alignment.ColumnLimit = 30;
9557 Alignment.BinPackParameters = false;
9558 verifyFormat("void foo(float a,\n"
9559 " float b,\n"
9560 " int c,\n"
9561 " uint32_t *d) {\n"
9562 " int * e = 0;\n"
9563 " float f = 0;\n"
9564 " double g = 0;\n"
9565 "}\n"
9566 "void bar(ino_t a,\n"
9567 " int b,\n"
9568 " uint32_t *c,\n"
9569 " bool d) {}\n",
9570 Alignment);
9571 Alignment.BinPackParameters = true;
9572 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009573
9574 // Bug 33507
9575 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9576 verifyFormat(
9577 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9578 " static const Version verVs2017;\n"
9579 " return true;\n"
9580 "});\n",
9581 Alignment);
9582 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009583}
9584
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009585TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009586 FormatStyle LinuxBraceStyle = getLLVMStyle();
9587 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009588 verifyFormat("namespace a\n"
9589 "{\n"
9590 "class A\n"
9591 "{\n"
9592 " void f()\n"
9593 " {\n"
9594 " if (true) {\n"
9595 " a();\n"
9596 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009597 " } else {\n"
9598 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009599 " }\n"
9600 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009601 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009602 "};\n"
9603 "struct B {\n"
9604 " int x;\n"
9605 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009606 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009607 LinuxBraceStyle);
9608 verifyFormat("enum X {\n"
9609 " Y = 0,\n"
9610 "}\n",
9611 LinuxBraceStyle);
9612 verifyFormat("struct S {\n"
9613 " int Type;\n"
9614 " union {\n"
9615 " int x;\n"
9616 " double y;\n"
9617 " } Value;\n"
9618 " class C\n"
9619 " {\n"
9620 " MyFavoriteType Value;\n"
9621 " } Class;\n"
9622 "}\n",
9623 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009624}
9625
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009626TEST_F(FormatTest, MozillaBraceBreaking) {
9627 FormatStyle MozillaBraceStyle = getLLVMStyle();
9628 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009629 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009630 verifyFormat("namespace a {\n"
9631 "class A\n"
9632 "{\n"
9633 " void f()\n"
9634 " {\n"
9635 " if (true) {\n"
9636 " a();\n"
9637 " b();\n"
9638 " }\n"
9639 " }\n"
9640 " void g() { return; }\n"
9641 "};\n"
9642 "enum E\n"
9643 "{\n"
9644 " A,\n"
9645 " // foo\n"
9646 " B,\n"
9647 " C\n"
9648 "};\n"
9649 "struct B\n"
9650 "{\n"
9651 " int x;\n"
9652 "};\n"
9653 "}\n",
9654 MozillaBraceStyle);
9655 verifyFormat("struct S\n"
9656 "{\n"
9657 " int Type;\n"
9658 " union\n"
9659 " {\n"
9660 " int x;\n"
9661 " double y;\n"
9662 " } Value;\n"
9663 " class C\n"
9664 " {\n"
9665 " MyFavoriteType Value;\n"
9666 " } Class;\n"
9667 "}\n",
9668 MozillaBraceStyle);
9669}
9670
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009671TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009672 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9673 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009674 verifyFormat("namespace a {\n"
9675 "class A {\n"
9676 " void f()\n"
9677 " {\n"
9678 " if (true) {\n"
9679 " a();\n"
9680 " b();\n"
9681 " }\n"
9682 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009683 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009684 "};\n"
9685 "struct B {\n"
9686 " int x;\n"
9687 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009688 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009689 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009690
Daniel Jasperd9670872014-08-05 12:06:20 +00009691 verifyFormat("void foo()\n"
9692 "{\n"
9693 " if (a) {\n"
9694 " a();\n"
9695 " }\n"
9696 " else {\n"
9697 " b();\n"
9698 " }\n"
9699 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009700 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009701
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009702 verifyFormat("#ifdef _DEBUG\n"
9703 "int foo(int i = 0)\n"
9704 "#else\n"
9705 "int foo(int i = 5)\n"
9706 "#endif\n"
9707 "{\n"
9708 " return i;\n"
9709 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009710 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009711
9712 verifyFormat("void foo() {}\n"
9713 "void bar()\n"
9714 "#ifdef _DEBUG\n"
9715 "{\n"
9716 " foo();\n"
9717 "}\n"
9718 "#else\n"
9719 "{\n"
9720 "}\n"
9721 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009722 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009723
9724 verifyFormat("void foobar() { int i = 5; }\n"
9725 "#ifdef _DEBUG\n"
9726 "void bar() {}\n"
9727 "#else\n"
9728 "void bar() { foobar(); }\n"
9729 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009730 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009731}
9732
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009733TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009734 FormatStyle AllmanBraceStyle = getLLVMStyle();
9735 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009736
9737 EXPECT_EQ("namespace a\n"
9738 "{\n"
9739 "void f();\n"
9740 "void g();\n"
9741 "} // namespace a\n",
9742 format("namespace a\n"
9743 "{\n"
9744 "void f();\n"
9745 "void g();\n"
9746 "}\n",
9747 AllmanBraceStyle));
9748
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009749 verifyFormat("namespace a\n"
9750 "{\n"
9751 "class A\n"
9752 "{\n"
9753 " void f()\n"
9754 " {\n"
9755 " if (true)\n"
9756 " {\n"
9757 " a();\n"
9758 " b();\n"
9759 " }\n"
9760 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009761 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009762 "};\n"
9763 "struct B\n"
9764 "{\n"
9765 " int x;\n"
9766 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009767 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009768 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009769
9770 verifyFormat("void f()\n"
9771 "{\n"
9772 " if (true)\n"
9773 " {\n"
9774 " a();\n"
9775 " }\n"
9776 " else if (false)\n"
9777 " {\n"
9778 " b();\n"
9779 " }\n"
9780 " else\n"
9781 " {\n"
9782 " c();\n"
9783 " }\n"
9784 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009785 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009786
9787 verifyFormat("void f()\n"
9788 "{\n"
9789 " for (int i = 0; i < 10; ++i)\n"
9790 " {\n"
9791 " a();\n"
9792 " }\n"
9793 " while (false)\n"
9794 " {\n"
9795 " b();\n"
9796 " }\n"
9797 " do\n"
9798 " {\n"
9799 " c();\n"
9800 " } while (false)\n"
9801 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009802 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009803
9804 verifyFormat("void f(int a)\n"
9805 "{\n"
9806 " switch (a)\n"
9807 " {\n"
9808 " case 0:\n"
9809 " break;\n"
9810 " case 1:\n"
9811 " {\n"
9812 " break;\n"
9813 " }\n"
9814 " case 2:\n"
9815 " {\n"
9816 " }\n"
9817 " break;\n"
9818 " default:\n"
9819 " break;\n"
9820 " }\n"
9821 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009822 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009823
9824 verifyFormat("enum X\n"
9825 "{\n"
9826 " Y = 0,\n"
9827 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009828 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009829 verifyFormat("enum X\n"
9830 "{\n"
9831 " Y = 0\n"
9832 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009833 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009834
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009835 verifyFormat("@interface BSApplicationController ()\n"
9836 "{\n"
9837 "@private\n"
9838 " id _extraIvar;\n"
9839 "}\n"
9840 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009841 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009842
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009843 verifyFormat("#ifdef _DEBUG\n"
9844 "int foo(int i = 0)\n"
9845 "#else\n"
9846 "int foo(int i = 5)\n"
9847 "#endif\n"
9848 "{\n"
9849 " return i;\n"
9850 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009851 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009852
9853 verifyFormat("void foo() {}\n"
9854 "void bar()\n"
9855 "#ifdef _DEBUG\n"
9856 "{\n"
9857 " foo();\n"
9858 "}\n"
9859 "#else\n"
9860 "{\n"
9861 "}\n"
9862 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009863 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009864
9865 verifyFormat("void foobar() { int i = 5; }\n"
9866 "#ifdef _DEBUG\n"
9867 "void bar() {}\n"
9868 "#else\n"
9869 "void bar() { foobar(); }\n"
9870 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009871 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009872
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009873 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009874 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009875 " // ...\n"
9876 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009877 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009878 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009879 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009880 " // ...\n"
9881 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009882 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009883 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009884 // .. or dict literals.
9885 verifyFormat("void f()\n"
9886 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009887 " // ...\n"
9888 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9889 "}",
9890 AllmanBraceStyle);
9891 verifyFormat("void f()\n"
9892 "{\n"
9893 " // ...\n"
9894 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009895 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009896 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009897 verifyFormat("int f()\n"
9898 "{ // comment\n"
9899 " return 42;\n"
9900 "}",
9901 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009902
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009903 AllmanBraceStyle.ColumnLimit = 19;
9904 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9905 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009906 verifyFormat("void f()\n"
9907 "{\n"
9908 " int i;\n"
9909 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009910 AllmanBraceStyle);
9911 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009912
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009913 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009914 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9915 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9916 verifyFormat("void f(bool b)\n"
9917 "{\n"
9918 " if (b)\n"
9919 " {\n"
9920 " return;\n"
9921 " }\n"
9922 "}\n",
9923 BreakBeforeBraceShortIfs);
9924 verifyFormat("void f(bool b)\n"
9925 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009926 " if constexpr (b)\n"
9927 " {\n"
9928 " return;\n"
9929 " }\n"
9930 "}\n",
9931 BreakBeforeBraceShortIfs);
9932 verifyFormat("void f(bool b)\n"
9933 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009934 " if (b) return;\n"
9935 "}\n",
9936 BreakBeforeBraceShortIfs);
9937 verifyFormat("void f(bool b)\n"
9938 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009939 " if constexpr (b) return;\n"
9940 "}\n",
9941 BreakBeforeBraceShortIfs);
9942 verifyFormat("void f(bool b)\n"
9943 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009944 " while (b)\n"
9945 " {\n"
9946 " return;\n"
9947 " }\n"
9948 "}\n",
9949 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009950}
9951
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009952TEST_F(FormatTest, GNUBraceBreaking) {
9953 FormatStyle GNUBraceStyle = getLLVMStyle();
9954 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9955 verifyFormat("namespace a\n"
9956 "{\n"
9957 "class A\n"
9958 "{\n"
9959 " void f()\n"
9960 " {\n"
9961 " int a;\n"
9962 " {\n"
9963 " int b;\n"
9964 " }\n"
9965 " if (true)\n"
9966 " {\n"
9967 " a();\n"
9968 " b();\n"
9969 " }\n"
9970 " }\n"
9971 " void g() { return; }\n"
9972 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009973 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009974 GNUBraceStyle);
9975
9976 verifyFormat("void f()\n"
9977 "{\n"
9978 " if (true)\n"
9979 " {\n"
9980 " a();\n"
9981 " }\n"
9982 " else if (false)\n"
9983 " {\n"
9984 " b();\n"
9985 " }\n"
9986 " else\n"
9987 " {\n"
9988 " c();\n"
9989 " }\n"
9990 "}\n",
9991 GNUBraceStyle);
9992
9993 verifyFormat("void f()\n"
9994 "{\n"
9995 " for (int i = 0; i < 10; ++i)\n"
9996 " {\n"
9997 " a();\n"
9998 " }\n"
9999 " while (false)\n"
10000 " {\n"
10001 " b();\n"
10002 " }\n"
10003 " do\n"
10004 " {\n"
10005 " c();\n"
10006 " }\n"
10007 " while (false);\n"
10008 "}\n",
10009 GNUBraceStyle);
10010
10011 verifyFormat("void f(int a)\n"
10012 "{\n"
10013 " switch (a)\n"
10014 " {\n"
10015 " case 0:\n"
10016 " break;\n"
10017 " case 1:\n"
10018 " {\n"
10019 " break;\n"
10020 " }\n"
10021 " case 2:\n"
10022 " {\n"
10023 " }\n"
10024 " break;\n"
10025 " default:\n"
10026 " break;\n"
10027 " }\n"
10028 "}\n",
10029 GNUBraceStyle);
10030
10031 verifyFormat("enum X\n"
10032 "{\n"
10033 " Y = 0,\n"
10034 "}\n",
10035 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010036
10037 verifyFormat("@interface BSApplicationController ()\n"
10038 "{\n"
10039 "@private\n"
10040 " id _extraIvar;\n"
10041 "}\n"
10042 "@end\n",
10043 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010044
10045 verifyFormat("#ifdef _DEBUG\n"
10046 "int foo(int i = 0)\n"
10047 "#else\n"
10048 "int foo(int i = 5)\n"
10049 "#endif\n"
10050 "{\n"
10051 " return i;\n"
10052 "}",
10053 GNUBraceStyle);
10054
10055 verifyFormat("void foo() {}\n"
10056 "void bar()\n"
10057 "#ifdef _DEBUG\n"
10058 "{\n"
10059 " foo();\n"
10060 "}\n"
10061 "#else\n"
10062 "{\n"
10063 "}\n"
10064 "#endif",
10065 GNUBraceStyle);
10066
10067 verifyFormat("void foobar() { int i = 5; }\n"
10068 "#ifdef _DEBUG\n"
10069 "void bar() {}\n"
10070 "#else\n"
10071 "void bar() { foobar(); }\n"
10072 "#endif",
10073 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010074}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010075
10076TEST_F(FormatTest, WebKitBraceBreaking) {
10077 FormatStyle WebKitBraceStyle = getLLVMStyle();
10078 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010079 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010080 verifyFormat("namespace a {\n"
10081 "class A {\n"
10082 " void f()\n"
10083 " {\n"
10084 " if (true) {\n"
10085 " a();\n"
10086 " b();\n"
10087 " }\n"
10088 " }\n"
10089 " void g() { return; }\n"
10090 "};\n"
10091 "enum E {\n"
10092 " A,\n"
10093 " // foo\n"
10094 " B,\n"
10095 " C\n"
10096 "};\n"
10097 "struct B {\n"
10098 " int x;\n"
10099 "};\n"
10100 "}\n",
10101 WebKitBraceStyle);
10102 verifyFormat("struct S {\n"
10103 " int Type;\n"
10104 " union {\n"
10105 " int x;\n"
10106 " double y;\n"
10107 " } Value;\n"
10108 " class C {\n"
10109 " MyFavoriteType Value;\n"
10110 " } Class;\n"
10111 "};\n",
10112 WebKitBraceStyle);
10113}
10114
Manuel Klimekd5735502013-08-12 03:51:17 +000010115TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10116 verifyFormat("void f() {\n"
10117 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010118 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010119 " }\n"
10120 "}\n",
10121 getLLVMStyle());
10122}
10123
Daniel Jasper9613c812013-08-07 16:29:23 +000010124TEST_F(FormatTest, UnderstandsPragmas) {
10125 verifyFormat("#pragma omp reduction(| : var)");
10126 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010127
10128 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10129 "(including parentheses).",
10130 format("#pragma mark Any non-hyphenated or hyphenated string "
10131 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010132}
10133
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010134TEST_F(FormatTest, UnderstandPragmaOption) {
10135 verifyFormat("#pragma option -C -A");
10136
10137 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10138}
10139
Manuel Klimek77866142017-11-17 11:17:15 +000010140TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10141 FormatStyle Style = getLLVMStyle();
10142 Style.ColumnLimit = 20;
10143
10144 verifyFormat("int a; // the\n"
10145 " // comment", Style);
10146 EXPECT_EQ("int a; /* first line\n"
10147 " * second\n"
10148 " * line third\n"
10149 " * line\n"
10150 " */",
10151 format("int a; /* first line\n"
10152 " * second\n"
10153 " * line third\n"
10154 " * line\n"
10155 " */",
10156 Style));
10157 EXPECT_EQ("int a; // first line\n"
10158 " // second\n"
10159 " // line third\n"
10160 " // line",
10161 format("int a; // first line\n"
10162 " // second line\n"
10163 " // third line",
10164 Style));
10165
10166 Style.PenaltyExcessCharacter = 90;
10167 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010168 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010169 " // aaa",
10170 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010171 EXPECT_EQ("int a; /* first line\n"
10172 " * second line\n"
10173 " * third line\n"
10174 " */",
10175 format("int a; /* first line\n"
10176 " * second line\n"
10177 " * third line\n"
10178 " */",
10179 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010180 EXPECT_EQ("int a; // first line\n"
10181 " // second line\n"
10182 " // third line",
10183 format("int a; // first line\n"
10184 " // second line\n"
10185 " // third line",
10186 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010187 // FIXME: Investigate why this is not getting the same layout as the test
10188 // above.
10189 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010190 " * second line\n"
10191 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010192 " */",
10193 format("int a; /* first line second line third line"
10194 "\n*/",
10195 Style));
10196
10197 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010198 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010199 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010200 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010201 Style));
10202 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010203 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010204 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010205 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010206 Style));
10207
10208 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10209 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010210 EXPECT_EQ("// foo bar baz bazfoo\n"
10211 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010212 format("// foo bar baz bazfoo bar\n"
10213 "// foo bar\n",
10214 Style));
10215
10216 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010217 "// foo bar baz bazfoo\n"
10218 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010219 format("// foo bar baz bazfoo\n"
10220 "// foo bar baz bazfoo bar\n"
10221 "// foo bar\n",
10222 Style));
10223
Manuel Klimek77866142017-11-17 11:17:15 +000010224 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010225 "// foo bar baz bazfoo\n"
10226 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010227 format("// foo bar baz bazfoo\n"
10228 "// foo bar baz bazfoo bar\n"
10229 "// foo bar\n",
10230 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010231
10232 // Make sure we do not keep protruding characters if strict mode reflow is
10233 // cheaper than keeping protruding characters.
10234 Style.ColumnLimit = 21;
10235 EXPECT_EQ("// foo foo foo foo\n"
10236 "// foo foo foo foo\n"
10237 "// foo foo foo foo\n",
10238 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10239 Style));
10240
10241 EXPECT_EQ("int a = /* long block\n"
10242 " comment */\n"
10243 " 42;",
10244 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010245}
10246
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010247#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10248 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010249 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10250 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010251
10252TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010253 SmallVector<FormatStyle, 3> Styles;
10254 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010255
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010256 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010257 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10258 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10259 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010260
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010261 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010262 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10263 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10264 EXPECT_ALL_STYLES_EQUAL(Styles);
10265
Nico Weber514ecc82014-02-02 20:50:45 +000010266 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010267 EXPECT_TRUE(
10268 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10269 EXPECT_TRUE(
10270 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10271 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010272
Nico Weber514ecc82014-02-02 20:50:45 +000010273 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010274 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10275 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10276 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010277
10278 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010279 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10280 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10281 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010282
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010283 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010284 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10285 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10286 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010287
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010288 Styles[0] = getGNUStyle();
10289 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10290 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10291 EXPECT_ALL_STYLES_EQUAL(Styles);
10292
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010293 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10294}
10295
10296TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10297 SmallVector<FormatStyle, 8> Styles;
10298 Styles.resize(2);
10299
10300 Styles[0] = getGoogleStyle();
10301 Styles[1] = getLLVMStyle();
10302 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10303 EXPECT_ALL_STYLES_EQUAL(Styles);
10304
10305 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010306 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010307 Styles[1] = getLLVMStyle();
10308 Styles[1].Language = FormatStyle::LK_JavaScript;
10309 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10310
10311 Styles[2] = getLLVMStyle();
10312 Styles[2].Language = FormatStyle::LK_JavaScript;
10313 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10314 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010315 &Styles[2])
10316 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010317
10318 Styles[3] = getLLVMStyle();
10319 Styles[3].Language = FormatStyle::LK_JavaScript;
10320 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10321 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010322 &Styles[3])
10323 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010324
10325 Styles[4] = getLLVMStyle();
10326 Styles[4].Language = FormatStyle::LK_JavaScript;
10327 EXPECT_EQ(0, parseConfiguration("---\n"
10328 "BasedOnStyle: LLVM\n"
10329 "IndentWidth: 123\n"
10330 "---\n"
10331 "BasedOnStyle: Google\n"
10332 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010333 &Styles[4])
10334 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010335 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010336}
10337
Daniel Jasper91881d92014-09-29 08:07:46 +000010338#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010339 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010340 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010341 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010342 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010343 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010344
Daniel Jasper91881d92014-09-29 08:07:46 +000010345#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10346
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010347#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10348 Style.STRUCT.FIELD = false; \
10349 EXPECT_EQ(0, \
10350 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10351 .value()); \
10352 EXPECT_TRUE(Style.STRUCT.FIELD); \
10353 EXPECT_EQ(0, \
10354 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10355 .value()); \
10356 EXPECT_FALSE(Style.STRUCT.FIELD);
10357
10358#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10359 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10360
Daniel Jasper00853002014-09-16 16:22:30 +000010361#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10362 EXPECT_NE(VALUE, Style.FIELD); \
10363 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10364 EXPECT_EQ(VALUE, Style.FIELD)
10365
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010366TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010367 FormatStyle Style = {};
10368 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010369 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010370 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010371 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010372 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010373 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010374 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010375 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010376 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010377 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010378 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010379 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010380 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010381 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010382 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010383 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010384 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010385 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010386 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010387 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010388 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010389 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010390 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010391 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010392 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010393 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010394 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010395 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010396 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010397 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010398 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010399 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010400 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010401 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010402 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010403 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010404 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010405 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010406 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010407 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010408 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10409 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10410 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010411
10412 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10413 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10414 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10415 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10416 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10417 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10418 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10419 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010420 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010421 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10422 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10423 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010424 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10425 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10426 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010427}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010428
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010429#undef CHECK_PARSE_BOOL
10430
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010431TEST_F(FormatTest, ParsesConfiguration) {
10432 FormatStyle Style = {};
10433 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010434 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010435 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10436 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010437 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010438 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10439 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010440 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10441 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010442 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10443 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010444 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10445 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10446 PenaltyReturnTypeOnItsOwnLine, 1234u);
10447 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10448 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010449 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010450 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010451 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010452
Daniel Jasper553d4872014-06-17 12:40:34 +000010453 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010454 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10455 FormatStyle::PAS_Left);
10456 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10457 FormatStyle::PAS_Right);
10458 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10459 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010460 // For backward compatibility:
10461 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10462 FormatStyle::PAS_Left);
10463 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10464 FormatStyle::PAS_Right);
10465 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10466 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010467
Alexander Kornienkod6538332013-05-07 15:32:14 +000010468 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010469 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10470 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010471 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10472 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10473 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10474
Daniel Jasperac043c92014-09-15 11:11:00 +000010475 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010476 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10477 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010478 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10479 FormatStyle::BOS_None);
10480 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10481 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010482 // For backward compatibility:
10483 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10484 FormatStyle::BOS_None);
10485 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10486 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010487
Francois Ferranda6b6d512017-05-24 11:36:58 +000010488 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10489 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10490 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10491 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10492 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10493 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10494 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10495 // For backward compatibility:
10496 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10497 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10498
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010499 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10500 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10501 FormatStyle::BAS_Align);
10502 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10503 FormatStyle::BAS_DontAlign);
10504 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10505 FormatStyle::BAS_AlwaysBreak);
10506 // For backward compatibility:
10507 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10508 FormatStyle::BAS_DontAlign);
10509 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10510 FormatStyle::BAS_Align);
10511
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010512 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10513 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10514 FormatStyle::ENAS_DontAlign);
10515 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10516 FormatStyle::ENAS_Left);
10517 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10518 FormatStyle::ENAS_Right);
10519 // For backward compatibility:
10520 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10521 FormatStyle::ENAS_Left);
10522 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10523 FormatStyle::ENAS_Right);
10524
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010525 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010526 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10527 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10528 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010529 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10530 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010531 // For backward compatibility:
10532 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10533 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010534
Daniel Jasperd74cf402014-04-08 12:46:38 +000010535 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010536 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10537 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10538 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10539 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010540 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10541 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010542 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10543 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010544 // For backward compatibility:
10545 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10546 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10547 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10548 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010549
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010550 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10551 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10552 FormatStyle::SBPO_Never);
10553 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10554 FormatStyle::SBPO_Always);
10555 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10556 FormatStyle::SBPO_ControlStatements);
10557 // For backward compatibility:
10558 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10559 FormatStyle::SBPO_Never);
10560 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10561 FormatStyle::SBPO_ControlStatements);
10562
Alexander Kornienkod6538332013-05-07 15:32:14 +000010563 Style.ColumnLimit = 123;
10564 FormatStyle BaseStyle = getLLVMStyle();
10565 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10566 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10567
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010568 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10569 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10570 FormatStyle::BS_Attach);
10571 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10572 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010573 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10574 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010575 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10576 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010577 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10578 FormatStyle::BS_Allman);
10579 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010580 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10581 FormatStyle::BS_WebKit);
10582 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10583 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010584
Zachary Turner448592e2015-12-18 22:20:15 +000010585 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10586 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10587 FormatStyle::RTBS_None);
10588 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10589 FormatStyle::RTBS_All);
10590 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010591 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010592 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10593 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10594 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10595 AlwaysBreakAfterReturnType,
10596 FormatStyle::RTBS_TopLevelDefinitions);
10597
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010598 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10599 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10600 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10601 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10602 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10603 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10604 AlwaysBreakAfterDefinitionReturnType,
10605 FormatStyle::DRTBS_TopLevel);
10606
Daniel Jasper65ee3472013-07-31 23:16:02 +000010607 Style.NamespaceIndentation = FormatStyle::NI_All;
10608 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10609 FormatStyle::NI_None);
10610 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10611 FormatStyle::NI_Inner);
10612 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10613 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010614
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010615 // FIXME: This is required because parsing a configuration simply overwrites
10616 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010617 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010618 std::vector<std::string> BoostForeach;
10619 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010620 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010621 std::vector<std::string> BoostAndQForeach;
10622 BoostAndQForeach.push_back("BOOST_FOREACH");
10623 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010624 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10625 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010626
10627 Style.IncludeCategories.clear();
10628 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10629 {".*", 1}};
10630 CHECK_PARSE("IncludeCategories:\n"
10631 " - Regex: abc/.*\n"
10632 " Priority: 2\n"
10633 " - Regex: .*\n"
10634 " Priority: 1",
10635 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010636 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010637
10638 Style.RawStringFormats.clear();
10639 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010640 {
10641 FormatStyle::LK_TextProto,
10642 {"pb", "proto"},
10643 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010644 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010645 "llvm",
10646 },
10647 {
10648 FormatStyle::LK_Cpp,
10649 {"cc", "cpp"},
10650 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010651 /*CanonicalDelimiter=*/"cc",
10652 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010653 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010654 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010655
10656 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010657 " - Language: TextProto\n"
10658 " Delimiters:\n"
10659 " - 'pb'\n"
10660 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010661 " EnclosingFunctions:\n"
10662 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010663 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010664 " - Language: Cpp\n"
10665 " Delimiters:\n"
10666 " - 'cc'\n"
10667 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010668 " EnclosingFunctions:\n"
10669 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010670 " - 'CPPEVAL'\n"
10671 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010672 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010673}
10674
10675TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10676 FormatStyle Style = {};
10677 Style.Language = FormatStyle::LK_Cpp;
10678 CHECK_PARSE("Language: Cpp\n"
10679 "IndentWidth: 12",
10680 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010681 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10682 "IndentWidth: 34",
10683 &Style),
10684 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010685 EXPECT_EQ(12u, Style.IndentWidth);
10686 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10687 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10688
10689 Style.Language = FormatStyle::LK_JavaScript;
10690 CHECK_PARSE("Language: JavaScript\n"
10691 "IndentWidth: 12",
10692 IndentWidth, 12u);
10693 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010694 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10695 "IndentWidth: 34",
10696 &Style),
10697 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010698 EXPECT_EQ(23u, Style.IndentWidth);
10699 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10700 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10701
10702 CHECK_PARSE("BasedOnStyle: LLVM\n"
10703 "IndentWidth: 67",
10704 IndentWidth, 67u);
10705
10706 CHECK_PARSE("---\n"
10707 "Language: JavaScript\n"
10708 "IndentWidth: 12\n"
10709 "---\n"
10710 "Language: Cpp\n"
10711 "IndentWidth: 34\n"
10712 "...\n",
10713 IndentWidth, 12u);
10714
10715 Style.Language = FormatStyle::LK_Cpp;
10716 CHECK_PARSE("---\n"
10717 "Language: JavaScript\n"
10718 "IndentWidth: 12\n"
10719 "---\n"
10720 "Language: Cpp\n"
10721 "IndentWidth: 34\n"
10722 "...\n",
10723 IndentWidth, 34u);
10724 CHECK_PARSE("---\n"
10725 "IndentWidth: 78\n"
10726 "---\n"
10727 "Language: JavaScript\n"
10728 "IndentWidth: 56\n"
10729 "...\n",
10730 IndentWidth, 78u);
10731
10732 Style.ColumnLimit = 123;
10733 Style.IndentWidth = 234;
10734 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10735 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010736 EXPECT_FALSE(parseConfiguration("---\n"
10737 "IndentWidth: 456\n"
10738 "BreakBeforeBraces: Allman\n"
10739 "---\n"
10740 "Language: JavaScript\n"
10741 "IndentWidth: 111\n"
10742 "TabWidth: 111\n"
10743 "---\n"
10744 "Language: Cpp\n"
10745 "BreakBeforeBraces: Stroustrup\n"
10746 "TabWidth: 789\n"
10747 "...\n",
10748 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010749 EXPECT_EQ(123u, Style.ColumnLimit);
10750 EXPECT_EQ(456u, Style.IndentWidth);
10751 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10752 EXPECT_EQ(789u, Style.TabWidth);
10753
Rafael Espindola1f243172014-06-12 11:35:17 +000010754 EXPECT_EQ(parseConfiguration("---\n"
10755 "Language: JavaScript\n"
10756 "IndentWidth: 56\n"
10757 "---\n"
10758 "IndentWidth: 78\n"
10759 "...\n",
10760 &Style),
10761 ParseError::Error);
10762 EXPECT_EQ(parseConfiguration("---\n"
10763 "Language: JavaScript\n"
10764 "IndentWidth: 56\n"
10765 "---\n"
10766 "Language: JavaScript\n"
10767 "IndentWidth: 78\n"
10768 "...\n",
10769 &Style),
10770 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010771
10772 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10773}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010774
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010775#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010776
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010777TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10778 FormatStyle Style = {};
10779 Style.Language = FormatStyle::LK_JavaScript;
10780 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010781 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010782 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010783
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010784 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010785 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010786 "BasedOnStyle: Google\n"
10787 "---\n"
10788 "Language: JavaScript\n"
10789 "IndentWidth: 76\n"
10790 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010791 &Style)
10792 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010793 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010794 EXPECT_EQ(76u, Style.IndentWidth);
10795 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10796}
10797
Alexander Kornienkod6538332013-05-07 15:32:14 +000010798TEST_F(FormatTest, ConfigurationRoundTripTest) {
10799 FormatStyle Style = getLLVMStyle();
10800 std::string YAML = configurationAsText(Style);
10801 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010802 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010803 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10804 EXPECT_EQ(Style, ParsedStyle);
10805}
10806
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010807TEST_F(FormatTest, WorksFor8bitEncodings) {
10808 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10809 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10810 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10811 "\"\xef\xee\xf0\xf3...\"",
10812 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10813 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10814 "\xef\xee\xf0\xf3...\"",
10815 getLLVMStyleWithColumns(12)));
10816}
10817
Alexander Kornienko393e3082013-11-13 14:04:17 +000010818TEST_F(FormatTest, HandlesUTF8BOM) {
10819 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10820 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10821 format("\xef\xbb\xbf#include <iostream>"));
10822 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10823 format("\xef\xbb\xbf\n#include <iostream>"));
10824}
10825
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010826// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10827#if !defined(_MSC_VER)
10828
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010829TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10830 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10831 getLLVMStyleWithColumns(35));
10832 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010833 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010834 verifyFormat("// Однажды в студёную зимнюю пору...",
10835 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010836 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010837 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10838 getLLVMStyleWithColumns(39));
10839 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010840 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010841}
10842
10843TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010844 // Non-printable characters' width is currently considered to be the length in
10845 // bytes in UTF8. The characters can be displayed in very different manner
10846 // (zero-width, single width with a substitution glyph, expanded to their code
10847 // (e.g. "<8d>"), so there's no single correct way to handle them.
10848 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010849 "\"\xc2\x8d\";",
10850 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010851 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010852 "\"\xc2\x8d\";",
10853 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010854 EXPECT_EQ("\"Однажды, в \"\n"
10855 "\"студёную \"\n"
10856 "\"зимнюю \"\n"
10857 "\"пору,\"",
10858 format("\"Однажды, в студёную зимнюю пору,\"",
10859 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010860 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010861 "\"一 二 三 \"\n"
10862 "\"四 五六 \"\n"
10863 "\"七 八 九 \"\n"
10864 "\"十\"",
10865 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010866 EXPECT_EQ("\"一\t\"\n"
10867 "\"二 \t\"\n"
10868 "\"三 四 \"\n"
10869 "\"五\t\"\n"
10870 "\"六 \t\"\n"
10871 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010872 "\"八九十\tqq\"",
10873 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10874 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010875
10876 // UTF8 character in an escape sequence.
10877 EXPECT_EQ("\"aaaaaa\"\n"
10878 "\"\\\xC2\x8D\"",
10879 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010880}
10881
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010882TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10883 EXPECT_EQ("const char *sssss =\n"
10884 " \"一二三四五六七八\\\n"
10885 " 九 十\";",
10886 format("const char *sssss = \"一二三四五六七八\\\n"
10887 " 九 十\";",
10888 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010889}
10890
10891TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010892 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10893 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010894 EXPECT_EQ("// Я из лесу\n"
10895 "// вышел; был\n"
10896 "// сильный\n"
10897 "// мороз.",
10898 format("// Я из лесу вышел; был сильный мороз.",
10899 getLLVMStyleWithColumns(13)));
10900 EXPECT_EQ("// 一二三\n"
10901 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010902 "// 八 九\n"
10903 "// 十",
10904 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010905}
10906
10907TEST_F(FormatTest, SplitsUTF8BlockComments) {
10908 EXPECT_EQ("/* Гляжу,\n"
10909 " * поднимается\n"
10910 " * медленно в\n"
10911 " * гору\n"
10912 " * Лошадка,\n"
10913 " * везущая\n"
10914 " * хворосту\n"
10915 " * воз. */",
10916 format("/* Гляжу, поднимается медленно в гору\n"
10917 " * Лошадка, везущая хворосту воз. */",
10918 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010919 EXPECT_EQ(
10920 "/* 一二三\n"
10921 " * 四五六七\n"
10922 " * 八 九\n"
10923 " * 十 */",
10924 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010925 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10926 " * 𝕓𝕪𝕥𝕖\n"
10927 " * 𝖀𝕿𝕱-𝟠 */",
10928 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010929}
10930
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010931#endif // _MSC_VER
10932
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010933TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10934 FormatStyle Style = getLLVMStyle();
10935
10936 Style.ConstructorInitializerIndentWidth = 4;
10937 verifyFormat(
10938 "SomeClass::Constructor()\n"
10939 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10940 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10941 Style);
10942
10943 Style.ConstructorInitializerIndentWidth = 2;
10944 verifyFormat(
10945 "SomeClass::Constructor()\n"
10946 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10947 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10948 Style);
10949
10950 Style.ConstructorInitializerIndentWidth = 0;
10951 verifyFormat(
10952 "SomeClass::Constructor()\n"
10953 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10954 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10955 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010956 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10957 verifyFormat(
10958 "SomeLongTemplateVariableName<\n"
10959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10960 Style);
10961 verifyFormat(
10962 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10964 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010965}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010966
Daniel Jasper00853002014-09-16 16:22:30 +000010967TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10968 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010969 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010970 Style.ConstructorInitializerIndentWidth = 4;
10971 verifyFormat("SomeClass::Constructor()\n"
10972 " : a(a)\n"
10973 " , b(b)\n"
10974 " , c(c) {}",
10975 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010976 verifyFormat("SomeClass::Constructor()\n"
10977 " : a(a) {}",
10978 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010979
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010980 Style.ColumnLimit = 0;
10981 verifyFormat("SomeClass::Constructor()\n"
10982 " : a(a) {}",
10983 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010984 verifyFormat("SomeClass::Constructor() noexcept\n"
10985 " : a(a) {}",
10986 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010987 verifyFormat("SomeClass::Constructor()\n"
10988 " : a(a)\n"
10989 " , b(b)\n"
10990 " , c(c) {}",
10991 Style);
10992 verifyFormat("SomeClass::Constructor()\n"
10993 " : a(a) {\n"
10994 " foo();\n"
10995 " bar();\n"
10996 "}",
10997 Style);
10998
Daniel Jasperd74cf402014-04-08 12:46:38 +000010999 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011000 verifyFormat("SomeClass::Constructor()\n"
11001 " : a(a)\n"
11002 " , b(b)\n"
11003 " , c(c) {\n}",
11004 Style);
11005 verifyFormat("SomeClass::Constructor()\n"
11006 " : a(a) {\n}",
11007 Style);
11008
11009 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011010 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011011 Style.ConstructorInitializerIndentWidth = 2;
11012 verifyFormat("SomeClass::Constructor()\n"
11013 " : a(a)\n"
11014 " , b(b)\n"
11015 " , c(c) {}",
11016 Style);
11017
11018 Style.ConstructorInitializerIndentWidth = 0;
11019 verifyFormat("SomeClass::Constructor()\n"
11020 ": a(a)\n"
11021 ", b(b)\n"
11022 ", c(c) {}",
11023 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011024
11025 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11026 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011027 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11028 verifyFormat(
11029 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11030 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011031 verifyFormat(
11032 "SomeClass::Constructor()\n"
11033 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11034 Style);
11035 Style.ConstructorInitializerIndentWidth = 4;
11036 Style.ColumnLimit = 60;
11037 verifyFormat("SomeClass::Constructor()\n"
11038 " : aaaaaaaa(aaaaaaaa)\n"
11039 " , aaaaaaaa(aaaaaaaa)\n"
11040 " , aaaaaaaa(aaaaaaaa) {}",
11041 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011042}
11043
Daniel Jasper38efc132014-10-21 07:51:54 +000011044TEST_F(FormatTest, Destructors) {
11045 verifyFormat("void F(int &i) { i.~int(); }");
11046 verifyFormat("void F(int &i) { i->~int(); }");
11047}
11048
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011049TEST_F(FormatTest, FormatsWithWebKitStyle) {
11050 FormatStyle Style = getWebKitStyle();
11051
11052 // Don't indent in outer namespaces.
11053 verifyFormat("namespace outer {\n"
11054 "int i;\n"
11055 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011056 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011057 "} // namespace inner\n"
11058 "} // namespace outer\n"
11059 "namespace other_outer {\n"
11060 "int i;\n"
11061 "}",
11062 Style);
11063
11064 // Don't indent case labels.
11065 verifyFormat("switch (variable) {\n"
11066 "case 1:\n"
11067 "case 2:\n"
11068 " doSomething();\n"
11069 " break;\n"
11070 "default:\n"
11071 " ++variable;\n"
11072 "}",
11073 Style);
11074
11075 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011076 EXPECT_EQ("void f()\n"
11077 "{\n"
11078 " if (aaaaaaaaaaaaaaaa\n"
11079 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11080 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11081 " return;\n"
11082 "}",
11083 format("void f() {\n"
11084 "if (aaaaaaaaaaaaaaaa\n"
11085 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11086 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11087 "return;\n"
11088 "}",
11089 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011090
Daniel Jasper35995672014-04-29 14:05:20 +000011091 // Allow functions on a single line.
11092 verifyFormat("void f() { return; }", Style);
11093
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011094 // Constructor initializers are formatted one per line with the "," on the
11095 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011096 verifyFormat("Constructor()\n"
11097 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11098 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011099 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011100 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11101 "{\n"
11102 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011103 Style);
11104 verifyFormat("SomeClass::Constructor()\n"
11105 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011106 "{\n"
11107 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011108 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011109 EXPECT_EQ("SomeClass::Constructor()\n"
11110 " : a(a)\n"
11111 "{\n"
11112 "}",
11113 format("SomeClass::Constructor():a(a){}", Style));
11114 verifyFormat("SomeClass::Constructor()\n"
11115 " : a(a)\n"
11116 " , b(b)\n"
11117 " , c(c)\n"
11118 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011119 "}",
11120 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011121 verifyFormat("SomeClass::Constructor()\n"
11122 " : a(a)\n"
11123 "{\n"
11124 " foo();\n"
11125 " bar();\n"
11126 "}",
11127 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011128
Daniel Jasper65ee3472013-07-31 23:16:02 +000011129 // Access specifiers should be aligned left.
11130 verifyFormat("class C {\n"
11131 "public:\n"
11132 " int i;\n"
11133 "};",
11134 Style);
11135
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011136 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011137 verifyFormat("int a; // Do not\n"
11138 "double b; // align comments.",
11139 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011140
Daniel Jasper3219e432014-12-02 13:24:51 +000011141 // Do not align operands.
11142 EXPECT_EQ("ASSERT(aaaa\n"
11143 " || bbbb);",
11144 format("ASSERT ( aaaa\n||bbbb);", Style));
11145
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011146 // Accept input's line breaks.
11147 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11148 " || bbbbbbbbbbbbbbb) {\n"
11149 " i++;\n"
11150 "}",
11151 format("if (aaaaaaaaaaaaaaa\n"
11152 "|| bbbbbbbbbbbbbbb) { i++; }",
11153 Style));
11154 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11155 " i++;\n"
11156 "}",
11157 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011158
11159 // Don't automatically break all macro definitions (llvm.org/PR17842).
11160 verifyFormat("#define aNumber 10", Style);
11161 // However, generally keep the line breaks that the user authored.
11162 EXPECT_EQ("#define aNumber \\\n"
11163 " 10",
11164 format("#define aNumber \\\n"
11165 " 10",
11166 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011167
11168 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011169 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11170 " copyItems:YES];",
11171 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11172 "copyItems:YES];",
11173 Style));
11174 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11175 " copyItems:YES];",
11176 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11177 " copyItems:YES];",
11178 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011179 // FIXME: This does not seem right, there should be more indentation before
11180 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011181 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011182 " @\"a\",\n"
11183 " @\"a\"\n"
11184 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011185 " copyItems:YES];",
11186 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11187 " @\"a\",\n"
11188 " @\"a\"\n"
11189 " ]\n"
11190 " copyItems:YES];",
11191 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011192 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011193 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11194 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011195 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11196 " copyItems:YES];",
11197 Style));
11198
11199 verifyFormat("[self.a b:c c:d];", Style);
11200 EXPECT_EQ("[self.a b:c\n"
11201 " c:d];",
11202 format("[self.a b:c\n"
11203 "c:d];",
11204 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011205}
11206
Manuel Klimekffdeb592013-09-03 15:10:01 +000011207TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011208 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11209 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11210 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11211 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11212 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011213 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011214 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11215 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011216 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011217 verifyFormat("void f() {\n"
11218 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11219 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011220 verifyFormat("void f() {\n"
11221 " other(x.begin(), //\n"
11222 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011223 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011224 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011225 verifyFormat("SomeFunction([]() { // A cool function...\n"
11226 " return 43;\n"
11227 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011228 EXPECT_EQ("SomeFunction([]() {\n"
11229 "#define A a\n"
11230 " return 43;\n"
11231 "});",
11232 format("SomeFunction([](){\n"
11233 "#define A a\n"
11234 "return 43;\n"
11235 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011236 verifyFormat("void f() {\n"
11237 " SomeFunction([](decltype(x), A *a) {});\n"
11238 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011239 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11240 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011241 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11242 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11243 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011244 verifyFormat("Constructor()\n"
11245 " : Field([] { // comment\n"
11246 " int i;\n"
11247 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011248 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11249 " return some_parameter.size();\n"
11250 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011251 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11252 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011253 verifyFormat("int i = aaaaaa ? 1 //\n"
11254 " : [] {\n"
11255 " return 2; //\n"
11256 " }();");
11257 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11258 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11259 " return x == 2; // force break\n"
11260 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011261 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11262 " [=](int iiiiiiiiiiii) {\n"
11263 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11264 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11265 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011266 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011267 verifyFormat("SomeFunction({[&] {\n"
11268 " // comment\n"
11269 " },\n"
11270 " [&] {\n"
11271 " // comment\n"
11272 " }});");
11273 verifyFormat("SomeFunction({[&] {\n"
11274 " // comment\n"
11275 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011276 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11277 " [&]() { return true; },\n"
11278 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011279
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011280 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011281 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011282 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011283 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11284 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011285 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011286 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011287 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11288 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011289 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011290 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11291 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011292 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011293 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011294 verifyFormat(
11295 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11296 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11297 " return aaaaaaaaaaaaaaaaa;\n"
11298 " });",
11299 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011300 verifyFormat("[]() //\n"
11301 " -> int {\n"
11302 " return 1; //\n"
11303 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011304
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011305 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011306 verifyFormat("SomeFunction(\n"
11307 " []() {\n"
11308 " int i = 42;\n"
11309 " return i;\n"
11310 " },\n"
11311 " []() {\n"
11312 " int j = 43;\n"
11313 " return j;\n"
11314 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011315
Daniel Jasperda18fd82014-06-10 06:39:03 +000011316 // More complex introducers.
11317 verifyFormat("return [i, args...] {};");
11318
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011319 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011320 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011321 verifyFormat("double &operator[](int i) { return 0; }\n"
11322 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011323 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011324 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011325 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011326
11327 // Other corner cases.
11328 verifyFormat("void f() {\n"
11329 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011330 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011331 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011332
11333 // Lambdas created through weird macros.
11334 verifyFormat("void f() {\n"
11335 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011336 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011337 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011338
11339 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11340 " doo_dah();\n"
11341 " doo_dah();\n"
11342 " })) {\n"
11343 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011344 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11345 " doo_dah();\n"
11346 " doo_dah();\n"
11347 " })) {\n"
11348 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011349 verifyFormat("auto lambda = []() {\n"
11350 " int a = 2\n"
11351 "#if A\n"
11352 " + 2\n"
11353 "#endif\n"
11354 " ;\n"
11355 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011356
11357 // Lambdas with complex multiline introducers.
11358 verifyFormat(
11359 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11360 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11361 " -> ::std::unordered_set<\n"
11362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11363 " //\n"
11364 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011365}
11366
Martin Probsta004b3f2017-11-17 18:06:33 +000011367TEST_F(FormatTest, EmptyLinesInLambdas) {
11368 verifyFormat("auto lambda = []() {\n"
11369 " x(); //\n"
11370 "};",
11371 "auto lambda = []() {\n"
11372 "\n"
11373 " x(); //\n"
11374 "\n"
11375 "};");
11376}
11377
Manuel Klimek516e0542013-09-04 13:25:30 +000011378TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011379 FormatStyle ShortBlocks = getLLVMStyle();
11380 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11381 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11382 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11383 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11384 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11385 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11386 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011387
Daniel Jasper76284682014-10-22 09:12:44 +000011388 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11389 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11390 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011391
Daniel Jasper76284682014-10-22 09:12:44 +000011392 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011393 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011394 "}];");
11395 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011396 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011397 "}]};");
11398 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011399 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011400 "}];");
11401 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011402 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011403 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011404 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011405 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011406 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011407 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011408 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011409
11410 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011411 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011412 "}];",
11413 getLLVMStyleWithColumns(60));
11414 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011415 " NSString *path = [self sessionFilePath];\n"
11416 " if (path) {\n"
11417 " // ...\n"
11418 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011419 "});");
11420 verifyFormat("[[SessionService sharedService]\n"
11421 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011422 " if (window) {\n"
11423 " [self windowDidLoad:window];\n"
11424 " } else {\n"
11425 " [self errorLoadingWindow];\n"
11426 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011427 " }];");
11428 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011429 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011430 "};\n",
11431 getLLVMStyleWithColumns(40));
11432 verifyFormat("[[SessionService sharedService]\n"
11433 " loadWindowWithCompletionBlock: //\n"
11434 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011435 " if (window) {\n"
11436 " [self windowDidLoad:window];\n"
11437 " } else {\n"
11438 " [self errorLoadingWindow];\n"
11439 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011440 " }];",
11441 getLLVMStyleWithColumns(60));
11442 verifyFormat("[myObject doSomethingWith:arg1\n"
11443 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011444 " // ...\n"
11445 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011446 " }\n"
11447 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011448 " // ...\n"
11449 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011450 " }\n"
11451 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011452 " // ...\n"
11453 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011454 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011455 verifyFormat("[myObject doSomethingWith:arg1\n"
11456 " firstBlock:-1\n"
11457 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011458 " // ...\n"
11459 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011460 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011461
11462 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011463 " @autoreleasepool {\n"
11464 " if (a) {\n"
11465 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011466 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011467 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011468 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011469 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011470 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11471 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011472
11473 FormatStyle FourIndent = getLLVMStyle();
11474 FourIndent.ObjCBlockIndentWidth = 4;
11475 verifyFormat("[operation setCompletionBlock:^{\n"
11476 " [self onOperationDone];\n"
11477 "}];",
11478 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011479}
11480
Daniel Jasper289afc02015-04-23 09:23:17 +000011481TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11482 FormatStyle ZeroColumn = getLLVMStyle();
11483 ZeroColumn.ColumnLimit = 0;
11484
11485 verifyFormat("[[SessionService sharedService] "
11486 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11487 " if (window) {\n"
11488 " [self windowDidLoad:window];\n"
11489 " } else {\n"
11490 " [self errorLoadingWindow];\n"
11491 " }\n"
11492 "}];",
11493 ZeroColumn);
11494 EXPECT_EQ("[[SessionService sharedService]\n"
11495 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11496 " if (window) {\n"
11497 " [self windowDidLoad:window];\n"
11498 " } else {\n"
11499 " [self errorLoadingWindow];\n"
11500 " }\n"
11501 " }];",
11502 format("[[SessionService sharedService]\n"
11503 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11504 " if (window) {\n"
11505 " [self windowDidLoad:window];\n"
11506 " } else {\n"
11507 " [self errorLoadingWindow];\n"
11508 " }\n"
11509 "}];",
11510 ZeroColumn));
11511 verifyFormat("[myObject doSomethingWith:arg1\n"
11512 " firstBlock:^(Foo *a) {\n"
11513 " // ...\n"
11514 " int i;\n"
11515 " }\n"
11516 " secondBlock:^(Bar *b) {\n"
11517 " // ...\n"
11518 " int i;\n"
11519 " }\n"
11520 " thirdBlock:^Foo(Bar *b) {\n"
11521 " // ...\n"
11522 " int i;\n"
11523 " }];",
11524 ZeroColumn);
11525 verifyFormat("f(^{\n"
11526 " @autoreleasepool {\n"
11527 " if (a) {\n"
11528 " g();\n"
11529 " }\n"
11530 " }\n"
11531 "});",
11532 ZeroColumn);
11533 verifyFormat("void (^largeBlock)(void) = ^{\n"
11534 " // ...\n"
11535 "};",
11536 ZeroColumn);
11537
11538 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11539 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011540 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011541 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11542 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11543 " int i;\n"
11544 "};",
11545 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11546}
11547
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011548TEST_F(FormatTest, SupportsCRLF) {
11549 EXPECT_EQ("int a;\r\n"
11550 "int b;\r\n"
11551 "int c;\r\n",
11552 format("int a;\r\n"
11553 " int b;\r\n"
11554 " int c;\r\n",
11555 getLLVMStyle()));
11556 EXPECT_EQ("int a;\r\n"
11557 "int b;\r\n"
11558 "int c;\r\n",
11559 format("int a;\r\n"
11560 " int b;\n"
11561 " int c;\r\n",
11562 getLLVMStyle()));
11563 EXPECT_EQ("int a;\n"
11564 "int b;\n"
11565 "int c;\n",
11566 format("int a;\r\n"
11567 " int b;\n"
11568 " int c;\n",
11569 getLLVMStyle()));
11570 EXPECT_EQ("\"aaaaaaa \"\r\n"
11571 "\"bbbbbbb\";\r\n",
11572 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11573 EXPECT_EQ("#define A \\\r\n"
11574 " b; \\\r\n"
11575 " c; \\\r\n"
11576 " d;\r\n",
11577 format("#define A \\\r\n"
11578 " b; \\\r\n"
11579 " c; d; \r\n",
11580 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011581
11582 EXPECT_EQ("/*\r\n"
11583 "multi line block comments\r\n"
11584 "should not introduce\r\n"
11585 "an extra carriage return\r\n"
11586 "*/\r\n",
11587 format("/*\r\n"
11588 "multi line block comments\r\n"
11589 "should not introduce\r\n"
11590 "an extra carriage return\r\n"
11591 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011592}
11593
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011594TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11595 verifyFormat("MY_CLASS(C) {\n"
11596 " int i;\n"
11597 " int j;\n"
11598 "};");
11599}
11600
Daniel Jasper6633ab82013-10-18 10:38:14 +000011601TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11602 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11603 TwoIndent.ContinuationIndentWidth = 2;
11604
11605 EXPECT_EQ("int i =\n"
11606 " longFunction(\n"
11607 " arg);",
11608 format("int i = longFunction(arg);", TwoIndent));
11609
11610 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11611 SixIndent.ContinuationIndentWidth = 6;
11612
11613 EXPECT_EQ("int i =\n"
11614 " longFunction(\n"
11615 " arg);",
11616 format("int i = longFunction(arg);", SixIndent));
11617}
11618
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011619TEST_F(FormatTest, SpacesInAngles) {
11620 FormatStyle Spaces = getLLVMStyle();
11621 Spaces.SpacesInAngles = true;
11622
11623 verifyFormat("static_cast< int >(arg);", Spaces);
11624 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11625 verifyFormat("f< int, float >();", Spaces);
11626 verifyFormat("template <> g() {}", Spaces);
11627 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011628 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11629 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11630 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011631
11632 Spaces.Standard = FormatStyle::LS_Cpp03;
11633 Spaces.SpacesInAngles = true;
11634 verifyFormat("A< A< int > >();", Spaces);
11635
11636 Spaces.SpacesInAngles = false;
11637 verifyFormat("A<A<int> >();", Spaces);
11638
11639 Spaces.Standard = FormatStyle::LS_Cpp11;
11640 Spaces.SpacesInAngles = true;
11641 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011642
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011643 Spaces.SpacesInAngles = false;
11644 verifyFormat("A<A<int>>();", Spaces);
11645}
11646
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011647TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11648 FormatStyle Style = getLLVMStyle();
11649 Style.SpaceAfterTemplateKeyword = false;
11650 verifyFormat("template<int> void foo();", Style);
11651}
11652
Jacques Pienaarfc275112015-02-18 23:48:37 +000011653TEST_F(FormatTest, TripleAngleBrackets) {
11654 verifyFormat("f<<<1, 1>>>();");
11655 verifyFormat("f<<<1, 1, 1, s>>>();");
11656 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011657 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011658 verifyFormat("f<param><<<1, 1>>>();");
11659 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011660 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011661 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11662 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011663 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11664 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011665}
11666
11667TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011668 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011669 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011670 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11671 "aaallvm::outs() <<");
11672 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11673 "aaaallvm::outs()\n <<");
11674}
11675
Manuel Klimek819788d2014-03-18 11:22:45 +000011676TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11677 std::string code = "#if A\n"
11678 "#if B\n"
11679 "a.\n"
11680 "#endif\n"
11681 " a = 1;\n"
11682 "#else\n"
11683 "#endif\n"
11684 "#if C\n"
11685 "#else\n"
11686 "#endif\n";
11687 EXPECT_EQ(code, format(code));
11688}
11689
Manuel Klimek68b03042014-04-14 09:14:11 +000011690TEST_F(FormatTest, HandleConflictMarkers) {
11691 // Git/SVN conflict markers.
11692 EXPECT_EQ("int a;\n"
11693 "void f() {\n"
11694 " callme(some(parameter1,\n"
11695 "<<<<<<< text by the vcs\n"
11696 " parameter2),\n"
11697 "||||||| text by the vcs\n"
11698 " parameter2),\n"
11699 " parameter3,\n"
11700 "======= text by the vcs\n"
11701 " parameter2, parameter3),\n"
11702 ">>>>>>> text by the vcs\n"
11703 " otherparameter);\n",
11704 format("int a;\n"
11705 "void f() {\n"
11706 " callme(some(parameter1,\n"
11707 "<<<<<<< text by the vcs\n"
11708 " parameter2),\n"
11709 "||||||| text by the vcs\n"
11710 " parameter2),\n"
11711 " parameter3,\n"
11712 "======= text by the vcs\n"
11713 " parameter2,\n"
11714 " parameter3),\n"
11715 ">>>>>>> text by the vcs\n"
11716 " otherparameter);\n"));
11717
11718 // Perforce markers.
11719 EXPECT_EQ("void f() {\n"
11720 " function(\n"
11721 ">>>> text by the vcs\n"
11722 " parameter,\n"
11723 "==== text by the vcs\n"
11724 " parameter,\n"
11725 "==== text by the vcs\n"
11726 " parameter,\n"
11727 "<<<< text by the vcs\n"
11728 " parameter);\n",
11729 format("void f() {\n"
11730 " function(\n"
11731 ">>>> text by the vcs\n"
11732 " parameter,\n"
11733 "==== text by the vcs\n"
11734 " parameter,\n"
11735 "==== text by the vcs\n"
11736 " parameter,\n"
11737 "<<<< text by the vcs\n"
11738 " parameter);\n"));
11739
11740 EXPECT_EQ("<<<<<<<\n"
11741 "|||||||\n"
11742 "=======\n"
11743 ">>>>>>>",
11744 format("<<<<<<<\n"
11745 "|||||||\n"
11746 "=======\n"
11747 ">>>>>>>"));
11748
11749 EXPECT_EQ("<<<<<<<\n"
11750 "|||||||\n"
11751 "int i;\n"
11752 "=======\n"
11753 ">>>>>>>",
11754 format("<<<<<<<\n"
11755 "|||||||\n"
11756 "int i;\n"
11757 "=======\n"
11758 ">>>>>>>"));
11759
11760 // FIXME: Handle parsing of macros around conflict markers correctly:
11761 EXPECT_EQ("#define Macro \\\n"
11762 "<<<<<<<\n"
11763 "Something \\\n"
11764 "|||||||\n"
11765 "Else \\\n"
11766 "=======\n"
11767 "Other \\\n"
11768 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011769 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011770 format("#define Macro \\\n"
11771 "<<<<<<<\n"
11772 " Something \\\n"
11773 "|||||||\n"
11774 " Else \\\n"
11775 "=======\n"
11776 " Other \\\n"
11777 ">>>>>>>\n"
11778 " End\n"
11779 "int i;\n"));
11780}
11781
Daniel Jasper471894432014-08-06 13:40:26 +000011782TEST_F(FormatTest, DisableRegions) {
11783 EXPECT_EQ("int i;\n"
11784 "// clang-format off\n"
11785 " int j;\n"
11786 "// clang-format on\n"
11787 "int k;",
11788 format(" int i;\n"
11789 " // clang-format off\n"
11790 " int j;\n"
11791 " // clang-format on\n"
11792 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011793 EXPECT_EQ("int i;\n"
11794 "/* clang-format off */\n"
11795 " int j;\n"
11796 "/* clang-format on */\n"
11797 "int k;",
11798 format(" int i;\n"
11799 " /* clang-format off */\n"
11800 " int j;\n"
11801 " /* clang-format on */\n"
11802 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011803
11804 // Don't reflow comments within disabled regions.
11805 EXPECT_EQ(
11806 "// clang-format off\n"
11807 "// long long long long long long line\n"
11808 "/* clang-format on */\n"
11809 "/* long long long\n"
11810 " * long long long\n"
11811 " * line */\n"
11812 "int i;\n"
11813 "/* clang-format off */\n"
11814 "/* long long long long long long line */\n",
11815 format("// clang-format off\n"
11816 "// long long long long long long line\n"
11817 "/* clang-format on */\n"
11818 "/* long long long long long long line */\n"
11819 "int i;\n"
11820 "/* clang-format off */\n"
11821 "/* long long long long long long line */\n",
11822 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011823}
11824
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011825TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11826 format("? ) =");
11827 verifyNoCrash("#define a\\\n /**/}");
11828}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011829
Daniel Jasper498f5582015-12-25 08:53:31 +000011830TEST_F(FormatTest, FormatsTableGenCode) {
11831 FormatStyle Style = getLLVMStyle();
11832 Style.Language = FormatStyle::LK_TableGen;
11833 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11834}
11835
Nico Weberb2673a12016-11-10 21:49:25 +000011836TEST_F(FormatTest, ArrayOfTemplates) {
11837 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11838 format("auto a = new unique_ptr<int > [ 10];"));
11839
11840 FormatStyle Spaces = getLLVMStyle();
11841 Spaces.SpacesInSquareBrackets = true;
11842 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11843 format("auto a = new unique_ptr<int > [10];", Spaces));
11844}
11845
11846TEST_F(FormatTest, ArrayAsTemplateType) {
11847 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11848 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11849
11850 FormatStyle Spaces = getLLVMStyle();
11851 Spaces.SpacesInSquareBrackets = true;
11852 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11853 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11854}
11855
Martin Probstc9c51c42017-03-16 10:21:35 +000011856TEST_F(FormatTest, NoSpaceAfterSuper) {
11857 verifyFormat("__super::FooBar();");
11858}
11859
Ben Hamilton07e58362018-02-21 21:27:27 +000011860TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011861 vfs::InMemoryFileSystem FS;
11862 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011863 ASSERT_TRUE((bool)Style1);
11864 ASSERT_EQ(*Style1, getGoogleStyle());
11865}
11866
Eric Liu547d8792016-03-24 13:22:42 +000011867TEST(FormatStyle, GetStyleOfFile) {
11868 vfs::InMemoryFileSystem FS;
11869 // Test 1: format file in the same directory.
11870 ASSERT_TRUE(
11871 FS.addFile("/a/.clang-format", 0,
11872 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11873 ASSERT_TRUE(
11874 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011875 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011876 ASSERT_TRUE((bool)Style1);
11877 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011878
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011879 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011880 ASSERT_TRUE(
11881 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011882 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011883 ASSERT_TRUE((bool)Style2);
11884 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011885
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011886 // Test 2.2: no format on 'none' fallback style.
11887 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11888 ASSERT_TRUE((bool)Style2);
11889 ASSERT_EQ(*Style2, getNoStyle());
11890
11891 // Test 2.3: format if config is found with no based style while fallback is
11892 // 'none'.
11893 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11894 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11895 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11896 ASSERT_TRUE((bool)Style2);
11897 ASSERT_EQ(*Style2, getLLVMStyle());
11898
11899 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11900 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11901 ASSERT_TRUE((bool)Style2);
11902 ASSERT_EQ(*Style2, getLLVMStyle());
11903
Eric Liu547d8792016-03-24 13:22:42 +000011904 // Test 3: format file in parent directory.
11905 ASSERT_TRUE(
11906 FS.addFile("/c/.clang-format", 0,
11907 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11908 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11909 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011910 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011911 ASSERT_TRUE((bool)Style3);
11912 ASSERT_EQ(*Style3, getGoogleStyle());
11913
11914 // Test 4: error on invalid fallback style
11915 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11916 ASSERT_FALSE((bool)Style4);
11917 llvm::consumeError(Style4.takeError());
11918
11919 // Test 5: error on invalid yaml on command line
11920 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11921 ASSERT_FALSE((bool)Style5);
11922 llvm::consumeError(Style5.takeError());
11923
11924 // Test 6: error on invalid style
11925 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11926 ASSERT_FALSE((bool)Style6);
11927 llvm::consumeError(Style6.takeError());
11928
11929 // Test 7: found config file, error on parsing it
11930 ASSERT_TRUE(
11931 FS.addFile("/d/.clang-format", 0,
11932 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11933 "InvalidKey: InvalidValue")));
11934 ASSERT_TRUE(
11935 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11936 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11937 ASSERT_FALSE((bool)Style7);
11938 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011939}
11940
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011941TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11942 // Column limit is 20.
11943 std::string Code = "Type *a =\n"
11944 " new Type();\n"
11945 "g(iiiii, 0, jjjjj,\n"
11946 " 0, kkkkk, 0, mm);\n"
11947 "int bad = format ;";
11948 std::string Expected = "auto a = new Type();\n"
11949 "g(iiiii, nullptr,\n"
11950 " jjjjj, nullptr,\n"
11951 " kkkkk, nullptr,\n"
11952 " mm);\n"
11953 "int bad = format ;";
11954 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011955 tooling::Replacements Replaces = toReplacements(
11956 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11957 "auto "),
11958 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11959 "nullptr"),
11960 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11961 "nullptr"),
11962 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11963 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011964
11965 format::FormatStyle Style = format::getLLVMStyle();
11966 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011967 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11968 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11969 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11970 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11971 EXPECT_TRUE(static_cast<bool>(Result));
11972 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011973}
11974
Eric Liubaf58c22016-05-18 13:43:48 +000011975TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11976 std::string Code = "#include \"a.h\"\n"
11977 "#include \"c.h\"\n"
11978 "\n"
11979 "int main() {\n"
11980 " return 0;\n"
11981 "}";
11982 std::string Expected = "#include \"a.h\"\n"
11983 "#include \"b.h\"\n"
11984 "#include \"c.h\"\n"
11985 "\n"
11986 "int main() {\n"
11987 " return 0;\n"
11988 "}";
11989 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011990 tooling::Replacements Replaces = toReplacements(
11991 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11992 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011993
11994 format::FormatStyle Style = format::getLLVMStyle();
11995 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011996 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11997 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11998 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11999 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12000 EXPECT_TRUE(static_cast<bool>(Result));
12001 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012002}
12003
Krasimir Georgievac16a202017-06-23 11:46:03 +000012004TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12005 EXPECT_EQ("using std::cin;\n"
12006 "using std::cout;",
12007 format("using std::cout;\n"
12008 "using std::cin;", getGoogleStyle()));
12009}
12010
Nico Weberdc065182017-04-05 18:10:42 +000012011TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12012 format::FormatStyle Style = format::getLLVMStyle();
12013 Style.Standard = FormatStyle::LS_Cpp03;
12014 // cpp03 recognize this string as identifier u8 and literal character 'a'
12015 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12016}
12017
12018TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12019 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12020 // all modes, including C++11, C++14 and C++17
12021 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12022}
12023
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012024TEST_F(FormatTest, DoNotFormatLikelyXml) {
12025 EXPECT_EQ("<!-- ;> -->",
12026 format("<!-- ;> -->", getGoogleStyle()));
12027 EXPECT_EQ(" <!-- >; -->",
12028 format(" <!-- >; -->", getGoogleStyle()));
12029}
12030
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012031TEST_F(FormatTest, StructuredBindings) {
12032 // Structured bindings is a C++17 feature.
12033 // all modes, including C++11, C++14 and C++17
12034 verifyFormat("auto [a, b] = f();");
12035 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12036 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12037 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12038 EXPECT_EQ("auto const volatile [a, b] = f();",
12039 format("auto const volatile[a, b] = f();"));
12040 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012041 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012042 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012043 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012044 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012045 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12046 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012047 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012048 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12049 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12050 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12051 format("const auto volatile &&[a, b] = f();"));
12052 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12053 format("volatile const auto &&[a, b] = f();"));
12054 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012055
Manuel Klimeke411aa82017-09-20 09:29:37 +000012056 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012057 FormatStyle PointerMiddle = getLLVMStyle();
12058 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12059 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12060 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12061 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12062 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12063 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12064 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12065 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12066 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12067 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12068 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12069 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12070 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12071
12072 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12073 format("for (const auto && [a, b] : some_range) {\n}"));
12074 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12075 format("for (const auto & [a, b] : some_range) {\n}"));
12076 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12077 format("for (const auto[a, b] : some_range) {\n}"));
12078 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12079 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12080 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12081 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12082 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12083 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12084 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12085 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012086
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012087 format::FormatStyle Spaces = format::getLLVMStyle();
12088 Spaces.SpacesInSquareBrackets = true;
12089 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012090 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12091 verifyFormat("auto &[ a, b ] = f();", Spaces);
12092 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12093 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012094}
12095
Ben Hamilton6e066352018-02-27 15:56:40 +000012096TEST_F(FormatTest, FileAndCode) {
12097 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12098 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12099 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12100 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12101 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
12102 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12103 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012104 EXPECT_EQ(FormatStyle::LK_ObjC,
12105 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12106 EXPECT_EQ(
12107 FormatStyle::LK_ObjC,
12108 guessLanguage("foo.h",
12109 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012110 EXPECT_EQ(
12111 FormatStyle::LK_Cpp,
12112 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012113}
12114
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012115TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12116 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12117 EXPECT_EQ(FormatStyle::LK_ObjC,
12118 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012119 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012120 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012121 EXPECT_EQ(
12122 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012123 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12124 EXPECT_EQ(FormatStyle::LK_ObjC,
12125 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12126 EXPECT_EQ(FormatStyle::LK_Cpp,
12127 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12128 EXPECT_EQ(FormatStyle::LK_ObjC,
12129 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12130 EXPECT_EQ(FormatStyle::LK_Cpp,
12131 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12132 EXPECT_EQ(FormatStyle::LK_Cpp,
12133 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12134 EXPECT_EQ(FormatStyle::LK_ObjC,
12135 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12136 EXPECT_EQ(FormatStyle::LK_Cpp,
12137 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12138 EXPECT_EQ(
12139 FormatStyle::LK_Cpp,
12140 guessLanguage("foo.h",
12141 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12142 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012143}
12144
Ben Hamilton788a2222018-03-12 15:42:40 +000012145TEST_F(FormatTest, GuessLanguageWithCaret) {
12146 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12147 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12148 EXPECT_EQ(FormatStyle::LK_ObjC,
12149 guessLanguage("foo.h", "int(^)(char, float);"));
12150 EXPECT_EQ(FormatStyle::LK_ObjC,
12151 guessLanguage("foo.h", "int(^foo)(char, float);"));
12152 EXPECT_EQ(FormatStyle::LK_ObjC,
12153 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12154 EXPECT_EQ(FormatStyle::LK_ObjC,
12155 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12156 EXPECT_EQ(
12157 FormatStyle::LK_ObjC,
12158 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12159}
12160
Ben Hamilton6432afe2018-03-22 17:37:19 +000012161TEST_F(FormatTest, GuessLanguageWithChildLines) {
12162 EXPECT_EQ(FormatStyle::LK_Cpp,
12163 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12164 EXPECT_EQ(FormatStyle::LK_ObjC,
12165 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012166 EXPECT_EQ(
12167 FormatStyle::LK_Cpp,
12168 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12169 EXPECT_EQ(
12170 FormatStyle::LK_ObjC,
12171 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012172}
12173
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012174} // end namespace
12175} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012176} // end namespace clang