blob: c1250283a131ab2c3cac189c07ffaf2acd3cd0e6 [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);
6038 verifyFormat("template <int * y> f() {}", PointerMiddle);
6039 verifyFormat("int * f(int * a) {}", PointerMiddle);
6040 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6041 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6042 verifyFormat("A<int *> a;", PointerMiddle);
6043 verifyFormat("A<int **> a;", PointerMiddle);
6044 verifyFormat("A<int *, int *> a;", PointerMiddle);
6045 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006046 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6047 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006048 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006049
6050 // Member function reference qualifiers aren't binary operators.
6051 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006052 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006053 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006054 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006055 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006056 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006057}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006058
Daniel Jasperee6d6502013-07-17 20:25:02 +00006059TEST_F(FormatTest, UnderstandsAttributes) {
6060 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006061 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6062 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006063 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006064 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006065 verifyFormat("__attribute__((nodebug)) void\n"
6066 "foo() {}\n",
6067 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006068}
6069
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006070TEST_F(FormatTest, UnderstandsSquareAttributes) {
6071 verifyFormat("SomeType s [[unused]] (InitValue);");
6072 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6073 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6074 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6075 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6076 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6077 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6078}
6079
Daniel Jasper10cd5812013-05-06 06:35:44 +00006080TEST_F(FormatTest, UnderstandsEllipsis) {
6081 verifyFormat("int printf(const char *fmt, ...);");
6082 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006083 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6084
6085 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006086 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006087 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006088}
6089
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006090TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006091 EXPECT_EQ("int *a;\n"
6092 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006093 "int *a;",
6094 format("int *a;\n"
6095 "int* a;\n"
6096 "int *a;",
6097 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006098 EXPECT_EQ("int* a;\n"
6099 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006100 "int* a;",
6101 format("int* a;\n"
6102 "int* a;\n"
6103 "int *a;",
6104 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006105 EXPECT_EQ("int *a;\n"
6106 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006107 "int *a;",
6108 format("int *a;\n"
6109 "int * a;\n"
6110 "int * a;",
6111 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006112 EXPECT_EQ("auto x = [] {\n"
6113 " int *a;\n"
6114 " int *a;\n"
6115 " int *a;\n"
6116 "};",
6117 format("auto x=[]{int *a;\n"
6118 "int * a;\n"
6119 "int * a;};",
6120 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006121}
6122
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006123TEST_F(FormatTest, UnderstandsRvalueReferences) {
6124 verifyFormat("int f(int &&a) {}");
6125 verifyFormat("int f(int a, char &&b) {}");
6126 verifyFormat("void f() { int &&a = b; }");
6127 verifyGoogleFormat("int f(int a, char&& b) {}");
6128 verifyGoogleFormat("void f() { int&& a = b; }");
6129
Daniel Jasper1eff9082013-05-27 16:36:33 +00006130 verifyIndependentOfContext("A<int &&> a;");
6131 verifyIndependentOfContext("A<int &&, int &&> a;");
6132 verifyGoogleFormat("A<int&&> a;");
6133 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006134
6135 // Not rvalue references:
6136 verifyFormat("template <bool B, bool C> class A {\n"
6137 " static_assert(B && C, \"Something is wrong\");\n"
6138 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006139 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6140 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006141 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006142}
6143
Manuel Klimekc1237a82013-01-23 14:08:21 +00006144TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6145 verifyFormat("void f() {\n"
6146 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006147 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006148 "}",
6149 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006150}
6151
Daniel Jasperef906a92013-01-13 08:01:36 +00006152TEST_F(FormatTest, FormatsCasts) {
6153 verifyFormat("Type *A = static_cast<Type *>(P);");
6154 verifyFormat("Type *A = (Type *)P;");
6155 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6156 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006157 verifyFormat("int a = (int)2.0f;");
6158 verifyFormat("x[(int32)y];");
6159 verifyFormat("x = (int32)y;");
6160 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6161 verifyFormat("int a = (int)*b;");
6162 verifyFormat("int a = (int)2.0f;");
6163 verifyFormat("int a = (int)~0;");
6164 verifyFormat("int a = (int)++a;");
6165 verifyFormat("int a = (int)sizeof(int);");
6166 verifyFormat("int a = (int)+2;");
6167 verifyFormat("my_int a = (my_int)2.0f;");
6168 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006169 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006170 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006171 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006172 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006173 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006174
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006175 verifyFormat("void f() { my_int a = (my_int)*b; }");
6176 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6177 verifyFormat("my_int a = (my_int)~0;");
6178 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006179 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006180 verifyFormat("my_int a = (my_int)1;");
6181 verifyFormat("my_int a = (my_int *)1;");
6182 verifyFormat("my_int a = (const my_int)-1;");
6183 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006184 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006185 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006186 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006187 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006188
6189 // FIXME: single value wrapped with paren will be treated as cast.
6190 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006191
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006192 verifyFormat("{ (void)F; }");
6193
Daniel Jasper998cabc2013-07-18 14:46:07 +00006194 // Don't break after a cast's
6195 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6196 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6197 " bbbbbbbbbbbbbbbbbbbbbb);");
6198
Daniel Jasperef906a92013-01-13 08:01:36 +00006199 // These are not casts.
6200 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006201 verifyFormat("f(foo)->b;");
6202 verifyFormat("f(foo).b;");
6203 verifyFormat("f(foo)(b);");
6204 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006205 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006206 verifyFormat("(*funptr)(foo)[4];");
6207 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006208 verifyFormat("void f(int *);");
6209 verifyFormat("void f(int *) = 0;");
6210 verifyFormat("void f(SmallVector<int>) {}");
6211 verifyFormat("void f(SmallVector<int>);");
6212 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006213 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006214 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006215 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006216 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6217 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006218 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006219
Daniel Jasperba0bda92013-02-23 08:07:18 +00006220 // These are not casts, but at some point were confused with casts.
6221 verifyFormat("virtual void foo(int *) override;");
6222 verifyFormat("virtual void foo(char &) const;");
6223 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006224 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006225 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006226 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006227 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006228
6229 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6230 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006231 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006232 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006233 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6234 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6235 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006236}
6237
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006238TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006239 verifyFormat("A<bool()> a;");
6240 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006241 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006242 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006243 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006244 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006245 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006246 verifyFormat("template <class CallbackClass>\n"
6247 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006248
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006249 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6250 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006251 verifyGoogleFormat(
6252 "template <class CallbackClass>\n"
6253 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006254
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006255 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006256 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006257 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006258 verifyFormat("some_var = function(*some_pointer_var)[0];");
6259 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006260 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006261 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006262 verifyFormat("std::function<\n"
6263 " LooooooooooongTemplatedType<\n"
6264 " SomeType>*(\n"
6265 " LooooooooooooooooongType type)>\n"
6266 " function;",
6267 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006268}
6269
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006270TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6271 verifyFormat("A (*foo_)[6];");
6272 verifyFormat("vector<int> (*foo_)[6];");
6273}
6274
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006275TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6276 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6277 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6278 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6279 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006280 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6281 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006282
6283 // Different ways of ()-initializiation.
6284 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6285 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6286 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6287 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6288 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6289 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006290 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6291 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006292
6293 // Lambdas should not confuse the variable declaration heuristic.
6294 verifyFormat("LooooooooooooooooongType\n"
6295 " variable(nullptr, [](A *a) {});",
6296 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006297}
6298
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006299TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006300 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006301 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006302 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006304 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006305 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006306 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6307 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006308 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6309 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006310 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6311 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006312 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6313 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006314 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6315 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006316 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6317 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6318 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6319 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006320 FormatStyle Indented = getLLVMStyle();
6321 Indented.IndentWrappedFunctionNames = true;
6322 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6323 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6324 Indented);
6325 verifyFormat(
6326 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6327 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6328 Indented);
6329 verifyFormat(
6330 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6331 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6332 Indented);
6333 verifyFormat(
6334 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6335 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6336 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006337
6338 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006339 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6340 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6341 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006342
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006343 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006344 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006345 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006346 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6347 " SourceLocation L, IdentifierIn *II,\n"
6348 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006349 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006350 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006351 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006352 " const SomeType<string, SomeOtherTemplateParameter>\n"
6353 " &ReallyReallyLongParameterName,\n"
6354 " const SomeType<string, SomeOtherTemplateParameter>\n"
6355 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006356 verifyFormat("template <typename A>\n"
6357 "SomeLoooooooooooooooooooooongType<\n"
6358 " typename some_namespace::SomeOtherType<A>::Type>\n"
6359 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006360
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006361 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006362 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6363 " aaaaaaaaaaaaaaaaaaaaaaa;");
6364 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006365 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6366 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006367 verifyGoogleFormat(
6368 "some_namespace::LongReturnType\n"
6369 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006370 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006371
6372 verifyGoogleFormat("template <typename T>\n"
6373 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006374 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006375 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6376 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006377
6378 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006379 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6380 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006381 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6382 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6383 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6384 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6385 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006388
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006389 verifyFormat("template <typename T> // Templates on own line.\n"
6390 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006391 "MyFunction(int a);",
6392 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006393}
6394
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006395TEST_F(FormatTest, FormatsArrays) {
6396 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6397 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006398 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6399 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006400 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6401 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006402 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6403 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6404 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6405 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6406 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6407 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6408 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6409 verifyFormat(
6410 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6411 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6412 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006413 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6414 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006415
6416 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006418 verifyFormat(
6419 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6420 " .aaaaaaa[0]\n"
6421 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006422 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006423
6424 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006425
6426 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6427 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006428}
6429
Daniel Jaspere9de2602012-12-06 09:56:08 +00006430TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6431 verifyFormat("(a)->b();");
6432 verifyFormat("--a;");
6433}
6434
Daniel Jasper8b529712012-12-04 13:02:32 +00006435TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006436 verifyFormat("#include <string>\n"
6437 "#include <a/b/c.h>\n"
6438 "#include \"a/b/string\"\n"
6439 "#include \"string.h\"\n"
6440 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006441 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006442 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006443 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006444 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006445 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006446 "#include \"some very long include path\"\n"
6447 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006448 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006449 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6450 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006451
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006452 verifyFormat("#import <string>");
6453 verifyFormat("#import <a/b/c.h>");
6454 verifyFormat("#import \"a/b/string\"");
6455 verifyFormat("#import \"string.h\"");
6456 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006457 verifyFormat("#if __has_include(<strstream>)\n"
6458 "#include <strstream>\n"
6459 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006460
Daniel Jasper343643b2014-08-13 08:29:18 +00006461 verifyFormat("#define MY_IMPORT <a/b>");
6462
Nico Weber21088802017-02-10 19:36:52 +00006463 verifyFormat("#if __has_include(<a/b>)");
6464 verifyFormat("#if __has_include_next(<a/b>)");
6465 verifyFormat("#define F __has_include(<a/b>)");
6466 verifyFormat("#define F __has_include_next(<a/b>)");
6467
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006468 // Protocol buffer definition or missing "#".
6469 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6470 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006471
6472 FormatStyle Style = getLLVMStyle();
6473 Style.AlwaysBreakBeforeMultilineStrings = true;
6474 Style.ColumnLimit = 0;
6475 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006476
6477 // But 'import' might also be a regular C++ namespace.
6478 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006480}
6481
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006482//===----------------------------------------------------------------------===//
6483// Error recovery tests.
6484//===----------------------------------------------------------------------===//
6485
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006486TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006487 FormatStyle NoBinPacking = getLLVMStyle();
6488 NoBinPacking.BinPackParameters = false;
6489 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6490 " double *min_x,\n"
6491 " double *max_x,\n"
6492 " double *min_y,\n"
6493 " double *max_y,\n"
6494 " double *min_z,\n"
6495 " double *max_z, ) {}",
6496 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006497}
6498
Daniel Jasper83a54d22013-01-10 09:26:47 +00006499TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006500 verifyFormat("void f() { return; }\n42");
6501 verifyFormat("void f() {\n"
6502 " if (0)\n"
6503 " return;\n"
6504 "}\n"
6505 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006506 verifyFormat("void f() { return }\n42");
6507 verifyFormat("void f() {\n"
6508 " if (0)\n"
6509 " return\n"
6510 "}\n"
6511 "42");
6512}
6513
6514TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6515 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6516 EXPECT_EQ("void f() {\n"
6517 " if (a)\n"
6518 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006519 "}",
6520 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006521 EXPECT_EQ("namespace N {\n"
6522 "void f()\n"
6523 "}",
6524 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006525 EXPECT_EQ("namespace N {\n"
6526 "void f() {}\n"
6527 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006528 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006529 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006530}
6531
Daniel Jasper2df93312013-01-09 10:16:05 +00006532TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6533 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006534 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006535 " b;",
6536 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006537 verifyFormat("function(\n"
6538 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006539 " LoooooooooooongArgument);\n",
6540 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006541}
6542
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006543TEST_F(FormatTest, IncorrectAccessSpecifier) {
6544 verifyFormat("public:");
6545 verifyFormat("class A {\n"
6546 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006547 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006548 "};");
6549 verifyFormat("public\n"
6550 "int qwerty;");
6551 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006552 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006553 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006554 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006555 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006556 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006557}
Daniel Jasperf7935112012-12-03 18:12:45 +00006558
Daniel Jasper291f9362013-03-20 15:58:10 +00006559TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6560 verifyFormat("{");
6561 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006562 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006563}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006564
6565TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006566 verifyFormat("do {\n}");
6567 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006568 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006569 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006570 "wheeee(fun);");
6571 verifyFormat("do {\n"
6572 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006573 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006574}
6575
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006576TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006577 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006578 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006579 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006580 verifyFormat("while {\n foo;\n foo();\n}");
6581 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006582}
6583
Daniel Jasperc0880a92013-01-04 18:52:56 +00006584TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006585 verifyIncompleteFormat("namespace {\n"
6586 "class Foo { Foo (\n"
6587 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006588 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006589}
6590
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006591TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006592 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006593 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6594 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006595 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006596
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006597 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006598 " {\n"
6599 " breakme(\n"
6600 " qwe);\n"
6601 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006602 format("{\n"
6603 " {\n"
6604 " breakme(qwe);\n"
6605 "}\n",
6606 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006607}
6608
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006609TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006610 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006611 " avariable,\n"
6612 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006613 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006614}
6615
Manuel Klimek762dd182013-01-21 10:07:49 +00006616TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006617 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006618}
6619
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006620TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006621 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006622 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006623 " 1,\n"
6624 " 2,\n"
6625 " 3,\n"
6626 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006627 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006628 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6629 verifyFormat("f({1, 2});");
6630 verifyFormat("auto v = Foo{-1};");
6631 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6632 verifyFormat("Class::Class : member{1, 2, 3} {}");
6633 verifyFormat("new vector<int>{1, 2, 3};");
6634 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006635 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006636 verifyFormat("return {arg1, arg2};");
6637 verifyFormat("return {arg1, SomeType{parameter}};");
6638 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6639 verifyFormat("new T{arg1, arg2};");
6640 verifyFormat("f(MyMap[{composite, key}]);");
6641 verifyFormat("class Class {\n"
6642 " T member = {arg1, arg2};\n"
6643 "};");
6644 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006645 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6646 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006647 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6648 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006649
Daniel Jasper438059e2014-05-22 12:11:13 +00006650 verifyFormat("int foo(int i) { return fo1{}(i); }");
6651 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006652 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006653 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006654 verifyFormat("Node n{1, Node{1000}, //\n"
6655 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006656 verifyFormat("Aaaa aaaaaaa{\n"
6657 " {\n"
6658 " aaaa,\n"
6659 " },\n"
6660 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006661 verifyFormat("class C : public D {\n"
6662 " SomeClass SC{2};\n"
6663 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006664 verifyFormat("class C : public A {\n"
6665 " class D : public B {\n"
6666 " void f() { int i{2}; }\n"
6667 " };\n"
6668 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006669 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006670
Francois Ferrandd2130f52017-06-30 20:00:02 +00006671 // Binpacking only if there is no trailing comma
6672 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6673 " cccccccccc, dddddddddd};",
6674 getLLVMStyleWithColumns(50));
6675 verifyFormat("const Aaaaaa aaaaa = {\n"
6676 " aaaaaaaaaaa,\n"
6677 " bbbbbbbbbbb,\n"
6678 " ccccccccccc,\n"
6679 " ddddddddddd,\n"
6680 "};", getLLVMStyleWithColumns(50));
6681
Daniel Jaspere4ada022016-12-13 10:05:03 +00006682 // Cases where distinguising braced lists and blocks is hard.
6683 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6684 verifyFormat("void f() {\n"
6685 " return; // comment\n"
6686 "}\n"
6687 "SomeType t;");
6688 verifyFormat("void f() {\n"
6689 " if (a) {\n"
6690 " f();\n"
6691 " }\n"
6692 "}\n"
6693 "SomeType t;");
6694
Daniel Jasper08434342015-05-26 07:26:26 +00006695 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006696 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006697 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006698 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6699 " bbbbb,\n"
6700 " ccccc,\n"
6701 " ddddd,\n"
6702 " eeeee,\n"
6703 " ffffff,\n"
6704 " ggggg,\n"
6705 " hhhhhh,\n"
6706 " iiiiii,\n"
6707 " jjjjjj,\n"
6708 " kkkkkk};",
6709 NoBinPacking);
6710 verifyFormat("const Aaaaaa aaaaa = {\n"
6711 " aaaaa,\n"
6712 " bbbbb,\n"
6713 " ccccc,\n"
6714 " ddddd,\n"
6715 " eeeee,\n"
6716 " ffffff,\n"
6717 " ggggg,\n"
6718 " hhhhhh,\n"
6719 " iiiiii,\n"
6720 " jjjjjj,\n"
6721 " kkkkkk,\n"
6722 "};",
6723 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006724 verifyFormat(
6725 "const Aaaaaa aaaaa = {\n"
6726 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6727 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6728 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6729 "};",
6730 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006731
Chandler Carruthf8b72662014-03-02 12:37:31 +00006732 // FIXME: The alignment of these trailing comments might be bad. Then again,
6733 // this might be utterly useless in real code.
6734 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006735 " : some_value{ //\n"
6736 " aaaaaaa, //\n"
6737 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006738
Chandler Carruthf8b72662014-03-02 12:37:31 +00006739 // In braced lists, the first comment is always assumed to belong to the
6740 // first element. Thus, it can be moved to the next or previous line as
6741 // appropriate.
6742 EXPECT_EQ("function({// First element:\n"
6743 " 1,\n"
6744 " // Second element:\n"
6745 " 2});",
6746 format("function({\n"
6747 " // First element:\n"
6748 " 1,\n"
6749 " // Second element:\n"
6750 " 2});"));
6751 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6752 " // First element:\n"
6753 " 1,\n"
6754 " // Second element:\n"
6755 " 2};",
6756 format("std::vector<int> MyNumbers{// First element:\n"
6757 " 1,\n"
6758 " // Second element:\n"
6759 " 2};",
6760 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006761 // A trailing comma should still lead to an enforced line break and no
6762 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006763 EXPECT_EQ("vector<int> SomeVector = {\n"
6764 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006765 " 1,\n"
6766 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006767 "};",
6768 format("vector<int> SomeVector = { // aaa\n"
6769 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006770
Chandler Carruthf8b72662014-03-02 12:37:31 +00006771 FormatStyle ExtraSpaces = getLLVMStyle();
6772 ExtraSpaces.Cpp11BracedListStyle = false;
6773 ExtraSpaces.ColumnLimit = 75;
6774 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6775 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6776 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6777 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6778 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6779 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6780 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6781 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6782 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6783 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6784 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6785 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6786 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6787 verifyFormat("class Class {\n"
6788 " T member = { arg1, arg2 };\n"
6789 "};",
6790 ExtraSpaces);
6791 verifyFormat(
6792 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6793 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6794 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6795 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6796 ExtraSpaces);
6797 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006798 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006799 ExtraSpaces);
6800 verifyFormat(
6801 "someFunction(OtherParam,\n"
6802 " BracedList{ // comment 1 (Forcing interesting break)\n"
6803 " param1, param2,\n"
6804 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006805 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006806 ExtraSpaces);
6807 verifyFormat(
6808 "std::this_thread::sleep_for(\n"
6809 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6810 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006811 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006812 " aaaaaaa,\n"
6813 " aaaaaaaaaa,\n"
6814 " aaaaa,\n"
6815 " aaaaaaaaaaaaaaa,\n"
6816 " aaa,\n"
6817 " aaaaaaaaaa,\n"
6818 " a,\n"
6819 " aaaaaaaaaaaaaaaaaaaaa,\n"
6820 " aaaaaaaaaaaa,\n"
6821 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6822 " aaaaaaa,\n"
6823 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006824 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006825 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6826 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006827}
6828
Daniel Jasper33b909c2013-10-25 14:29:37 +00006829TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006830 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6831 " 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};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006836 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006837 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006838 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006839 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6840 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006841 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006842 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6843 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6844 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6845 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6846 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6847 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6848 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006849 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006850 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6851 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006852 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6853 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6854 " // Separating comment.\n"
6855 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6856 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6857 " // Leading comment\n"
6858 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6859 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006860 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6861 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006862 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006863 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6864 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006865 getLLVMStyleWithColumns(38));
6866 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006867 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6868 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006869 verifyFormat(
6870 "static unsigned SomeValues[10][3] = {\n"
6871 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6872 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6873 verifyFormat("static auto fields = new vector<string>{\n"
6874 " \"aaaaaaaaaaaaa\",\n"
6875 " \"aaaaaaaaaaaaa\",\n"
6876 " \"aaaaaaaaaaaa\",\n"
6877 " \"aaaaaaaaaaaaaa\",\n"
6878 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6879 " \"aaaaaaaaaaaa\",\n"
6880 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6881 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006882 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6883 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6884 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6885 " 3, cccccccccccccccccccccc};",
6886 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006887
6888 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006889 verifyFormat("vector<int> x = {\n"
6890 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6891 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006892 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006893 verifyFormat("vector<int> x = {\n"
6894 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006895 "};",
6896 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006897 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6898 " 1, 1, 1, 1,\n"
6899 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006900 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006901
Daniel Jasper60c27072015-05-13 08:16:00 +00006902 // Trailing comment in the first line.
6903 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6904 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6905 " 111111111, 222222222, 3333333333, 444444444, //\n"
6906 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006907 // Trailing comment in the last line.
6908 verifyFormat("int aaaaa[] = {\n"
6909 " 1, 2, 3, // comment\n"
6910 " 4, 5, 6 // comment\n"
6911 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006912
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006913 // With nested lists, we should either format one item per line or all nested
6914 // lists one on line.
6915 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006916 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6917 " {aaaaaaaaaaaaaaaaaaa},\n"
6918 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6919 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006920 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006921 verifyFormat(
6922 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006923 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6924 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6925 " {aaa, aaa},\n"
6926 " {aaa, aaa},\n"
6927 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6928 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6929 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006930
6931 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006932 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006933 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006934
6935 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006936
Daniel Jaspereb65e912015-12-21 18:31:15 +00006937 // No braced initializer here.
6938 verifyFormat("void f() {\n"
6939 " struct Dummy {};\n"
6940 " f(v);\n"
6941 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006942
6943 // Long lists should be formatted in columns even if they are nested.
6944 verifyFormat(
6945 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6946 " 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});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006951
6952 // Allow "single-column" layout even if that violates the column limit. There
6953 // isn't going to be a better way.
6954 verifyFormat("std::vector<int> a = {\n"
6955 " aaaaaaaa,\n"
6956 " aaaaaaaa,\n"
6957 " aaaaaaaa,\n"
6958 " aaaaaaaa,\n"
6959 " aaaaaaaaaa,\n"
6960 " aaaaaaaa,\n"
6961 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6962 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006963 verifyFormat("vector<int> aaaa = {\n"
6964 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6965 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6966 " aaaaaa.aaaaaaa,\n"
6967 " aaaaaa.aaaaaaa,\n"
6968 " aaaaaa.aaaaaaa,\n"
6969 " aaaaaa.aaaaaaa,\n"
6970 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006971
6972 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006973 verifyFormat("someFunction(Param, {List1, List2,\n"
6974 " List3});",
6975 getLLVMStyleWithColumns(35));
6976 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006977 " {List1, List2,\n"
6978 " List3});",
6979 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006980 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6981 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006982}
6983
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006984TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006985 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006986 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006987
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006988 verifyFormat("void f() { return 42; }");
6989 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006990 " return 42;\n"
6991 "}",
6992 DoNotMerge);
6993 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006994 " // Comment\n"
6995 "}");
6996 verifyFormat("{\n"
6997 "#error {\n"
6998 " int a;\n"
6999 "}");
7000 verifyFormat("{\n"
7001 " int a;\n"
7002 "#error {\n"
7003 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007004 verifyFormat("void f() {} // comment");
7005 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007006 verifyFormat("void f() {\n"
7007 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007008 DoNotMerge);
7009 verifyFormat("void f() {\n"
7010 " int a;\n"
7011 "} // comment",
7012 DoNotMerge);
7013 verifyFormat("void f() {\n"
7014 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007015 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007016
7017 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7018 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7019
7020 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7021 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007022 verifyFormat("class C {\n"
7023 " C()\n"
7024 " : iiiiiiii(nullptr),\n"
7025 " kkkkkkk(nullptr),\n"
7026 " mmmmmmm(nullptr),\n"
7027 " nnnnnnn(nullptr) {}\n"
7028 "};",
7029 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007030
7031 FormatStyle NoColumnLimit = getLLVMStyle();
7032 NoColumnLimit.ColumnLimit = 0;
7033 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7034 EXPECT_EQ("class C {\n"
7035 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007036 "};",
7037 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007038 EXPECT_EQ("A()\n"
7039 " : b(0) {\n"
7040 "}",
7041 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7042
7043 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007044 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7045 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007046 EXPECT_EQ("A()\n"
7047 " : b(0) {\n"
7048 "}",
7049 format("A():b(0){}", DoNotMergeNoColumnLimit));
7050 EXPECT_EQ("A()\n"
7051 " : b(0) {\n"
7052 "}",
7053 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007054
7055 verifyFormat("#define A \\\n"
7056 " void f() { \\\n"
7057 " int i; \\\n"
7058 " }",
7059 getLLVMStyleWithColumns(20));
7060 verifyFormat("#define A \\\n"
7061 " void f() { int i; }",
7062 getLLVMStyleWithColumns(21));
7063 verifyFormat("#define A \\\n"
7064 " void f() { \\\n"
7065 " int i; \\\n"
7066 " } \\\n"
7067 " int j;",
7068 getLLVMStyleWithColumns(22));
7069 verifyFormat("#define A \\\n"
7070 " void f() { int i; } \\\n"
7071 " int j;",
7072 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007073}
7074
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007075TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7076 FormatStyle MergeEmptyOnly = getLLVMStyle();
7077 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7078 verifyFormat("class C {\n"
7079 " int f() {}\n"
7080 "};",
7081 MergeEmptyOnly);
7082 verifyFormat("class C {\n"
7083 " int f() {\n"
7084 " return 42;\n"
7085 " }\n"
7086 "};",
7087 MergeEmptyOnly);
7088 verifyFormat("int f() {}", MergeEmptyOnly);
7089 verifyFormat("int f() {\n"
7090 " return 42;\n"
7091 "}",
7092 MergeEmptyOnly);
7093
7094 // Also verify behavior when BraceWrapping.AfterFunction = true
7095 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7096 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7097 verifyFormat("int f() {}", MergeEmptyOnly);
7098 verifyFormat("class C {\n"
7099 " int f() {}\n"
7100 "};",
7101 MergeEmptyOnly);
7102}
7103
Daniel Jasperd74cf402014-04-08 12:46:38 +00007104TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7105 FormatStyle MergeInlineOnly = getLLVMStyle();
7106 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7107 verifyFormat("class C {\n"
7108 " int f() { return 42; }\n"
7109 "};",
7110 MergeInlineOnly);
7111 verifyFormat("int f() {\n"
7112 " return 42;\n"
7113 "}",
7114 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007115
7116 // SFS_Inline implies SFS_Empty
7117 verifyFormat("class C {\n"
7118 " int f() {}\n"
7119 "};",
7120 MergeInlineOnly);
7121 verifyFormat("int f() {}", MergeInlineOnly);
7122
7123 // Also verify behavior when BraceWrapping.AfterFunction = true
7124 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7125 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7126 verifyFormat("class C {\n"
7127 " int f() { return 42; }\n"
7128 "};",
7129 MergeInlineOnly);
7130 verifyFormat("int f()\n"
7131 "{\n"
7132 " return 42;\n"
7133 "}",
7134 MergeInlineOnly);
7135
7136 // SFS_Inline implies SFS_Empty
7137 verifyFormat("int f() {}", MergeInlineOnly);
7138 verifyFormat("class C {\n"
7139 " int f() {}\n"
7140 "};",
7141 MergeInlineOnly);
7142}
7143
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007144TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7145 FormatStyle MergeInlineOnly = getLLVMStyle();
7146 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7147 FormatStyle::SFS_InlineOnly;
7148 verifyFormat("class C {\n"
7149 " int f() { return 42; }\n"
7150 "};",
7151 MergeInlineOnly);
7152 verifyFormat("int f() {\n"
7153 " return 42;\n"
7154 "}",
7155 MergeInlineOnly);
7156
7157 // SFS_InlineOnly does not imply SFS_Empty
7158 verifyFormat("class C {\n"
7159 " int f() {}\n"
7160 "};",
7161 MergeInlineOnly);
7162 verifyFormat("int f() {\n"
7163 "}",
7164 MergeInlineOnly);
7165
7166 // Also verify behavior when BraceWrapping.AfterFunction = true
7167 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7168 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7169 verifyFormat("class C {\n"
7170 " int f() { return 42; }\n"
7171 "};",
7172 MergeInlineOnly);
7173 verifyFormat("int f()\n"
7174 "{\n"
7175 " return 42;\n"
7176 "}",
7177 MergeInlineOnly);
7178
7179 // SFS_InlineOnly does not imply SFS_Empty
7180 verifyFormat("int f()\n"
7181 "{\n"
7182 "}",
7183 MergeInlineOnly);
7184 verifyFormat("class C {\n"
7185 " int f() {}\n"
7186 "};",
7187 MergeInlineOnly);
7188}
7189
Francois Ferrandad722562017-06-30 20:25:55 +00007190TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007191 FormatStyle Style = getLLVMStyle();
7192 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7193 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7194 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007195 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007196 Style.ColumnLimit = 40;
7197
7198 verifyFormat("int f()\n"
7199 "{}",
7200 Style);
7201 verifyFormat("int f()\n"
7202 "{\n"
7203 " return 42;\n"
7204 "}",
7205 Style);
7206 verifyFormat("int f()\n"
7207 "{\n"
7208 " // some comment\n"
7209 "}",
7210 Style);
7211
7212 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7213 verifyFormat("int f() {}", Style);
7214 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7215 "{}",
7216 Style);
7217 verifyFormat("int f()\n"
7218 "{\n"
7219 " return 0;\n"
7220 "}",
7221 Style);
7222
7223 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7224 verifyFormat("class Foo {\n"
7225 " int f() {}\n"
7226 "};\n",
7227 Style);
7228 verifyFormat("class Foo {\n"
7229 " int f() { return 0; }\n"
7230 "};\n",
7231 Style);
7232 verifyFormat("class Foo {\n"
7233 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7234 " {}\n"
7235 "};\n",
7236 Style);
7237 verifyFormat("class Foo {\n"
7238 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7239 " {\n"
7240 " return 0;\n"
7241 " }\n"
7242 "};\n",
7243 Style);
7244
7245 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7246 verifyFormat("int f() {}", Style);
7247 verifyFormat("int f() { return 0; }", Style);
7248 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7249 "{}",
7250 Style);
7251 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7252 "{\n"
7253 " return 0;\n"
7254 "}",
7255 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007256}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007257TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7258 FormatStyle Style = getLLVMStyle();
7259 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7260 verifyFormat("#ifdef A\n"
7261 "int f() {}\n"
7262 "#else\n"
7263 "int g() {}\n"
7264 "#endif",
7265 Style);
7266}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007267
Francois Ferrandad722562017-06-30 20:25:55 +00007268TEST_F(FormatTest, SplitEmptyClass) {
7269 FormatStyle Style = getLLVMStyle();
7270 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7271 Style.BraceWrapping.AfterClass = true;
7272 Style.BraceWrapping.SplitEmptyRecord = false;
7273
7274 verifyFormat("class Foo\n"
7275 "{};",
7276 Style);
7277 verifyFormat("/* something */ class Foo\n"
7278 "{};",
7279 Style);
7280 verifyFormat("template <typename X> class Foo\n"
7281 "{};",
7282 Style);
7283 verifyFormat("class Foo\n"
7284 "{\n"
7285 " Foo();\n"
7286 "};",
7287 Style);
7288 verifyFormat("typedef class Foo\n"
7289 "{\n"
7290 "} Foo_t;",
7291 Style);
7292}
7293
7294TEST_F(FormatTest, SplitEmptyStruct) {
7295 FormatStyle Style = getLLVMStyle();
7296 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7297 Style.BraceWrapping.AfterStruct = true;
7298 Style.BraceWrapping.SplitEmptyRecord = false;
7299
7300 verifyFormat("struct Foo\n"
7301 "{};",
7302 Style);
7303 verifyFormat("/* something */ struct Foo\n"
7304 "{};",
7305 Style);
7306 verifyFormat("template <typename X> struct Foo\n"
7307 "{};",
7308 Style);
7309 verifyFormat("struct Foo\n"
7310 "{\n"
7311 " Foo();\n"
7312 "};",
7313 Style);
7314 verifyFormat("typedef struct Foo\n"
7315 "{\n"
7316 "} Foo_t;",
7317 Style);
7318 //typedef struct Bar {} Bar_t;
7319}
7320
7321TEST_F(FormatTest, SplitEmptyUnion) {
7322 FormatStyle Style = getLLVMStyle();
7323 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7324 Style.BraceWrapping.AfterUnion = true;
7325 Style.BraceWrapping.SplitEmptyRecord = false;
7326
7327 verifyFormat("union Foo\n"
7328 "{};",
7329 Style);
7330 verifyFormat("/* something */ union Foo\n"
7331 "{};",
7332 Style);
7333 verifyFormat("union Foo\n"
7334 "{\n"
7335 " A,\n"
7336 "};",
7337 Style);
7338 verifyFormat("typedef union Foo\n"
7339 "{\n"
7340 "} Foo_t;",
7341 Style);
7342}
7343
7344TEST_F(FormatTest, SplitEmptyNamespace) {
7345 FormatStyle Style = getLLVMStyle();
7346 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7347 Style.BraceWrapping.AfterNamespace = true;
7348 Style.BraceWrapping.SplitEmptyNamespace = false;
7349
7350 verifyFormat("namespace Foo\n"
7351 "{};",
7352 Style);
7353 verifyFormat("/* something */ namespace Foo\n"
7354 "{};",
7355 Style);
7356 verifyFormat("inline namespace Foo\n"
7357 "{};",
7358 Style);
7359 verifyFormat("namespace Foo\n"
7360 "{\n"
7361 "void Bar();\n"
7362 "};",
7363 Style);
7364}
7365
7366TEST_F(FormatTest, NeverMergeShortRecords) {
7367 FormatStyle Style = getLLVMStyle();
7368
7369 verifyFormat("class Foo {\n"
7370 " Foo();\n"
7371 "};",
7372 Style);
7373 verifyFormat("typedef class Foo {\n"
7374 " Foo();\n"
7375 "} Foo_t;",
7376 Style);
7377 verifyFormat("struct Foo {\n"
7378 " Foo();\n"
7379 "};",
7380 Style);
7381 verifyFormat("typedef struct Foo {\n"
7382 " Foo();\n"
7383 "} Foo_t;",
7384 Style);
7385 verifyFormat("union Foo {\n"
7386 " A,\n"
7387 "};",
7388 Style);
7389 verifyFormat("typedef union Foo {\n"
7390 " A,\n"
7391 "} Foo_t;",
7392 Style);
7393 verifyFormat("namespace Foo {\n"
7394 "void Bar();\n"
7395 "};",
7396 Style);
7397
7398 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7399 Style.BraceWrapping.AfterClass = true;
7400 Style.BraceWrapping.AfterStruct = true;
7401 Style.BraceWrapping.AfterUnion = true;
7402 Style.BraceWrapping.AfterNamespace = true;
7403 verifyFormat("class Foo\n"
7404 "{\n"
7405 " Foo();\n"
7406 "};",
7407 Style);
7408 verifyFormat("typedef class Foo\n"
7409 "{\n"
7410 " Foo();\n"
7411 "} Foo_t;",
7412 Style);
7413 verifyFormat("struct Foo\n"
7414 "{\n"
7415 " Foo();\n"
7416 "};",
7417 Style);
7418 verifyFormat("typedef struct Foo\n"
7419 "{\n"
7420 " Foo();\n"
7421 "} Foo_t;",
7422 Style);
7423 verifyFormat("union Foo\n"
7424 "{\n"
7425 " A,\n"
7426 "};",
7427 Style);
7428 verifyFormat("typedef union Foo\n"
7429 "{\n"
7430 " A,\n"
7431 "} Foo_t;",
7432 Style);
7433 verifyFormat("namespace Foo\n"
7434 "{\n"
7435 "void Bar();\n"
7436 "};",
7437 Style);
7438}
7439
Manuel Klimeke01bab52013-01-15 13:38:33 +00007440TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7441 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007442 verifyFormat("struct foo a = {bar};\nint n;");
7443 verifyFormat("class foo a = {bar};\nint n;");
7444 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007445
7446 // Elaborate types inside function definitions.
7447 verifyFormat("struct foo f() {}\nint n;");
7448 verifyFormat("class foo f() {}\nint n;");
7449 verifyFormat("union foo f() {}\nint n;");
7450
7451 // Templates.
7452 verifyFormat("template <class X> void f() {}\nint n;");
7453 verifyFormat("template <struct X> void f() {}\nint n;");
7454 verifyFormat("template <union X> void f() {}\nint n;");
7455
7456 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007457 verifyFormat("struct {\n} n;");
7458 verifyFormat(
7459 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007460 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007461 verifyFormat("class MACRO Z {\n} n;");
7462 verifyFormat("class MACRO(X) Z {\n} n;");
7463 verifyFormat("class __attribute__(X) Z {\n} n;");
7464 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007465 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007466 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007467 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7468 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007469
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007470 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007471 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007472
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007473 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007474 verifyFormat(
7475 "template <typename F>\n"
7476 "Matcher(const Matcher<F> &Other,\n"
7477 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7478 " !is_same<F, T>::value>::type * = 0)\n"
7479 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7480
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007481 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007482 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007483 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007484
7485 // FIXME:
7486 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007487 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007488
Manuel Klimeke01bab52013-01-15 13:38:33 +00007489 // Elaborate types where incorrectly parsing the structural element would
7490 // break the indent.
7491 verifyFormat("if (true)\n"
7492 " class X x;\n"
7493 "else\n"
7494 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007495
7496 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007497 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007498}
7499
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007500TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007501 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7502 format("#error Leave all white!!!!! space* alone!\n"));
7503 EXPECT_EQ(
7504 "#warning Leave all white!!!!! space* alone!\n",
7505 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007506 EXPECT_EQ("#error 1", format(" # error 1"));
7507 EXPECT_EQ("#warning 1", format(" # warning 1"));
7508}
7509
Daniel Jasper4431aa92013-04-23 13:54:04 +00007510TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007511 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007512 verifyFormat("#if (AAAA && BBBB)");
7513 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007514 // FIXME: Come up with a better indentation for #elif.
7515 verifyFormat(
7516 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7517 " defined(BBBBBBBB)\n"
7518 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7519 " defined(BBBBBBBB)\n"
7520 "#endif",
7521 getLLVMStyleWithColumns(65));
7522}
7523
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007524TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7525 FormatStyle AllowsMergedIf = getGoogleStyle();
7526 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7527 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7528 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007529 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7530 EXPECT_EQ("if (true) return 42;",
7531 format("if (true)\nreturn 42;", AllowsMergedIf));
7532 FormatStyle ShortMergedIf = AllowsMergedIf;
7533 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007534 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007535 " if (true) return 42;",
7536 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007537 verifyFormat("#define A \\\n"
7538 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007539 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007540 "#define B",
7541 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007542 verifyFormat("#define A \\\n"
7543 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007544 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007545 "g();",
7546 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007547 verifyFormat("{\n"
7548 "#ifdef A\n"
7549 " // Comment\n"
7550 " if (true) continue;\n"
7551 "#endif\n"
7552 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007553 " if (true) continue;\n"
7554 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007555 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007556 ShortMergedIf.ColumnLimit = 33;
7557 verifyFormat("#define A \\\n"
7558 " if constexpr (true) return 42;",
7559 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007560 ShortMergedIf.ColumnLimit = 29;
7561 verifyFormat("#define A \\\n"
7562 " if (aaaaaaaaaa) return 1; \\\n"
7563 " return 2;",
7564 ShortMergedIf);
7565 ShortMergedIf.ColumnLimit = 28;
7566 verifyFormat("#define A \\\n"
7567 " if (aaaaaaaaaa) \\\n"
7568 " return 1; \\\n"
7569 " return 2;",
7570 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007571 verifyFormat("#define A \\\n"
7572 " if constexpr (aaaaaaa) \\\n"
7573 " return 1; \\\n"
7574 " return 2;",
7575 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007576}
7577
Manuel Klimekd33516e2013-01-23 10:09:28 +00007578TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007579 verifyFormat("void f(int *a);");
7580 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007581 verifyFormat("class A {\n void f(int *a);\n};");
7582 verifyFormat("class A {\n int *a;\n};");
7583 verifyFormat("namespace a {\n"
7584 "namespace b {\n"
7585 "class A {\n"
7586 " void f() {}\n"
7587 " int *a;\n"
7588 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007589 "} // namespace b\n"
7590 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007591}
7592
Manuel Klimekd33516e2013-01-23 10:09:28 +00007593TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7594 verifyFormat("while");
7595 verifyFormat("operator");
7596}
7597
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007598TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7599 // This code would be painfully slow to format if we didn't skip it.
7600 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
7601 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
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(1, 1)\n"
7606 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7607 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
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 // Deeply nested part is untouched, rest is formatted.
7617 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7618 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007619 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007620}
7621
Nico Weber7e6a7a12013-01-08 17:56:31 +00007622//===----------------------------------------------------------------------===//
7623// Objective-C tests.
7624//===----------------------------------------------------------------------===//
7625
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007626TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7627 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7628 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7629 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007630 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007631 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7632 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7633 format("-(NSInteger)Method3:(id)anObject;"));
7634 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7635 format("-(NSInteger)Method4:(id)anObject;"));
7636 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7637 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7638 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7639 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007640 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7641 "forAllCells:(BOOL)flag;",
7642 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7643 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007644
7645 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007646 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7647 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007648 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7649 " inRange:(NSRange)range\n"
7650 " outRange:(NSRange)out_range\n"
7651 " outRange1:(NSRange)out_range1\n"
7652 " outRange2:(NSRange)out_range2\n"
7653 " outRange3:(NSRange)out_range3\n"
7654 " outRange4:(NSRange)out_range4\n"
7655 " outRange5:(NSRange)out_range5\n"
7656 " outRange6:(NSRange)out_range6\n"
7657 " outRange7:(NSRange)out_range7\n"
7658 " outRange8:(NSRange)out_range8\n"
7659 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007660
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007661 // When the function name has to be wrapped.
7662 FormatStyle Style = getLLVMStyle();
7663 Style.IndentWrappedFunctionNames = false;
7664 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7665 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7666 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7667 "}",
7668 Style);
7669 Style.IndentWrappedFunctionNames = true;
7670 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7671 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7672 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7673 "}",
7674 Style);
7675
Nico Weberd6f962f2013-01-10 20:18:33 +00007676 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007677 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007678 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7679 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007680 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007681
Daniel Jasper37194282013-05-28 08:33:00 +00007682 verifyFormat("- (int (*)())foo:(int (*)())f;");
7683 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007684
7685 // If there's no return type (very rare in practice!), LLVM and Google style
7686 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007687 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007688 verifyFormat("- foo:(int)f;");
7689 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007690}
7691
Nico Weber0588b502013-02-07 00:19:29 +00007692
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007693TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007694 EXPECT_EQ("\"some text \"\n"
7695 "\"other\";",
7696 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007697 EXPECT_EQ("\"some text \"\n"
7698 "\"other\";",
7699 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007700 EXPECT_EQ(
7701 "#define A \\\n"
7702 " \"some \" \\\n"
7703 " \"text \" \\\n"
7704 " \"other\";",
7705 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7706 EXPECT_EQ(
7707 "#define A \\\n"
7708 " \"so \" \\\n"
7709 " \"text \" \\\n"
7710 " \"other\";",
7711 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7712
7713 EXPECT_EQ("\"some text\"",
7714 format("\"some text\"", getLLVMStyleWithColumns(1)));
7715 EXPECT_EQ("\"some text\"",
7716 format("\"some text\"", getLLVMStyleWithColumns(11)));
7717 EXPECT_EQ("\"some \"\n"
7718 "\"text\"",
7719 format("\"some text\"", getLLVMStyleWithColumns(10)));
7720 EXPECT_EQ("\"some \"\n"
7721 "\"text\"",
7722 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007723 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007724 "\" tex\"\n"
7725 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007726 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007727 EXPECT_EQ("\"some\"\n"
7728 "\" tex\"\n"
7729 "\" and\"",
7730 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7731 EXPECT_EQ("\"some\"\n"
7732 "\"/tex\"\n"
7733 "\"/and\"",
7734 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007735
7736 EXPECT_EQ("variable =\n"
7737 " \"long string \"\n"
7738 " \"literal\";",
7739 format("variable = \"long string literal\";",
7740 getLLVMStyleWithColumns(20)));
7741
7742 EXPECT_EQ("variable = f(\n"
7743 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007744 " \"literal\",\n"
7745 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007746 " loooooooooooooooooooong);",
7747 format("variable = f(\"long string literal\", short, "
7748 "loooooooooooooooooooong);",
7749 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007750
Daniel Jaspera44991332015-04-29 13:06:49 +00007751 EXPECT_EQ(
7752 "f(g(\"long string \"\n"
7753 " \"literal\"),\n"
7754 " b);",
7755 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007756 EXPECT_EQ("f(g(\"long string \"\n"
7757 " \"literal\",\n"
7758 " a),\n"
7759 " b);",
7760 format("f(g(\"long string literal\", a), b);",
7761 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007762 EXPECT_EQ(
7763 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007764 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007765 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7766 EXPECT_EQ("f(\"one two three four five six \"\n"
7767 " \"seven\".split(\n"
7768 " really_looooong_variable));",
7769 format("f(\"one two three four five six seven\"."
7770 "split(really_looooong_variable));",
7771 getLLVMStyleWithColumns(33)));
7772
7773 EXPECT_EQ("f(\"some \"\n"
7774 " \"text\",\n"
7775 " other);",
7776 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007777
7778 // Only break as a last resort.
7779 verifyFormat(
7780 "aaaaaaaaaaaaaaaaaaaa(\n"
7781 " aaaaaaaaaaaaaaaaaaaa,\n"
7782 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007783
Daniel Jaspera44991332015-04-29 13:06:49 +00007784 EXPECT_EQ("\"splitmea\"\n"
7785 "\"trandomp\"\n"
7786 "\"oint\"",
7787 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007788
Daniel Jaspera44991332015-04-29 13:06:49 +00007789 EXPECT_EQ("\"split/\"\n"
7790 "\"pathat/\"\n"
7791 "\"slashes\"",
7792 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007793
Daniel Jaspera44991332015-04-29 13:06:49 +00007794 EXPECT_EQ("\"split/\"\n"
7795 "\"pathat/\"\n"
7796 "\"slashes\"",
7797 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007798 EXPECT_EQ("\"split at \"\n"
7799 "\"spaces/at/\"\n"
7800 "\"slashes.at.any$\"\n"
7801 "\"non-alphanumeric%\"\n"
7802 "\"1111111111characte\"\n"
7803 "\"rs\"",
7804 format("\"split at "
7805 "spaces/at/"
7806 "slashes.at."
7807 "any$non-"
7808 "alphanumeric%"
7809 "1111111111characte"
7810 "rs\"",
7811 getLLVMStyleWithColumns(20)));
7812
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007813 // Verify that splitting the strings understands
7814 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007815 EXPECT_EQ(
7816 "aaaaaaaaaaaa(\n"
7817 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7818 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7819 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7820 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7821 "aaaaaaaaaaaaaaaaaaaaaa\");",
7822 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007823 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7824 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7825 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7826 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7827 "aaaaaaaaaaaaaaaaaaaaaa\";",
7828 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007829 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7830 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7831 format("llvm::outs() << "
7832 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7833 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007834 EXPECT_EQ("ffff(\n"
7835 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7836 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7837 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7838 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7839 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007840
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007841 FormatStyle Style = getLLVMStyleWithColumns(12);
7842 Style.BreakStringLiterals = false;
7843 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7844
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007845 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007846 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007847 EXPECT_EQ("#define A \\\n"
7848 " \"some \" \\\n"
7849 " \"text \" \\\n"
7850 " \"other\";",
7851 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007852}
7853
Manuel Klimek93699f42017-11-29 14:29:43 +00007854TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7855 EXPECT_EQ("C a = \"some more \"\n"
7856 " \"text\";",
7857 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7858}
7859
Manuel Klimek9e321992015-07-28 15:50:24 +00007860TEST_F(FormatTest, FullyRemoveEmptyLines) {
7861 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7862 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7863 EXPECT_EQ("int i = a(b());",
7864 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7865}
7866
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007867TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7868 EXPECT_EQ(
7869 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7870 "(\n"
7871 " \"x\t\");",
7872 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7873 "aaaaaaa("
7874 "\"x\t\");"));
7875}
7876
Daniel Jasper174b0122014-01-09 14:18:12 +00007877TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007878 EXPECT_EQ(
7879 "u8\"utf8 string \"\n"
7880 "u8\"literal\";",
7881 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7882 EXPECT_EQ(
7883 "u\"utf16 string \"\n"
7884 "u\"literal\";",
7885 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7886 EXPECT_EQ(
7887 "U\"utf32 string \"\n"
7888 "U\"literal\";",
7889 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7890 EXPECT_EQ("L\"wide string \"\n"
7891 "L\"literal\";",
7892 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007893 EXPECT_EQ("@\"NSString \"\n"
7894 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007895 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007896 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007897
7898 // This input makes clang-format try to split the incomplete unicode escape
7899 // sequence, which used to lead to a crasher.
7900 verifyNoCrash(
7901 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7902 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007903}
7904
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007905TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7906 FormatStyle Style = getGoogleStyleWithColumns(15);
7907 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7908 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7909 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7910 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7911 EXPECT_EQ("u8R\"x(raw literal)x\";",
7912 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007913}
7914
7915TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7916 FormatStyle Style = getLLVMStyleWithColumns(20);
7917 EXPECT_EQ(
7918 "_T(\"aaaaaaaaaaaaaa\")\n"
7919 "_T(\"aaaaaaaaaaaaaa\")\n"
7920 "_T(\"aaaaaaaaaaaa\")",
7921 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007922 EXPECT_EQ("f(x,\n"
7923 " _T(\"aaaaaaaaaaaa\")\n"
7924 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007925 " z);",
7926 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7927
7928 // FIXME: Handle embedded spaces in one iteration.
7929 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7930 // "_T(\"aaaaaaaaaaaaa\")\n"
7931 // "_T(\"aaaaaaaaaaaaa\")\n"
7932 // "_T(\"a\")",
7933 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7934 // getLLVMStyleWithColumns(20)));
7935 EXPECT_EQ(
7936 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7937 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007938 EXPECT_EQ("f(\n"
7939 "#if !TEST\n"
7940 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7941 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007942 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007943 format("f(\n"
7944 "#if !TEST\n"
7945 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7946 "#endif\n"
7947 ");"));
7948 EXPECT_EQ("f(\n"
7949 "\n"
7950 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7951 format("f(\n"
7952 "\n"
7953 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007954}
7955
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007956TEST_F(FormatTest, BreaksStringLiteralOperands) {
7957 // In a function call with two operands, the second can be broken with no line
7958 // break before it.
7959 EXPECT_EQ("func(a, \"long long \"\n"
7960 " \"long long\");",
7961 format("func(a, \"long long long long\");",
7962 getLLVMStyleWithColumns(24)));
7963 // In a function call with three operands, the second must be broken with a
7964 // line break before it.
7965 EXPECT_EQ("func(a,\n"
7966 " \"long long long \"\n"
7967 " \"long\",\n"
7968 " c);",
7969 format("func(a, \"long long long long\", c);",
7970 getLLVMStyleWithColumns(24)));
7971 // In a function call with three operands, the third must be broken with a
7972 // line break before it.
7973 EXPECT_EQ("func(a, b,\n"
7974 " \"long long long \"\n"
7975 " \"long\");",
7976 format("func(a, b, \"long long long long\");",
7977 getLLVMStyleWithColumns(24)));
7978 // In a function call with three operands, both the second and the third must
7979 // be broken with a line break before them.
7980 EXPECT_EQ("func(a,\n"
7981 " \"long long long \"\n"
7982 " \"long\",\n"
7983 " \"long long long \"\n"
7984 " \"long\");",
7985 format("func(a, \"long long long long\", \"long long long long\");",
7986 getLLVMStyleWithColumns(24)));
7987 // In a chain of << with two operands, the second can be broken with no line
7988 // break before it.
7989 EXPECT_EQ("a << \"line line \"\n"
7990 " \"line\";",
7991 format("a << \"line line line\";",
7992 getLLVMStyleWithColumns(20)));
7993 // In a chain of << with three operands, the second can be broken with no line
7994 // break before it.
7995 EXPECT_EQ("abcde << \"line \"\n"
7996 " \"line line\"\n"
7997 " << c;",
7998 format("abcde << \"line line line\" << c;",
7999 getLLVMStyleWithColumns(20)));
8000 // In a chain of << with three operands, the third must be broken with a line
8001 // break before it.
8002 EXPECT_EQ("a << b\n"
8003 " << \"line line \"\n"
8004 " \"line\";",
8005 format("a << b << \"line line line\";",
8006 getLLVMStyleWithColumns(20)));
8007 // In a chain of << with three operands, the second can be broken with no line
8008 // break before it and the third must be broken with a line break before it.
8009 EXPECT_EQ("abcd << \"line line \"\n"
8010 " \"line\"\n"
8011 " << \"line line \"\n"
8012 " \"line\";",
8013 format("abcd << \"line line line\" << \"line line line\";",
8014 getLLVMStyleWithColumns(20)));
8015 // In a chain of binary operators with two operands, the second can be broken
8016 // with no line break before it.
8017 EXPECT_EQ("abcd + \"line line \"\n"
8018 " \"line line\";",
8019 format("abcd + \"line line line line\";",
8020 getLLVMStyleWithColumns(20)));
8021 // In a chain of binary operators with three operands, the second must be
8022 // broken with a line break before it.
8023 EXPECT_EQ("abcd +\n"
8024 " \"line line \"\n"
8025 " \"line line\" +\n"
8026 " e;",
8027 format("abcd + \"line line line line\" + e;",
8028 getLLVMStyleWithColumns(20)));
8029 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8030 // the first must be broken with a line break before it.
8031 FormatStyle Style = getLLVMStyleWithColumns(25);
8032 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8033 EXPECT_EQ("someFunction(\n"
8034 " \"long long long \"\n"
8035 " \"long\",\n"
8036 " a);",
8037 format("someFunction(\"long long long long\", a);", Style));
8038}
8039
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008040TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008041 EXPECT_EQ(
8042 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8045 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8046 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8048}
8049
8050TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8051 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008052 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008053 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8054 "multiline raw string literal xxxxxxxxxxxxxx\n"
8055 ")x\",\n"
8056 " a),\n"
8057 " b);",
8058 format("fffffffffff(g(R\"x(\n"
8059 "multiline raw string literal xxxxxxxxxxxxxx\n"
8060 ")x\", a), b);",
8061 getGoogleStyleWithColumns(20)));
8062 EXPECT_EQ("fffffffffff(\n"
8063 " g(R\"x(qqq\n"
8064 "multiline raw string literal xxxxxxxxxxxxxx\n"
8065 ")x\",\n"
8066 " a),\n"
8067 " b);",
8068 format("fffffffffff(g(R\"x(qqq\n"
8069 "multiline raw string literal xxxxxxxxxxxxxx\n"
8070 ")x\", a), b);",
8071 getGoogleStyleWithColumns(20)));
8072
8073 EXPECT_EQ("fffffffffff(R\"x(\n"
8074 "multiline raw string literal xxxxxxxxxxxxxx\n"
8075 ")x\");",
8076 format("fffffffffff(R\"x(\n"
8077 "multiline raw string literal xxxxxxxxxxxxxx\n"
8078 ")x\");",
8079 getGoogleStyleWithColumns(20)));
8080 EXPECT_EQ("fffffffffff(R\"x(\n"
8081 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008082 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008083 format("fffffffffff(R\"x(\n"
8084 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008085 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008086 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008087 EXPECT_EQ("fffffffffff(\n"
8088 " R\"x(\n"
8089 "multiline raw string literal xxxxxxxxxxxxxx\n"
8090 ")x\" +\n"
8091 " bbbbbb);",
8092 format("fffffffffff(\n"
8093 " R\"x(\n"
8094 "multiline raw string literal xxxxxxxxxxxxxx\n"
8095 ")x\" + bbbbbb);",
8096 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008097 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8098 format("fffffffffff(\n"
8099 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008100}
8101
Alexander Kornienkobe633902013-06-14 11:46:10 +00008102TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008103 verifyFormat("string a = \"unterminated;");
8104 EXPECT_EQ("function(\"unterminated,\n"
8105 " OtherParameter);",
8106 format("function( \"unterminated,\n"
8107 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008108}
8109
8110TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008111 FormatStyle Style = getLLVMStyle();
8112 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008113 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008114 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008115}
8116
Daniel Jaspera44991332015-04-29 13:06:49 +00008117TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008118
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008119TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8120 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8121 " \"ddeeefff\");",
8122 format("someFunction(\"aaabbbcccdddeeefff\");",
8123 getLLVMStyleWithColumns(25)));
8124 EXPECT_EQ("someFunction1234567890(\n"
8125 " \"aaabbbcccdddeeefff\");",
8126 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8127 getLLVMStyleWithColumns(26)));
8128 EXPECT_EQ("someFunction1234567890(\n"
8129 " \"aaabbbcccdddeeeff\"\n"
8130 " \"f\");",
8131 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8132 getLLVMStyleWithColumns(25)));
8133 EXPECT_EQ("someFunction1234567890(\n"
8134 " \"aaabbbcccdddeeeff\"\n"
8135 " \"f\");",
8136 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8137 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008138 EXPECT_EQ("someFunction(\n"
8139 " \"aaabbbcc ddde \"\n"
8140 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008141 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008142 getLLVMStyleWithColumns(25)));
8143 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8144 " \"ddeeefff\");",
8145 format("someFunction(\"aaabbbccc ddeeefff\");",
8146 getLLVMStyleWithColumns(25)));
8147 EXPECT_EQ("someFunction1234567890(\n"
8148 " \"aaabb \"\n"
8149 " \"cccdddeeefff\");",
8150 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8151 getLLVMStyleWithColumns(25)));
8152 EXPECT_EQ("#define A \\\n"
8153 " string s = \\\n"
8154 " \"123456789\" \\\n"
8155 " \"0\"; \\\n"
8156 " int i;",
8157 format("#define A string s = \"1234567890\"; int i;",
8158 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008159 EXPECT_EQ("someFunction(\n"
8160 " \"aaabbbcc \"\n"
8161 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008162 format("someFunction(\"aaabbbcc dddeeefff\");",
8163 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008164}
8165
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008166TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008167 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8168 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008169 EXPECT_EQ("\"test\"\n"
8170 "\"\\n\"",
8171 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8172 EXPECT_EQ("\"tes\\\\\"\n"
8173 "\"n\"",
8174 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8175 EXPECT_EQ("\"\\\\\\\\\"\n"
8176 "\"\\n\"",
8177 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008178 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008179 EXPECT_EQ("\"\\uff01\"\n"
8180 "\"test\"",
8181 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8182 EXPECT_EQ("\"\\Uff01ff02\"",
8183 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8184 EXPECT_EQ("\"\\x000000000001\"\n"
8185 "\"next\"",
8186 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8187 EXPECT_EQ("\"\\x000000000001next\"",
8188 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8189 EXPECT_EQ("\"\\x000000000001\"",
8190 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8191 EXPECT_EQ("\"test\"\n"
8192 "\"\\000000\"\n"
8193 "\"000001\"",
8194 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8195 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008196 "\"00000000\"\n"
8197 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008198 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008199}
8200
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008201TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8202 verifyFormat("void f() {\n"
8203 " return g() {}\n"
8204 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008205 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008206 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008207 "}");
8208}
8209
Manuel Klimek421147e2014-01-24 09:25:23 +00008210TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8211 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008212 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008213}
8214
Manuel Klimek13b97d82013-05-13 08:42:42 +00008215TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8216 verifyFormat("class X {\n"
8217 " void f() {\n"
8218 " }\n"
8219 "};",
8220 getLLVMStyleWithColumns(12));
8221}
8222
8223TEST_F(FormatTest, ConfigurableIndentWidth) {
8224 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8225 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008226 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008227 verifyFormat("void f() {\n"
8228 " someFunction();\n"
8229 " if (true) {\n"
8230 " f();\n"
8231 " }\n"
8232 "}",
8233 EightIndent);
8234 verifyFormat("class X {\n"
8235 " void f() {\n"
8236 " }\n"
8237 "};",
8238 EightIndent);
8239 verifyFormat("int x[] = {\n"
8240 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008241 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008242 EightIndent);
8243}
8244
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008245TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008246 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008247 "f();",
8248 getLLVMStyleWithColumns(8));
8249}
8250
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008251TEST_F(FormatTest, ConfigurableUseOfTab) {
8252 FormatStyle Tab = getLLVMStyleWithColumns(42);
8253 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008254 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008255 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008256
8257 EXPECT_EQ("if (aaaaaaaa && // q\n"
8258 " bb)\t\t// w\n"
8259 "\t;",
8260 format("if (aaaaaaaa &&// q\n"
8261 "bb)// w\n"
8262 ";",
8263 Tab));
8264 EXPECT_EQ("if (aaa && bbb) // w\n"
8265 "\t;",
8266 format("if(aaa&&bbb)// w\n"
8267 ";",
8268 Tab));
8269
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008270 verifyFormat("class X {\n"
8271 "\tvoid f() {\n"
8272 "\t\tsomeFunction(parameter1,\n"
8273 "\t\t\t parameter2);\n"
8274 "\t}\n"
8275 "};",
8276 Tab);
8277 verifyFormat("#define A \\\n"
8278 "\tvoid f() { \\\n"
8279 "\t\tsomeFunction( \\\n"
8280 "\t\t parameter1, \\\n"
8281 "\t\t parameter2); \\\n"
8282 "\t}",
8283 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008284
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008285 Tab.TabWidth = 4;
8286 Tab.IndentWidth = 8;
8287 verifyFormat("class TabWidth4Indent8 {\n"
8288 "\t\tvoid f() {\n"
8289 "\t\t\t\tsomeFunction(parameter1,\n"
8290 "\t\t\t\t\t\t\t parameter2);\n"
8291 "\t\t}\n"
8292 "};",
8293 Tab);
8294
8295 Tab.TabWidth = 4;
8296 Tab.IndentWidth = 4;
8297 verifyFormat("class TabWidth4Indent4 {\n"
8298 "\tvoid f() {\n"
8299 "\t\tsomeFunction(parameter1,\n"
8300 "\t\t\t\t\t parameter2);\n"
8301 "\t}\n"
8302 "};",
8303 Tab);
8304
8305 Tab.TabWidth = 8;
8306 Tab.IndentWidth = 4;
8307 verifyFormat("class TabWidth8Indent4 {\n"
8308 " void f() {\n"
8309 "\tsomeFunction(parameter1,\n"
8310 "\t\t parameter2);\n"
8311 " }\n"
8312 "};",
8313 Tab);
8314
Alexander Kornienko39856b72013-09-10 09:38:25 +00008315 Tab.TabWidth = 8;
8316 Tab.IndentWidth = 8;
8317 EXPECT_EQ("/*\n"
8318 "\t a\t\tcomment\n"
8319 "\t in multiple lines\n"
8320 " */",
8321 format(" /*\t \t \n"
8322 " \t \t a\t\tcomment\t \t\n"
8323 " \t \t in multiple lines\t\n"
8324 " \t */",
8325 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008326
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008327 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008328 verifyFormat("{\n"
8329 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8330 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8331 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8332 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8333 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8334 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008335 "};",
8336 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008337 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008338 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008339 "\ta2,\n"
8340 "\ta3\n"
8341 "};",
8342 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008343 EXPECT_EQ("if (aaaaaaaa && // q\n"
8344 " bb) // w\n"
8345 "\t;",
8346 format("if (aaaaaaaa &&// q\n"
8347 "bb)// w\n"
8348 ";",
8349 Tab));
8350 verifyFormat("class X {\n"
8351 "\tvoid f() {\n"
8352 "\t\tsomeFunction(parameter1,\n"
8353 "\t\t parameter2);\n"
8354 "\t}\n"
8355 "};",
8356 Tab);
8357 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008358 "\tQ(\n"
8359 "\t {\n"
8360 "\t\t int a;\n"
8361 "\t\t someFunction(aaaaaaaa,\n"
8362 "\t\t bbbbbbb);\n"
8363 "\t },\n"
8364 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008365 "}",
8366 Tab);
8367 EXPECT_EQ("{\n"
8368 "\t/* aaaa\n"
8369 "\t bbbb */\n"
8370 "}",
8371 format("{\n"
8372 "/* aaaa\n"
8373 " bbbb */\n"
8374 "}",
8375 Tab));
8376 EXPECT_EQ("{\n"
8377 "\t/*\n"
8378 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8379 "\t bbbbbbbbbbbbb\n"
8380 "\t*/\n"
8381 "}",
8382 format("{\n"
8383 "/*\n"
8384 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8385 "*/\n"
8386 "}",
8387 Tab));
8388 EXPECT_EQ("{\n"
8389 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8390 "\t// bbbbbbbbbbbbb\n"
8391 "}",
8392 format("{\n"
8393 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8394 "}",
8395 Tab));
8396 EXPECT_EQ("{\n"
8397 "\t/*\n"
8398 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8399 "\t bbbbbbbbbbbbb\n"
8400 "\t*/\n"
8401 "}",
8402 format("{\n"
8403 "\t/*\n"
8404 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8405 "\t*/\n"
8406 "}",
8407 Tab));
8408 EXPECT_EQ("{\n"
8409 "\t/*\n"
8410 "\n"
8411 "\t*/\n"
8412 "}",
8413 format("{\n"
8414 "\t/*\n"
8415 "\n"
8416 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008417 "}",
8418 Tab));
8419 EXPECT_EQ("{\n"
8420 "\t/*\n"
8421 " asdf\n"
8422 "\t*/\n"
8423 "}",
8424 format("{\n"
8425 "\t/*\n"
8426 " asdf\n"
8427 "\t*/\n"
8428 "}",
8429 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008430
8431 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008432 EXPECT_EQ("/*\n"
8433 " a\t\tcomment\n"
8434 " in multiple lines\n"
8435 " */",
8436 format(" /*\t \t \n"
8437 " \t \t a\t\tcomment\t \t\n"
8438 " \t \t in multiple lines\t\n"
8439 " \t */",
8440 Tab));
8441 EXPECT_EQ("/* some\n"
8442 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008443 format(" \t \t /* some\n"
8444 " \t \t comment */",
8445 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008446 EXPECT_EQ("int a; /* some\n"
8447 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008448 format(" \t \t int a; /* some\n"
8449 " \t \t comment */",
8450 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008451
Alexander Kornienko39856b72013-09-10 09:38:25 +00008452 EXPECT_EQ("int a; /* some\n"
8453 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008454 format(" \t \t int\ta; /* some\n"
8455 " \t \t comment */",
8456 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008457 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8458 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008459 format(" \t \t f(\"\t\t\"); /* some\n"
8460 " \t \t comment */",
8461 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008462 EXPECT_EQ("{\n"
8463 " /*\n"
8464 " * Comment\n"
8465 " */\n"
8466 " int i;\n"
8467 "}",
8468 format("{\n"
8469 "\t/*\n"
8470 "\t * Comment\n"
8471 "\t */\n"
8472 "\t int i;\n"
8473 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008474
8475 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8476 Tab.TabWidth = 8;
8477 Tab.IndentWidth = 8;
8478 EXPECT_EQ("if (aaaaaaaa && // q\n"
8479 " bb) // w\n"
8480 "\t;",
8481 format("if (aaaaaaaa &&// q\n"
8482 "bb)// w\n"
8483 ";",
8484 Tab));
8485 EXPECT_EQ("if (aaa && bbb) // w\n"
8486 "\t;",
8487 format("if(aaa&&bbb)// w\n"
8488 ";",
8489 Tab));
8490 verifyFormat("class X {\n"
8491 "\tvoid f() {\n"
8492 "\t\tsomeFunction(parameter1,\n"
8493 "\t\t\t parameter2);\n"
8494 "\t}\n"
8495 "};",
8496 Tab);
8497 verifyFormat("#define A \\\n"
8498 "\tvoid f() { \\\n"
8499 "\t\tsomeFunction( \\\n"
8500 "\t\t parameter1, \\\n"
8501 "\t\t parameter2); \\\n"
8502 "\t}",
8503 Tab);
8504 Tab.TabWidth = 4;
8505 Tab.IndentWidth = 8;
8506 verifyFormat("class TabWidth4Indent8 {\n"
8507 "\t\tvoid f() {\n"
8508 "\t\t\t\tsomeFunction(parameter1,\n"
8509 "\t\t\t\t\t\t\t parameter2);\n"
8510 "\t\t}\n"
8511 "};",
8512 Tab);
8513 Tab.TabWidth = 4;
8514 Tab.IndentWidth = 4;
8515 verifyFormat("class TabWidth4Indent4 {\n"
8516 "\tvoid f() {\n"
8517 "\t\tsomeFunction(parameter1,\n"
8518 "\t\t\t\t\t parameter2);\n"
8519 "\t}\n"
8520 "};",
8521 Tab);
8522 Tab.TabWidth = 8;
8523 Tab.IndentWidth = 4;
8524 verifyFormat("class TabWidth8Indent4 {\n"
8525 " void f() {\n"
8526 "\tsomeFunction(parameter1,\n"
8527 "\t\t parameter2);\n"
8528 " }\n"
8529 "};",
8530 Tab);
8531 Tab.TabWidth = 8;
8532 Tab.IndentWidth = 8;
8533 EXPECT_EQ("/*\n"
8534 "\t a\t\tcomment\n"
8535 "\t in multiple lines\n"
8536 " */",
8537 format(" /*\t \t \n"
8538 " \t \t a\t\tcomment\t \t\n"
8539 " \t \t in multiple lines\t\n"
8540 " \t */",
8541 Tab));
8542 verifyFormat("{\n"
8543 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8544 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8545 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8546 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8547 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8548 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8549 "};",
8550 Tab);
8551 verifyFormat("enum AA {\n"
8552 "\ta1, // Force multiple lines\n"
8553 "\ta2,\n"
8554 "\ta3\n"
8555 "};",
8556 Tab);
8557 EXPECT_EQ("if (aaaaaaaa && // q\n"
8558 " bb) // w\n"
8559 "\t;",
8560 format("if (aaaaaaaa &&// q\n"
8561 "bb)// w\n"
8562 ";",
8563 Tab));
8564 verifyFormat("class X {\n"
8565 "\tvoid f() {\n"
8566 "\t\tsomeFunction(parameter1,\n"
8567 "\t\t\t parameter2);\n"
8568 "\t}\n"
8569 "};",
8570 Tab);
8571 verifyFormat("{\n"
8572 "\tQ(\n"
8573 "\t {\n"
8574 "\t\t int a;\n"
8575 "\t\t someFunction(aaaaaaaa,\n"
8576 "\t\t\t\t bbbbbbb);\n"
8577 "\t },\n"
8578 "\t p);\n"
8579 "}",
8580 Tab);
8581 EXPECT_EQ("{\n"
8582 "\t/* aaaa\n"
8583 "\t bbbb */\n"
8584 "}",
8585 format("{\n"
8586 "/* aaaa\n"
8587 " bbbb */\n"
8588 "}",
8589 Tab));
8590 EXPECT_EQ("{\n"
8591 "\t/*\n"
8592 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8593 "\t bbbbbbbbbbbbb\n"
8594 "\t*/\n"
8595 "}",
8596 format("{\n"
8597 "/*\n"
8598 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8599 "*/\n"
8600 "}",
8601 Tab));
8602 EXPECT_EQ("{\n"
8603 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8604 "\t// bbbbbbbbbbbbb\n"
8605 "}",
8606 format("{\n"
8607 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8608 "}",
8609 Tab));
8610 EXPECT_EQ("{\n"
8611 "\t/*\n"
8612 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8613 "\t bbbbbbbbbbbbb\n"
8614 "\t*/\n"
8615 "}",
8616 format("{\n"
8617 "\t/*\n"
8618 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8619 "\t*/\n"
8620 "}",
8621 Tab));
8622 EXPECT_EQ("{\n"
8623 "\t/*\n"
8624 "\n"
8625 "\t*/\n"
8626 "}",
8627 format("{\n"
8628 "\t/*\n"
8629 "\n"
8630 "\t*/\n"
8631 "}",
8632 Tab));
8633 EXPECT_EQ("{\n"
8634 "\t/*\n"
8635 " asdf\n"
8636 "\t*/\n"
8637 "}",
8638 format("{\n"
8639 "\t/*\n"
8640 " asdf\n"
8641 "\t*/\n"
8642 "}",
8643 Tab));
8644 EXPECT_EQ("/*\n"
8645 "\t a\t\tcomment\n"
8646 "\t in multiple lines\n"
8647 " */",
8648 format(" /*\t \t \n"
8649 " \t \t a\t\tcomment\t \t\n"
8650 " \t \t in multiple lines\t\n"
8651 " \t */",
8652 Tab));
8653 EXPECT_EQ("/* some\n"
8654 " comment */",
8655 format(" \t \t /* some\n"
8656 " \t \t comment */",
8657 Tab));
8658 EXPECT_EQ("int a; /* some\n"
8659 " comment */",
8660 format(" \t \t int a; /* some\n"
8661 " \t \t comment */",
8662 Tab));
8663 EXPECT_EQ("int a; /* some\n"
8664 "comment */",
8665 format(" \t \t int\ta; /* some\n"
8666 " \t \t comment */",
8667 Tab));
8668 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8669 " comment */",
8670 format(" \t \t f(\"\t\t\"); /* some\n"
8671 " \t \t comment */",
8672 Tab));
8673 EXPECT_EQ("{\n"
8674 " /*\n"
8675 " * Comment\n"
8676 " */\n"
8677 " int i;\n"
8678 "}",
8679 format("{\n"
8680 "\t/*\n"
8681 "\t * Comment\n"
8682 "\t */\n"
8683 "\t int i;\n"
8684 "}"));
8685 Tab.AlignConsecutiveAssignments = true;
8686 Tab.AlignConsecutiveDeclarations = true;
8687 Tab.TabWidth = 4;
8688 Tab.IndentWidth = 4;
8689 verifyFormat("class Assign {\n"
8690 "\tvoid f() {\n"
8691 "\t\tint x = 123;\n"
8692 "\t\tint random = 4;\n"
8693 "\t\tstd::string alphabet =\n"
8694 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8695 "\t}\n"
8696 "};",
8697 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008698}
8699
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008700TEST_F(FormatTest, CalculatesOriginalColumn) {
8701 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8702 "q\"; /* some\n"
8703 " comment */",
8704 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8705 "q\"; /* some\n"
8706 " comment */",
8707 getLLVMStyle()));
8708 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8709 "/* some\n"
8710 " comment */",
8711 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8712 " /* some\n"
8713 " comment */",
8714 getLLVMStyle()));
8715 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8716 "qqq\n"
8717 "/* some\n"
8718 " comment */",
8719 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8720 "qqq\n"
8721 " /* some\n"
8722 " comment */",
8723 getLLVMStyle()));
8724 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8725 "wwww; /* some\n"
8726 " comment */",
8727 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8728 "wwww; /* some\n"
8729 " comment */",
8730 getLLVMStyle()));
8731}
8732
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008733TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008734 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008735 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008736
8737 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008738 " continue;",
8739 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008740 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008741 " continue;",
8742 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008743 verifyFormat("if(true)\n"
8744 " f();\n"
8745 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008746 " f();",
8747 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008748 verifyFormat("do {\n"
8749 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008750 "} while(something());",
8751 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008752 verifyFormat("switch(x) {\n"
8753 "default:\n"
8754 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008755 "}",
8756 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008757 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008758 verifyFormat("size_t x = sizeof(x);", NoSpace);
8759 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8760 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8761 verifyFormat("alignas(128) char a[128];", NoSpace);
8762 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8763 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8764 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008765 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008766 verifyFormat("T A::operator()();", NoSpace);
8767 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008768
8769 FormatStyle Space = getLLVMStyle();
8770 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8771
8772 verifyFormat("int f ();", Space);
8773 verifyFormat("void f (int a, T b) {\n"
8774 " while (true)\n"
8775 " continue;\n"
8776 "}",
8777 Space);
8778 verifyFormat("if (true)\n"
8779 " f ();\n"
8780 "else if (true)\n"
8781 " f ();",
8782 Space);
8783 verifyFormat("do {\n"
8784 " do_something ();\n"
8785 "} while (something ());",
8786 Space);
8787 verifyFormat("switch (x) {\n"
8788 "default:\n"
8789 " break;\n"
8790 "}",
8791 Space);
8792 verifyFormat("A::A () : a (1) {}", Space);
8793 verifyFormat("void f () __attribute__ ((asdf));", Space);
8794 verifyFormat("*(&a + 1);\n"
8795 "&((&a)[1]);\n"
8796 "a[(b + c) * d];\n"
8797 "(((a + 1) * 2) + 3) * 4;",
8798 Space);
8799 verifyFormat("#define A(x) x", Space);
8800 verifyFormat("#define A (x) x", Space);
8801 verifyFormat("#if defined(x)\n"
8802 "#endif",
8803 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008804 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008805 verifyFormat("size_t x = sizeof (x);", Space);
8806 verifyFormat("auto f (int x) -> decltype (x);", Space);
8807 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8808 verifyFormat("alignas (128) char a[128];", Space);
8809 verifyFormat("size_t x = alignof (MyType);", Space);
8810 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8811 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008812 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008813 verifyFormat("T A::operator() ();", Space);
8814 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008815}
8816
8817TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8818 FormatStyle Spaces = getLLVMStyle();
8819
8820 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00008821 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008822 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008823 verifyFormat("call();", Spaces);
8824 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008825 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8826 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008827 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008828 " continue;",
8829 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008830 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008831 " continue;",
8832 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008833 verifyFormat("if ( true )\n"
8834 " f();\n"
8835 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008836 " f();",
8837 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008838 verifyFormat("do {\n"
8839 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008840 "} while ( something() );",
8841 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008842 verifyFormat("switch ( x ) {\n"
8843 "default:\n"
8844 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008845 "}",
8846 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008847
8848 Spaces.SpacesInParentheses = false;
8849 Spaces.SpacesInCStyleCastParentheses = true;
8850 verifyFormat("Type *A = ( Type * )P;", Spaces);
8851 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8852 verifyFormat("x = ( int32 )y;", Spaces);
8853 verifyFormat("int a = ( int )(2.0f);", Spaces);
8854 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8855 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8856 verifyFormat("#define x (( int )-1)", Spaces);
8857
Daniel Jasper92e09822015-03-18 12:59:19 +00008858 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008859 Spaces.SpacesInParentheses = false;
8860 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008861 Spaces.SpacesInCStyleCastParentheses = true;
8862 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008863 verifyFormat("call( );", Spaces);
8864 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008865 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008866 " continue;",
8867 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008868 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008869 " continue;",
8870 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008871 verifyFormat("if (true)\n"
8872 " f( );\n"
8873 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008874 " f( );",
8875 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008876 verifyFormat("do {\n"
8877 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008878 "} while (something( ));",
8879 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008880 verifyFormat("switch (x) {\n"
8881 "default:\n"
8882 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008883 "}",
8884 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008885
Daniel Jasper92e09822015-03-18 12:59:19 +00008886 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008887 Spaces.SpaceAfterCStyleCast = true;
8888 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008889 verifyFormat("call( );", Spaces);
8890 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008891 verifyFormat("while (( bool ) 1)\n"
8892 " continue;",
8893 Spaces);
8894 verifyFormat("for (;;)\n"
8895 " continue;",
8896 Spaces);
8897 verifyFormat("if (true)\n"
8898 " f( );\n"
8899 "else if (true)\n"
8900 " f( );",
8901 Spaces);
8902 verifyFormat("do {\n"
8903 " do_something(( int ) i);\n"
8904 "} while (something( ));",
8905 Spaces);
8906 verifyFormat("switch (x) {\n"
8907 "default:\n"
8908 " break;\n"
8909 "}",
8910 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008911
8912 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008913 Spaces.SpacesInCStyleCastParentheses = false;
8914 Spaces.SpaceAfterCStyleCast = true;
8915 verifyFormat("while ((bool) 1)\n"
8916 " continue;",
8917 Spaces);
8918 verifyFormat("do {\n"
8919 " do_something((int) i);\n"
8920 "} while (something( ));",
8921 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008922}
8923
Daniel Jasperad981f82014-08-26 11:41:14 +00008924TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8925 verifyFormat("int a[5];");
8926 verifyFormat("a[3] += 42;");
8927
8928 FormatStyle Spaces = getLLVMStyle();
8929 Spaces.SpacesInSquareBrackets = true;
8930 // Lambdas unchanged.
8931 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8932 verifyFormat("return [i, args...] {};", Spaces);
8933
8934 // Not lambdas.
8935 verifyFormat("int a[ 5 ];", Spaces);
8936 verifyFormat("a[ 3 ] += 42;", Spaces);
8937 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8938 verifyFormat("double &operator[](int i) { return 0; }\n"
8939 "int i;",
8940 Spaces);
8941 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8942 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8943 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8944}
8945
Daniel Jasperd94bff32013-09-25 15:15:02 +00008946TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8947 verifyFormat("int a = 5;");
8948 verifyFormat("a += 42;");
8949 verifyFormat("a or_eq 8;");
8950
8951 FormatStyle Spaces = getLLVMStyle();
8952 Spaces.SpaceBeforeAssignmentOperators = false;
8953 verifyFormat("int a= 5;", Spaces);
8954 verifyFormat("a+= 42;", Spaces);
8955 verifyFormat("a or_eq 8;", Spaces);
8956}
8957
Francois Ferrand2a9ea782018-03-01 10:09:13 +00008958TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
8959 verifyFormat("class Foo : public Bar {};");
8960 verifyFormat("Foo::Foo() : foo(1) {}");
8961 verifyFormat("for (auto a : b) {\n}");
8962 verifyFormat("int x = a ? b : c;");
8963 verifyFormat("{\n"
8964 "label0:\n"
8965 " int x = 0;\n"
8966 "}");
8967 verifyFormat("switch (x) {\n"
8968 "case 1:\n"
8969 "default:\n"
8970 "}");
8971
8972 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
8973 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
8974 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
8975 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
8976 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
8977 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
8978 verifyFormat("{\n"
8979 "label1:\n"
8980 " int x = 0;\n"
8981 "}",
8982 CtorInitializerStyle);
8983 verifyFormat("switch (x) {\n"
8984 "case 1:\n"
8985 "default:\n"
8986 "}",
8987 CtorInitializerStyle);
8988 CtorInitializerStyle.BreakConstructorInitializers =
8989 FormatStyle::BCIS_AfterColon;
8990 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
8991 " aaaaaaaaaaaaaaaa(1),\n"
8992 " bbbbbbbbbbbbbbbb(2) {}",
8993 CtorInitializerStyle);
8994 CtorInitializerStyle.BreakConstructorInitializers =
8995 FormatStyle::BCIS_BeforeComma;
8996 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
8997 " : aaaaaaaaaaaaaaaa(1)\n"
8998 " , bbbbbbbbbbbbbbbb(2) {}",
8999 CtorInitializerStyle);
9000 CtorInitializerStyle.BreakConstructorInitializers =
9001 FormatStyle::BCIS_BeforeColon;
9002 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9003 " : aaaaaaaaaaaaaaaa(1),\n"
9004 " bbbbbbbbbbbbbbbb(2) {}",
9005 CtorInitializerStyle);
9006 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9007 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9008 ": aaaaaaaaaaaaaaaa(1),\n"
9009 " bbbbbbbbbbbbbbbb(2) {}",
9010 CtorInitializerStyle);
9011
9012 FormatStyle InheritanceStyle = getLLVMStyle();
9013 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9014 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9015 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9016 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9017 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9018 verifyFormat("{\n"
9019 "label2:\n"
9020 " int x = 0;\n"
9021 "}",
9022 InheritanceStyle);
9023 verifyFormat("switch (x) {\n"
9024 "case 1:\n"
9025 "default:\n"
9026 "}",
9027 InheritanceStyle);
9028
9029 FormatStyle ForLoopStyle = getLLVMStyle();
9030 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9031 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9032 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9033 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9034 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9035 verifyFormat("{\n"
9036 "label2:\n"
9037 " int x = 0;\n"
9038 "}",
9039 ForLoopStyle);
9040 verifyFormat("switch (x) {\n"
9041 "case 1:\n"
9042 "default:\n"
9043 "}",
9044 ForLoopStyle);
9045
9046 FormatStyle NoSpaceStyle = getLLVMStyle();
9047 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9048 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9049 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9050 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9051 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9052 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9053 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9054 verifyFormat("{\n"
9055 "label3:\n"
9056 " int x = 0;\n"
9057 "}",
9058 NoSpaceStyle);
9059 verifyFormat("switch (x) {\n"
9060 "case 1:\n"
9061 "default:\n"
9062 "}",
9063 NoSpaceStyle);
9064}
9065
Daniel Jaspera44991332015-04-29 13:06:49 +00009066TEST_F(FormatTest, AlignConsecutiveAssignments) {
9067 FormatStyle Alignment = getLLVMStyle();
9068 Alignment.AlignConsecutiveAssignments = false;
9069 verifyFormat("int a = 5;\n"
9070 "int oneTwoThree = 123;",
9071 Alignment);
9072 verifyFormat("int a = 5;\n"
9073 "int oneTwoThree = 123;",
9074 Alignment);
9075
9076 Alignment.AlignConsecutiveAssignments = true;
9077 verifyFormat("int a = 5;\n"
9078 "int oneTwoThree = 123;",
9079 Alignment);
9080 verifyFormat("int a = method();\n"
9081 "int oneTwoThree = 133;",
9082 Alignment);
9083 verifyFormat("a &= 5;\n"
9084 "bcd *= 5;\n"
9085 "ghtyf += 5;\n"
9086 "dvfvdb -= 5;\n"
9087 "a /= 5;\n"
9088 "vdsvsv %= 5;\n"
9089 "sfdbddfbdfbb ^= 5;\n"
9090 "dvsdsv |= 5;\n"
9091 "int dsvvdvsdvvv = 123;",
9092 Alignment);
9093 verifyFormat("int i = 1, j = 10;\n"
9094 "something = 2000;",
9095 Alignment);
9096 verifyFormat("something = 2000;\n"
9097 "int i = 1, j = 10;\n",
9098 Alignment);
9099 verifyFormat("something = 2000;\n"
9100 "another = 911;\n"
9101 "int i = 1, j = 10;\n"
9102 "oneMore = 1;\n"
9103 "i = 2;",
9104 Alignment);
9105 verifyFormat("int a = 5;\n"
9106 "int one = 1;\n"
9107 "method();\n"
9108 "int oneTwoThree = 123;\n"
9109 "int oneTwo = 12;",
9110 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009111 verifyFormat("int oneTwoThree = 123;\n"
9112 "int oneTwo = 12;\n"
9113 "method();\n",
9114 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009115 verifyFormat("int oneTwoThree = 123; // comment\n"
9116 "int oneTwo = 12; // comment",
9117 Alignment);
9118 EXPECT_EQ("int a = 5;\n"
9119 "\n"
9120 "int oneTwoThree = 123;",
9121 format("int a = 5;\n"
9122 "\n"
9123 "int oneTwoThree= 123;",
9124 Alignment));
9125 EXPECT_EQ("int a = 5;\n"
9126 "int one = 1;\n"
9127 "\n"
9128 "int oneTwoThree = 123;",
9129 format("int a = 5;\n"
9130 "int one = 1;\n"
9131 "\n"
9132 "int oneTwoThree = 123;",
9133 Alignment));
9134 EXPECT_EQ("int a = 5;\n"
9135 "int one = 1;\n"
9136 "\n"
9137 "int oneTwoThree = 123;\n"
9138 "int oneTwo = 12;",
9139 format("int a = 5;\n"
9140 "int one = 1;\n"
9141 "\n"
9142 "int oneTwoThree = 123;\n"
9143 "int oneTwo = 12;",
9144 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009145 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9146 verifyFormat("#define A \\\n"
9147 " int aaaa = 12; \\\n"
9148 " int b = 23; \\\n"
9149 " int ccc = 234; \\\n"
9150 " int dddddddddd = 2345;",
9151 Alignment);
9152 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009153 verifyFormat("#define A \\\n"
9154 " int aaaa = 12; \\\n"
9155 " int b = 23; \\\n"
9156 " int ccc = 234; \\\n"
9157 " int dddddddddd = 2345;",
9158 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009159 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009160 verifyFormat("#define A "
9161 " \\\n"
9162 " int aaaa = 12; "
9163 " \\\n"
9164 " int b = 23; "
9165 " \\\n"
9166 " int ccc = 234; "
9167 " \\\n"
9168 " int dddddddddd = 2345;",
9169 Alignment);
9170 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9171 "k = 4, int l = 5,\n"
9172 " int m = 6) {\n"
9173 " int j = 10;\n"
9174 " otherThing = 1;\n"
9175 "}",
9176 Alignment);
9177 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9178 " int i = 1;\n"
9179 " int j = 2;\n"
9180 " int big = 10000;\n"
9181 "}",
9182 Alignment);
9183 verifyFormat("class C {\n"
9184 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009185 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009186 " virtual void f() = 0;\n"
9187 "};",
9188 Alignment);
9189 verifyFormat("int i = 1;\n"
9190 "if (SomeType t = getSomething()) {\n"
9191 "}\n"
9192 "int j = 2;\n"
9193 "int big = 10000;",
9194 Alignment);
9195 verifyFormat("int j = 7;\n"
9196 "for (int k = 0; k < N; ++k) {\n"
9197 "}\n"
9198 "int j = 2;\n"
9199 "int big = 10000;\n"
9200 "}",
9201 Alignment);
9202 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9203 verifyFormat("int i = 1;\n"
9204 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9205 " = someLooooooooooooooooongFunction();\n"
9206 "int j = 2;",
9207 Alignment);
9208 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9209 verifyFormat("int i = 1;\n"
9210 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9211 " someLooooooooooooooooongFunction();\n"
9212 "int j = 2;",
9213 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009214
9215 verifyFormat("auto lambda = []() {\n"
9216 " auto i = 0;\n"
9217 " return 0;\n"
9218 "};\n"
9219 "int i = 0;\n"
9220 "auto v = type{\n"
9221 " i = 1, //\n"
9222 " (i = 2), //\n"
9223 " i = 3 //\n"
9224 "};",
9225 Alignment);
9226
Daniel Jaspera44991332015-04-29 13:06:49 +00009227 verifyFormat(
9228 "int i = 1;\n"
9229 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9230 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009231 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009232 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009233
9234 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9235 " typename B = very_long_type_name_1,\n"
9236 " typename T_2 = very_long_type_name_2>\n"
9237 "auto foo() {}\n",
9238 Alignment);
9239 verifyFormat("int a, b = 1;\n"
9240 "int c = 2;\n"
9241 "int dd = 3;\n",
9242 Alignment);
9243 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9244 "float b[1][] = {{3.f}};\n",
9245 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009246 verifyFormat("for (int i = 0; i < 1; i++)\n"
9247 " int x = 1;\n",
9248 Alignment);
9249 verifyFormat("for (i = 0; i < 1; i++)\n"
9250 " x = 1;\n"
9251 "y = 1;\n",
9252 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009253}
9254
Daniel Jaspere12597c2015-10-01 10:06:54 +00009255TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9256 FormatStyle Alignment = getLLVMStyle();
9257 Alignment.AlignConsecutiveDeclarations = false;
9258 verifyFormat("float const a = 5;\n"
9259 "int oneTwoThree = 123;",
9260 Alignment);
9261 verifyFormat("int a = 5;\n"
9262 "float const oneTwoThree = 123;",
9263 Alignment);
9264
9265 Alignment.AlignConsecutiveDeclarations = true;
9266 verifyFormat("float const a = 5;\n"
9267 "int oneTwoThree = 123;",
9268 Alignment);
9269 verifyFormat("int a = method();\n"
9270 "float const oneTwoThree = 133;",
9271 Alignment);
9272 verifyFormat("int i = 1, j = 10;\n"
9273 "something = 2000;",
9274 Alignment);
9275 verifyFormat("something = 2000;\n"
9276 "int i = 1, j = 10;\n",
9277 Alignment);
9278 verifyFormat("float something = 2000;\n"
9279 "double another = 911;\n"
9280 "int i = 1, j = 10;\n"
9281 "const int *oneMore = 1;\n"
9282 "unsigned i = 2;",
9283 Alignment);
9284 verifyFormat("float a = 5;\n"
9285 "int one = 1;\n"
9286 "method();\n"
9287 "const double oneTwoThree = 123;\n"
9288 "const unsigned int oneTwo = 12;",
9289 Alignment);
9290 verifyFormat("int oneTwoThree{0}; // comment\n"
9291 "unsigned oneTwo; // comment",
9292 Alignment);
9293 EXPECT_EQ("float const a = 5;\n"
9294 "\n"
9295 "int oneTwoThree = 123;",
9296 format("float const a = 5;\n"
9297 "\n"
9298 "int oneTwoThree= 123;",
9299 Alignment));
9300 EXPECT_EQ("float a = 5;\n"
9301 "int one = 1;\n"
9302 "\n"
9303 "unsigned oneTwoThree = 123;",
9304 format("float a = 5;\n"
9305 "int one = 1;\n"
9306 "\n"
9307 "unsigned oneTwoThree = 123;",
9308 Alignment));
9309 EXPECT_EQ("float a = 5;\n"
9310 "int one = 1;\n"
9311 "\n"
9312 "unsigned oneTwoThree = 123;\n"
9313 "int oneTwo = 12;",
9314 format("float a = 5;\n"
9315 "int one = 1;\n"
9316 "\n"
9317 "unsigned oneTwoThree = 123;\n"
9318 "int oneTwo = 12;",
9319 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009320 // Function prototype alignment
9321 verifyFormat("int a();\n"
9322 "double b();",
9323 Alignment);
9324 verifyFormat("int a(int x);\n"
9325 "double b();",
9326 Alignment);
9327 unsigned OldColumnLimit = Alignment.ColumnLimit;
9328 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9329 // otherwise the function parameters will be re-flowed onto a single line.
9330 Alignment.ColumnLimit = 0;
9331 EXPECT_EQ("int a(int x,\n"
9332 " float y);\n"
9333 "double b(int x,\n"
9334 " double y);",
9335 format("int a(int x,\n"
9336 " float y);\n"
9337 "double b(int x,\n"
9338 " double y);",
9339 Alignment));
9340 // This ensures that function parameters of function declarations are
9341 // correctly indented when their owning functions are indented.
9342 // The failure case here is for 'double y' to not be indented enough.
9343 EXPECT_EQ("double a(int x);\n"
9344 "int b(int y,\n"
9345 " double z);",
9346 format("double a(int x);\n"
9347 "int b(int y,\n"
9348 " double z);",
9349 Alignment));
9350 // Set ColumnLimit low so that we induce wrapping immediately after
9351 // the function name and opening paren.
9352 Alignment.ColumnLimit = 13;
9353 verifyFormat("int function(\n"
9354 " int x,\n"
9355 " bool y);",
9356 Alignment);
9357 Alignment.ColumnLimit = OldColumnLimit;
9358 // Ensure function pointers don't screw up recursive alignment
9359 verifyFormat("int a(int x, void (*fp)(int y));\n"
9360 "double b();",
9361 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009362 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009363 // Ensure recursive alignment is broken by function braces, so that the
9364 // "a = 1" does not align with subsequent assignments inside the function
9365 // body.
9366 verifyFormat("int func(int a = 1) {\n"
9367 " int b = 2;\n"
9368 " int cc = 3;\n"
9369 "}",
9370 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009371 verifyFormat("float something = 2000;\n"
9372 "double another = 911;\n"
9373 "int i = 1, j = 10;\n"
9374 "const int *oneMore = 1;\n"
9375 "unsigned i = 2;",
9376 Alignment);
9377 verifyFormat("int oneTwoThree = {0}; // comment\n"
9378 "unsigned oneTwo = 0; // comment",
9379 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009380 // Make sure that scope is correctly tracked, in the absence of braces
9381 verifyFormat("for (int i = 0; i < n; i++)\n"
9382 " j = i;\n"
9383 "double x = 1;\n",
9384 Alignment);
9385 verifyFormat("if (int i = 0)\n"
9386 " j = i;\n"
9387 "double x = 1;\n",
9388 Alignment);
9389 // Ensure operator[] and operator() are comprehended
9390 verifyFormat("struct test {\n"
9391 " long long int foo();\n"
9392 " int operator[](int a);\n"
9393 " double bar();\n"
9394 "};\n",
9395 Alignment);
9396 verifyFormat("struct test {\n"
9397 " long long int foo();\n"
9398 " int operator()(int a);\n"
9399 " double bar();\n"
9400 "};\n",
9401 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009402 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9403 " int const i = 1;\n"
9404 " int * j = 2;\n"
9405 " int big = 10000;\n"
9406 "\n"
9407 " unsigned oneTwoThree = 123;\n"
9408 " int oneTwo = 12;\n"
9409 " method();\n"
9410 " float k = 2;\n"
9411 " int ll = 10000;\n"
9412 "}",
9413 format("void SomeFunction(int parameter= 0) {\n"
9414 " int const i= 1;\n"
9415 " int *j=2;\n"
9416 " int big = 10000;\n"
9417 "\n"
9418 "unsigned oneTwoThree =123;\n"
9419 "int oneTwo = 12;\n"
9420 " method();\n"
9421 "float k= 2;\n"
9422 "int ll=10000;\n"
9423 "}",
9424 Alignment));
9425 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009426 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9427 verifyFormat("#define A \\\n"
9428 " int aaaa = 12; \\\n"
9429 " float b = 23; \\\n"
9430 " const int ccc = 234; \\\n"
9431 " unsigned dddddddddd = 2345;",
9432 Alignment);
9433 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009434 verifyFormat("#define A \\\n"
9435 " int aaaa = 12; \\\n"
9436 " float b = 23; \\\n"
9437 " const int ccc = 234; \\\n"
9438 " unsigned dddddddddd = 2345;",
9439 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009440 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009441 Alignment.ColumnLimit = 30;
9442 verifyFormat("#define A \\\n"
9443 " int aaaa = 12; \\\n"
9444 " float b = 23; \\\n"
9445 " const int ccc = 234; \\\n"
9446 " int dddddddddd = 2345;",
9447 Alignment);
9448 Alignment.ColumnLimit = 80;
9449 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9450 "k = 4, int l = 5,\n"
9451 " int m = 6) {\n"
9452 " const int j = 10;\n"
9453 " otherThing = 1;\n"
9454 "}",
9455 Alignment);
9456 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9457 " int const i = 1;\n"
9458 " int * j = 2;\n"
9459 " int big = 10000;\n"
9460 "}",
9461 Alignment);
9462 verifyFormat("class C {\n"
9463 "public:\n"
9464 " int i = 1;\n"
9465 " virtual void f() = 0;\n"
9466 "};",
9467 Alignment);
9468 verifyFormat("float i = 1;\n"
9469 "if (SomeType t = getSomething()) {\n"
9470 "}\n"
9471 "const unsigned j = 2;\n"
9472 "int big = 10000;",
9473 Alignment);
9474 verifyFormat("float j = 7;\n"
9475 "for (int k = 0; k < N; ++k) {\n"
9476 "}\n"
9477 "unsigned j = 2;\n"
9478 "int big = 10000;\n"
9479 "}",
9480 Alignment);
9481 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9482 verifyFormat("float i = 1;\n"
9483 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9484 " = someLooooooooooooooooongFunction();\n"
9485 "int j = 2;",
9486 Alignment);
9487 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9488 verifyFormat("int i = 1;\n"
9489 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9490 " someLooooooooooooooooongFunction();\n"
9491 "int j = 2;",
9492 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009493
9494 Alignment.AlignConsecutiveAssignments = true;
9495 verifyFormat("auto lambda = []() {\n"
9496 " auto ii = 0;\n"
9497 " float j = 0;\n"
9498 " return 0;\n"
9499 "};\n"
9500 "int i = 0;\n"
9501 "float i2 = 0;\n"
9502 "auto v = type{\n"
9503 " i = 1, //\n"
9504 " (i = 2), //\n"
9505 " i = 3 //\n"
9506 "};",
9507 Alignment);
9508 Alignment.AlignConsecutiveAssignments = false;
9509
Daniel Jaspere12597c2015-10-01 10:06:54 +00009510 verifyFormat(
9511 "int i = 1;\n"
9512 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9513 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009514 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009515 Alignment);
9516
9517 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9518 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009519 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009520 // happens.
9521 Alignment.AlignConsecutiveAssignments = true;
9522 Alignment.ColumnLimit = 30;
9523 verifyFormat("float ii = 1;\n"
9524 "unsigned j = 2;\n"
9525 "int someVerylongVariable = 1;\n"
9526 "AnotherLongType ll = 123456;\n"
9527 "VeryVeryLongType k = 2;\n"
9528 "int myvar = 1;",
9529 Alignment);
9530 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009531 Alignment.AlignConsecutiveAssignments = false;
9532
9533 verifyFormat(
9534 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9535 " typename LongType, typename B>\n"
9536 "auto foo() {}\n",
9537 Alignment);
9538 verifyFormat("float a, b = 1;\n"
9539 "int c = 2;\n"
9540 "int dd = 3;\n",
9541 Alignment);
9542 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9543 "float b[1][] = {{3.f}};\n",
9544 Alignment);
9545 Alignment.AlignConsecutiveAssignments = true;
9546 verifyFormat("float a, b = 1;\n"
9547 "int c = 2;\n"
9548 "int dd = 3;\n",
9549 Alignment);
9550 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9551 "float b[1][] = {{3.f}};\n",
9552 Alignment);
9553 Alignment.AlignConsecutiveAssignments = false;
9554
9555 Alignment.ColumnLimit = 30;
9556 Alignment.BinPackParameters = false;
9557 verifyFormat("void foo(float a,\n"
9558 " float b,\n"
9559 " int c,\n"
9560 " uint32_t *d) {\n"
9561 " int * e = 0;\n"
9562 " float f = 0;\n"
9563 " double g = 0;\n"
9564 "}\n"
9565 "void bar(ino_t a,\n"
9566 " int b,\n"
9567 " uint32_t *c,\n"
9568 " bool d) {}\n",
9569 Alignment);
9570 Alignment.BinPackParameters = true;
9571 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009572
9573 // Bug 33507
9574 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9575 verifyFormat(
9576 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9577 " static const Version verVs2017;\n"
9578 " return true;\n"
9579 "});\n",
9580 Alignment);
9581 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009582}
9583
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009584TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009585 FormatStyle LinuxBraceStyle = getLLVMStyle();
9586 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009587 verifyFormat("namespace a\n"
9588 "{\n"
9589 "class A\n"
9590 "{\n"
9591 " void f()\n"
9592 " {\n"
9593 " if (true) {\n"
9594 " a();\n"
9595 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009596 " } else {\n"
9597 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009598 " }\n"
9599 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009600 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009601 "};\n"
9602 "struct B {\n"
9603 " int x;\n"
9604 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009605 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009606 LinuxBraceStyle);
9607 verifyFormat("enum X {\n"
9608 " Y = 0,\n"
9609 "}\n",
9610 LinuxBraceStyle);
9611 verifyFormat("struct S {\n"
9612 " int Type;\n"
9613 " union {\n"
9614 " int x;\n"
9615 " double y;\n"
9616 " } Value;\n"
9617 " class C\n"
9618 " {\n"
9619 " MyFavoriteType Value;\n"
9620 " } Class;\n"
9621 "}\n",
9622 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009623}
9624
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009625TEST_F(FormatTest, MozillaBraceBreaking) {
9626 FormatStyle MozillaBraceStyle = getLLVMStyle();
9627 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009628 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009629 verifyFormat("namespace a {\n"
9630 "class A\n"
9631 "{\n"
9632 " void f()\n"
9633 " {\n"
9634 " if (true) {\n"
9635 " a();\n"
9636 " b();\n"
9637 " }\n"
9638 " }\n"
9639 " void g() { return; }\n"
9640 "};\n"
9641 "enum E\n"
9642 "{\n"
9643 " A,\n"
9644 " // foo\n"
9645 " B,\n"
9646 " C\n"
9647 "};\n"
9648 "struct B\n"
9649 "{\n"
9650 " int x;\n"
9651 "};\n"
9652 "}\n",
9653 MozillaBraceStyle);
9654 verifyFormat("struct S\n"
9655 "{\n"
9656 " int Type;\n"
9657 " union\n"
9658 " {\n"
9659 " int x;\n"
9660 " double y;\n"
9661 " } Value;\n"
9662 " class C\n"
9663 " {\n"
9664 " MyFavoriteType Value;\n"
9665 " } Class;\n"
9666 "}\n",
9667 MozillaBraceStyle);
9668}
9669
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009670TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009671 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9672 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009673 verifyFormat("namespace a {\n"
9674 "class A {\n"
9675 " void f()\n"
9676 " {\n"
9677 " if (true) {\n"
9678 " a();\n"
9679 " b();\n"
9680 " }\n"
9681 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009682 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009683 "};\n"
9684 "struct B {\n"
9685 " int x;\n"
9686 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009687 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009688 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009689
Daniel Jasperd9670872014-08-05 12:06:20 +00009690 verifyFormat("void foo()\n"
9691 "{\n"
9692 " if (a) {\n"
9693 " a();\n"
9694 " }\n"
9695 " else {\n"
9696 " b();\n"
9697 " }\n"
9698 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009699 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009700
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009701 verifyFormat("#ifdef _DEBUG\n"
9702 "int foo(int i = 0)\n"
9703 "#else\n"
9704 "int foo(int i = 5)\n"
9705 "#endif\n"
9706 "{\n"
9707 " return i;\n"
9708 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009709 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009710
9711 verifyFormat("void foo() {}\n"
9712 "void bar()\n"
9713 "#ifdef _DEBUG\n"
9714 "{\n"
9715 " foo();\n"
9716 "}\n"
9717 "#else\n"
9718 "{\n"
9719 "}\n"
9720 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009721 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009722
9723 verifyFormat("void foobar() { int i = 5; }\n"
9724 "#ifdef _DEBUG\n"
9725 "void bar() {}\n"
9726 "#else\n"
9727 "void bar() { foobar(); }\n"
9728 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009729 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009730}
9731
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009732TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009733 FormatStyle AllmanBraceStyle = getLLVMStyle();
9734 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009735
9736 EXPECT_EQ("namespace a\n"
9737 "{\n"
9738 "void f();\n"
9739 "void g();\n"
9740 "} // namespace a\n",
9741 format("namespace a\n"
9742 "{\n"
9743 "void f();\n"
9744 "void g();\n"
9745 "}\n",
9746 AllmanBraceStyle));
9747
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009748 verifyFormat("namespace a\n"
9749 "{\n"
9750 "class A\n"
9751 "{\n"
9752 " void f()\n"
9753 " {\n"
9754 " if (true)\n"
9755 " {\n"
9756 " a();\n"
9757 " b();\n"
9758 " }\n"
9759 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009760 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009761 "};\n"
9762 "struct B\n"
9763 "{\n"
9764 " int x;\n"
9765 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009766 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009767 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009768
9769 verifyFormat("void f()\n"
9770 "{\n"
9771 " if (true)\n"
9772 " {\n"
9773 " a();\n"
9774 " }\n"
9775 " else if (false)\n"
9776 " {\n"
9777 " b();\n"
9778 " }\n"
9779 " else\n"
9780 " {\n"
9781 " c();\n"
9782 " }\n"
9783 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009785
9786 verifyFormat("void f()\n"
9787 "{\n"
9788 " for (int i = 0; i < 10; ++i)\n"
9789 " {\n"
9790 " a();\n"
9791 " }\n"
9792 " while (false)\n"
9793 " {\n"
9794 " b();\n"
9795 " }\n"
9796 " do\n"
9797 " {\n"
9798 " c();\n"
9799 " } while (false)\n"
9800 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009802
9803 verifyFormat("void f(int a)\n"
9804 "{\n"
9805 " switch (a)\n"
9806 " {\n"
9807 " case 0:\n"
9808 " break;\n"
9809 " case 1:\n"
9810 " {\n"
9811 " break;\n"
9812 " }\n"
9813 " case 2:\n"
9814 " {\n"
9815 " }\n"
9816 " break;\n"
9817 " default:\n"
9818 " break;\n"
9819 " }\n"
9820 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009821 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009822
9823 verifyFormat("enum X\n"
9824 "{\n"
9825 " Y = 0,\n"
9826 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009827 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009828 verifyFormat("enum X\n"
9829 "{\n"
9830 " Y = 0\n"
9831 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009832 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009833
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009834 verifyFormat("@interface BSApplicationController ()\n"
9835 "{\n"
9836 "@private\n"
9837 " id _extraIvar;\n"
9838 "}\n"
9839 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009840 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009841
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009842 verifyFormat("#ifdef _DEBUG\n"
9843 "int foo(int i = 0)\n"
9844 "#else\n"
9845 "int foo(int i = 5)\n"
9846 "#endif\n"
9847 "{\n"
9848 " return i;\n"
9849 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009851
9852 verifyFormat("void foo() {}\n"
9853 "void bar()\n"
9854 "#ifdef _DEBUG\n"
9855 "{\n"
9856 " foo();\n"
9857 "}\n"
9858 "#else\n"
9859 "{\n"
9860 "}\n"
9861 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009862 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009863
9864 verifyFormat("void foobar() { int i = 5; }\n"
9865 "#ifdef _DEBUG\n"
9866 "void bar() {}\n"
9867 "#else\n"
9868 "void bar() { foobar(); }\n"
9869 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009870 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009871
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009872 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009873 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009874 " // ...\n"
9875 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009876 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009877 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009878 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009879 " // ...\n"
9880 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009881 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009882 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009883 // .. or dict literals.
9884 verifyFormat("void f()\n"
9885 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009886 " // ...\n"
9887 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9888 "}",
9889 AllmanBraceStyle);
9890 verifyFormat("void f()\n"
9891 "{\n"
9892 " // ...\n"
9893 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009894 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009895 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009896 verifyFormat("int f()\n"
9897 "{ // comment\n"
9898 " return 42;\n"
9899 "}",
9900 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009901
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009902 AllmanBraceStyle.ColumnLimit = 19;
9903 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9904 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009905 verifyFormat("void f()\n"
9906 "{\n"
9907 " int i;\n"
9908 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009909 AllmanBraceStyle);
9910 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009911
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009912 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009913 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9914 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9915 verifyFormat("void f(bool b)\n"
9916 "{\n"
9917 " if (b)\n"
9918 " {\n"
9919 " return;\n"
9920 " }\n"
9921 "}\n",
9922 BreakBeforeBraceShortIfs);
9923 verifyFormat("void f(bool b)\n"
9924 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009925 " if constexpr (b)\n"
9926 " {\n"
9927 " return;\n"
9928 " }\n"
9929 "}\n",
9930 BreakBeforeBraceShortIfs);
9931 verifyFormat("void f(bool b)\n"
9932 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009933 " if (b) return;\n"
9934 "}\n",
9935 BreakBeforeBraceShortIfs);
9936 verifyFormat("void f(bool b)\n"
9937 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009938 " if constexpr (b) return;\n"
9939 "}\n",
9940 BreakBeforeBraceShortIfs);
9941 verifyFormat("void f(bool b)\n"
9942 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009943 " while (b)\n"
9944 " {\n"
9945 " return;\n"
9946 " }\n"
9947 "}\n",
9948 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009949}
9950
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009951TEST_F(FormatTest, GNUBraceBreaking) {
9952 FormatStyle GNUBraceStyle = getLLVMStyle();
9953 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9954 verifyFormat("namespace a\n"
9955 "{\n"
9956 "class A\n"
9957 "{\n"
9958 " void f()\n"
9959 " {\n"
9960 " int a;\n"
9961 " {\n"
9962 " int b;\n"
9963 " }\n"
9964 " if (true)\n"
9965 " {\n"
9966 " a();\n"
9967 " b();\n"
9968 " }\n"
9969 " }\n"
9970 " void g() { return; }\n"
9971 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009972 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009973 GNUBraceStyle);
9974
9975 verifyFormat("void f()\n"
9976 "{\n"
9977 " if (true)\n"
9978 " {\n"
9979 " a();\n"
9980 " }\n"
9981 " else if (false)\n"
9982 " {\n"
9983 " b();\n"
9984 " }\n"
9985 " else\n"
9986 " {\n"
9987 " c();\n"
9988 " }\n"
9989 "}\n",
9990 GNUBraceStyle);
9991
9992 verifyFormat("void f()\n"
9993 "{\n"
9994 " for (int i = 0; i < 10; ++i)\n"
9995 " {\n"
9996 " a();\n"
9997 " }\n"
9998 " while (false)\n"
9999 " {\n"
10000 " b();\n"
10001 " }\n"
10002 " do\n"
10003 " {\n"
10004 " c();\n"
10005 " }\n"
10006 " while (false);\n"
10007 "}\n",
10008 GNUBraceStyle);
10009
10010 verifyFormat("void f(int a)\n"
10011 "{\n"
10012 " switch (a)\n"
10013 " {\n"
10014 " case 0:\n"
10015 " break;\n"
10016 " case 1:\n"
10017 " {\n"
10018 " break;\n"
10019 " }\n"
10020 " case 2:\n"
10021 " {\n"
10022 " }\n"
10023 " break;\n"
10024 " default:\n"
10025 " break;\n"
10026 " }\n"
10027 "}\n",
10028 GNUBraceStyle);
10029
10030 verifyFormat("enum X\n"
10031 "{\n"
10032 " Y = 0,\n"
10033 "}\n",
10034 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010035
10036 verifyFormat("@interface BSApplicationController ()\n"
10037 "{\n"
10038 "@private\n"
10039 " id _extraIvar;\n"
10040 "}\n"
10041 "@end\n",
10042 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010043
10044 verifyFormat("#ifdef _DEBUG\n"
10045 "int foo(int i = 0)\n"
10046 "#else\n"
10047 "int foo(int i = 5)\n"
10048 "#endif\n"
10049 "{\n"
10050 " return i;\n"
10051 "}",
10052 GNUBraceStyle);
10053
10054 verifyFormat("void foo() {}\n"
10055 "void bar()\n"
10056 "#ifdef _DEBUG\n"
10057 "{\n"
10058 " foo();\n"
10059 "}\n"
10060 "#else\n"
10061 "{\n"
10062 "}\n"
10063 "#endif",
10064 GNUBraceStyle);
10065
10066 verifyFormat("void foobar() { int i = 5; }\n"
10067 "#ifdef _DEBUG\n"
10068 "void bar() {}\n"
10069 "#else\n"
10070 "void bar() { foobar(); }\n"
10071 "#endif",
10072 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010073}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010074
10075TEST_F(FormatTest, WebKitBraceBreaking) {
10076 FormatStyle WebKitBraceStyle = getLLVMStyle();
10077 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010078 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010079 verifyFormat("namespace a {\n"
10080 "class A {\n"
10081 " void f()\n"
10082 " {\n"
10083 " if (true) {\n"
10084 " a();\n"
10085 " b();\n"
10086 " }\n"
10087 " }\n"
10088 " void g() { return; }\n"
10089 "};\n"
10090 "enum E {\n"
10091 " A,\n"
10092 " // foo\n"
10093 " B,\n"
10094 " C\n"
10095 "};\n"
10096 "struct B {\n"
10097 " int x;\n"
10098 "};\n"
10099 "}\n",
10100 WebKitBraceStyle);
10101 verifyFormat("struct S {\n"
10102 " int Type;\n"
10103 " union {\n"
10104 " int x;\n"
10105 " double y;\n"
10106 " } Value;\n"
10107 " class C {\n"
10108 " MyFavoriteType Value;\n"
10109 " } Class;\n"
10110 "};\n",
10111 WebKitBraceStyle);
10112}
10113
Manuel Klimekd5735502013-08-12 03:51:17 +000010114TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10115 verifyFormat("void f() {\n"
10116 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010117 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010118 " }\n"
10119 "}\n",
10120 getLLVMStyle());
10121}
10122
Daniel Jasper9613c812013-08-07 16:29:23 +000010123TEST_F(FormatTest, UnderstandsPragmas) {
10124 verifyFormat("#pragma omp reduction(| : var)");
10125 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010126
10127 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10128 "(including parentheses).",
10129 format("#pragma mark Any non-hyphenated or hyphenated string "
10130 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010131}
10132
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010133TEST_F(FormatTest, UnderstandPragmaOption) {
10134 verifyFormat("#pragma option -C -A");
10135
10136 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10137}
10138
Manuel Klimek77866142017-11-17 11:17:15 +000010139TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10140 FormatStyle Style = getLLVMStyle();
10141 Style.ColumnLimit = 20;
10142
10143 verifyFormat("int a; // the\n"
10144 " // comment", Style);
10145 EXPECT_EQ("int a; /* first line\n"
10146 " * second\n"
10147 " * line third\n"
10148 " * line\n"
10149 " */",
10150 format("int a; /* first line\n"
10151 " * second\n"
10152 " * line third\n"
10153 " * line\n"
10154 " */",
10155 Style));
10156 EXPECT_EQ("int a; // first line\n"
10157 " // second\n"
10158 " // line third\n"
10159 " // line",
10160 format("int a; // first line\n"
10161 " // second line\n"
10162 " // third line",
10163 Style));
10164
10165 Style.PenaltyExcessCharacter = 90;
10166 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010167 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010168 " // aaa",
10169 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010170 EXPECT_EQ("int a; /* first line\n"
10171 " * second line\n"
10172 " * third line\n"
10173 " */",
10174 format("int a; /* first line\n"
10175 " * second line\n"
10176 " * third line\n"
10177 " */",
10178 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010179 EXPECT_EQ("int a; // first line\n"
10180 " // second line\n"
10181 " // third line",
10182 format("int a; // first line\n"
10183 " // second line\n"
10184 " // third line",
10185 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010186 // FIXME: Investigate why this is not getting the same layout as the test
10187 // above.
10188 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010189 " * second line\n"
10190 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010191 " */",
10192 format("int a; /* first line second line third line"
10193 "\n*/",
10194 Style));
10195
10196 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010197 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010198 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010199 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010200 Style));
10201 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010202 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010203 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010204 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010205 Style));
10206
10207 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10208 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010209 EXPECT_EQ("// foo bar baz bazfoo\n"
10210 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010211 format("// foo bar baz bazfoo bar\n"
10212 "// foo bar\n",
10213 Style));
10214
10215 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010216 "// foo bar baz bazfoo\n"
10217 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010218 format("// foo bar baz bazfoo\n"
10219 "// foo bar baz bazfoo bar\n"
10220 "// foo bar\n",
10221 Style));
10222
Manuel Klimek77866142017-11-17 11:17:15 +000010223 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010224 "// foo bar baz bazfoo\n"
10225 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010226 format("// foo bar baz bazfoo\n"
10227 "// foo bar baz bazfoo bar\n"
10228 "// foo bar\n",
10229 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010230
10231 // Make sure we do not keep protruding characters if strict mode reflow is
10232 // cheaper than keeping protruding characters.
10233 Style.ColumnLimit = 21;
10234 EXPECT_EQ("// foo foo foo foo\n"
10235 "// foo foo foo foo\n"
10236 "// foo foo foo foo\n",
10237 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10238 Style));
10239
10240 EXPECT_EQ("int a = /* long block\n"
10241 " comment */\n"
10242 " 42;",
10243 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010244}
10245
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010246#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10247 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010248 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10249 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010250
10251TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010252 SmallVector<FormatStyle, 3> Styles;
10253 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010254
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010255 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010256 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10257 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10258 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010259
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010260 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010261 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10262 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10263 EXPECT_ALL_STYLES_EQUAL(Styles);
10264
Nico Weber514ecc82014-02-02 20:50:45 +000010265 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010266 EXPECT_TRUE(
10267 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10268 EXPECT_TRUE(
10269 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10270 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010271
Nico Weber514ecc82014-02-02 20:50:45 +000010272 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010273 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10274 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10275 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010276
10277 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010278 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10279 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10280 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010281
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010282 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010283 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10284 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10285 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010286
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010287 Styles[0] = getGNUStyle();
10288 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10289 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10290 EXPECT_ALL_STYLES_EQUAL(Styles);
10291
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010292 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10293}
10294
10295TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10296 SmallVector<FormatStyle, 8> Styles;
10297 Styles.resize(2);
10298
10299 Styles[0] = getGoogleStyle();
10300 Styles[1] = getLLVMStyle();
10301 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10302 EXPECT_ALL_STYLES_EQUAL(Styles);
10303
10304 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010305 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010306 Styles[1] = getLLVMStyle();
10307 Styles[1].Language = FormatStyle::LK_JavaScript;
10308 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10309
10310 Styles[2] = getLLVMStyle();
10311 Styles[2].Language = FormatStyle::LK_JavaScript;
10312 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10313 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010314 &Styles[2])
10315 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010316
10317 Styles[3] = getLLVMStyle();
10318 Styles[3].Language = FormatStyle::LK_JavaScript;
10319 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10320 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010321 &Styles[3])
10322 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010323
10324 Styles[4] = getLLVMStyle();
10325 Styles[4].Language = FormatStyle::LK_JavaScript;
10326 EXPECT_EQ(0, parseConfiguration("---\n"
10327 "BasedOnStyle: LLVM\n"
10328 "IndentWidth: 123\n"
10329 "---\n"
10330 "BasedOnStyle: Google\n"
10331 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010332 &Styles[4])
10333 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010334 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010335}
10336
Daniel Jasper91881d92014-09-29 08:07:46 +000010337#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010338 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010339 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010340 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010341 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010342 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010343
Daniel Jasper91881d92014-09-29 08:07:46 +000010344#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10345
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010346#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10347 Style.STRUCT.FIELD = false; \
10348 EXPECT_EQ(0, \
10349 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10350 .value()); \
10351 EXPECT_TRUE(Style.STRUCT.FIELD); \
10352 EXPECT_EQ(0, \
10353 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10354 .value()); \
10355 EXPECT_FALSE(Style.STRUCT.FIELD);
10356
10357#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10358 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10359
Daniel Jasper00853002014-09-16 16:22:30 +000010360#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10361 EXPECT_NE(VALUE, Style.FIELD); \
10362 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10363 EXPECT_EQ(VALUE, Style.FIELD)
10364
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010365TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010366 FormatStyle Style = {};
10367 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010368 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010369 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010370 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010371 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010372 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010373 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010374 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010375 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010376 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010377 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010378 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010379 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010380 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010381 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010382 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010383 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010384 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010385 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010386 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010387 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010388 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010389 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010390 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010391 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010392 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010393 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010394 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010395 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010396 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010397 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010398 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010399 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010400 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010401 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010402 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010403 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010404 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010405 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010406 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010407 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10408 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10409 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010410
10411 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10412 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10413 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10414 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10415 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10416 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10417 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10418 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010419 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010420 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10421 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10422 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010423 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10424 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10425 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010426}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010427
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010428#undef CHECK_PARSE_BOOL
10429
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010430TEST_F(FormatTest, ParsesConfiguration) {
10431 FormatStyle Style = {};
10432 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010433 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010434 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10435 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010436 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010437 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10438 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010439 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10440 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010441 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10442 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010443 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10444 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10445 PenaltyReturnTypeOnItsOwnLine, 1234u);
10446 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10447 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010448 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010449 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010450 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010451
Daniel Jasper553d4872014-06-17 12:40:34 +000010452 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010453 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10454 FormatStyle::PAS_Left);
10455 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10456 FormatStyle::PAS_Right);
10457 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10458 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010459 // For backward compatibility:
10460 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10461 FormatStyle::PAS_Left);
10462 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10463 FormatStyle::PAS_Right);
10464 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10465 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010466
Alexander Kornienkod6538332013-05-07 15:32:14 +000010467 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010468 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10469 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010470 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10471 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10472 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10473
Daniel Jasperac043c92014-09-15 11:11:00 +000010474 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010475 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10476 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010477 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10478 FormatStyle::BOS_None);
10479 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10480 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010481 // For backward compatibility:
10482 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10483 FormatStyle::BOS_None);
10484 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10485 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010486
Francois Ferranda6b6d512017-05-24 11:36:58 +000010487 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10488 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10489 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10490 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10491 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10492 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10493 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10494 // For backward compatibility:
10495 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10496 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10497
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010498 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10499 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10500 FormatStyle::BAS_Align);
10501 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10502 FormatStyle::BAS_DontAlign);
10503 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10504 FormatStyle::BAS_AlwaysBreak);
10505 // For backward compatibility:
10506 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10507 FormatStyle::BAS_DontAlign);
10508 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10509 FormatStyle::BAS_Align);
10510
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010511 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10512 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10513 FormatStyle::ENAS_DontAlign);
10514 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10515 FormatStyle::ENAS_Left);
10516 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10517 FormatStyle::ENAS_Right);
10518 // For backward compatibility:
10519 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10520 FormatStyle::ENAS_Left);
10521 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10522 FormatStyle::ENAS_Right);
10523
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010524 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010525 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10526 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10527 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010528 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10529 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010530 // For backward compatibility:
10531 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10532 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010533
Daniel Jasperd74cf402014-04-08 12:46:38 +000010534 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010535 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10536 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10537 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10538 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010539 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10540 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010541 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10542 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010543 // For backward compatibility:
10544 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10545 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10546 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10547 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010548
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010549 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10550 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10551 FormatStyle::SBPO_Never);
10552 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10553 FormatStyle::SBPO_Always);
10554 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10555 FormatStyle::SBPO_ControlStatements);
10556 // For backward compatibility:
10557 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10558 FormatStyle::SBPO_Never);
10559 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10560 FormatStyle::SBPO_ControlStatements);
10561
Alexander Kornienkod6538332013-05-07 15:32:14 +000010562 Style.ColumnLimit = 123;
10563 FormatStyle BaseStyle = getLLVMStyle();
10564 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10565 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10566
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010567 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10568 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10569 FormatStyle::BS_Attach);
10570 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10571 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010572 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10573 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010574 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10575 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010576 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10577 FormatStyle::BS_Allman);
10578 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010579 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10580 FormatStyle::BS_WebKit);
10581 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10582 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010583
Zachary Turner448592e2015-12-18 22:20:15 +000010584 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10585 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10586 FormatStyle::RTBS_None);
10587 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10588 FormatStyle::RTBS_All);
10589 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010590 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010591 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10592 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10593 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10594 AlwaysBreakAfterReturnType,
10595 FormatStyle::RTBS_TopLevelDefinitions);
10596
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010597 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10598 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10599 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10600 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10601 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10602 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10603 AlwaysBreakAfterDefinitionReturnType,
10604 FormatStyle::DRTBS_TopLevel);
10605
Daniel Jasper65ee3472013-07-31 23:16:02 +000010606 Style.NamespaceIndentation = FormatStyle::NI_All;
10607 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10608 FormatStyle::NI_None);
10609 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10610 FormatStyle::NI_Inner);
10611 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10612 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010613
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010614 // FIXME: This is required because parsing a configuration simply overwrites
10615 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010616 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010617 std::vector<std::string> BoostForeach;
10618 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010619 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010620 std::vector<std::string> BoostAndQForeach;
10621 BoostAndQForeach.push_back("BOOST_FOREACH");
10622 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010623 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10624 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010625
10626 Style.IncludeCategories.clear();
10627 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10628 {".*", 1}};
10629 CHECK_PARSE("IncludeCategories:\n"
10630 " - Regex: abc/.*\n"
10631 " Priority: 2\n"
10632 " - Regex: .*\n"
10633 " Priority: 1",
10634 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010635 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010636
10637 Style.RawStringFormats.clear();
10638 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010639 {
10640 FormatStyle::LK_TextProto,
10641 {"pb", "proto"},
10642 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010643 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010644 "llvm",
10645 },
10646 {
10647 FormatStyle::LK_Cpp,
10648 {"cc", "cpp"},
10649 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010650 /*CanonicalDelimiter=*/"cc",
10651 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010652 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010653 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010654
10655 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010656 " - Language: TextProto\n"
10657 " Delimiters:\n"
10658 " - 'pb'\n"
10659 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010660 " EnclosingFunctions:\n"
10661 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010662 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010663 " - Language: Cpp\n"
10664 " Delimiters:\n"
10665 " - 'cc'\n"
10666 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010667 " EnclosingFunctions:\n"
10668 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010669 " - 'CPPEVAL'\n"
10670 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010671 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010672}
10673
10674TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10675 FormatStyle Style = {};
10676 Style.Language = FormatStyle::LK_Cpp;
10677 CHECK_PARSE("Language: Cpp\n"
10678 "IndentWidth: 12",
10679 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010680 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10681 "IndentWidth: 34",
10682 &Style),
10683 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010684 EXPECT_EQ(12u, Style.IndentWidth);
10685 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10686 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10687
10688 Style.Language = FormatStyle::LK_JavaScript;
10689 CHECK_PARSE("Language: JavaScript\n"
10690 "IndentWidth: 12",
10691 IndentWidth, 12u);
10692 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010693 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10694 "IndentWidth: 34",
10695 &Style),
10696 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010697 EXPECT_EQ(23u, Style.IndentWidth);
10698 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10699 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10700
10701 CHECK_PARSE("BasedOnStyle: LLVM\n"
10702 "IndentWidth: 67",
10703 IndentWidth, 67u);
10704
10705 CHECK_PARSE("---\n"
10706 "Language: JavaScript\n"
10707 "IndentWidth: 12\n"
10708 "---\n"
10709 "Language: Cpp\n"
10710 "IndentWidth: 34\n"
10711 "...\n",
10712 IndentWidth, 12u);
10713
10714 Style.Language = FormatStyle::LK_Cpp;
10715 CHECK_PARSE("---\n"
10716 "Language: JavaScript\n"
10717 "IndentWidth: 12\n"
10718 "---\n"
10719 "Language: Cpp\n"
10720 "IndentWidth: 34\n"
10721 "...\n",
10722 IndentWidth, 34u);
10723 CHECK_PARSE("---\n"
10724 "IndentWidth: 78\n"
10725 "---\n"
10726 "Language: JavaScript\n"
10727 "IndentWidth: 56\n"
10728 "...\n",
10729 IndentWidth, 78u);
10730
10731 Style.ColumnLimit = 123;
10732 Style.IndentWidth = 234;
10733 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10734 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010735 EXPECT_FALSE(parseConfiguration("---\n"
10736 "IndentWidth: 456\n"
10737 "BreakBeforeBraces: Allman\n"
10738 "---\n"
10739 "Language: JavaScript\n"
10740 "IndentWidth: 111\n"
10741 "TabWidth: 111\n"
10742 "---\n"
10743 "Language: Cpp\n"
10744 "BreakBeforeBraces: Stroustrup\n"
10745 "TabWidth: 789\n"
10746 "...\n",
10747 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010748 EXPECT_EQ(123u, Style.ColumnLimit);
10749 EXPECT_EQ(456u, Style.IndentWidth);
10750 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10751 EXPECT_EQ(789u, Style.TabWidth);
10752
Rafael Espindola1f243172014-06-12 11:35:17 +000010753 EXPECT_EQ(parseConfiguration("---\n"
10754 "Language: JavaScript\n"
10755 "IndentWidth: 56\n"
10756 "---\n"
10757 "IndentWidth: 78\n"
10758 "...\n",
10759 &Style),
10760 ParseError::Error);
10761 EXPECT_EQ(parseConfiguration("---\n"
10762 "Language: JavaScript\n"
10763 "IndentWidth: 56\n"
10764 "---\n"
10765 "Language: JavaScript\n"
10766 "IndentWidth: 78\n"
10767 "...\n",
10768 &Style),
10769 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010770
10771 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10772}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010773
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010774#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010775
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010776TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10777 FormatStyle Style = {};
10778 Style.Language = FormatStyle::LK_JavaScript;
10779 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010780 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010781 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010782
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010783 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010784 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010785 "BasedOnStyle: Google\n"
10786 "---\n"
10787 "Language: JavaScript\n"
10788 "IndentWidth: 76\n"
10789 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010790 &Style)
10791 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010792 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010793 EXPECT_EQ(76u, Style.IndentWidth);
10794 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10795}
10796
Alexander Kornienkod6538332013-05-07 15:32:14 +000010797TEST_F(FormatTest, ConfigurationRoundTripTest) {
10798 FormatStyle Style = getLLVMStyle();
10799 std::string YAML = configurationAsText(Style);
10800 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010801 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010802 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10803 EXPECT_EQ(Style, ParsedStyle);
10804}
10805
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010806TEST_F(FormatTest, WorksFor8bitEncodings) {
10807 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10808 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10809 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10810 "\"\xef\xee\xf0\xf3...\"",
10811 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10812 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10813 "\xef\xee\xf0\xf3...\"",
10814 getLLVMStyleWithColumns(12)));
10815}
10816
Alexander Kornienko393e3082013-11-13 14:04:17 +000010817TEST_F(FormatTest, HandlesUTF8BOM) {
10818 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10819 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10820 format("\xef\xbb\xbf#include <iostream>"));
10821 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10822 format("\xef\xbb\xbf\n#include <iostream>"));
10823}
10824
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010825// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10826#if !defined(_MSC_VER)
10827
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010828TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10829 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10830 getLLVMStyleWithColumns(35));
10831 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010832 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010833 verifyFormat("// Однажды в студёную зимнюю пору...",
10834 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010835 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010836 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10837 getLLVMStyleWithColumns(39));
10838 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010839 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010840}
10841
10842TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010843 // Non-printable characters' width is currently considered to be the length in
10844 // bytes in UTF8. The characters can be displayed in very different manner
10845 // (zero-width, single width with a substitution glyph, expanded to their code
10846 // (e.g. "<8d>"), so there's no single correct way to handle them.
10847 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010848 "\"\xc2\x8d\";",
10849 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010850 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010851 "\"\xc2\x8d\";",
10852 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010853 EXPECT_EQ("\"Однажды, в \"\n"
10854 "\"студёную \"\n"
10855 "\"зимнюю \"\n"
10856 "\"пору,\"",
10857 format("\"Однажды, в студёную зимнюю пору,\"",
10858 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010859 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010860 "\"一 二 三 \"\n"
10861 "\"四 五六 \"\n"
10862 "\"七 八 九 \"\n"
10863 "\"十\"",
10864 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010865 EXPECT_EQ("\"一\t\"\n"
10866 "\"二 \t\"\n"
10867 "\"三 四 \"\n"
10868 "\"五\t\"\n"
10869 "\"六 \t\"\n"
10870 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010871 "\"八九十\tqq\"",
10872 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10873 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010874
10875 // UTF8 character in an escape sequence.
10876 EXPECT_EQ("\"aaaaaa\"\n"
10877 "\"\\\xC2\x8D\"",
10878 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010879}
10880
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010881TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10882 EXPECT_EQ("const char *sssss =\n"
10883 " \"一二三四五六七八\\\n"
10884 " 九 十\";",
10885 format("const char *sssss = \"一二三四五六七八\\\n"
10886 " 九 十\";",
10887 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010888}
10889
10890TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010891 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10892 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010893 EXPECT_EQ("// Я из лесу\n"
10894 "// вышел; был\n"
10895 "// сильный\n"
10896 "// мороз.",
10897 format("// Я из лесу вышел; был сильный мороз.",
10898 getLLVMStyleWithColumns(13)));
10899 EXPECT_EQ("// 一二三\n"
10900 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010901 "// 八 九\n"
10902 "// 十",
10903 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010904}
10905
10906TEST_F(FormatTest, SplitsUTF8BlockComments) {
10907 EXPECT_EQ("/* Гляжу,\n"
10908 " * поднимается\n"
10909 " * медленно в\n"
10910 " * гору\n"
10911 " * Лошадка,\n"
10912 " * везущая\n"
10913 " * хворосту\n"
10914 " * воз. */",
10915 format("/* Гляжу, поднимается медленно в гору\n"
10916 " * Лошадка, везущая хворосту воз. */",
10917 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010918 EXPECT_EQ(
10919 "/* 一二三\n"
10920 " * 四五六七\n"
10921 " * 八 九\n"
10922 " * 十 */",
10923 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010924 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10925 " * 𝕓𝕪𝕥𝕖\n"
10926 " * 𝖀𝕿𝕱-𝟠 */",
10927 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010928}
10929
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010930#endif // _MSC_VER
10931
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010932TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10933 FormatStyle Style = getLLVMStyle();
10934
10935 Style.ConstructorInitializerIndentWidth = 4;
10936 verifyFormat(
10937 "SomeClass::Constructor()\n"
10938 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10939 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10940 Style);
10941
10942 Style.ConstructorInitializerIndentWidth = 2;
10943 verifyFormat(
10944 "SomeClass::Constructor()\n"
10945 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10946 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10947 Style);
10948
10949 Style.ConstructorInitializerIndentWidth = 0;
10950 verifyFormat(
10951 "SomeClass::Constructor()\n"
10952 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10953 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10954 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010955 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10956 verifyFormat(
10957 "SomeLongTemplateVariableName<\n"
10958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10959 Style);
10960 verifyFormat(
10961 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10963 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010964}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010965
Daniel Jasper00853002014-09-16 16:22:30 +000010966TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10967 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010968 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010969 Style.ConstructorInitializerIndentWidth = 4;
10970 verifyFormat("SomeClass::Constructor()\n"
10971 " : a(a)\n"
10972 " , b(b)\n"
10973 " , c(c) {}",
10974 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010975 verifyFormat("SomeClass::Constructor()\n"
10976 " : a(a) {}",
10977 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010978
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010979 Style.ColumnLimit = 0;
10980 verifyFormat("SomeClass::Constructor()\n"
10981 " : a(a) {}",
10982 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010983 verifyFormat("SomeClass::Constructor() noexcept\n"
10984 " : a(a) {}",
10985 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010986 verifyFormat("SomeClass::Constructor()\n"
10987 " : a(a)\n"
10988 " , b(b)\n"
10989 " , c(c) {}",
10990 Style);
10991 verifyFormat("SomeClass::Constructor()\n"
10992 " : a(a) {\n"
10993 " foo();\n"
10994 " bar();\n"
10995 "}",
10996 Style);
10997
Daniel Jasperd74cf402014-04-08 12:46:38 +000010998 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010999 verifyFormat("SomeClass::Constructor()\n"
11000 " : a(a)\n"
11001 " , b(b)\n"
11002 " , c(c) {\n}",
11003 Style);
11004 verifyFormat("SomeClass::Constructor()\n"
11005 " : a(a) {\n}",
11006 Style);
11007
11008 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011009 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011010 Style.ConstructorInitializerIndentWidth = 2;
11011 verifyFormat("SomeClass::Constructor()\n"
11012 " : a(a)\n"
11013 " , b(b)\n"
11014 " , c(c) {}",
11015 Style);
11016
11017 Style.ConstructorInitializerIndentWidth = 0;
11018 verifyFormat("SomeClass::Constructor()\n"
11019 ": a(a)\n"
11020 ", b(b)\n"
11021 ", c(c) {}",
11022 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011023
11024 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11025 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011026 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11027 verifyFormat(
11028 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11029 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011030 verifyFormat(
11031 "SomeClass::Constructor()\n"
11032 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11033 Style);
11034 Style.ConstructorInitializerIndentWidth = 4;
11035 Style.ColumnLimit = 60;
11036 verifyFormat("SomeClass::Constructor()\n"
11037 " : aaaaaaaa(aaaaaaaa)\n"
11038 " , aaaaaaaa(aaaaaaaa)\n"
11039 " , aaaaaaaa(aaaaaaaa) {}",
11040 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011041}
11042
Daniel Jasper38efc132014-10-21 07:51:54 +000011043TEST_F(FormatTest, Destructors) {
11044 verifyFormat("void F(int &i) { i.~int(); }");
11045 verifyFormat("void F(int &i) { i->~int(); }");
11046}
11047
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011048TEST_F(FormatTest, FormatsWithWebKitStyle) {
11049 FormatStyle Style = getWebKitStyle();
11050
11051 // Don't indent in outer namespaces.
11052 verifyFormat("namespace outer {\n"
11053 "int i;\n"
11054 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011055 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011056 "} // namespace inner\n"
11057 "} // namespace outer\n"
11058 "namespace other_outer {\n"
11059 "int i;\n"
11060 "}",
11061 Style);
11062
11063 // Don't indent case labels.
11064 verifyFormat("switch (variable) {\n"
11065 "case 1:\n"
11066 "case 2:\n"
11067 " doSomething();\n"
11068 " break;\n"
11069 "default:\n"
11070 " ++variable;\n"
11071 "}",
11072 Style);
11073
11074 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011075 EXPECT_EQ("void f()\n"
11076 "{\n"
11077 " if (aaaaaaaaaaaaaaaa\n"
11078 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11079 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11080 " return;\n"
11081 "}",
11082 format("void f() {\n"
11083 "if (aaaaaaaaaaaaaaaa\n"
11084 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11085 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11086 "return;\n"
11087 "}",
11088 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011089
Daniel Jasper35995672014-04-29 14:05:20 +000011090 // Allow functions on a single line.
11091 verifyFormat("void f() { return; }", Style);
11092
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011093 // Constructor initializers are formatted one per line with the "," on the
11094 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011095 verifyFormat("Constructor()\n"
11096 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11097 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011098 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011099 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11100 "{\n"
11101 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011102 Style);
11103 verifyFormat("SomeClass::Constructor()\n"
11104 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011105 "{\n"
11106 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011107 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011108 EXPECT_EQ("SomeClass::Constructor()\n"
11109 " : a(a)\n"
11110 "{\n"
11111 "}",
11112 format("SomeClass::Constructor():a(a){}", Style));
11113 verifyFormat("SomeClass::Constructor()\n"
11114 " : a(a)\n"
11115 " , b(b)\n"
11116 " , c(c)\n"
11117 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011118 "}",
11119 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011120 verifyFormat("SomeClass::Constructor()\n"
11121 " : a(a)\n"
11122 "{\n"
11123 " foo();\n"
11124 " bar();\n"
11125 "}",
11126 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011127
Daniel Jasper65ee3472013-07-31 23:16:02 +000011128 // Access specifiers should be aligned left.
11129 verifyFormat("class C {\n"
11130 "public:\n"
11131 " int i;\n"
11132 "};",
11133 Style);
11134
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011135 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011136 verifyFormat("int a; // Do not\n"
11137 "double b; // align comments.",
11138 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011139
Daniel Jasper3219e432014-12-02 13:24:51 +000011140 // Do not align operands.
11141 EXPECT_EQ("ASSERT(aaaa\n"
11142 " || bbbb);",
11143 format("ASSERT ( aaaa\n||bbbb);", Style));
11144
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011145 // Accept input's line breaks.
11146 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11147 " || bbbbbbbbbbbbbbb) {\n"
11148 " i++;\n"
11149 "}",
11150 format("if (aaaaaaaaaaaaaaa\n"
11151 "|| bbbbbbbbbbbbbbb) { i++; }",
11152 Style));
11153 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11154 " i++;\n"
11155 "}",
11156 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011157
11158 // Don't automatically break all macro definitions (llvm.org/PR17842).
11159 verifyFormat("#define aNumber 10", Style);
11160 // However, generally keep the line breaks that the user authored.
11161 EXPECT_EQ("#define aNumber \\\n"
11162 " 10",
11163 format("#define aNumber \\\n"
11164 " 10",
11165 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011166
11167 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011168 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11169 " copyItems:YES];",
11170 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11171 "copyItems:YES];",
11172 Style));
11173 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11174 " copyItems:YES];",
11175 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11176 " copyItems:YES];",
11177 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011178 // FIXME: This does not seem right, there should be more indentation before
11179 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011180 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011181 " @\"a\",\n"
11182 " @\"a\"\n"
11183 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011184 " copyItems:YES];",
11185 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11186 " @\"a\",\n"
11187 " @\"a\"\n"
11188 " ]\n"
11189 " copyItems:YES];",
11190 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011191 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011192 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11193 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011194 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11195 " copyItems:YES];",
11196 Style));
11197
11198 verifyFormat("[self.a b:c c:d];", Style);
11199 EXPECT_EQ("[self.a b:c\n"
11200 " c:d];",
11201 format("[self.a b:c\n"
11202 "c:d];",
11203 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011204}
11205
Manuel Klimekffdeb592013-09-03 15:10:01 +000011206TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011207 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11208 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11209 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11210 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11211 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011212 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011213 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11214 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011215 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011216 verifyFormat("void f() {\n"
11217 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11218 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011219 verifyFormat("void f() {\n"
11220 " other(x.begin(), //\n"
11221 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011222 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011223 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011224 verifyFormat("SomeFunction([]() { // A cool function...\n"
11225 " return 43;\n"
11226 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011227 EXPECT_EQ("SomeFunction([]() {\n"
11228 "#define A a\n"
11229 " return 43;\n"
11230 "});",
11231 format("SomeFunction([](){\n"
11232 "#define A a\n"
11233 "return 43;\n"
11234 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011235 verifyFormat("void f() {\n"
11236 " SomeFunction([](decltype(x), A *a) {});\n"
11237 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011238 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11239 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011240 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11241 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11242 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011243 verifyFormat("Constructor()\n"
11244 " : Field([] { // comment\n"
11245 " int i;\n"
11246 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011247 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11248 " return some_parameter.size();\n"
11249 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011250 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11251 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011252 verifyFormat("int i = aaaaaa ? 1 //\n"
11253 " : [] {\n"
11254 " return 2; //\n"
11255 " }();");
11256 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11257 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11258 " return x == 2; // force break\n"
11259 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011260 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11261 " [=](int iiiiiiiiiiii) {\n"
11262 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11263 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11264 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011265 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011266 verifyFormat("SomeFunction({[&] {\n"
11267 " // comment\n"
11268 " },\n"
11269 " [&] {\n"
11270 " // comment\n"
11271 " }});");
11272 verifyFormat("SomeFunction({[&] {\n"
11273 " // comment\n"
11274 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011275 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11276 " [&]() { return true; },\n"
11277 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011278
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011279 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011280 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011281 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011282 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11283 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011284 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011285 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011286 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11287 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011288 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011289 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11290 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011291 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011292 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011293 verifyFormat(
11294 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11295 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11296 " return aaaaaaaaaaaaaaaaa;\n"
11297 " });",
11298 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011299 verifyFormat("[]() //\n"
11300 " -> int {\n"
11301 " return 1; //\n"
11302 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011303
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011304 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011305 verifyFormat("SomeFunction(\n"
11306 " []() {\n"
11307 " int i = 42;\n"
11308 " return i;\n"
11309 " },\n"
11310 " []() {\n"
11311 " int j = 43;\n"
11312 " return j;\n"
11313 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011314
Daniel Jasperda18fd82014-06-10 06:39:03 +000011315 // More complex introducers.
11316 verifyFormat("return [i, args...] {};");
11317
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011318 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011319 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011320 verifyFormat("double &operator[](int i) { return 0; }\n"
11321 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011322 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011323 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011324 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011325
11326 // Other corner cases.
11327 verifyFormat("void f() {\n"
11328 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011329 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011330 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011331
11332 // Lambdas created through weird macros.
11333 verifyFormat("void f() {\n"
11334 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011335 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011336 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011337
11338 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11339 " doo_dah();\n"
11340 " doo_dah();\n"
11341 " })) {\n"
11342 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011343 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11344 " doo_dah();\n"
11345 " doo_dah();\n"
11346 " })) {\n"
11347 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011348 verifyFormat("auto lambda = []() {\n"
11349 " int a = 2\n"
11350 "#if A\n"
11351 " + 2\n"
11352 "#endif\n"
11353 " ;\n"
11354 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011355
11356 // Lambdas with complex multiline introducers.
11357 verifyFormat(
11358 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11359 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11360 " -> ::std::unordered_set<\n"
11361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11362 " //\n"
11363 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011364}
11365
Martin Probsta004b3f2017-11-17 18:06:33 +000011366TEST_F(FormatTest, EmptyLinesInLambdas) {
11367 verifyFormat("auto lambda = []() {\n"
11368 " x(); //\n"
11369 "};",
11370 "auto lambda = []() {\n"
11371 "\n"
11372 " x(); //\n"
11373 "\n"
11374 "};");
11375}
11376
Manuel Klimek516e0542013-09-04 13:25:30 +000011377TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011378 FormatStyle ShortBlocks = getLLVMStyle();
11379 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11380 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11381 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11382 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11383 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11384 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11385 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011386
Daniel Jasper76284682014-10-22 09:12:44 +000011387 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11388 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11389 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011390
Daniel Jasper76284682014-10-22 09:12:44 +000011391 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011392 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011393 "}];");
11394 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011395 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011396 "}]};");
11397 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011398 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011399 "}];");
11400 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011401 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011402 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011403 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011404 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011405 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011406 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011407 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011408
11409 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011410 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011411 "}];",
11412 getLLVMStyleWithColumns(60));
11413 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011414 " NSString *path = [self sessionFilePath];\n"
11415 " if (path) {\n"
11416 " // ...\n"
11417 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011418 "});");
11419 verifyFormat("[[SessionService sharedService]\n"
11420 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011421 " if (window) {\n"
11422 " [self windowDidLoad:window];\n"
11423 " } else {\n"
11424 " [self errorLoadingWindow];\n"
11425 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011426 " }];");
11427 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011428 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011429 "};\n",
11430 getLLVMStyleWithColumns(40));
11431 verifyFormat("[[SessionService sharedService]\n"
11432 " loadWindowWithCompletionBlock: //\n"
11433 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011434 " if (window) {\n"
11435 " [self windowDidLoad:window];\n"
11436 " } else {\n"
11437 " [self errorLoadingWindow];\n"
11438 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011439 " }];",
11440 getLLVMStyleWithColumns(60));
11441 verifyFormat("[myObject doSomethingWith:arg1\n"
11442 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011443 " // ...\n"
11444 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011445 " }\n"
11446 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011447 " // ...\n"
11448 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011449 " }\n"
11450 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011451 " // ...\n"
11452 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011453 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011454 verifyFormat("[myObject doSomethingWith:arg1\n"
11455 " firstBlock:-1\n"
11456 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011457 " // ...\n"
11458 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011459 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011460
11461 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011462 " @autoreleasepool {\n"
11463 " if (a) {\n"
11464 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011465 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011466 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011467 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011468 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011469 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11470 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011471
11472 FormatStyle FourIndent = getLLVMStyle();
11473 FourIndent.ObjCBlockIndentWidth = 4;
11474 verifyFormat("[operation setCompletionBlock:^{\n"
11475 " [self onOperationDone];\n"
11476 "}];",
11477 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011478}
11479
Daniel Jasper289afc02015-04-23 09:23:17 +000011480TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11481 FormatStyle ZeroColumn = getLLVMStyle();
11482 ZeroColumn.ColumnLimit = 0;
11483
11484 verifyFormat("[[SessionService sharedService] "
11485 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11486 " if (window) {\n"
11487 " [self windowDidLoad:window];\n"
11488 " } else {\n"
11489 " [self errorLoadingWindow];\n"
11490 " }\n"
11491 "}];",
11492 ZeroColumn);
11493 EXPECT_EQ("[[SessionService sharedService]\n"
11494 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11495 " if (window) {\n"
11496 " [self windowDidLoad:window];\n"
11497 " } else {\n"
11498 " [self errorLoadingWindow];\n"
11499 " }\n"
11500 " }];",
11501 format("[[SessionService sharedService]\n"
11502 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11503 " if (window) {\n"
11504 " [self windowDidLoad:window];\n"
11505 " } else {\n"
11506 " [self errorLoadingWindow];\n"
11507 " }\n"
11508 "}];",
11509 ZeroColumn));
11510 verifyFormat("[myObject doSomethingWith:arg1\n"
11511 " firstBlock:^(Foo *a) {\n"
11512 " // ...\n"
11513 " int i;\n"
11514 " }\n"
11515 " secondBlock:^(Bar *b) {\n"
11516 " // ...\n"
11517 " int i;\n"
11518 " }\n"
11519 " thirdBlock:^Foo(Bar *b) {\n"
11520 " // ...\n"
11521 " int i;\n"
11522 " }];",
11523 ZeroColumn);
11524 verifyFormat("f(^{\n"
11525 " @autoreleasepool {\n"
11526 " if (a) {\n"
11527 " g();\n"
11528 " }\n"
11529 " }\n"
11530 "});",
11531 ZeroColumn);
11532 verifyFormat("void (^largeBlock)(void) = ^{\n"
11533 " // ...\n"
11534 "};",
11535 ZeroColumn);
11536
11537 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11538 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011539 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011540 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11541 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11542 " int i;\n"
11543 "};",
11544 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11545}
11546
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011547TEST_F(FormatTest, SupportsCRLF) {
11548 EXPECT_EQ("int a;\r\n"
11549 "int b;\r\n"
11550 "int c;\r\n",
11551 format("int a;\r\n"
11552 " int b;\r\n"
11553 " int c;\r\n",
11554 getLLVMStyle()));
11555 EXPECT_EQ("int a;\r\n"
11556 "int b;\r\n"
11557 "int c;\r\n",
11558 format("int a;\r\n"
11559 " int b;\n"
11560 " int c;\r\n",
11561 getLLVMStyle()));
11562 EXPECT_EQ("int a;\n"
11563 "int b;\n"
11564 "int c;\n",
11565 format("int a;\r\n"
11566 " int b;\n"
11567 " int c;\n",
11568 getLLVMStyle()));
11569 EXPECT_EQ("\"aaaaaaa \"\r\n"
11570 "\"bbbbbbb\";\r\n",
11571 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11572 EXPECT_EQ("#define A \\\r\n"
11573 " b; \\\r\n"
11574 " c; \\\r\n"
11575 " d;\r\n",
11576 format("#define A \\\r\n"
11577 " b; \\\r\n"
11578 " c; d; \r\n",
11579 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011580
11581 EXPECT_EQ("/*\r\n"
11582 "multi line block comments\r\n"
11583 "should not introduce\r\n"
11584 "an extra carriage return\r\n"
11585 "*/\r\n",
11586 format("/*\r\n"
11587 "multi line block comments\r\n"
11588 "should not introduce\r\n"
11589 "an extra carriage return\r\n"
11590 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011591}
11592
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011593TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11594 verifyFormat("MY_CLASS(C) {\n"
11595 " int i;\n"
11596 " int j;\n"
11597 "};");
11598}
11599
Daniel Jasper6633ab82013-10-18 10:38:14 +000011600TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11601 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11602 TwoIndent.ContinuationIndentWidth = 2;
11603
11604 EXPECT_EQ("int i =\n"
11605 " longFunction(\n"
11606 " arg);",
11607 format("int i = longFunction(arg);", TwoIndent));
11608
11609 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11610 SixIndent.ContinuationIndentWidth = 6;
11611
11612 EXPECT_EQ("int i =\n"
11613 " longFunction(\n"
11614 " arg);",
11615 format("int i = longFunction(arg);", SixIndent));
11616}
11617
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011618TEST_F(FormatTest, SpacesInAngles) {
11619 FormatStyle Spaces = getLLVMStyle();
11620 Spaces.SpacesInAngles = true;
11621
11622 verifyFormat("static_cast< int >(arg);", Spaces);
11623 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11624 verifyFormat("f< int, float >();", Spaces);
11625 verifyFormat("template <> g() {}", Spaces);
11626 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011627 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11628 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11629 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011630
11631 Spaces.Standard = FormatStyle::LS_Cpp03;
11632 Spaces.SpacesInAngles = true;
11633 verifyFormat("A< A< int > >();", Spaces);
11634
11635 Spaces.SpacesInAngles = false;
11636 verifyFormat("A<A<int> >();", Spaces);
11637
11638 Spaces.Standard = FormatStyle::LS_Cpp11;
11639 Spaces.SpacesInAngles = true;
11640 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011641
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011642 Spaces.SpacesInAngles = false;
11643 verifyFormat("A<A<int>>();", Spaces);
11644}
11645
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011646TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11647 FormatStyle Style = getLLVMStyle();
11648 Style.SpaceAfterTemplateKeyword = false;
11649 verifyFormat("template<int> void foo();", Style);
11650}
11651
Jacques Pienaarfc275112015-02-18 23:48:37 +000011652TEST_F(FormatTest, TripleAngleBrackets) {
11653 verifyFormat("f<<<1, 1>>>();");
11654 verifyFormat("f<<<1, 1, 1, s>>>();");
11655 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011656 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011657 verifyFormat("f<param><<<1, 1>>>();");
11658 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011659 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011660 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11661 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011662 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11663 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011664}
11665
11666TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011667 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011668 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011669 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11670 "aaallvm::outs() <<");
11671 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11672 "aaaallvm::outs()\n <<");
11673}
11674
Manuel Klimek819788d2014-03-18 11:22:45 +000011675TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11676 std::string code = "#if A\n"
11677 "#if B\n"
11678 "a.\n"
11679 "#endif\n"
11680 " a = 1;\n"
11681 "#else\n"
11682 "#endif\n"
11683 "#if C\n"
11684 "#else\n"
11685 "#endif\n";
11686 EXPECT_EQ(code, format(code));
11687}
11688
Manuel Klimek68b03042014-04-14 09:14:11 +000011689TEST_F(FormatTest, HandleConflictMarkers) {
11690 // Git/SVN conflict markers.
11691 EXPECT_EQ("int a;\n"
11692 "void f() {\n"
11693 " callme(some(parameter1,\n"
11694 "<<<<<<< text by the vcs\n"
11695 " parameter2),\n"
11696 "||||||| text by the vcs\n"
11697 " parameter2),\n"
11698 " parameter3,\n"
11699 "======= text by the vcs\n"
11700 " parameter2, parameter3),\n"
11701 ">>>>>>> text by the vcs\n"
11702 " otherparameter);\n",
11703 format("int a;\n"
11704 "void f() {\n"
11705 " callme(some(parameter1,\n"
11706 "<<<<<<< text by the vcs\n"
11707 " parameter2),\n"
11708 "||||||| text by the vcs\n"
11709 " parameter2),\n"
11710 " parameter3,\n"
11711 "======= text by the vcs\n"
11712 " parameter2,\n"
11713 " parameter3),\n"
11714 ">>>>>>> text by the vcs\n"
11715 " otherparameter);\n"));
11716
11717 // Perforce markers.
11718 EXPECT_EQ("void f() {\n"
11719 " function(\n"
11720 ">>>> text by the vcs\n"
11721 " parameter,\n"
11722 "==== text by the vcs\n"
11723 " parameter,\n"
11724 "==== text by the vcs\n"
11725 " parameter,\n"
11726 "<<<< text by the vcs\n"
11727 " parameter);\n",
11728 format("void f() {\n"
11729 " function(\n"
11730 ">>>> text by the vcs\n"
11731 " parameter,\n"
11732 "==== text by the vcs\n"
11733 " parameter,\n"
11734 "==== text by the vcs\n"
11735 " parameter,\n"
11736 "<<<< text by the vcs\n"
11737 " parameter);\n"));
11738
11739 EXPECT_EQ("<<<<<<<\n"
11740 "|||||||\n"
11741 "=======\n"
11742 ">>>>>>>",
11743 format("<<<<<<<\n"
11744 "|||||||\n"
11745 "=======\n"
11746 ">>>>>>>"));
11747
11748 EXPECT_EQ("<<<<<<<\n"
11749 "|||||||\n"
11750 "int i;\n"
11751 "=======\n"
11752 ">>>>>>>",
11753 format("<<<<<<<\n"
11754 "|||||||\n"
11755 "int i;\n"
11756 "=======\n"
11757 ">>>>>>>"));
11758
11759 // FIXME: Handle parsing of macros around conflict markers correctly:
11760 EXPECT_EQ("#define Macro \\\n"
11761 "<<<<<<<\n"
11762 "Something \\\n"
11763 "|||||||\n"
11764 "Else \\\n"
11765 "=======\n"
11766 "Other \\\n"
11767 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011768 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011769 format("#define Macro \\\n"
11770 "<<<<<<<\n"
11771 " Something \\\n"
11772 "|||||||\n"
11773 " Else \\\n"
11774 "=======\n"
11775 " Other \\\n"
11776 ">>>>>>>\n"
11777 " End\n"
11778 "int i;\n"));
11779}
11780
Daniel Jasper471894432014-08-06 13:40:26 +000011781TEST_F(FormatTest, DisableRegions) {
11782 EXPECT_EQ("int i;\n"
11783 "// clang-format off\n"
11784 " int j;\n"
11785 "// clang-format on\n"
11786 "int k;",
11787 format(" int i;\n"
11788 " // clang-format off\n"
11789 " int j;\n"
11790 " // clang-format on\n"
11791 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011792 EXPECT_EQ("int i;\n"
11793 "/* clang-format off */\n"
11794 " int j;\n"
11795 "/* clang-format on */\n"
11796 "int k;",
11797 format(" int i;\n"
11798 " /* clang-format off */\n"
11799 " int j;\n"
11800 " /* clang-format on */\n"
11801 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011802
11803 // Don't reflow comments within disabled regions.
11804 EXPECT_EQ(
11805 "// clang-format off\n"
11806 "// long long long long long long line\n"
11807 "/* clang-format on */\n"
11808 "/* long long long\n"
11809 " * long long long\n"
11810 " * line */\n"
11811 "int i;\n"
11812 "/* clang-format off */\n"
11813 "/* long long long long long long line */\n",
11814 format("// clang-format off\n"
11815 "// long long long long long long line\n"
11816 "/* clang-format on */\n"
11817 "/* long long long long long long line */\n"
11818 "int i;\n"
11819 "/* clang-format off */\n"
11820 "/* long long long long long long line */\n",
11821 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011822}
11823
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011824TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11825 format("? ) =");
11826 verifyNoCrash("#define a\\\n /**/}");
11827}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011828
Daniel Jasper498f5582015-12-25 08:53:31 +000011829TEST_F(FormatTest, FormatsTableGenCode) {
11830 FormatStyle Style = getLLVMStyle();
11831 Style.Language = FormatStyle::LK_TableGen;
11832 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11833}
11834
Nico Weberb2673a12016-11-10 21:49:25 +000011835TEST_F(FormatTest, ArrayOfTemplates) {
11836 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11837 format("auto a = new unique_ptr<int > [ 10];"));
11838
11839 FormatStyle Spaces = getLLVMStyle();
11840 Spaces.SpacesInSquareBrackets = true;
11841 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11842 format("auto a = new unique_ptr<int > [10];", Spaces));
11843}
11844
11845TEST_F(FormatTest, ArrayAsTemplateType) {
11846 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11847 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11848
11849 FormatStyle Spaces = getLLVMStyle();
11850 Spaces.SpacesInSquareBrackets = true;
11851 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11852 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11853}
11854
Martin Probstc9c51c42017-03-16 10:21:35 +000011855TEST_F(FormatTest, NoSpaceAfterSuper) {
11856 verifyFormat("__super::FooBar();");
11857}
11858
Ben Hamilton07e58362018-02-21 21:27:27 +000011859TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011860 vfs::InMemoryFileSystem FS;
11861 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011862 ASSERT_TRUE((bool)Style1);
11863 ASSERT_EQ(*Style1, getGoogleStyle());
11864}
11865
Eric Liu547d8792016-03-24 13:22:42 +000011866TEST(FormatStyle, GetStyleOfFile) {
11867 vfs::InMemoryFileSystem FS;
11868 // Test 1: format file in the same directory.
11869 ASSERT_TRUE(
11870 FS.addFile("/a/.clang-format", 0,
11871 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11872 ASSERT_TRUE(
11873 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011874 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011875 ASSERT_TRUE((bool)Style1);
11876 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011877
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011878 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011879 ASSERT_TRUE(
11880 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011881 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011882 ASSERT_TRUE((bool)Style2);
11883 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011884
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011885 // Test 2.2: no format on 'none' fallback style.
11886 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11887 ASSERT_TRUE((bool)Style2);
11888 ASSERT_EQ(*Style2, getNoStyle());
11889
11890 // Test 2.3: format if config is found with no based style while fallback is
11891 // 'none'.
11892 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11893 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11894 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11895 ASSERT_TRUE((bool)Style2);
11896 ASSERT_EQ(*Style2, getLLVMStyle());
11897
11898 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11899 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11900 ASSERT_TRUE((bool)Style2);
11901 ASSERT_EQ(*Style2, getLLVMStyle());
11902
Eric Liu547d8792016-03-24 13:22:42 +000011903 // Test 3: format file in parent directory.
11904 ASSERT_TRUE(
11905 FS.addFile("/c/.clang-format", 0,
11906 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11907 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11908 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011909 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011910 ASSERT_TRUE((bool)Style3);
11911 ASSERT_EQ(*Style3, getGoogleStyle());
11912
11913 // Test 4: error on invalid fallback style
11914 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11915 ASSERT_FALSE((bool)Style4);
11916 llvm::consumeError(Style4.takeError());
11917
11918 // Test 5: error on invalid yaml on command line
11919 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11920 ASSERT_FALSE((bool)Style5);
11921 llvm::consumeError(Style5.takeError());
11922
11923 // Test 6: error on invalid style
11924 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11925 ASSERT_FALSE((bool)Style6);
11926 llvm::consumeError(Style6.takeError());
11927
11928 // Test 7: found config file, error on parsing it
11929 ASSERT_TRUE(
11930 FS.addFile("/d/.clang-format", 0,
11931 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11932 "InvalidKey: InvalidValue")));
11933 ASSERT_TRUE(
11934 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11935 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11936 ASSERT_FALSE((bool)Style7);
11937 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011938}
11939
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011940TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11941 // Column limit is 20.
11942 std::string Code = "Type *a =\n"
11943 " new Type();\n"
11944 "g(iiiii, 0, jjjjj,\n"
11945 " 0, kkkkk, 0, mm);\n"
11946 "int bad = format ;";
11947 std::string Expected = "auto a = new Type();\n"
11948 "g(iiiii, nullptr,\n"
11949 " jjjjj, nullptr,\n"
11950 " kkkkk, nullptr,\n"
11951 " mm);\n"
11952 "int bad = format ;";
11953 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011954 tooling::Replacements Replaces = toReplacements(
11955 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11956 "auto "),
11957 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11958 "nullptr"),
11959 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11960 "nullptr"),
11961 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11962 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011963
11964 format::FormatStyle Style = format::getLLVMStyle();
11965 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011966 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11967 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11968 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11969 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11970 EXPECT_TRUE(static_cast<bool>(Result));
11971 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011972}
11973
Eric Liubaf58c22016-05-18 13:43:48 +000011974TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11975 std::string Code = "#include \"a.h\"\n"
11976 "#include \"c.h\"\n"
11977 "\n"
11978 "int main() {\n"
11979 " return 0;\n"
11980 "}";
11981 std::string Expected = "#include \"a.h\"\n"
11982 "#include \"b.h\"\n"
11983 "#include \"c.h\"\n"
11984 "\n"
11985 "int main() {\n"
11986 " return 0;\n"
11987 "}";
11988 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011989 tooling::Replacements Replaces = toReplacements(
11990 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11991 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011992
11993 format::FormatStyle Style = format::getLLVMStyle();
11994 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011995 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11996 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11997 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11998 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11999 EXPECT_TRUE(static_cast<bool>(Result));
12000 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012001}
12002
Krasimir Georgievac16a202017-06-23 11:46:03 +000012003TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12004 EXPECT_EQ("using std::cin;\n"
12005 "using std::cout;",
12006 format("using std::cout;\n"
12007 "using std::cin;", getGoogleStyle()));
12008}
12009
Nico Weberdc065182017-04-05 18:10:42 +000012010TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12011 format::FormatStyle Style = format::getLLVMStyle();
12012 Style.Standard = FormatStyle::LS_Cpp03;
12013 // cpp03 recognize this string as identifier u8 and literal character 'a'
12014 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12015}
12016
12017TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12018 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12019 // all modes, including C++11, C++14 and C++17
12020 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12021}
12022
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012023TEST_F(FormatTest, DoNotFormatLikelyXml) {
12024 EXPECT_EQ("<!-- ;> -->",
12025 format("<!-- ;> -->", getGoogleStyle()));
12026 EXPECT_EQ(" <!-- >; -->",
12027 format(" <!-- >; -->", getGoogleStyle()));
12028}
12029
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012030TEST_F(FormatTest, StructuredBindings) {
12031 // Structured bindings is a C++17 feature.
12032 // all modes, including C++11, C++14 and C++17
12033 verifyFormat("auto [a, b] = f();");
12034 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12035 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12036 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12037 EXPECT_EQ("auto const volatile [a, b] = f();",
12038 format("auto const volatile[a, b] = f();"));
12039 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012040 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012041 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012042 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012043 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012044 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12045 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012046 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012047 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12048 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12049 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12050 format("const auto volatile &&[a, b] = f();"));
12051 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12052 format("volatile const auto &&[a, b] = f();"));
12053 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012054
Manuel Klimeke411aa82017-09-20 09:29:37 +000012055 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012056 FormatStyle PointerMiddle = getLLVMStyle();
12057 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12058 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12059 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12060 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12061 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12062 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12063 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12064 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12065 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12066 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12067 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12068 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12069 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12070
12071 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12072 format("for (const auto && [a, b] : some_range) {\n}"));
12073 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12074 format("for (const auto & [a, b] : some_range) {\n}"));
12075 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12076 format("for (const auto[a, b] : some_range) {\n}"));
12077 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
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 const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12081 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12082 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12083 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12084 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012085
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012086 format::FormatStyle Spaces = format::getLLVMStyle();
12087 Spaces.SpacesInSquareBrackets = true;
12088 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012089 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12090 verifyFormat("auto &[ a, b ] = f();", Spaces);
12091 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12092 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012093}
12094
Ben Hamilton6e066352018-02-27 15:56:40 +000012095TEST_F(FormatTest, FileAndCode) {
12096 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12097 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12098 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12099 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12100 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
12101 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12102 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012103 EXPECT_EQ(FormatStyle::LK_ObjC,
12104 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12105 EXPECT_EQ(
12106 FormatStyle::LK_ObjC,
12107 guessLanguage("foo.h",
12108 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012109}
12110
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012111TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12112 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12113 EXPECT_EQ(FormatStyle::LK_ObjC,
12114 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012115 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012116 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012117 EXPECT_EQ(
12118 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012119 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12120 EXPECT_EQ(FormatStyle::LK_ObjC,
12121 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12122 EXPECT_EQ(FormatStyle::LK_Cpp,
12123 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12124 EXPECT_EQ(FormatStyle::LK_ObjC,
12125 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12126 EXPECT_EQ(FormatStyle::LK_Cpp,
12127 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12128 EXPECT_EQ(FormatStyle::LK_Cpp,
12129 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12130 EXPECT_EQ(FormatStyle::LK_ObjC,
12131 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12132 EXPECT_EQ(FormatStyle::LK_Cpp,
12133 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12134 EXPECT_EQ(
12135 FormatStyle::LK_Cpp,
12136 guessLanguage("foo.h",
12137 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12138 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012139}
12140
Ben Hamilton788a2222018-03-12 15:42:40 +000012141TEST_F(FormatTest, GuessLanguageWithCaret) {
12142 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12143 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12144 EXPECT_EQ(FormatStyle::LK_ObjC,
12145 guessLanguage("foo.h", "int(^)(char, float);"));
12146 EXPECT_EQ(FormatStyle::LK_ObjC,
12147 guessLanguage("foo.h", "int(^foo)(char, float);"));
12148 EXPECT_EQ(FormatStyle::LK_ObjC,
12149 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12150 EXPECT_EQ(FormatStyle::LK_ObjC,
12151 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12152 EXPECT_EQ(
12153 FormatStyle::LK_ObjC,
12154 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12155}
12156
Ben Hamilton6432afe2018-03-22 17:37:19 +000012157TEST_F(FormatTest, GuessLanguageWithChildLines) {
12158 EXPECT_EQ(FormatStyle::LK_Cpp,
12159 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12160 EXPECT_EQ(FormatStyle::LK_ObjC,
12161 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
12162}
12163
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012164} // end namespace
12165} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012166} // end namespace clang